diff --git a/.vpython3 b/.vpython3 index 3cf8cd7..5fee61b 100644 --- a/.vpython3 +++ b/.vpython3
@@ -580,3 +580,17 @@ name: "infra/python/wheels/pyopenssl-py2_py3" version: "version:19.0.0" > + +# Used by //tools/md_browser to render Markdown. +wheel: < + name: "infra/python/wheels/markdown-py3" + version: "version:3.3.4" +> +wheel: < + name: "infra/python/wheels/importlib-metadata-py3" + version: "version:1.6.0" +> +wheel: < + name: "infra/python/wheels/zipp-py3" + version: "version:3.1.0" +>
diff --git a/BUILD.gn b/BUILD.gn index 057b4081..1a125216 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -66,25 +66,20 @@ assert(!is_component_build) } -# This file defines the following two main targets: +# The `gn_all` target is used to list all of the main targets in the build, so +# that we can figure out which BUILD.gn files to process, following the process +# described at the top of this file. # -# "gn_all" is used to create explicit dependencies from the root BUILD.gn to -# each top-level component that we wish to include when building everything via -# "all". This is required since the set of targets built by "all" is determined -# automatically based on reachability from the root BUILD.gn (for details, see -# crbug.com/503241). Builders should typically use "all", or list targets -# explicitly, rather than relying on "gn_all". -# -# "gn_visibility": targets that are normally not visible to top-level targets, -# but are built anyway by "all". Since we don't want any such targets, we have -# this placeholder to make sure hidden targets that aren't otherwise depended -# on yet are accounted for. +# Because of the way GN works (again, as described above), there may be targets +# built by `all` that aren't built by `gn_all`. We always want `all` to build, +# so there's really never a reason you'd want to build `gn_all` instead of +# `all`, and no tooling should depend directly on this target. Tools should +# should depend on either an explicit list of targets, or `all`. group("gn_all") { testonly = true deps = [ - ":gn_visibility", "//base:base_perftests", "//base:base_unittests", "//codelabs", @@ -256,6 +251,9 @@ deps += [ "//chrome/test:telemetry_perf_unittests${_target_suffix}" ] } } + if (!v8_use_external_startup_data) { + deps += [ "//v8:v8_snapshot" ] + } } else { deps += [ "//ios:all", @@ -1030,18 +1028,9 @@ } } +# TODO(crbug.com/1311306) - Remove this target once all references to +# it have been removed from this and other repos. group("gn_visibility") { - deps = [ - "//build/config/sanitizers:options_sources", - # "//third_party/pdfium:pdfium_embeddertests", # TODO(GYP): visibility? - # "//third_party/pdfium:pdfium_unittests", # TODO(GYP): visibility? - ] - - if (!is_ios) { - if (!v8_use_external_startup_data) { - deps += [ "//v8:v8_snapshot" ] - } - } } if (!is_ios) {
diff --git a/DEPS b/DEPS index 72ae5452..266fbafd 100644 --- a/DEPS +++ b/DEPS
@@ -299,7 +299,7 @@ # 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': '88338f726819e04b5ddf46f66d50c0c86a486a4f', + 'skia_revision': 'aa36fbbd0c1db4cb5a11e26395eb1f469d47f900', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -307,15 +307,15 @@ # 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': '452a7179d35e7da870d53ecb8258645d75a25fd0', + 'angle_revision': 'f8e56b0c18135ead8bc3296cc650a1933d97c55c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '6aae7dba00c85d44706622517746da0e25cd61b9', + 'swiftshader_revision': 'dca80fc3a894149ecf4d5cd4d4fe665fe0274bb3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '5be0603fadd355da9d4bf17f76ba48ffdffedb06', + 'pdfium_revision': 'bf5900a3c4b9236ea62816a0364081723e36c4c4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -326,7 +326,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:11.20230223.1.1', + 'fuchsia_version': 'version:11.20230224.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -370,7 +370,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '4274fe29dac91b7713244daebb6f1d2364d97193', + 'catapult_revision': '9c6c41afcf180e0bf068129b75da62e535f37629', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -386,7 +386,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '80ee7f807010712887f378762b2f8f047061fa17', + 'devtools_frontend_revision': '4a894fba784b3f6e95296fc1f3ba16d01bb4a564', # 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. @@ -426,11 +426,11 @@ # 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': 'd8a13ee60c6fddb5a47b7331853c91162fe37737', + 'dawn_revision': 'e958db049046d393ee01b3043f606fdef83b9a75', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '40c87d454d762f3daaeca334cd2dc962f0476b13', + 'quiche_revision': 'f21da2b76427131c1bd175512cd40695a15da724', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -490,10 +490,10 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': '09f68a400f9200921688efb34a341d9af4c0d3d8', + 'libcxx_revision': 'e136ec5032a5e5d97e988ce66e8c269a80ff54c4', # GN CIPD package version. - 'gn_version': 'git_revision:b25a2f8c2d33f02082f0f258350f5e22c0973108', + 'gn_version': 'git_revision:fe330c0ae1ec29db30b6f830e50771a335e071fb', # ninja CIPD package version. # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja @@ -764,16 +764,16 @@ 'src/clank': { 'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' + - '7db85339b109a100e4af00bb89b350d9d3cd3031', + 'fc2e825030815d9fd9789add28b59525efda4c54', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '182a630499559e1403237d14e2bc6302d384ed39', + 'url': Var('chromium_git') + '/website.git' + '@' + '3467b2e2130078c5f9355c85a8c64121bda70a59', }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '8ac47627cb9ba09bf4bc3489b7aff5d77cd6eb88', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'dc932298481308087b192deca693e210bd11cd01', 'condition': 'checkout_ios', }, @@ -953,7 +953,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'zEg6hTXAR6Mcqyfh8gHDzD9fmyy1xwz4swj6pkENIYsC', + 'version': 'Fsm98n6hLbqLHEvpZJ-mBOrHHZO6hyzNJto4m65OEv8C', }, ], 'condition': 'checkout_android', @@ -1174,7 +1174,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' + '@' + '483428cf0ebe2bfd30c90d41e0c87cbea732f8ec', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '52efbfdc210624f1895d5994149f53c3a4457f29', 'condition': 'checkout_chromeos', }, @@ -1206,13 +1206,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'd85c5bc6ff0dee8171007d947aabc3dfa6dd433b', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '27ac29f980eb459c7da5ddea20ec515d7c8627c9', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '5e8256727ee1aef2f4a54f24f5fc7204508e4974', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '8e0b54f612513e0963a696978ab0ec30d4510ff2', 'condition': 'checkout_src_internal', }, @@ -1684,7 +1684,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'dce90b9ff65042877a53554fc76610aeb4310cf4', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '4bda78645d1d23a98473b793bc532a3ebff6c7f9', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1869,7 +1869,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6c8361e98f1daba65902f5e2fc1297893ac14b67', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'cdfeb4f7922f05007d88c8263842998ec79b6dd6', + Var('webrtc_git') + '/src.git' + '@' + '765812902ccee061e03594a54343f2a9d337113f', # 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. @@ -1939,7 +1939,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a37e9dafccef62ba0019615cca4e9696b1f6a50f', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@cbbf14b048d52a4439ebd9cb71ee6ea55e5b6bee', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/tracing/aw_background_tracing_metrics_provider_unittest.cc b/android_webview/browser/tracing/aw_background_tracing_metrics_provider_unittest.cc index ac6f87b..118a820 100644 --- a/android_webview/browser/tracing/aw_background_tracing_metrics_provider_unittest.cc +++ b/android_webview/browser/tracing/aw_background_tracing_metrics_provider_unittest.cc
@@ -63,6 +63,10 @@ content::BackgroundTracingManager::ANONYMIZE_DATA)); } + void TearDown() override { + content::BackgroundTracingManager::GetInstance().AbortScenarioForTesting(); + } + private: content::BrowserTaskEnvironment task_environment_; content::ContentClient content_client_;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java index 85b78d2..d18c54db 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java
@@ -6,6 +6,7 @@ import static org.chromium.android_webview.test.AwActivityTestRule.CHECK_INTERVAL; +import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.os.Build; @@ -32,13 +33,16 @@ import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.CriteriaNotSatisfiedException; +import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Feature; import org.chromium.content_public.browser.ImeAdapter; import org.chromium.content_public.browser.WebContentsAccessibility; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.common.ContentUrlConstants; +import java.lang.ref.PhantomReference; import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; import java.util.concurrent.Callable; /** @@ -48,6 +52,7 @@ * See crbug.com/544098 for why @DisableHardwareAccelerationForTest is needed. */ @RunWith(AwJUnit4ClassRunner.class) +@DoNotBatch(reason = "GC tests require full restarts") public class AwContentsGarbageCollectionTest { @Rule public AwActivityTestRule mActivityTestRule = new AwActivityTestRule() { @@ -198,6 +203,7 @@ mOverridenFactory = new GcTestDependencyFactory(context); AwTestContainerView containerView = mActivityTestRule.createAwTestContainerViewOnMainSync(client); + context.setAwContentsStrongRef(containerView.getAwContents()); mOverridenFactory = null; mActivityTestRule.loadUrlAsync( containerView.getAwContents(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); @@ -284,6 +290,40 @@ }); } + @Test + @DisableHardwareAccelerationForTest + @LargeTest + public void testActivityDoesNotLeak() throws Throwable { + // Test that Activity should not leak if view is still attached after activity is destroyed. + ReferenceQueue<Activity> referenceQueue = new ReferenceQueue<>(); + PhantomReference<Activity> reference; + { + Activity activity = mActivityTestRule.getActivity(); + reference = new PhantomReference<>(activity, referenceQueue); + + TestAwContentsClient client = new TestAwContentsClient(); + AwTestContainerView containerView = + mActivityTestRule.createAwTestContainerViewOnMainSync(client); + mActivityTestRule.loadUrlAsync( + containerView.getAwContents(), ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + + mActivityTestRule.recreateActivity(); + boolean destroyed = + TestThreadUtils.runOnUiThreadBlockingNoException(() -> activity.isDestroyed()); + Assert.assertTrue(destroyed); + } + + Runtime.getRuntime().gc(); + final long timeoutMs = 30000L; + CriteriaHelper.pollInstrumentationThread(() -> { + Runtime.getRuntime().gc(); + Reference enqueuedReference = referenceQueue.poll(); + Criteria.checkThat(enqueuedReference, Matchers.notNullValue()); + Criteria.checkThat(enqueuedReference, Matchers.is(reference)); + }, timeoutMs, CHECK_INTERVAL); + gcAndCheckAllAwContentsDestroyed(); + } + // This moves the test body that manipulates AwContents and such objects into // a stack frame that's guaranteed to be cleared when the gc checks are run. // Otherwise the thread may hold local references (ie from stack variables)
diff --git a/ash/accelerators/accelerator_alias_converter.cc b/ash/accelerators/accelerator_alias_converter.cc index fea7d80..06cf5ed 100644 --- a/ash/accelerators/accelerator_alias_converter.cc +++ b/ash/accelerators/accelerator_alias_converter.cc
@@ -122,11 +122,6 @@ } int modifiers = accelerator.modifiers() & ~ui::EF_COMMAND_DOWN; - // If modifiers only contain [Search] key, no reversed alias exists. - if (modifiers == 0) { - return std::vector<ui::Accelerator>(); - } - // [Back] maps back to [Insert] if modifier contains [Shift]. Otherwise, // it maps back to [Delete]. if (accelerator.key_code() == ui::KeyboardCode::VKEY_BACK) { @@ -136,14 +131,8 @@ } modifiers &= ~ui::EF_SHIFT_DOWN; - if (modifiers == 0) { - // Handles an edge case if the accelerator is just the reverse of - // [Insert]. - return std::vector<ui::Accelerator>(); - } else { - return {ui::Accelerator(ui::KeyboardCode::VKEY_INSERT, modifiers, - accelerator.key_state())}; - } + return {ui::Accelerator(ui::KeyboardCode::VKEY_INSERT, modifiers, + accelerator.key_state())}; } // Handle modifiers other than [Back].
diff --git a/ash/accelerators/accelerator_alias_converter_unittest.cc b/ash/accelerators/accelerator_alias_converter_unittest.cc index 62c7ace..0cc8661 100644 --- a/ash/accelerators/accelerator_alias_converter_unittest.cc +++ b/ash/accelerators/accelerator_alias_converter_unittest.cc
@@ -306,13 +306,13 @@ {ui::Accelerator{ui::VKEY_LEFT, ui::EF_ALT_DOWN}, absl::nullopt}, // key_code not as reversed six pack key prevent remapping. {ui::Accelerator{ui::VKEY_ZOOM, ui::EF_COMMAND_DOWN}, absl::nullopt}, - // [Search] as the only modifier prevents remapping. - {ui::Accelerator{ui::VKEY_BACK, ui::EF_COMMAND_DOWN}, absl::nullopt}, - // [Back] + [Shift] + [Search] only prevents remapping, which is just - // the reverse of [Insert]. + // [Back] + [Search] -> [Delete] + {ui::Accelerator{ui::VKEY_BACK, ui::EF_COMMAND_DOWN}, + ui::Accelerator{ui::VKEY_DELETE, ui::EF_NONE}}, + // [Back] + [Shift] + [Search] -> [Insert]. {ui::Accelerator{ui::VKEY_BACK, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN}, - absl::nullopt}, + ui::Accelerator{ui::VKEY_INSERT, ui::EF_NONE}}, // [Back] + [Shift] + [Search] + [Alt] -> [Insert] + [Alt]. {ui::Accelerator{ui::VKEY_BACK, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN |
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index aa1e4ca4..a6ef192 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -4670,6 +4670,18 @@ Calendar view, <ph name="date">$1<ex>Wednesday, May 25, 2022</ex></ph>, <ph name="time">$2<ex>14:07</ex></ph> </message> + <message name="IDS_ASH_CALENDAR_EVENT_POSITION_ACCESSIBLE_DESCRIPTION" desc="The accessible label of the position in the event list of a calendar event entry."> + Event <ph name="event_position">$1<ex>1</ex></ph> of <ph name="event_total_count">$2<ex>2</ex></ph> + </message> + + <message name="IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION_JELLY" desc="The accessible label of a calendar event list item jelly entry."> + <ph name="event_position">$1<ex>Event 1 of 2</ex></ph> + <ph name="event_summary">$2<ex>Lunch break</ex></ph>, + <ph name="start_time">$3<ex>12 PM</ex></ph> to + <ph name="end_time">$4<ex>1 PM</ex></ph>, + <ph name="time_zone">$5<ex>Pacific time</ex></ph>. Select for more details in Google Calendar. + </message> + <message name="IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION" desc="The accessible label of a calendar event entry."> <ph name="start_time">$1<ex>12 PM</ex></ph> to <ph name="end_time">$2<ex>1 PM</ex></ph>,
diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION_JELLY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION_JELLY.png.sha1 new file mode 100644 index 0000000..9c307f9a --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION_JELLY.png.sha1
@@ -0,0 +1 @@ +cddc7241d928b5f05cb4cdc770c31017fdfd4314 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_POSITION_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_POSITION_ACCESSIBLE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..e36749a --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_EVENT_POSITION_ACCESSIBLE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +0b29ff56cabe0426eb32708b8d567ee53ae08b49 \ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_demo_tools_controller.cc b/ash/capture_mode/capture_mode_demo_tools_controller.cc index 0a17a4e..d0ec193 100644 --- a/ash/capture_mode/capture_mode_demo_tools_controller.cc +++ b/ash/capture_mode/capture_mode_demo_tools_controller.cc
@@ -22,6 +22,7 @@ #include "base/containers/unique_ptr_adapters.h" #include "base/location.h" #include "base/notreached.h" +#include "ui/base/ime/constants.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/text_input_client.h" #include "ui/base/ime/text_input_type.h" @@ -52,6 +53,9 @@ constexpr base::TimeDelta kTouchUpScaleUpDuration = base::Milliseconds(1000); constexpr int kSpaceBetweenKeyComboAndCaptureBar = 8; +constexpr int kModifiersToConsider = ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | + ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN; + int GetModifierFlagForKeyCode(ui::KeyboardCode key_code) { switch (key_code) { case ui::VKEY_COMMAND: @@ -77,7 +81,7 @@ // Includes non-modifier keys that can be shown independently without a modifier // key being pressed. constexpr ui::KeyboardCode kNotNeedingModifierKeys[] = { - ui::VKEY_COMMAND, + ui::VKEY_CAPITAL, ui::VKEY_RWIN, ui::VKEY_ESCAPE, ui::VKEY_TAB, @@ -116,6 +120,12 @@ return params; } +bool IsKeyEventFromVirtualKeyboard(const ui::KeyEvent* event) { + const auto* event_properties = event->properties(); + return event_properties && + event_properties->find(ui::kPropertyFromVK) != event_properties->end(); +} + } // namespace CaptureModeDemoToolsController::CaptureModeDemoToolsController( @@ -216,8 +226,17 @@ void CaptureModeDemoToolsController::OnKeyUpEvent(ui::KeyEvent* event) { const ui::KeyboardCode key_code = event->key_code(); - const int modifier_flag = GetModifierFlagForKeyCode(key_code); - modifiers_ &= ~modifier_flag; + + if (IsKeyEventFromVirtualKeyboard(event)) { + // The virtual keyboard does not send key up events for modifier keys, such + // as 'Ctrl' or 'Alt'. Therefore on key up of non-modifier key we clear the + // `modifiers_` and rely on `Event::flags()` to refill it properly when we + // get a key down event from a virtual keyboard. + modifiers_ = 0; + } else { + const int modifier_flag = GetModifierFlagForKeyCode(key_code); + modifiers_ &= ~modifier_flag; + } if (last_non_modifier_key_ == key_code) { last_non_modifier_key_ = ui::VKEY_UNKNOWN; @@ -260,16 +279,28 @@ const ui::KeyboardCode key_code = event->key_code(); // Return directly if it is a repeated key event for non-modifier key. - if (key_code == last_non_modifier_key_) + if (key_code == last_non_modifier_key_) { return; + } key_up_refresh_timer_.Stop(); const int modifier_flag = GetModifierFlagForKeyCode(key_code); - modifiers_ |= modifier_flag; + const bool is_vk_event = IsKeyEventFromVirtualKeyboard(event); - if (modifier_flag == ui::EF_NONE) + // For key event coming from on-screen keyboard, `event->flags()` will reflect + // the currently pressed modifier key(s). For key event coming from physical + // keyboard, `GetModifierFlagForKeyCode()` will give us the currently pressed + // modifier key. + if (is_vk_event) { + modifiers_ |= (event->flags() & kModifiersToConsider); + } else { + modifiers_ |= modifier_flag; + } + + if (modifier_flag == ui::EF_NONE) { last_non_modifier_key_ = key_code; + } RefreshKeyComboViewer(); }
diff --git a/ash/capture_mode/capture_mode_demo_tools_test_api.cc b/ash/capture_mode/capture_mode_demo_tools_test_api.cc index 8b78376..87367dc 100644 --- a/ash/capture_mode/capture_mode_demo_tools_test_api.cc +++ b/ash/capture_mode/capture_mode_demo_tools_test_api.cc
@@ -41,8 +41,9 @@ DCHECK(demo_tools_controller_); KeyComboView* key_combo_view = demo_tools_controller_->key_combo_view_; - if (!key_combo_view || !key_combo_view->modifiers_container_view_) + if (!key_combo_view || !key_combo_view->modifiers_container_view_) { return std::vector<ui::KeyboardCode>(); + } return key_combo_view->GetModifierKeycodeVector(); }
diff --git a/ash/capture_mode/capture_mode_demo_tools_unittests.cc b/ash/capture_mode/capture_mode_demo_tools_unittests.cc index 85380a3..1c52540 100644 --- a/ash/capture_mode/capture_mode_demo_tools_unittests.cc +++ b/ash/capture_mode/capture_mode_demo_tools_unittests.cc
@@ -1019,6 +1019,34 @@ controller->EndVideoRecording(EndRecordingReason::kStopRecordingButton); } +// Tests that the key combo viewer widget will display for key event coming from +// on-screen keyboard. For such key event, the key combo viewer will show on key +// down of a modifier key whose `flags()` is not 0 or non-modifier key that is +// allowed to show independently. +TEST_F(CaptureModeDemoToolsTest, OnScreenKeyboardKeyEventTest) { + CaptureModeController* controller = StartCaptureSession( + CaptureModeSource::kFullscreen, CaptureModeType::kVideo); + controller->EnableDemoTools(true); + StartVideoRecordingImmediately(); + EXPECT_TRUE(controller->is_recording_in_progress()); + CaptureModeDemoToolsController* demo_tools_controller = + GetCaptureModeDemoToolsController(); + EXPECT_TRUE(demo_tools_controller); + CaptureModeDemoToolsTestApi demo_tools_test_api(demo_tools_controller); + + auto* event_generator = GetEventGenerator(); + PressAndReleaseKeyOnVK(event_generator, ui::VKEY_A, ui::EF_CONTROL_DOWN); + EXPECT_THAT(demo_tools_test_api.GetShownModifiersKeyCodes(), + testing::ElementsAre(ui::VKEY_CONTROL)); + EXPECT_EQ(demo_tools_test_api.GetShownNonModifierKeyCode(), ui::VKEY_A); + FireTimerAndVerifyWidget(/*should_hide_view=*/true); + + PressAndReleaseKeyOnVK(event_generator, ui::VKEY_TAB, ui::EF_NONE); + EXPECT_TRUE(demo_tools_test_api.GetShownModifiersKeyCodes().empty()); + EXPECT_EQ(demo_tools_test_api.GetShownNonModifierKeyCode(), ui::VKEY_TAB); + FireTimerAndVerifyWidget(/*should_hide_view=*/true); +} + // Tests that the metrics that record if a recording starts with demo tools // feature enabled are recorded correctly in a capture session both in clamshell // and tablet mode.
diff --git a/ash/capture_mode/capture_mode_test_util.cc b/ash/capture_mode/capture_mode_test_util.cc index a318f3f..76792351 100644 --- a/ash/capture_mode/capture_mode_test_util.cc +++ b/ash/capture_mode/capture_mode_test_util.cc
@@ -28,6 +28,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/ime/constants.h" #include "ui/display/screen.h" #include "ui/events/test/event_generator.h" #include "ui/views/view.h" @@ -35,6 +36,27 @@ namespace ash { +namespace { + +// Dispatch the simulated virtual key event to the WindowEventDispatcher. +void DispatchVKEvent(ui::test::EventGenerator* event_generator, + bool is_press, + ui::KeyboardCode key_code, + int flags, + int source_device_id) { + ui::EventType type = is_press ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED; + ui::KeyEvent keyev(type, key_code, flags); + + keyev.SetProperties({{ + ui::kPropertyFromVK, + std::vector<uint8_t>(ui::kPropertyFromVKSize), + }}); + keyev.set_source_device_id(source_device_id); + event_generator->Dispatch(&keyev); +} + +} // namespace + CaptureModeController* StartCaptureSession(CaptureModeSource source, CaptureModeType type) { auto* controller = CaptureModeController::Get(); @@ -210,6 +232,30 @@ return autoclick_bubble_widget; } +void PressKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags, + int source_device_id) { + DispatchVKEvent(event_generator, /*is_press=*/true, key_code, flags, + source_device_id); +} + +void ReleaseKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags, + int source_device_id) { + DispatchVKEvent(event_generator, /*is_press=*/false, key_code, flags, + source_device_id); +} + +void PressAndReleaseKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags, + int source_device_id) { + PressKeyOnVK(event_generator, key_code, flags, source_device_id); + ReleaseKeyOnVK(event_generator, key_code, flags, source_device_id); +} + // ----------------------------------------------------------------------------- // ProjectorCaptureModeIntegrationHelper:
diff --git a/ash/capture_mode/capture_mode_test_util.h b/ash/capture_mode/capture_mode_test_util.h index 92b0ce7c..2dbb249f 100644 --- a/ash/capture_mode/capture_mode_test_util.h +++ b/ash/capture_mode/capture_mode_test_util.h
@@ -114,6 +114,20 @@ // bubble widget. views::Widget* EnableAndGetAutoClickBubbleWidget(); +// Functions to simulate triggering key events from the virtual keyboard. +void PressKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags, + int source_device_id = ui::ED_UNKNOWN_DEVICE); +void ReleaseKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags, + int source_device_id = ui::ED_UNKNOWN_DEVICE); +void PressAndReleaseKeyOnVK(ui::test::EventGenerator* event_generator, + ui::KeyboardCode key_code, + int flags = ui::EF_NONE, + int source_device_id = ui::ED_UNKNOWN_DEVICE); + // Defines a helper class to allow setting up and testing the Projector feature // in multiple test fixtures. Note that this helper initializes the Projector- // related features in its constructor, so test fixtures that use this should
diff --git a/ash/capture_mode/capture_mode_toast_controller.cc b/ash/capture_mode/capture_mode_toast_controller.cc index 352d807..388b6ba 100644 --- a/ash/capture_mode/capture_mode_toast_controller.cc +++ b/ash/capture_mode/capture_mode_toast_controller.cc
@@ -12,6 +12,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/system_toast_style.h" +#include "base/strings/utf_string_conversions.h" #include "ui/base/l10n/l10n_util.h" #include "ui/compositor/layer.h" #include "ui/gfx/geometry/rect.h" @@ -77,6 +78,9 @@ toast_contents_view_->SetText(capture_toast_label); } + capture_mode_util::TriggerAccessibilityAlertSoon( + base::UTF16ToUTF8(capture_toast_label)); + MaybeRepositionCaptureToast(); const bool did_visibility_change = capture_mode_util::SetWidgetVisibility( capture_toast_widget_.get(), /*target_visibility=*/true,
diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc index dd6fe43..5664beba 100644 --- a/ash/components/arc/arc_features.cc +++ b/ash/components/arc/arc_features.cc
@@ -336,4 +336,23 @@ BASE_FEATURE(kVmmSwapKeyboardShortcut, "ArcvmSwapoutKeyboardShortcut", base::FEATURE_DISABLED_BY_DEFAULT); + +// Controls experimental key to enable and swap out ARCVM by policy. +BASE_FEATURE(kVmmSwapPolicy, + "ArcVmmSwapPolicy", + base::FEATURE_DISABLED_BY_DEFAULT); + +// Controls the time interval between create staging memory and swap out. The +// default value is 10 seconds. +const base::FeatureParam<int> kVmmSwapOutDelaySecond{&kVmmSwapPolicy, + "delay_sec", 10}; + +// Controls the time interval between two swap out. The default value is 12 +// hours. +const base::FeatureParam<int> kVmmSwapOutTimeIntervalSecond{ + &kVmmSwapPolicy, "swapout_interval_sec", 60 * 60 * 12}; + +// Controls the time interval of ARC silence. The default value is 15 minutes. +const base::FeatureParam<int> kVmmSwapArcSilenceIntervalSecond{ + &kVmmSwapPolicy, "arc_silence_interval_sec", 60 * 15}; } // namespace arc
diff --git a/ash/components/arc/arc_features.h b/ash/components/arc/arc_features.h index b2ae70c9..ef4cffa8 100644 --- a/ash/components/arc/arc_features.h +++ b/ash/components/arc/arc_features.h
@@ -70,6 +70,10 @@ BASE_DECLARE_FEATURE(kVmBroadcastPreNotifyANR); BASE_DECLARE_FEATURE(kVmGmsCoreLowMemoryKillerProtection); BASE_DECLARE_FEATURE(kVmmSwapKeyboardShortcut); +BASE_DECLARE_FEATURE(kVmmSwapPolicy); +extern const base::FeatureParam<int> kVmmSwapOutDelaySecond; +extern const base::FeatureParam<int> kVmmSwapOutTimeIntervalSecond; +extern const base::FeatureParam<int> kVmmSwapArcSilenceIntervalSecond; } // namespace arc
diff --git a/ash/components/arc/compat_mode/overlay_dialog.cc b/ash/components/arc/compat_mode/overlay_dialog.cc index 3d23f73..a755ca8 100644 --- a/ash/components/arc/compat_mode/overlay_dialog.cc +++ b/ash/components/arc/compat_mode/overlay_dialog.cc
@@ -5,7 +5,6 @@ #include "ash/components/arc/compat_mode/overlay_dialog.h" #include "ash/components/arc/compat_mode/style/arc_color_provider.h" -#include "ash/constants/ash_features.h" #include "ash/style/ash_color_id.h" #include "base/functional/bind.h" #include "components/exo/shell_surface_base.h" @@ -54,10 +53,8 @@ void OverlayDialog::OnThemeChanged() { views::View::OnThemeChanged(); - const ui::ColorId color_id = ash::features::IsDarkLightModeEnabled() - ? ash::kColorAshShieldAndBase60 - : ash::kColorAshShieldAndBase60Light; - SetBackground(views::CreateThemedSolidBackground(color_id)); + SetBackground( + views::CreateThemedSolidBackground(ash::kColorAshShieldAndBase60)); } OverlayDialog::OverlayDialog(base::OnceClosure on_destroying,
diff --git a/ash/components/arc/mojom/net.mojom b/ash/components/arc/mojom/net.mojom index 1124c5c..65f5bc2b0 100644 --- a/ash/components/arc/mojom/net.mojom +++ b/ash/components/arc/mojom/net.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Next MinVersion: 30 +// Next MinVersion: 31 // This file defines the mojo interface between the ARC networking stack and // Chrome OS. There are three different groups of interactions: @@ -729,7 +729,24 @@ string? passphrase@3; }; -// Next Method ID: 21 +// Request object that is passed to the Chrome API RequestPasspointAppApproval. +struct PasspointApprovalRequest { + // The package name of the app requesting the approval. This is needed for + // Chrome to check if the app window is valid. + string package_name; + + // The name of the app requesting the approval. + string app_name; +}; + +// Result object that is returned to the caller to the Chrome API +// RequestPasspointAppApproval. +struct PasspointApprovalResponse { + // True if the user allowed the request. + bool allowed; +}; + +// Next Method ID: 22 // IDs 3 and 9 are missing as they belonged to deprecated methods. // Mojo interface exposed by the Chrome browser process for // networking/WiFi/VPN, ARC is the client. @@ -794,6 +811,11 @@ // Call with empty string as |vpnPackage| to lift the restriction. [MinVersion=9] SetAlwaysOnVpn@13(string vpnPackage, bool lockdown); + // Sends a request to Chrome to ask for user approval for the app to set up + // WiFi networks through Passpoint. + [MinVersion=30] RequestPasspointAppApproval@21( + PasspointApprovalRequest request) => (PasspointApprovalResponse response); + // Adds a PasspointCredentials block provided by an Android App onto the host // platform. [MinVersion=16] AddPasspointCredentials@14(PasspointCredentials credentials);
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc index 7cdbb39..972dd4a 100644 --- a/ash/components/arc/net/arc_net_host_impl.cc +++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -492,7 +492,7 @@ // the callee interface. auto split_callback = base::SplitOnceCallback(std::move(callback)); GetManagedConfigurationHandler()->CreateConfiguration( - user_id_hash, base::Value(std::move(properties)), + user_id_hash, properties, base::BindOnce(&ArcNetHostImpl::CreateNetworkSuccessCallback, weak_factory_.GetWeakPtr(), std::move(split_callback.first)), @@ -563,7 +563,7 @@ // the callee interface. auto split_callback = base::SplitOnceCallback(std::move(callback)); GetManagedConfigurationHandler()->SetProperties( - path, base::Value(std::move(properties)), + path, properties, base::BindOnce(&UpdateWifiNetworkSuccessCallback, std::move(split_callback.first)), base::BindOnce(&UpdateWifiNetworkFailureCallback, @@ -761,7 +761,7 @@ std::string service_path = LookupArcVpnServicePath(); if (!service_path.empty()) { GetManagedConfigurationHandler()->SetProperties( - service_path, base::Value(TranslateVpnConfigurationToOnc(*cfg)), + service_path, TranslateVpnConfigurationToOnc(*cfg), base::BindOnce(&ArcNetHostImpl::ConnectArcVpn, weak_factory_.GetWeakPtr(), service_path, std::string()), base::BindOnce(&ArcVpnErrorCallback, @@ -771,7 +771,7 @@ std::string user_id_hash = ash::LoginState::Get()->primary_user_hash(); GetManagedConfigurationHandler()->CreateConfiguration( - user_id_hash, base::Value(TranslateVpnConfigurationToOnc(*cfg)), + user_id_hash, TranslateVpnConfigurationToOnc(*cfg), base::BindOnce(&ArcNetHostImpl::ConnectArcVpn, weak_factory_.GetWeakPtr()), base::BindOnce(&ArcVpnErrorCallback, "connecting new ARC VPN")); @@ -985,6 +985,14 @@ weak_factory_.GetWeakPtr())); } +void ArcNetHostImpl::RequestPasspointAppApproval( + mojom::PasspointApprovalRequestPtr request, + RequestPasspointAppApprovalCallback callback) { + // TODO(b/266151265): Start a dialog for Passpoint approval. + std::move(callback).Run( + mojom::PasspointApprovalResponse::New(/*allow=*/false)); +} + void ArcNetHostImpl::AddPasspointCredentialsWithProperties( base::Value::Dict properties) { if (properties.empty()) {
diff --git a/ash/components/arc/net/arc_net_host_impl.h b/ash/components/arc/net/arc_net_host_impl.h index 285ff48..1f1875b 100644 --- a/ash/components/arc/net/arc_net_host_impl.h +++ b/ash/components/arc/net/arc_net_host_impl.h
@@ -93,6 +93,9 @@ void StartLohs(mojom::LohsConfigPtr config, StartLohsCallback callback) override; void StopLohs() override; + void RequestPasspointAppApproval( + mojom::PasspointApprovalRequestPtr request, + RequestPasspointAppApprovalCallback callback) override; // Overridden from ash::NetworkStateHandlerObserver. void ScanCompleted(const ash::DeviceState* /*unused*/) override;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 1106d1e..d8b77a2 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1233,6 +1233,11 @@ "InternalServerSideSpeechRecognition", base::FEATURE_DISABLED_BY_DEFAULT); +// Feature overrides the `InternalServerSideSpeechRecognition` flag if disabled. +BASE_FEATURE(kInternalServerSideSpeechRecognitionControl, + "InternalServerSideSpeechRecognitionControl", + base::FEATURE_ENABLED_BY_DEFAULT); + // Enables sending `client-info` values to IPP printers on ChromeOS. BASE_FEATURE(kIppClientInfo, "IppClientInfo", base::FEATURE_ENABLED_BY_DEFAULT); @@ -1997,6 +2002,16 @@ "TerminalTmuxIntegration", base::FEATURE_DISABLED_BY_DEFAULT); +// Enables time of day screen saver. +BASE_FEATURE(kTimeOfDayScreenSaver, + "TimeOfDayScreenSaver", + base::FEATURE_DISABLED_BY_DEFAULT); + +// Enables time of day wallpaper. +BASE_FEATURE(kTimeOfDayWallpaper, + "TimeOfDayWallpaper", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables the TrafficCountersHandler class to auto-reset traffic counters // and shows Data Usage in the Celluar Settings UI. BASE_FEATURE(kTrafficCountersEnabled, @@ -2699,8 +2714,18 @@ #if BUILDFLAG(GOOGLE_CHROME_BRANDING) // TODO(b/245614967): Once ready, enable this feature under // kProjectorBleedingEdgeExperience flag as well. - return ShouldForceEnableServerSideSpeechRecognitionForDev() || - base::FeatureList::IsEnabled(kInternalServerSideSpeechRecognition); + return IsInternalServerSideSpeechRecognitionControlEnabled() && + (ShouldForceEnableServerSideSpeechRecognitionForDev() || + base::FeatureList::IsEnabled(kInternalServerSideSpeechRecognition)); +#else + return false; +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) +} + +bool IsInternalServerSideSpeechRecognitionControlEnabled() { +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + return base::FeatureList::IsEnabled( + kInternalServerSideSpeechRecognitionControl); #else return false; #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) @@ -3114,6 +3139,15 @@ return base::FeatureList::IsEnabled(kStylusBatteryStatus); } +bool IsTimeOfDayScreenSaverEnabled() { + return base::FeatureList::IsEnabled(kTimeOfDayScreenSaver) && + IsTimeOfDayWallpaperEnabled(); +} + +bool IsTimeOfDayWallpaperEnabled() { + return base::FeatureList::IsEnabled(kTimeOfDayWallpaper); +} + bool IsTabClusterUIEnabled() { return base::FeatureList::IsEnabled(kTabClusterUI); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 638f219..238a280 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -362,6 +362,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kInstantTethering); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kInternalServerSideSpeechRecognition); +COMPONENT_EXPORT(ASH_CONSTANTS) +BASE_DECLARE_FEATURE(kInternalServerSideSpeechRecognitionControl); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kIppClientInfo); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kJelly); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kKioskEnableImeButton); @@ -566,6 +568,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTerminalMultiProfile); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTerminalSftp); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTerminalTmuxIntegration); +COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTimeOfDayScreenSaver); +COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTimeOfDayWallpaper); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTrafficCountersEnabled); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTrilinearFiltering); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kUploadOfficeToCloud); @@ -732,6 +736,8 @@ bool IsInstantTetheringBackgroundAdvertisingSupported(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsInternalServerSideSpeechRecognitionEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) +bool IsInternalServerSideSpeechRecognitionControlEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsIppClientInfoEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsJellyEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) @@ -851,6 +857,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsImeTrayHideVoiceButtonEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemTrayShadowEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsStylusBatteryStatusEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTimeOfDayScreenSaverEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTimeOfDayWallpaperEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTabClusterUIEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTouchpadInDiagnosticsAppEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTouchscreenInDiagnosticsAppEnabled();
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index 5f01b59b..184b7df4 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc
@@ -619,15 +619,19 @@ aura::client::GetDragDropDelegate(target); aura::client::DragDropDelegate::DropCallback delegate_drop_cb = - base::DoNothing(); + base::NullCallback(); + aura::client::DragDropDelegate::DropCallbackWithAnimation + delegate_drop_cb_animation = base::NullCallback(); ui::DropTargetEvent e(*drag_data_.get(), event.location_f(), event.root_location_f(), allowed_operations_); e.set_flags(event.flags()); ui::Event::DispatcherApi(&e).set_target(target); - if (delegate) + if (delegate) { + delegate_drop_cb_animation = delegate->GetDropCallbackWithAnimation(e); delegate_drop_cb = delegate->GetDropCallback(e); + } base::ScopedClosureRunner drag_cancel(base::BindOnce( &DragDropController::DragCancel, weak_factory_.GetWeakPtr())); @@ -642,11 +646,11 @@ DropIfAllowed( drag_data_.get(), current_drag_info_, - base::BindOnce(&DragDropController::PerformDrop, - weak_factory_.GetWeakPtr(), drop_location_in_screen, e, - std::move(drag_data_), std::move(delegate_drop_cb), - std::move(tab_drag_drop_delegate_), - std::move(drag_cancel))); + base::BindOnce( + &DragDropController::PerformDrop, weak_factory_.GetWeakPtr(), + drop_location_in_screen, e, std::move(drag_data_), + std::move(delegate_drop_cb), std::move(delegate_drop_cb_animation), + std::move(tab_drag_drop_delegate_), std::move(drag_cancel))); // During the drop, the event target (or its ancestors) might have // been destroyed, eg by the client reaction. Adapt the DropTargetEvent @@ -820,6 +824,7 @@ ui::DropTargetEvent event, std::unique_ptr<ui::OSExchangeData> drag_data, aura::client::DragDropDelegate::DropCallback drop_cb, + aura::client::DragDropDelegate::DropCallbackWithAnimation drop_cb_animation, std::unique_ptr<TabDragDropDelegate> tab_drag_drop_delegate, base::ScopedClosureRunner drag_cancel) { // Event copy constructor dooesn't copy the target. That's why we set it here. @@ -828,7 +833,11 @@ ui::Event::DispatcherApi(&event).set_target(drag_window_); ui::OSExchangeData copied_data(drag_data->provider().Clone()); - if (drop_cb) { + if (!!drop_cb_animation) { + std::move(drop_cb_animation) + .Run(std::move(drag_data), operation_, + ::wm::RecreateLayers(drag_image_widget_->GetNativeWindow())); + } else if (!!drop_cb) { std::move(drop_cb).Run(std::move(drag_data), operation_); }
diff --git a/ash/drag_drop/drag_drop_controller.h b/ash/drag_drop/drag_drop_controller.h index 78dc38f4..0be258cc 100644 --- a/ash/drag_drop/drag_drop_controller.h +++ b/ash/drag_drop/drag_drop_controller.h
@@ -166,6 +166,8 @@ ui::DropTargetEvent event, std::unique_ptr<ui::OSExchangeData> drag_data, aura::client::DragDropDelegate::DropCallback drop_cb, + aura::client::DragDropDelegate::DropCallbackWithAnimation + drop_cb_animation, std::unique_ptr<TabDragDropDelegate> tab_drag_drop_delegate, base::ScopedClosureRunner drag_cancel); @@ -173,7 +175,7 @@ bool enabled_ = false; bool drag_drop_completed_ = true; - views::UniqueWidgetPtr drag_image_widget_; + std::unique_ptr<views::Widget> drag_image_widget_; gfx::Vector2d drag_image_offset_; std::unique_ptr<ui::OSExchangeData> drag_data_; int allowed_operations_ = 0;
diff --git a/ash/drag_drop/drag_image_view.cc b/ash/drag_drop/drag_image_view.cc index 4475ed1..1d80b70 100644 --- a/ash/drag_drop/drag_image_view.cc +++ b/ash/drag_drop/drag_image_view.cc
@@ -28,7 +28,7 @@ DragImageView::~DragImageView() = default; // static -views::UniqueWidgetPtr DragImageView::Create( +std::unique_ptr<views::Widget> DragImageView::Create( aura::Window* root_window, ui::mojom::DragEventSource event_source) { views::Widget::InitParams params; @@ -37,12 +37,12 @@ params.accept_events = false; params.shadow_type = views::Widget::InitParams::ShadowType::kNone; params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = root_window->GetChildById(kShellWindowId_DragImageAndTooltipContainer); if (!params.parent) params.context = root_window; // Happens in tests. - auto drag_widget = views::UniqueWidgetPtr( - std::make_unique<views::Widget>(std::move(params))); + auto drag_widget = std::make_unique<views::Widget>(std::move(params)); drag_widget->SetOpacity(1.f); drag_widget->SetContentsView( base::WrapUnique(new DragImageView(event_source)));
diff --git a/ash/drag_drop/drag_image_view.h b/ash/drag_drop/drag_image_view.h index 2fb79aae..d39817c 100644 --- a/ash/drag_drop/drag_image_view.h +++ b/ash/drag_drop/drag_image_view.h
@@ -11,7 +11,6 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/size.h" #include "ui/views/controls/image_view.h" -#include "ui/views/widget/unique_widget_ptr.h" namespace aura { class Window; @@ -38,8 +37,9 @@ // |source| is the event source that started this drag drop operation (touch // or mouse). It is used to determine attributes of the drag image such as // whether to show drag operation hint on top of the image. - static views::UniqueWidgetPtr Create(aura::Window* root_window, - ui::mojom::DragEventSource source); + static std::unique_ptr<views::Widget> Create( + aura::Window* root_window, + ui::mojom::DragEventSource source); // Sets the bounds of the native widget in screen // coordinates.
diff --git a/ash/metrics/ui_metrics_recorder.cc b/ash/metrics/ui_metrics_recorder.cc index a133ef6..42a077f 100644 --- a/ash/metrics/ui_metrics_recorder.cc +++ b/ash/metrics/ui_metrics_recorder.cc
@@ -5,10 +5,15 @@ #include "ash/metrics/ui_metrics_recorder.h" #include "base/check_op.h" +#include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" #include "base/time/time.h" +#include "cc/metrics/event_metrics.h" + +#undef ENABLED_VLOG_LEVEL +#define ENABLED_VLOG_LEVEL 1 namespace ash { @@ -122,15 +127,27 @@ void UiMetricsRecorder::ReportEventLatency( std::vector<cc::EventLatencyTracker::LatencyData> latencies) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + using EventType = cc::EventMetrics::EventType; + + constexpr base::TimeDelta kLongLatency = base::Milliseconds(500); for (auto& latency : latencies) { + const char* event_type = cc::EventMetrics::GetTypeName(latency.event_type); base::UmaHistogramCustomMicrosecondsTimes( - base::StrCat({"Ash.EventLatency.", - cc::EventMetrics::GetTypeName(latency.event_type), - ".TotalLatency"}), + base::StrCat({"Ash.EventLatency.", event_type, ".TotalLatency"}), latency.total_latency, base::Milliseconds(1), base::Seconds(5), 100); UMA_HISTOGRAM_CUSTOM_TIMES("Ash.EventLatency.TotalLatency", latency.total_latency, base::Milliseconds(1), base::Seconds(5), 100); + + if (latency.event_type != EventType::kGestureLongPress && + latency.event_type != EventType::kGestureLongTap && + latency.total_latency > kLongLatency) { + VLOG(1) << "Ash event latency is longer than usual" + << ", type=" << event_type + << ", latency= " << latency.total_latency.InMilliseconds() + << " ms"; + } } } } // namespace ash
diff --git a/ash/public/cpp/metrics_util.cc b/ash/public/cpp/metrics_util.cc index 7f752d3..2b11c9c7 100644 --- a/ash/public/cpp/metrics_util.cc +++ b/ash/public/cpp/metrics_util.cc
@@ -6,12 +6,15 @@ #include "base/check.h" #include "base/functional/bind.h" +#include "base/logging.h" #include "base/no_destructor.h" #include "base/time/time.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" -namespace ash { -namespace metrics_util { +#undef ENABLED_VLOG_LEVEL +#define ENABLED_VLOG_LEVEL 1 + +namespace ash::metrics_util { namespace { @@ -40,7 +43,8 @@ } // Calculates smoothness from |throughput| and sends to |callback|. -void ForwardSmoothness(SmoothnessCallback callback, +void ForwardSmoothness(base::TimeTicks start_tick, + SmoothnessCallback callback, const cc::FrameSequenceMetrics::CustomReportData& data) { bool animation_in_test = ui::ScopedAnimationDurationScaleMode::duration_multiplier() != @@ -57,20 +61,36 @@ data.frames_produced == 0)) { return; } - callback.Run(CalculateSmoothness(data)); + + // Threshold to trigger logs for feedback analyzer. + constexpr base::TimeDelta kLongAnimation = base::Seconds(1); + constexpr int kLowSmoothness = 20; + + const base::TimeDelta duration = base::TimeTicks::Now() - start_tick; + const int smoothness = CalculateSmoothness(data); + + if (duration > kLongAnimation) { + VLOG(1) << "Ash system animation takes longer than usual, duration= " + << duration.InMilliseconds() << " ms"; + } else if (smoothness < kLowSmoothness) { + VLOG(1) << "Ash system animation drops too many frames, smoothness= " + << smoothness; + } + + callback.Run(smoothness); } } // namespace ReportCallback ForSmoothness(SmoothnessCallback callback, bool exclude_from_data_collection) { + const base::TimeTicks now = base::TimeTicks::Now(); auto forward_smoothness = - base::BindRepeating(&ForwardSmoothness, std::move(callback)); + base::BindRepeating(&ForwardSmoothness, now, std::move(callback)); if (!g_data_collection_enabled || exclude_from_data_collection) return forward_smoothness; - return base::BindRepeating(&CollectDataAndForwardReport, - base::TimeTicks::Now(), + return base::BindRepeating(&CollectDataAndForwardReport, now, std::move(forward_smoothness)); } @@ -103,5 +123,4 @@ return std::floor(100.0f * data.jank_count / data.frames_expected); } -} // namespace metrics_util -} // namespace ash +} // namespace ash::metrics_util
diff --git a/ash/public/cpp/metrics_util.h b/ash/public/cpp/metrics_util.h index 98d894f9..fee9f64 100644 --- a/ash/public/cpp/metrics_util.h +++ b/ash/public/cpp/metrics_util.h
@@ -12,8 +12,7 @@ #include "base/time/time.h" #include "cc/metrics/frame_sequence_metrics.h" -namespace ash { -namespace metrics_util { +namespace ash::metrics_util { using ReportCallback = base::RepeatingCallback<void( const cc::FrameSequenceMetrics::CustomReportData&)>; @@ -57,7 +56,6 @@ ASH_PUBLIC_EXPORT int CalculateJank( const cc::FrameSequenceMetrics::CustomReportData& data); -} // namespace metrics_util -} // namespace ash +} // namespace ash::metrics_util #endif // ASH_PUBLIC_CPP_METRICS_UTIL_H_
diff --git a/ash/public/mojom/BUILD.gn b/ash/public/mojom/BUILD.gn index 5ddd847..57749bb9 100644 --- a/ash/public/mojom/BUILD.gn +++ b/ash/public/mojom/BUILD.gn
@@ -13,19 +13,18 @@ sources = [ "accelerator_keys.mojom", "assistant_volume_control.mojom", - "input_device_settings.mojom", "tray_action.mojom", ] public_deps = [ ":accelerator_info", + ":input_device_settings", "//chromeos/ash/components/proximity_auth/public/mojom", "//components/account_id/mojom", "//components/sync/mojom", "//mojo/public/mojom/base", "//services/preferences/public/mojom", "//skia/public/mojom", - "//ui/chromeos/events/mojom", "//ui/gfx/geometry/mojom", "//ui/gfx/image/mojom", "//ui/gfx/range/mojom", @@ -70,3 +69,18 @@ "//ui/base/accelerators/mojom", ] } + +# This is a separate target so that downstream WebUI targets can take +# advantage of JS module Mojom files, without having to generate WebUI Mojom +# files for all dependencies (and their dependencies) in //ash/public/mojom. +mojom("input_device_settings") { + disable_variants = true + webui_module_path = "/" + + sources = [ "input_device_settings.mojom" ] + + public_deps = [ + "//mojo/public/mojom/base", + "//ui/chromeos/events/mojom", + ] +}
diff --git a/ash/quick_pair/repository/fast_pair/fake_footprints_fetcher.cc b/ash/quick_pair/repository/fast_pair/fake_footprints_fetcher.cc index d0b76a7..bbfdf17 100644 --- a/ash/quick_pair/repository/fast_pair/fake_footprints_fetcher.cc +++ b/ash/quick_pair/repository/fast_pair/fake_footprints_fetcher.cc
@@ -26,8 +26,9 @@ *response.add_fast_pair_info() = entry.second; } - if (add_user_result_) + if (add_user_result_) { *response.add_fast_pair_info() = opt_in_status_info_; + } std::move(callback).Run(std::move(response)); } @@ -44,13 +45,7 @@ void FakeFootprintsFetcher::AddUserFastPairInfo( nearby::fastpair::FastPairInfo info, AddDeviceCallback callback) { - if (info.has_opt_in_status() && add_user_result_) { - opt_in_status_info_ = info; - std::move(callback).Run(add_user_result_); - return; - } - - if (info.has_opt_in_status() && !add_user_result_) { + if (!add_user_result_) { std::move(callback).Run(add_user_result_); return; }
diff --git a/ash/quick_pair/repository/fast_pair_repository_impl.cc b/ash/quick_pair/repository/fast_pair_repository_impl.cc index 08606fc..9944e43 100644 --- a/ash/quick_pair/repository/fast_pair_repository_impl.cc +++ b/ash/quick_pair/repository/fast_pair_repository_impl.cc
@@ -446,18 +446,6 @@ // Remove pending write on successful Footprints write. pending_write_store_->OnPairedDeviceSaved(mac_address); - - // Save/Update account key in the saved device registry. - if (saved_device_registry_->SaveAccountAssociation(mac_address, - account_key)) { - QP_LOG(VERBOSE) << __func__ - << ": paired device at address = " << mac_address - << " added to local registry."; - return; - } - - QP_LOG(WARNING) << __func__ << ": failed to add paired device at address = " - << mac_address << " to local registry."; } void FastPairRepositoryImpl::CheckOptInStatus(
diff --git a/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc b/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc index 4f50e10..f7a1b58 100644 --- a/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc +++ b/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc
@@ -401,8 +401,6 @@ kAccountKey1); base::RunLoop().RunUntilIdle(); ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); auto run_loop = base::RunLoop(); @@ -448,8 +446,6 @@ kAccountKey1); base::RunLoop().RunUntilIdle(); ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); auto run_loop = base::RunLoop(); @@ -491,8 +487,6 @@ kAccountKey1); base::RunLoop().RunUntilIdle(); ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); auto run_loop = base::RunLoop(); @@ -1458,8 +1452,6 @@ kAccountKey1); base::RunLoop().RunUntilIdle(); ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); // After a successful Footprints write, pending writes list should be empty. ASSERT_EQ(0u, pending_write_store_->GetPendingWrites().size()); @@ -1479,11 +1471,10 @@ base::RunLoop().RunUntilIdle(); // The failed write should save as pending write. - ASSERT_FALSE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); std::vector<PendingWriteStore::PendingWrite> pending_writes = pending_write_store_->GetPendingWrites(); ASSERT_EQ(1u, pending_writes.size()); + ASSERT_FALSE(footprints_fetcher_->ContainsKey(kAccountKey1)); // Parse device account key from device fast pair info. const std::string& account_key_str = @@ -1502,9 +1493,8 @@ base::RunLoop().RunUntilIdle(); // The write should still be pending after a failed retry. - ASSERT_FALSE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); ASSERT_EQ(1u, pending_write_store_->GetPendingWrites().size()); + ASSERT_FALSE(footprints_fetcher_->ContainsKey(kAccountKey1)); // Reconnect to the Network, but within the 1 minute timeout. footprints_fetcher_->SetAddUserFastPairInfoResult(true); @@ -1513,9 +1503,8 @@ base::RunLoop().RunUntilIdle(); // Since we don't try within 1 minute, the write should still be pending. - ASSERT_FALSE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); ASSERT_EQ(1u, pending_write_store_->GetPendingWrites().size()); + ASSERT_FALSE(footprints_fetcher_->ContainsKey(kAccountKey1)); // Mock waiting out the 1 minute timeout. task_environment()->FastForwardBy(base::Minutes(1)); @@ -1528,9 +1517,8 @@ base::RunLoop().RunUntilIdle(); // The write, after a successful retry, should no longer be pending. - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); ASSERT_EQ(0u, pending_write_store_->GetPendingWrites().size()); + ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); } TEST_F(FastPairRepositoryImplTest, @@ -1548,11 +1536,10 @@ base::RunLoop().RunUntilIdle(); // The failed write should save as pending write. - ASSERT_FALSE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); std::vector<PendingWriteStore::PendingWrite> pending_writes = pending_write_store_->GetPendingWrites(); ASSERT_EQ(1u, pending_writes.size()); + ASSERT_FALSE(footprints_fetcher_->ContainsKey(kAccountKey1)); // Mock waiting out the 1 minute timeout. task_environment()->FastForwardBy(base::Minutes(1)); @@ -1565,8 +1552,6 @@ base::RunLoop().RunUntilIdle(); // The write, after a successful retry, should no longer be pending. - ASSERT_TRUE( - saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); ASSERT_EQ(0u, pending_write_store_->GetPendingWrites().size()); ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); @@ -1578,5 +1563,20 @@ 0); } +// `WriteAccountAssociationToFootprints()` previously wrote the association +// locally as well. This unit test ensures it does not anymore. +TEST_F(FastPairRepositoryImplTest, + AccountAssociationWriteToFootprints_NoLocalWrite) { + auto device = base::MakeRefCounted<Device>(kValidModelId, kTestBLEAddress, + Protocol::kFastPairRetroactive); + device->set_classic_address(kTestClassicAddress1); + device->set_display_name(kDeviceDisplayName); + fast_pair_repository_->WriteAccountAssociationToFootprints(device, + kAccountKey1); + ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1)); + ASSERT_FALSE( + saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1)); +} + } // namespace quick_pair } // namespace ash
diff --git a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc index caf8577..5f2889b 100644 --- a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc +++ b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -1279,6 +1279,13 @@ {{ui::VKEY_F, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}}}, {// |categories| + {ShortcutCategory::kTabAndWindow}, + IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU, + {}, + // |accelerator_ids| + {{ui::VKEY_Z, ui::EF_COMMAND_DOWN}}}, + + {// |categories| {ShortcutCategory::kPageAndBrowser}, IDS_KSV_DESCRIPTION_SHOW_IDC_FOCUS_MENU_BAR, {},
diff --git a/ash/shortcut_viewer/shortcut_viewer_strings.grd b/ash/shortcut_viewer/shortcut_viewer_strings.grd index 8306600..50c4ca4 100644 --- a/ash/shortcut_viewer/shortcut_viewer_strings.grd +++ b/ash/shortcut_viewer/shortcut_viewer_strings.grd
@@ -828,6 +828,9 @@ <message name="IDS_KSV_DESCRIPTION_FLOAT" desc="Description of the command in keyboard shortcut viewer."> Float active window on top </message> + <message name="IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU" desc="Description of the command in keyboard shortcut viewer."> + Open window layout options + </message> <message name="IDS_KSV_DESCRIPTION_OPEN_GOOGLE_ASSISTANT" desc="Description of the command in keyboard shortcut viewer."> Open Google Assistant </message>
diff --git a/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU.png.sha1 b/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU.png.sha1 new file mode 100644 index 0000000..710ba72 --- /dev/null +++ b/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU.png.sha1
@@ -0,0 +1 @@ +5c8bda85f451e4a25bb29fd017ceca60b52bd70f \ No newline at end of file
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc index 4f989441..044f8234 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -210,6 +210,7 @@ case IDS_KSV_DESCRIPTION_PRIVACY_SCREEN_TOGGLE: return !ash::Shell::Get()->privacy_screen_controller()->IsSupported(); case IDS_KSV_DESCRIPTION_FLOAT: + case IDS_KSV_DESCRIPTION_TOGGLE_MULTITASK_MENU: return !chromeos::wm::features::IsWindowLayoutMenuEnabled(); }
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 9df6356..ce42ad7c 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Jou PIN of wagwoord kon steeds nie geverifieer word nie. Let wel: As jy jou wagwoord onlangs verander het, moet jy jou ou wagwoord gebruik. Jou nuwe wagwoord sal van toepassing wees sodra jy afmeld.</translation> <translation id="8855885154700222542">Volskermsleutel</translation> +<translation id="8858369206579825206">Privaatheidkontroles</translation> <translation id="8870509716567206129">Program steun nie verdeelde skerm nie.</translation> <translation id="8874184842967597500">Nie gekoppel nie</translation> <translation id="8876661425082386199">Gaan jou verbinding na</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index bafd0f5..cd9fcc8 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">የእርስዎ ፒን ወይም ይለፍ ቃል አሁንም ሊረጋገጥ አልቻለም። ማሳሰቢያ፦ በቅርቡ የይለፍ ቃልዎን ከቀየሩ፣ የድሮውን የይለፍ ቃል ይጠቀሙ። አዲስ የይለፍ ቃልዎ የሚተገበረው ሲወጡ ነው።</translation> <translation id="8855885154700222542">የሙሉ ማያ ገጽ እይታ ቁልፍ</translation> +<translation id="8858369206579825206">የግላዊነት ቁጥጥሮች</translation> <translation id="8870509716567206129">መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።</translation> <translation id="8874184842967597500">አልተገናኘም</translation> <translation id="8876661425082386199">ግንኙነትዎን ይፈትሹ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index f23debac..819b569 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -1468,6 +1468,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">يتعذّر حتى الآن التحقُّق من رقم التعريف الشخصي أو كلمة المرور الخاصّة بك. ملاحظة: في حال تم تغيير كلمة المرور الخاصّة بك مؤخرًا، يمكنك تسجيل الدخول باستخدام كلمة المرور القديمة. وسيتم تطبيق كلمة المرور الجديدة بعد تسجيل الخروج.</translation> <translation id="8855885154700222542">مفتاح ملء الشاشة</translation> +<translation id="8858369206579825206">عناصر التحكّم في الخصوصية</translation> <translation id="8870509716567206129">التطبيق لا يتيح تقسيم الشاشة.</translation> <translation id="8874184842967597500">غير متصل</translation> <translation id="8876661425082386199">التحقُّق من الاتصال</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index ba22afd..997aa74 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">আপোনাৰ পিন অথবা পাছৱৰ্ডটো তথাপি সত্যাপন কৰিব পৰা নগ’ল। টোকা: আপুনি যদি শেহতীয়াকৈ আপোনাৰ পাছৱৰ্ড সলনি কৰিছে, আপোনাৰ পুৰণি পাছৱৰ্ডটো ব্যৱহাৰ কৰক। আপুনি ছাইন আউট কৰিলে আপোনাৰ নতুন পাছৱৰ্ডটো প্ৰযোজ্য হ'ব।</translation> <translation id="8855885154700222542">সম্পূৰ্ণ স্ক্রীণলৈ যাবৰ বাবে কী</translation> +<translation id="8858369206579825206">গোপনীয়তাৰ নিয়ন্ত্ৰণ</translation> <translation id="8870509716567206129">এপটোৱে বিভাজিত স্ক্ৰীন সমৰ্থন নকৰে।</translation> <translation id="8874184842967597500">সংযোগ হোৱা নাই</translation> <translation id="8876661425082386199">আপোনাৰ ইণ্টাৰনেট সংযোগ পৰীক্ষা কৰক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 091f308a..a1be633 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">PIN və ya parolunuzu yenə doğrulamaq mümkün olmadı. Qeyd: Bu yaxınlarda parolunuzu dəyişmisinizsə, köhnə parolunuzu istifadə edin. Çıxdıqdan sonra yeni parolunuz tətbiq ediləcək.</translation> <translation id="8855885154700222542">Tam ekran açarı</translation> +<translation id="8858369206579825206">Məxfilik kontrolları</translation> <translation id="8870509716567206129">Tətbiq ekran bölünməsini dəstəkləmir.</translation> <translation id="8874184842967597500">Qoşulmayıb</translation> <translation id="8876661425082386199">Bağlantını yoxlayın</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index f846024..92c400c3 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Клавіша пошуку + Esc</translation> <translation id="8853703225951107899">Пароль або PIN-код спраўдзіць зноў не ўдалося. Заўвага: калі вы нядаўна змянілі пароль, то выкарыстайце тут стары пароль. Новы пароль будзе прыменены пасля выхаду.</translation> <translation id="8855885154700222542">Клавіша поўнаэкраннага рэжыму</translation> +<translation id="8858369206579825206">Налады прыватнасці</translation> <translation id="8870509716567206129">Праграма не падтрымлівае рэжым падзеленага экрана.</translation> <translation id="8874184842967597500">Не падключана</translation> <translation id="8876661425082386199">Праверце падключэнне</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index b3363a6f..aba3a96 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">търсене + Esc</translation> <translation id="8853703225951107899">ПИН кодът или паролата ви пак не бяха потвърдени. Забележка: Ако наскоро сте променили паролата си, използвайте старата. Новата ще бъде приложена, щом излезете от профила си.</translation> <translation id="8855885154700222542">Клавиш за цял екран</translation> +<translation id="8858369206579825206">Контроли за поверителност</translation> <translation id="8870509716567206129">Приложението не поддържа разделен екран.</translation> <translation id="8874184842967597500">Няма връзка</translation> <translation id="8876661425082386199">Проверка на връзката ви</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index a33e092..7bb95b5 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">আপনার পিন বা পাসওয়ার্ড এখনও যাচাই করা যায়নি। মনে রাখবেন: আপনি সম্প্রতি পাসওয়ার্ড পরিবর্তন করে থাকলে, পুরনো পাসওয়ার্ড ব্যবহার করুন। আপনি সাইন-আউট করলে নতুন পাসওয়ার্ড প্রয়োগ করা হবে।</translation> <translation id="8855885154700222542">ফুলস্ক্রিন করার বোতাম</translation> +<translation id="8858369206579825206">গোপনীয়তা নিয়ন্ত্রণ</translation> <translation id="8870509716567206129">অ্যাপ্লিকেশনটি বিভক্ত-স্ক্রিন সমর্থন করে না৷</translation> <translation id="8874184842967597500">সংযুক্ত নয়</translation> <translation id="8876661425082386199">আপনার ইন্টারনেট কানেকশন চেক করুন</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 4e9c85bc..7cc1ec3 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, učitavanje događaja.</translation> <translation id="3932043219784172185">Nije povezan nijedan uređaj</translation> <translation id="3934456833412894880">Prilagodljivo punjenje je uključeno. Vaša baterija će ostati na 80% radi produžavanja vijeka trajanja baterije, a potpuno će se napuniti kada vam to bude potrebno.</translation> +<translation id="3936620957945677513">Pritisnite Enter da se pridružite događaju <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Zalijepi</translation> <translation id="394485226368336402">Postavke zvuka</translation> <translation id="3945319193631853098">Dodirnite da završite postavljanje</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Potvrđivanje PIN-a ili lozinke i dalje nije uspjelo. Napomena: Ako ste nedavno promijenili lozinku, koristite staru. Nova lozinka će se primijeniti nakon što se odjavite.</translation> <translation id="8855885154700222542">Tipka za prikaz preko cijelog ekrana</translation> +<translation id="8858369206579825206">Kontrole privatnosti</translation> <translation id="8870509716567206129">Aplikacija ne podržava dijeljenje ekrana.</translation> <translation id="8874184842967597500">Nije povezano</translation> <translation id="8876661425082386199">Provjerite stanje veze</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 6cad974ae..397da27c 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -1463,6 +1463,7 @@ <translation id="8850991929411075241">Cerca + Esc</translation> <translation id="8853703225951107899">El PIN o la contrasenya continuen sense poder-se verificar. Nota: si fa poc que has canviat la contrasenya, fes servir l'antiga. La contrasenya nova s'aplicarà un cop hagis tancat la sessió.</translation> <translation id="8855885154700222542">Tecla de pantalla completa</translation> +<translation id="8858369206579825206">Controls de privadesa</translation> <translation id="8870509716567206129">L'aplicació no admet la pantalla dividida.</translation> <translation id="8874184842967597500">No connectada</translation> <translation id="8876661425082386199">Comprova la connexió</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 9500099..d544077 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Hledat+Esc</translation> <translation id="8853703225951107899">Váš PIN nebo heslo se stále nepodařilo ověřit. Poznámka: Pokud jste heslo nedávno změnili, použijte staré heslo. Nové heslo bude možné použít až po odhlášení.</translation> <translation id="8855885154700222542">Tlačítko celé obrazovky</translation> +<translation id="8858369206579825206">Nastavení ochrany soukromí</translation> <translation id="8870509716567206129">Aplikace nepodporuje režim rozdělené obrazovky.</translation> <translation id="8874184842967597500">Nepřipojeno</translation> <translation id="8876661425082386199">Zkontrolujte připojení</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index fdc493d..13bbe67 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Ni ellid dilysu eich PIN neu gyfrinair o hyd. Sylwer: Os gwnaethoch newid eich cyfrinair yn ddiweddar, defnyddiwch eich hen gyfrinair. Bydd eich cyfrinair newydd yn gweithio ar ôl i chi allgofnodi.</translation> <translation id="8855885154700222542">Bysell sgrîn lawn</translation> +<translation id="8858369206579825206">Rheolyddion preifatrwydd</translation> <translation id="8870509716567206129">Nid yw'r ap yn cefnogi sgrîn hollt.</translation> <translation id="8874184842967597500">Ni chysylltir</translation> <translation id="8876661425082386199">Gwiriwch eich cysylltiad</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 2da303e..6935b0d 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Søg+Esc</translation> <translation id="8853703225951107899">Din pin- eller adgangskode kan stadig ikke bekræftes. Bemærk! Hvis du har ændret din adgangskode for nylig, skal du bruge din gamle adgangskode. Den nye adgangskode anvendes, når du har logget ud.</translation> <translation id="8855885154700222542">Tast til fuld skærm</translation> +<translation id="8858369206579825206">Privatlivsindstillinger</translation> <translation id="8870509716567206129">Appen understøtter ikke opdelt skærm.</translation> <translation id="8874184842967597500">Ikke forbundet</translation> <translation id="8876661425082386199">Tjek din forbindelse</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 27e5f33..88820af 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Suche + Esc</translation> <translation id="8853703225951107899">Deine PIN oder dein Passwort konnten noch immer nicht bestätigt werden. Hinweis: Wenn du kürzlich dein Passwort geändert hast, verwende dein altes Passwort. Dein neues Passwort wird übernommen, sobald du dich abmeldest.</translation> <translation id="8855885154700222542">Taste für Vollbildmodus</translation> +<translation id="8858369206579825206">Datenschutzeinstellungen</translation> <translation id="8870509716567206129">Das Teilen des Bildschirms wird in dieser App nicht unterstützt.</translation> <translation id="8874184842967597500">Nicht verbunden</translation> <translation id="8876661425082386199">Verbindung prüfen</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index f5476ab1..a91f2b3b 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Πλήκτρο αναζήτησης+Esc</translation> <translation id="8853703225951107899">Η επαλήθευση του PIN ή του κωδικού πρόσβασής σας εξακολουθεί να μην είναι δυνατή. Σημείωση: Εάν πρόσφατα αλλάξατε τον κωδικό πρόσβασής σας, χρησιμοποιήστε τον παλιό κωδικό πρόσβασης. Ο νέος κωδικός πρόσβασης θα εφαρμοστεί αφού αποσυνδεθείτε.</translation> <translation id="8855885154700222542">Πλήκτρο πλήρους οθόνης</translation> +<translation id="8858369206579825206">Στοιχεία ελέγχου απορρήτου</translation> <translation id="8870509716567206129">Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης.</translation> <translation id="8874184842967597500">Καμία σύνδεση</translation> <translation id="8876661425082386199">Ελέγξτε τη σύνδεσή σας</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index e33a6bec..91dd857f 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Your PIN or password still couldn't be verified. Note: If you recently changed your password, use your old password. Your new password will be applied once you've signed out.</translation> <translation id="8855885154700222542">Full-screen key</translation> +<translation id="8858369206579825206">Privacy controls</translation> <translation id="8870509716567206129">App does not support split-screen.</translation> <translation id="8874184842967597500">Not connected</translation> <translation id="8876661425082386199">Check your connection</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 49677aa..87185aa 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Tecla de búsqueda + Esc</translation> <translation id="8853703225951107899">Aún no se pudo verificar tu PIN o contraseña. Nota: Si cambiaste la contraseña recientemente, usa la anterior. Se aplicará la nueva cuando salgas de la cuenta.</translation> <translation id="8855885154700222542">Tecla de pantalla completa</translation> +<translation id="8858369206579825206">Controles de privacidad</translation> <translation id="8870509716567206129">La app no es compatible con la función de pantalla dividida.</translation> <translation id="8874184842967597500">No conectado</translation> <translation id="8876661425082386199">Revisa tu conexión</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 9aab5c1..7b70fd7 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Buscar+Esc</translation> <translation id="8853703225951107899">Todavía no se ha podido verificar tu PIN o contraseña. Nota: Si has cambiado la contraseña recientemente, utiliza la contraseña anterior. La nueva contraseña se aplicará cuando hayas cerrado la sesión.</translation> <translation id="8855885154700222542">Tecla de pantalla completa</translation> +<translation id="8858369206579825206">Controles de privacidad</translation> <translation id="8870509716567206129">La aplicación no admite la pantalla dividida.</translation> <translation id="8874184842967597500">No conectado</translation> <translation id="8876661425082386199">Comprobar tu conexión</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index fe00b3e2..a84363f4 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Otsing + ESC</translation> <translation id="8853703225951107899">Teie PIN-koodi või parooli ei saanud ikka kinnitada. Märkus. Kui muutsite hiljuti parooli, siis kasutage vana parooli. Uus parool rakendatakse väljalogimisel.</translation> <translation id="8855885154700222542">Täisekraani klahv</translation> +<translation id="8858369206579825206">Privaatsuse seaded</translation> <translation id="8870509716567206129">Rakendus ei toeta jagatud ekraani.</translation> <translation id="8874184842967597500">Ühendus puudub</translation> <translation id="8876661425082386199">Kontrollige ühendust</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index d47fd0b..75bc20f 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Bilaketa + Ihes</translation> <translation id="8853703225951107899">Oraindik ezin izan da egiaztatu PINa edo pasahitza. Oharra: pasahitza duela gutxi aldatu baduzu, erabili pasahitz zaharra. Saioa amaitu eta gero aplikatuko da pasahitz berria.</translation> <translation id="8855885154700222542">Pantaila osoaren tekla</translation> +<translation id="8858369206579825206">Pribatutasun-ezarpenak</translation> <translation id="8870509716567206129">Aplikazioak ez du onartzen pantaila zatitua erabiltzea.</translation> <translation id="8874184842967597500">Konektatu gabe</translation> <translation id="8876661425082386199">Egiaztatu konektatuta zaudela</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 8b5dbaae..2e9e188 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -1464,6 +1464,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">همچنان نمیتوان پین یا گذرواژه را تأیید کرد. توجه: اگر اخیراً گذرواژهتان را تغییر دادهاید، از گذرواژه قدیمیتان استفاده کنید. گذرواژه جدیدتان بعد از خروج شما از سیستم اعمال میشود.</translation> <translation id="8855885154700222542">کلید تمامصفحه</translation> +<translation id="8858369206579825206">تنظیمات حریم خصوصی</translation> <translation id="8870509716567206129">برنامه از تقسیم صفحه پشتیبانی نمیکند.</translation> <translation id="8874184842967597500">متصل نیست</translation> <translation id="8876661425082386199">بررسی اتصال</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index fb9a347f..e472bfb 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Haku+Esc</translation> <translation id="8853703225951107899">PIN-koodiasi tai salasanaasi ei voitu vieläkään vahvistaa. Huom. Jos vaihdoit salasanasi äskettäin, käytä vanhaa salasanaa. Uusi salasana otetaan käyttöön kirjauduttuasi ulos.</translation> <translation id="8855885154700222542">Koko näyttö ‑näppäin</translation> +<translation id="8858369206579825206">Yksityisyysasetukset</translation> <translation id="8870509716567206129">Sovellus ei tue jaetun näytön tilaa.</translation> <translation id="8874184842967597500">Ei yhdistetty</translation> <translation id="8876661425082386199">Tarkista yhteys</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index d7a5c11..b99978c 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Hindi pa rin ma-verify ang iyong PIN o password. Tandaan: Kung pinalitan mo kamakailan ang iyong password, gamitin ang lumang password mo. Malalapat ang iyong bagong password kapag nag-sign out ka.</translation> <translation id="8855885154700222542">Key ng fullscreen</translation> +<translation id="8858369206579825206">Mga kontrol sa privacy</translation> <translation id="8870509716567206129">Hindi sinusuportahan ng app ang split-screen.</translation> <translation id="8874184842967597500">Hindi konekta</translation> <translation id="8876661425082386199">Suriin ang iyong koneksyon</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 3f682f90..161ffd0 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Recherche+Échap</translation> <translation id="8853703225951107899">Votre NIP ou votre mot de passe n'a toujours pas pu être vérifié. Remarque : Si vous avez récemment changé votre mot de passe, servez-vous de votre ancien mot de passe. Votre nouveau mot de passe sera appliqué lorsque vous vous déconnecterez.</translation> <translation id="8855885154700222542">Touche mode Plein écran</translation> +<translation id="8858369206579825206">Paramètres de confidentialité</translation> <translation id="8870509716567206129">L'application n'est pas compatible avec l'écran partagé.</translation> <translation id="8874184842967597500">Non connecté</translation> <translation id="8876661425082386199">Vérifiez votre connexion</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 3f490ca964b..755677a 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -1464,6 +1464,7 @@ <translation id="8850991929411075241">Recherche+Échap</translation> <translation id="8853703225951107899">Impossible de valider votre code ou votre mot de passe pour la deuxième fois. Remarque : si vous avez modifié votre mot de passe récemment, utilisez l'ancien. Votre nouveau mot de passe ne sera appliqué qu'une fois que vous serez déconnecté.</translation> <translation id="8855885154700222542">Touche de plein écran</translation> +<translation id="8858369206579825206">Paramètres de confidentialité</translation> <translation id="8870509716567206129">Application incompatible avec l'écran partagé.</translation> <translation id="8874184842967597500">Non connecté</translation> <translation id="8876661425082386199">Vérifier votre connexion</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index d4db7cb..a0c087bb 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Busca+Esc</translation> <translation id="8853703225951107899">Aínda non se puido verificar o teu PIN ou contrasinal. Nota: Se cambiaches o contrasinal recentemente, utiliza o antigo. O contrasinal novo aplicarase en canto peches sesión.</translation> <translation id="8855885154700222542">Tecla de pantalla completa</translation> +<translation id="8858369206579825206">Controis de privacidade</translation> <translation id="8870509716567206129">A aplicación non é compatible coa función de pantalla dividida.</translation> <translation id="8874184842967597500">Non conectada</translation> <translation id="8876661425082386199">Comproba a conexión</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 768edf3a..baf609c 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">તમારો પિન કે પાસવર્ડ હજી પણ ચકાસી શકાયો નથી. નોંધ: જો તમે તમારો પાસવર્ડ તાજેતરમાં બદલ્યો હોય, તો તમારા જૂના પાસવર્ડનો ઉપયોગ કરો. એકવાર તમે સાઇન આઉટ કરો, તે પછી તમારો નવો પાસવર્ડ લાગુ કરવામાં આવશે.</translation> <translation id="8855885154700222542">પૂર્ણસ્ક્રીન કી</translation> +<translation id="8858369206579825206">પ્રાઇવસીને લગતાં નિયંત્રણ</translation> <translation id="8870509716567206129">ઍપ સ્ક્રીન-વિભાજનને સહાય કરતી નથી.</translation> <translation id="8874184842967597500">કનેક્ટ નથી</translation> <translation id="8876661425082386199">તમારું કનેક્શન ચેક કરો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index f4e99fa..b62b27a 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">अब भी आपके पिन या पासवर्ड की पुष्टि नहीं की जा सकी. ध्यान दें: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो पुराना पासवर्ड इस्तेमाल करें. नया पासवर्ड आपके साइन आउट करने के बाद लागू होगा.</translation> <translation id="8855885154700222542">फ़ुलस्क्रीन कुंजी</translation> +<translation id="8858369206579825206">निजता सेटिंग</translation> <translation id="8870509716567206129">ऐप्लिकेशन दो-स्क्रीन मोड में काम नहीं करता है.</translation> <translation id="8874184842967597500">कनेक्ट नहीं है</translation> <translation id="8876661425082386199">अपने कनेक्शन की जांच करें</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 7d89339..2c6b766 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -548,6 +548,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, Učitavanje događaja.</translation> <translation id="3932043219784172185">Nije povezan nijedan uređaj</translation> <translation id="3934456833412894880">Uključeno je adaptivno punjenje. Baterija će ostati na 80% kako bi se produljilo trajanje baterije i napunjena kad vam zatreba.</translation> +<translation id="3936620957945677513">Pritisnite tipku Enter da biste se pridružili događaju <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Zalijepi</translation> <translation id="394485226368336402">Postavke zvuka</translation> <translation id="3945319193631853098">Dodirnite da biste dovršili postavljanje</translation> @@ -1465,6 +1466,7 @@ <translation id="8850991929411075241">Pretraživanje + Esc</translation> <translation id="8853703225951107899">Bez obzira na to, vaš PIN ili zaporku nije bilo moguće potvrditi. Napomena: ako ste nedavno promijenili zaporku, upotrijebite staru zaporku. Vaša nova zaporka primijenit će se nakon što se odjavite.</translation> <translation id="8855885154700222542">tipka cijelog zaslona</translation> +<translation id="8858369206579825206">Kontrole privatnosti</translation> <translation id="8870509716567206129">Aplikacija ne podržava podijeljeni zaslon.</translation> <translation id="8874184842967597500">Niste povezani</translation> <translation id="8876661425082386199">Provjerite vezu</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 228a858..e8e896d 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Keresés+Esc</translation> <translation id="8853703225951107899">PIN-kódjának vagy jelszavának ellenőrzése még mindig nem sikerült. Megjegyzés: Ha nemrég módosította jelszavát, akkor használja a régit. Az új jelszó beállítása a kijelentkezés után lép érvénybe.</translation> <translation id="8855885154700222542">Teljes képernyő billentyű</translation> +<translation id="8858369206579825206">Adatvédelmi beállítások</translation> <translation id="8870509716567206129">Az alkalmazás nem támogatja az osztott képernyős nézetet.</translation> <translation id="8874184842967597500">Nincs csatl.</translation> <translation id="8876661425082386199">Ellenőrizze az internetkapcsolatot</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 1f4adce..04e716ef6 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -1464,6 +1464,7 @@ <translation id="8850991929411075241">Որոնել+Esc</translation> <translation id="8853703225951107899">Չհաջողվեց հաստատել ձեր PIN կոդը կամ գաղտնաբառը։ Նշում․ եթե դուք վերջերս փոխել եք ձեր գաղտնաբառը, ապա օգտագործեք հինը։ Ձեր նոր գաղտնաբառն ուժի մեջ կմտնի, երբ դուրս գաք հաշվից։</translation> <translation id="8855885154700222542">Լիաէկրան ռեժիմի ստեղն</translation> +<translation id="8858369206579825206">Գաղտնիության կարգավորումներ</translation> <translation id="8870509716567206129">Հավելվածը չի աջակցում էկրանի տրոհումը:</translation> <translation id="8874184842967597500">Կապ չկա</translation> <translation id="8876661425082386199">Ստուգեք ձեր կապը</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index a9abb086..57c3e4c0 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">PIN atau sandi Anda belum dapat diverifikasi. Catatan: Jika Anda baru-baru ini mengubah sandi, gunakan sandi lama Anda. Sandi baru akan diterapkan setelah Anda logout.</translation> <translation id="8855885154700222542">Tombol layar penuh</translation> +<translation id="8858369206579825206">Kontrol privasi</translation> <translation id="8870509716567206129">Aplikasi tidak mendukung layar terpisah.</translation> <translation id="8874184842967597500">Tak terhubung</translation> <translation id="8876661425082386199">Periksa koneksi Anda</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 3a85ad4..b25cc9a 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Enn tókst ekki að staðfesta PIN-númerið eða aðgangsorðið. Athugaðu: Ef þú skiptir nýlega um aðgangsorð skaltu nota gamla aðgangsorðið. Nýja aðgangsorðið tekur gildi þegar þú hefur skráð þig út.</translation> <translation id="8855885154700222542">Lykill fyrir allan skjáinn</translation> +<translation id="8858369206579825206">Persónuverndarstillingar</translation> <translation id="8870509716567206129">Forritið styður ekki að skjánum sé skipt.</translation> <translation id="8874184842967597500">Ekki tengt</translation> <translation id="8876661425082386199">Athugaðu tenginguna</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index c08911b..dbda3e8 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -550,6 +550,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, caricamento eventi in corso…</translation> <translation id="3932043219784172185">Nessun dispositivo connesso</translation> <translation id="3934456833412894880">Ricarica adattiva attiva. La batteria rimarrà all'80% per farla durare di più e verrà ricaricata completamente quando ti servirà.</translation> +<translation id="3936620957945677513">Premi Invio per partecipare all'evento <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Incolla</translation> <translation id="394485226368336402">Impostazioni audio</translation> <translation id="3945319193631853098">Tocca per completare la configurazione</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Tasto di ricerca+ESC</translation> <translation id="8853703225951107899">Non è stato di nuovo possibile verificare il PIN o la password. Nota: se hai modificato la password di recente, usa la password precedente. La nuova password verrà applicata quando uscirai dall'account.</translation> <translation id="8855885154700222542">Tasto schermo intero</translation> +<translation id="8858369206579825206">Controlli per la privacy</translation> <translation id="8870509716567206129">L'app non supporta la modalità Schermo diviso.</translation> <translation id="8874184842967597500">Non connesso</translation> <translation id="8876661425082386199">Controlla la connessione</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index add8db7..632077e24 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, האירועים בטעינה.</translation> <translation id="3932043219784172185">אין מכשיר מחובר</translation> <translation id="3934456833412894880">הטעינה הדינמית מופעלת. רמת הטעינה של הסוללה תישאר על 80% כדי להאריך את חיי הסוללה, ותתבצע טעינה מלאה כשיהיה בכך צורך.</translation> +<translation id="3936620957945677513">צריך להקיש על Enter כדי להצטרף לאירוע '<ph name="EVENT_SUMMARY" />'</translation> <translation id="3943857333388298514">הדבקה</translation> <translation id="394485226368336402">הגדרות אודיו</translation> <translation id="3945319193631853098">יש להקיש כדי להשלים את ההגדרה</translation> @@ -1468,6 +1469,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">לא הצלחנו לאמת את קוד האימות או את הסיסמה שלך. הערה: אם שינית לאחרונה את הסיסמה, עליך לנסות להיכנס עם הסיסמה הישנה. הסיסמה החדשה תיכנס לתוקף לאחר היציאה מהחשבון.</translation> <translation id="8855885154700222542">מקש מסך מלא</translation> +<translation id="8858369206579825206">אמצעי בקרה על פרטיות</translation> <translation id="8870509716567206129">האפליקציה אינה תומכת במסך מפוצל.</translation> <translation id="8874184842967597500">לא מחובר</translation> <translation id="8876661425082386199">מומלץ לבדוק את החיבור</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 8a1b0d8..68f13c26 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">PIN またはパスワードはまだ確認されていません。注: パスワードを最近変更した場合は、古いパスワードを使用してください。新しいパスワードはログアウトした後に適用されます。</translation> <translation id="8855885154700222542">全画面表示キー</translation> +<translation id="8858369206579825206">プライバシー管理</translation> <translation id="8870509716567206129">アプリで分割画面がサポートされていません。</translation> <translation id="8874184842967597500">未接続</translation> <translation id="8876661425082386199">接続を確認してください</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 86af8713..eb90372 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, მომდინარეობს მოვლენების ჩატვირთვა.</translation> <translation id="3932043219784172185">დაკავშირებული მოწყობილობები არ არის</translation> <translation id="3934456833412894880">ადაპტირებადი დატენა ჩართულია. ბატარეის ვარგისიანობის გასახანგრძლივებლად ის დარჩება 80%-ზე და სრულად დაიტენება, როცა დაგჭირდებათ.</translation> +<translation id="3936620957945677513">ღონისძიებაში „<ph name="EVENT_SUMMARY" />“ რომ ჩაერთოთ, დააჭირეთ ღილაკს Enter</translation> <translation id="3943857333388298514">ჩასმა</translation> <translation id="394485226368336402">აუდიოს პარამეტრები</translation> <translation id="3945319193631853098">შეეხეთ დაყენების დასასრულებლად</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">თქვენი PIN-კოდის ან პაროლის დადასტურება კვლავ ვერ მოხერხდა. გაითვალისწინეთ: თუ ახლახან შეცვალეთ პაროლი, გამოიყენეთ თქვენი ძველი პაროლი. ახალი პაროლი ძალაში შევა, როცა სისტემიდან გახვალთ.</translation> <translation id="8855885154700222542">სრულეკრანიან რეჟიმზე გადართვის კლავიში</translation> +<translation id="8858369206579825206">კონფიდენციალურობის მართვის პარამეტრები</translation> <translation id="8870509716567206129">ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ.</translation> <translation id="8874184842967597500">არ არის დაკავშირებული</translation> <translation id="8876661425082386199">შეამოწმეთ კავშირი</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 35276f0d..14e8d3e 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, іс-шаралар жүктелуде.</translation> <translation id="3932043219784172185">Жалғанған құрылғы жоқ.</translation> <translation id="3934456833412894880">Бейімдеп зарядтау функциясы қосулы. Батарея өз жұмысын ұзарту үшін заряд деңгейін 80% күйінде ұстап тұрады, ал керек кезде толық зарядталады.</translation> +<translation id="3936620957945677513"><ph name="EVENT_SUMMARY" /> оқиғасына қосылу үшін Enter пернесін басыңыз</translation> <translation id="3943857333388298514">Қою</translation> <translation id="394485226368336402">Аудио параметрлері</translation> <translation id="3945319193631853098">Реттеуді аяқтау үшін түртіңіз.</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">PIN кодыңыз не құпия сөзіңіз әлі расталмады. Ескертпе: құпия сөзіңізді жақында өзгерткен болсаңыз, бұрынғы құпия сөзіңізді пайдаланыңыз. Жаңа құпия сөз, аккаунттан шыққаннан кейін, күшіне енеді.</translation> <translation id="8855885154700222542">Толық экран пернесі</translation> +<translation id="8858369206579825206">Құпиялық параметрлері</translation> <translation id="8870509716567206129">Қолданба бөлінген экранды қолдамайды.</translation> <translation id="8874184842967597500">Қосылмаған</translation> <translation id="8876661425082386199">Интернет байланысын тексеріңіз.</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 4798306..aad81a6ad 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">នៅតែមិនអាចផ្ទៀងផ្ទាត់កូដ PIN ឬពាក្យសម្ងាត់របស់អ្នកបានដដែល។ ចំណាំ៖ ប្រសិនបើអ្នកបានប្ដូរពាក្យសម្ងាត់របស់អ្នកថ្មីៗនេះ សូមប្រើពាក្យសម្ងាត់ចាស់របស់អ្នក។ ពាក្យសម្ងាត់ថ្មីរបស់អ្នកនឹងត្រូវបានប្រើ បន្ទាប់ពីអ្នកចេញពីគណនី។</translation> <translation id="8855885154700222542">គ្រាប់ចុចពេញអេក្រង់</translation> +<translation id="8858369206579825206">ការគ្រប់គ្រងឯកជនភាព</translation> <translation id="8870509716567206129">កម្មវិធីមិនស្គាល់អេក្រង់បំបែកទេ។</translation> <translation id="8874184842967597500">មិនបានភ្ជាប់ទេ</translation> <translation id="8876661425082386199">សូមពិនិត្យមើលការតភ្ជាប់របស់អ្នក</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 1cccb0b..eb464af 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, ಈವೆಂಟ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation> <translation id="3932043219784172185">ಯಾವುದೇ ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿಲ್ಲ</translation> <translation id="3934456833412894880">ಅಡಾಪ್ಟಿವ್ ಚಾರ್ಜಿಂಗ್ ಆನ್ ಆಗಿದೆ. ಬ್ಯಾಟರಿ ಅವಧಿಯನ್ನು ವಿಸ್ತರಿಸಲು ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ಶೇಕಡಾ 80 ರಷ್ಟು ಇರುತ್ತದೆ ಮತ್ತು ನಿಮಗೆ ಅಗತ್ಯವಿರುವಾಗ ಸಂಪೂರ್ಣವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತದೆ.</translation> +<translation id="3936620957945677513"><ph name="EVENT_SUMMARY" /> ಈವೆಂಟ್ಗೆ ಸೇರಿಕೊಳ್ಳಲು Enter ಬಟನ್ ಒತ್ತಿ</translation> <translation id="3943857333388298514">ಅಂಟಿಸು</translation> <translation id="394485226368336402">ಆಡಿಯೋ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="3945319193631853098">ಸೆಟಪ್ ಪೂರ್ಣಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">ಹುಡುಕಾಟ+Esc</translation> <translation id="8853703225951107899">ನಿಮ್ಮ ಪಿನ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಗಮನಿಸಿ: ನೀವು ಇತ್ತೀಚೆಗೆ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬದಲಾಯಿಸಿದ್ದರೆ, ನಿಮ್ಮ ಹಳೆಯ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ. ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ ನಿಮ್ಮ ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="8855885154700222542">ಪೂರ್ಣಪರದೆ ಕೀ</translation> +<translation id="8858369206579825206">ಗೌಪ್ಯತೆ ನಿಯಂತ್ರಣಗಳು</translation> <translation id="8870509716567206129">ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation> <translation id="8874184842967597500">ಕನೆಕ್ಟ್ ಆಗಿಲ್ಲ</translation> <translation id="8876661425082386199">ನಿಮ್ಮ ಕನೆಕ್ಷನ್ ಪರಿಶೀಲಿಸಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 96a733d..87208e5 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">여전히 PIN 또는 비밀번호를 확인할 수 없습니다. 참고: 최근에 비밀번호를 변경한 경우 이전 비밀번호를 사용해 보세요. 로그아웃하고 나면 새로운 비밀번호가 적용됩니다.</translation> <translation id="8855885154700222542">전체화면 키</translation> +<translation id="8858369206579825206">개인 정보 보호 설정</translation> <translation id="8870509716567206129">앱이 화면 분할을 지원하지 않습니다.</translation> <translation id="8874184842967597500">연결되지 않음</translation> <translation id="8876661425082386199">연결 상태 확인</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 352d3f3..1dad58ad 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">PIN кодуңуз же сырсөзүңүз дагы эле ырасталган жок. Эскертүү: Эгер жакында сырсөзүңүздү өзгөрткөн болсоңуз, эски сырсөзүңүздү колдонуңуз. Жаңы сырсөзүңүз аккаунтуңуздан чыккандан кийин колдонулат.</translation> <translation id="8855885154700222542">Толук экран режиминин ачкычы</translation> +<translation id="8858369206579825206">Купуялык параметрлери</translation> <translation id="8870509716567206129">Колдонмодо экран бөлүнбөйт.</translation> <translation id="8874184842967597500">Интернет жок</translation> <translation id="8876661425082386199">Туташууңузду текшериңиз</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index d87bdfe..296ec32f 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">ຍັງບໍ່ສາມາດຢັ້ງຢືນ PIN ຫຼື ລະຫັດຜ່ານຂອງທ່ານໄດ້. ໝາຍເຫດ: ຖ້າທ່ານໄດ້ປ່ຽນລະຫັດຜ່ານຂອງທ່ານເມື່ອບໍ່ດົນມານີ້, ກະລຸນາໃຊ້ລະຫັດຜ່ານເກົ່າຂອງທ່ານ. ຈະມີການນຳໃຊ້ລະຫັດຜ່ານໃໝ່ຂອງທ່ານເມື່ອທ່ານອອກຈາກລະບົບແລ້ວ.</translation> <translation id="8855885154700222542">ປຸ່ມເຕັມຈໍ</translation> +<translation id="8858369206579825206">ການຄວບຄຸມຄວາມເປັນສ່ວນຕົວ</translation> <translation id="8870509716567206129">ແອັບບໍ່ຮອງຮັບໜ້າຈໍແບບແຍກກັນ.</translation> <translation id="8874184842967597500">ບໍ່ໄດ້ເຊື່ອມຕໍ່</translation> <translation id="8876661425082386199">ກະລຸນາກວດສອບການເຊື່ອມຕໍ່ຂອງທ່ານ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index a7940a34..0d18ed2 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Paieškos klavišas + „Esc“</translation> <translation id="8853703225951107899">Vis tiek nepavyko patvirtinti PIN kodo arba slaptažodžio. Pastaba: jei neseniai pakeitėte slaptažodį, naudokite senąjį. Naujas slaptažodis bus pritaikytas atsijungus.</translation> <translation id="8855885154700222542">Viso ekrano klavišas</translation> +<translation id="8858369206579825206">Privatumo valdikliai</translation> <translation id="8870509716567206129">Programoje nepalaikomas skaidytas ekranas.</translation> <translation id="8874184842967597500">Neprisijungta</translation> <translation id="8876661425082386199">Ryšio patikra</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index d47b470..0b6f76d5 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Joprojām nevarēja verificēt jūsu PIN vai paroli. Piezīme. Ja nesen mainījāt paroli, izmantojiet iepriekšējo paroli. Jaunā parole tiks lietota pēc izrakstīšanās.</translation> <translation id="8855885154700222542">Pilnekrāna taustiņš</translation> +<translation id="8858369206579825206">Konfidencialitātes vadīklas</translation> <translation id="8870509716567206129">Lietotnē netiek atbalstīta ekrāna sadalīšana.</translation> <translation id="8874184842967597500">Savienojums nav izveidots</translation> <translation id="8876661425082386199">Savienojuma pārbaude</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 72dea2e..40193e8 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Пребарај+Esc</translation> <translation id="8853703225951107899">Сѐ уште не може да се потврди PIN-кодот или лозинката. Забелешка: ако неодамна сте ја промениле лозинката, користете ја вашата стара лозинка. Новата лозинка ќе се примени откако ќе се одјавите.</translation> <translation id="8855885154700222542">Копче за цел екран</translation> +<translation id="8858369206579825206">Контроли на приватноста</translation> <translation id="8870509716567206129">Апликацијата не поддржува поделен екран.</translation> <translation id="8874184842967597500">Не е поврзано</translation> <translation id="8876661425082386199">Проверете ја врската</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index b0ee2d1..a4ed033 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, ഇവന്റുകൾ ലോഡ് ചെയ്യുന്നു.</translation> <translation id="3932043219784172185">ഉപകരണമൊന്നും കണക്റ്റ് ചെയ്തിട്ടില്ല</translation> <translation id="3934456833412894880">അഡാപ്റ്റീവ് ചാർജിംഗ് ഓണാണ്. ബാറ്ററി ലൈഫ് വർദ്ധിപ്പിക്കുന്നതിന് നിങ്ങളുടെ ബാറ്ററി ചാർജ് 80% എന്ന നിലയിൽ തുടരും, നിങ്ങൾക്ക് ആവശ്യമുള്ളപ്പോൾ അത് പൂർണ്ണമായി ചാർജ് ചെയ്യും.</translation> +<translation id="3936620957945677513"><ph name="EVENT_SUMMARY" /> എന്ന ഇവന്റിൽ ചേരാൻ Enter അമർത്തുക</translation> <translation id="3943857333388298514">ഒട്ടിക്കുക</translation> <translation id="394485226368336402">ഓഡിയോ ക്രമീകരണം</translation> <translation id="3945319193631853098">സജ്ജീകരണം പൂർത്തിയാക്കാൻ ടാപ്പ് ചെയ്യുക</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">തിരയൽ+Esc</translation> <translation id="8853703225951107899">നിങ്ങളുടെ പിൻ അല്ലെങ്കിൽ പാസ്വേഡ് ഇപ്പോഴും പരിശോധിച്ചുറപ്പിക്കാനായില്ല. ശ്രദ്ധിക്കുക: നിങ്ങൾ അടുത്തിടെ പാസ്വേഡ് മാറ്റിയിട്ടുണ്ടെങ്കിൽ, നിങ്ങളുടെ പഴയ പാസ്വേഡ് ഉപയോഗിക്കുക. സൈൻ ഔട്ട് ചെയ്തുകഴിഞ്ഞാൽ നിങ്ങളുടെ പുതിയ പാസ്വേഡ് ബാധകമാകും.</translation> <translation id="8855885154700222542">പൂർണ്ണ സ്ക്രീൻ കീ</translation> +<translation id="8858369206579825206">സ്വകാര്യതാ നിയന്ത്രണങ്ങൾ</translation> <translation id="8870509716567206129">സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല.</translation> <translation id="8874184842967597500">കണക്റ്റല്ല</translation> <translation id="8876661425082386199">നിങ്ങളുടെ കണക്ഷൻ പരിശോധിക്കുക</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 19e2761..91eb09a 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -1468,6 +1468,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Таны ПИН эсвэл нууц үгийг баталгаажуулж чадаагүй хэвээрээ байна. Тайлбар: Хэрэв та нууц үгээ саяхан сольсон бол хуучин нууц үгээ ашиглана уу. Таныг гарсны дараа, шинэ нууц үгийг ашиглах боломжтой болно.</translation> <translation id="8855885154700222542">Бүтэн дэлгэцийн түлхүүр</translation> +<translation id="8858369206579825206">Нууцлалын тохиргоо</translation> <translation id="8870509716567206129">Апп нь дэлгэц хуваах тохиргоог дэмждэггүй.</translation> <translation id="8874184842967597500">Холбогдоогүй</translation> <translation id="8876661425082386199">Холболтоо шалгана уу</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index c46ae49..3846be7 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">तुमच्या पिन किंवा पासवर्डची अद्याप पडताळणी करता आली नाही. टीप: तुम्ही अलीकडेच तुमचा पासवर्ड बदलला असल्यास, जुना पासवर्ड वापरा. तुम्ही साइन आउट केल्यानंतर तुमचा नवीन पासवर्ड लागू केला जाईल.</translation> <translation id="8855885154700222542">क्षेत्रे की</translation> +<translation id="8858369206579825206">गोपनीयता नियंत्रणे</translation> <translation id="8870509716567206129">अॅप विभाजित-स्क्रीनला सपोर्ट करत नाही.</translation> <translation id="8874184842967597500">कनेक्ट नाही</translation> <translation id="8876661425082386199">तुमचे कनेक्शन तपासा</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 51a11771..c6654b8 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Carian+Esc</translation> <translation id="8853703225951107899">PIN atau kata laluan anda masih tidak dapat disahkan. Nota: Jika anda menukar kata laluan anda baru-baru ini, gunakan kata laluan lama anda. Kata laluan baharu anda akan digunakan apabila anda log keluar.</translation> <translation id="8855885154700222542">Kekunci skrin penuh</translation> +<translation id="8858369206579825206">Kawalan privasi</translation> <translation id="8870509716567206129">Apl tidak menyokong skrin pisah.</translation> <translation id="8874184842967597500">Tidak bersambung</translation> <translation id="8876661425082386199">Semak sambungan anda</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 61aa735..9d1193c 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">ရှာဖွေမှု+Esc</translation> <translation id="8853703225951107899">သင့်ပင်နံပါတ် သို့မဟုတ် စကားဝှက်ကို စစ်ဆေး၍မရနိုင်သေးပါ။ မှတ်ချက် - လတ်တလောတွင် သင့်စကားဝှက်ကို ပြောင်းထားပါက စကားဝှက်အဟောင်းကို သုံးပါ။ ထွက်ပြီးသည့်အခါ စကားဝှက်အသစ်ကို အသုံးပြုပါမည်။</translation> <translation id="8855885154700222542">မျက်နှာပြင်ပြည့် ခလုတ်</translation> +<translation id="8858369206579825206">ကိုယ်ရေးအချက်အလက် လုံခြုံမှုဆိုင်ရာ ထိန်းချုပ်မှုများ</translation> <translation id="8870509716567206129">အက်ပ်သည် မျက်နှာပြင်ခွဲပြခြင်းကို ပံ့ပိုးမထားပါ။</translation> <translation id="8874184842967597500">ချိတ်ဆက် မထား</translation> <translation id="8876661425082386199">သင့်ချိတ်ဆက်မှုကို စစ်ဆေးပါ</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 55be6fe8..35021dc 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">तपाईंको PIN वा पासवर्ड अझै पनि पुष्टि गर्न सकिएन। याद राख्नुहोस्: तपाईंले हालसालै आफ्नो पासवर्ड बदल्नुभएको छ भने आफ्नो पुरानो पासवर्ड प्रयोग गरी साइन इन गर्नुहोस्। तपाईं साइन आउट हुनेबित्तिकै तपाईंको नयाँ पासवर्डले काम गर्न थाल्ने छ।</translation> <translation id="8855885154700222542">फुल स्क्रिन नामक कुञ्जी</translation> +<translation id="8858369206579825206">गोपनीयतासम्बन्धी सेटिङ</translation> <translation id="8870509716567206129">अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।</translation> <translation id="8874184842967597500">जडित छैन</translation> <translation id="8876661425082386199">आफ्नो यन्त्रको ब्लुटुथ वा Wi-Fi कनेक्सन जाँच्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 6cfecb4..a00535a 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -1463,6 +1463,7 @@ <translation id="8850991929411075241">Zoeken+Esc</translation> <translation id="8853703225951107899">Je pincode of wachtwoord kan nog steeds niet worden geverifieerd. Opmerking: Als je onlangs je wachtwoord hebt gewijzigd, gebruik je je oude wachtwoord. Je nieuwe wachtwoord wordt toegepast zodra je uitlogt.</translation> <translation id="8855885154700222542">Toets voor volledig scherm</translation> +<translation id="8858369206579825206">Privacyopties</translation> <translation id="8870509716567206129">App biedt geen ondersteuning voor gesplitst scherm.</translation> <translation id="8874184842967597500">Niet verbonden</translation> <translation id="8876661425082386199">Je verbinding checken</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index e84e8df7..8e2b420c 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Søk+Esc</translation> <translation id="8853703225951107899">PIN-koden eller passordet kunne fremdeles ikke verifiseres. Merk: Hvis du nylig har byttet passord, bruker du det gamle passordet. Det nye passordet blir tatt i bruk når du logger av.</translation> <translation id="8855885154700222542">Tast for fullskjermmodus</translation> +<translation id="8858369206579825206">Personverninnstillinger</translation> <translation id="8870509716567206129">Appen støtter ikke delt skjerm.</translation> <translation id="8874184842967597500">Ikke tilkoblet</translation> <translation id="8876661425082386199">Sjekk tilkoblingen din</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index bbb9564..25153f3 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -1464,6 +1464,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">ଆପଣଙ୍କ PIN କିମ୍ବା ପାସୱାର୍ଡକୁ ଏବେ ବି ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଧ୍ୟାନ ଦିଅନ୍ତୁ: ଯଦି ଆପଣ ଆପଣଙ୍କ ପାସୱାର୍ଡକୁ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିଛନ୍ତି, ତେବେ ପୁରୁଣା ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ। ଆପଣ ସାଇନ୍ ଆଉଟ୍ କରିବା ପରେ ଆପଣଙ୍କ ନୂଆ ପାସୱାର୍ଡ ଲାଗୁ ହେବ।</translation> <translation id="8855885154700222542">ପୂର୍ଣ୍ଣସ୍କ୍ରିନ୍ କୀ</translation> +<translation id="8858369206579825206">ଗୋପନୀୟତା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ</translation> <translation id="8870509716567206129">ଆପ୍ ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନକୁ ସମର୍ଥନ କରେନାହିଁ।</translation> <translation id="8874184842967597500">ସଂଯୁକ୍ତ ନାହିଁ</translation> <translation id="8876661425082386199">ଆପଣଙ୍କର ସଂଯୋଗ ଯାଞ୍ଚ କରନ୍ତୁ</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index b23d4af..ea7ccaba 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">ਤੁਹਾਡੇ ਪਿੰਨ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਹਾਲੇ ਵੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਨੋਟ ਕਰੋ: ਜੇ ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਹੈ, ਤਾਂ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤੋ। ਇੱਕ ਵਾਰ ਸਾਈਨ-ਆਊਟ ਕਰਨ 'ਤੇ ਤੁਹਾਡਾ ਨਵਾਂ ਪਾਸਵਰਡ ਲਾਗੂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="8855885154700222542">ਪੂਰੀ-ਸਕ੍ਰੀਨ ਕੁੰਜੀ</translation> +<translation id="8858369206579825206">ਪਰਦੇਦਾਰੀ ਕੰਟਰੋਲ</translation> <translation id="8870509716567206129">ਐਪ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।</translation> <translation id="8874184842967597500">ਕਨੈਕਟ ਨਹੀਂ ਹੈ</translation> <translation id="8876661425082386199">ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 8f874c7..4f81d26a 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, ładuję wydarzenia.</translation> <translation id="3932043219784172185">Brak podłączonych urządzeń</translation> <translation id="3934456833412894880">Włączono ładowanie adaptacyjne. Bateria będzie się ładować do 80%, co pozwoli wydłużyć jej żywotność. Jeśli będziesz tego potrzebować, będzie mogła naładować się do pełna.</translation> +<translation id="3936620957945677513">Naciśnij Enter, aby dołączyć do wydarzenia <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Wklej</translation> <translation id="394485226368336402">Ustawienia dźwięku</translation> <translation id="3945319193631853098">Kliknij, aby dokończyć konfigurację</translation> @@ -1465,6 +1466,7 @@ <translation id="8850991929411075241">Szukaj+Esc</translation> <translation id="8853703225951107899">Nadal nie udało się zweryfikować Twojego hasła ani kodu PIN. Uwaga: jeśli Twoje hasło zostało ostatnio zmienione, użyj starego hasła. Nowe hasło zacznie obowiązywać, gdy się wylogujesz.</translation> <translation id="8855885154700222542">Klawisz trybu pełnoekranowego</translation> +<translation id="8858369206579825206">Ustawienia prywatności</translation> <translation id="8870509716567206129">Aplikacja nie obsługuje dzielonego ekranu.</translation> <translation id="8874184842967597500">Nie połączono</translation> <translation id="8876661425082386199">Sprawdź połączenie</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 8a7b547..3d6e376c 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Pesquisa+Esc</translation> <translation id="8853703225951107899">Ainda não foi possível verificar seu PIN ou sua senha. Observação: se você mudou a senha recentemente, use a antiga. A nova senha será aplicada depois que você sair.</translation> <translation id="8855885154700222542">Tecla de tela cheia</translation> +<translation id="8858369206579825206">Controles de privacidade</translation> <translation id="8870509716567206129">O app não é compatível com a divisão de tela.</translation> <translation id="8874184842967597500">Não conectado</translation> <translation id="8876661425082386199">Verifique sua conexão</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index b5331866d..c0599a84 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, a carregar eventos.</translation> <translation id="3932043219784172185">Nenhum dispositivo ligado</translation> <translation id="3934456833412894880">O carregamento adaptável está ativado. A bateria vai permanecer nos 80% para prolongar a autonomia da mesma e ser carregada totalmente quando precisar.</translation> +<translation id="3936620957945677513">Prima Enter para participar no evento <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Colar</translation> <translation id="394485226368336402">Definições de áudio</translation> <translation id="3945319193631853098">Toque para concluir a configuração.</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Pesquisa+Esc</translation> <translation id="8853703225951107899">Ainda não foi possível validar o seu PIN ou palavra-passe. Nota: se alterou a sua palavra-passe recentemente, utilize a palavra-passe antiga. A nova palavra-passe será aplicada quando terminar sessão.</translation> <translation id="8855885154700222542">Tecla de ecrã inteiro</translation> +<translation id="8858369206579825206">Controlos de privacidade</translation> <translation id="8870509716567206129">A aplicação não é compatível com o ecrã dividido.</translation> <translation id="8874184842967597500">Sem ligação</translation> <translation id="8876661425082386199">Verifique a sua ligação</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 8b063889..45a5ada0 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, Se încarcă evenimentele.</translation> <translation id="3932043219784172185">Niciun dispozitiv conectat</translation> <translation id="3934456833412894880">S-a activat încărcarea adaptabilă. Bateria va rămâne la 80 % pentru o autonomie mai mare și se va încărca la capacitate maximă când ai nevoie.</translation> +<translation id="3936620957945677513">Apasă pe Enter pentru a te alătura evenimentului <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Inserează</translation> <translation id="394485226368336402">Setări audio</translation> <translation id="3945319193631853098">Atinge pentru a finaliza configurarea</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Tasta de căutare + Esc</translation> <translation id="8853703225951107899">Codul PIN sau parola tot nu au putut fi confirmate. Notă: dacă ai schimbat parola recent, folosește vechea parolă. Noua parolă se va aplica după ce te deconectezi.</translation> <translation id="8855885154700222542">Tasta pentru ecran complet</translation> +<translation id="8858369206579825206">Opțiuni de confidențialitate</translation> <translation id="8870509716567206129">Aplicația nu acceptă ecranul împărțit.</translation> <translation id="8874184842967597500">Neconectat</translation> <translation id="8876661425082386199">Verifică-ți conexiunea</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index c7c81f6..2204403 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, загрузка мероприятий</translation> <translation id="3932043219784172185">Нет подключенных устройств</translation> <translation id="3934456833412894880">Адаптивная зарядка включена. Чтобы продлить срок службы батареи, заряд будет доводиться до уровня 80 % и удерживаться на нем. Полностью батарея будет заряжаться, только когда это необходимо.</translation> +<translation id="3936620957945677513">Чтобы присоединиться к мероприятию "<ph name="EVENT_SUMMARY" />", нажмите клавишу "Ввод"</translation> <translation id="3943857333388298514">Вставить</translation> <translation id="394485226368336402">Настройки звука</translation> <translation id="3945319193631853098">Нажмите, чтобы завершить настройку.</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Клавиша поиска + Esc</translation> <translation id="8853703225951107899">Введенный PIN-код или пароль снова оказался недействительным. Если вы недавно меняли пароль, введите прежний. Новый пароль вступит в силу после того, как вы выйдете из аккаунта.</translation> <translation id="8855885154700222542">Клавиша полноэкранного режима</translation> +<translation id="8858369206579825206">Настройки конфиденциальности</translation> <translation id="8870509716567206129">Приложение не поддерживает разделение экрана.j</translation> <translation id="8874184842967597500">Не подключено</translation> <translation id="8876661425082386199">Проверьте подключение</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 99d95abe..ed898e4 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">ඔබගේ PIN හෝ මුරපදය තවම සත්යාපනය කළ නොහැකි විය. සටහන: ඔබ මෑතකදී ඔබගේ මුරපදය වෙනස් කළේ නම්, ඔබගේ පැරණි මුරපදය භාවිතා කරන්න. ඔබ ඉවත් වූ පසු ඔබගේ නව මුරපදය අදාළ වේ.</translation> <translation id="8855885154700222542">සම්පූර්ණ තිරයේ යතුර</translation> +<translation id="8858369206579825206">පෞද්ගලිකත්ව පාලන</translation> <translation id="8870509716567206129">යෙදුම බෙදුණු-තිරයට සහාය නොදක්වයි.</translation> <translation id="8874184842967597500">සබඳවී නොමැත</translation> <translation id="8876661425082386199">ඔබේ සම්බන්ධතාවය පරීක්ෂා කරන්න</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 0697f3a8c..5aef0998 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -1465,6 +1465,7 @@ <translation id="8850991929411075241">Hľadať+Esc</translation> <translation id="8853703225951107899">Váš kód PIN alebo heslo sa stále nepodarilo overiť. Poznámka: Ak ste nedávno zmenili svoje heslo, použite predchádzajúce. Nové heslo bude uplatnené až po odhlásení.</translation> <translation id="8855885154700222542">Kláves celej obrazovky</translation> +<translation id="8858369206579825206">Nastavenia ochrany súkromia</translation> <translation id="8870509716567206129">Aplikácia nepodporuje rozdelenú obrazovku.</translation> <translation id="8874184842967597500">Nepripojené</translation> <translation id="8876661425082386199">Skontrolujte pripojenie</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 8ff3995..7f6b2b7 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, dogodki se nalagajo.</translation> <translation id="3932043219784172185">Nobena naprava ni povezana</translation> <translation id="3934456833412894880">Prilagodljivo polnjenje je vklopljeno. Polnjenje baterije se bo zaradi podaljšanja časa delovanja baterije ustavilo pri 80 %, v celoti pa se bo napolnila, ko jo boste potrebovali.</translation> +<translation id="3936620957945677513">Pritisnite Enter, če se želite pridružiti dogodku <ph name="EVENT_SUMMARY" /></translation> <translation id="3943857333388298514">Prilepi</translation> <translation id="394485226368336402">Nastavitve zvoka</translation> <translation id="3945319193631853098">Dotaknite se, da dokončate nastavitev</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Iskanje + Esc</translation> <translation id="8853703225951107899">Vaše kode PIN ali gesla še vedno ni bilo mogoče preveriti. Opomba: Če ste nedavno spremenili geslo, uporabite staro. Novo geslo bo začelo veljati, ko se odjavite.</translation> <translation id="8855885154700222542">Tipka za celozaslonski način</translation> +<translation id="8858369206579825206">Nastavitve zasebnosti</translation> <translation id="8870509716567206129">Aplikacija ne podpira načina razdeljenega zaslona.</translation> <translation id="8874184842967597500">Ni povezano</translation> <translation id="8876661425082386199">Preverjanje povezave</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 70cb0954..6c07525 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Kërko+Esc</translation> <translation id="8853703225951107899">Kod yt PIN ose fjalëkalimi përsëri nuk mund të verifikoheshin. Shënim. Nëse e ke ndryshuar fjalëkalimin së fundi, përdor fjalëkalimin e vjetër. Fjalëkalimi yt i ri do të zbatohet pasi të dalësh nga llogaria.</translation> <translation id="8855885154700222542">Tasti i ekranit të plotë</translation> +<translation id="8858369206579825206">Kontrollet e privatësisë</translation> <translation id="8870509716567206129">Aplikacioni nuk e mbështet ekranin e ndarë.</translation> <translation id="8874184842967597500">Nuk u lidh</translation> <translation id="8876661425082386199">Kontrollo lidhjen tënde</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 0c0558e..493b3b7 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Verifikacija PIN-a ili lozinke još uvek nije uspela. Napomena: Ako ste nedavno promenili lozinku, koristite staru. Nova lozinka će biti primenjena kada se odjavite.</translation> <translation id="8855885154700222542">Taster za ceo ekran</translation> +<translation id="8858369206579825206">Kontrole privatnosti</translation> <translation id="8870509716567206129">Aplikacija ne podržava podeljeni ekran.</translation> <translation id="8874184842967597500">Nije povezano</translation> <translation id="8876661425082386199">Proverite vezu</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 897ccda..0e42c2cf 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Верификација PIN-а или лозинке још увек није успела. Напомена: Ако сте недавно променили лозинку, користите стару. Нова лозинка ће бити примењена када се одјавите.</translation> <translation id="8855885154700222542">Тастер за цео екран</translation> +<translation id="8858369206579825206">Контроле приватности</translation> <translation id="8870509716567206129">Апликација не подржава подељени екран.</translation> <translation id="8874184842967597500">Није повезано</translation> <translation id="8876661425082386199">Проверите везу</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 72ff68c..6c968ef 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Sök+Escape</translation> <translation id="8853703225951107899">Det gick fortfarande inte att verifiera pinkoden eller lösenordet. Obs! Om du nyligen har bytt lösenord ska du använda det gamla lösenordet. Det nya lösenordet börjar gälla när du loggar ut.</translation> <translation id="8855885154700222542">Tangent för helskärm</translation> +<translation id="8858369206579825206">Integritetsinställningar</translation> <translation id="8870509716567206129">Appen har inte stöd för delad skärm.</translation> <translation id="8874184842967597500">Inte ansluten</translation> <translation id="8876661425082386199">Kontrollera anslutningen</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 4a98c5b..a522b7b 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Bado imeshindwa kuthibitisha PIN au nenosiri lako. Kumbuka: Iwapo ulibadilisha nenosiri lako hivi majuzi, tumia nenosiri lako la awali. Nenosiri lako jipya litatumika utakapoondoka kwenye akaunti.</translation> <translation id="8855885154700222542">Kitufe cha skrini nzima</translation> +<translation id="8858369206579825206">Vidhibiti vya faragha</translation> <translation id="8870509716567206129">Programu haiwezi kutumia skrini iliyogawanywa.</translation> <translation id="8874184842967597500">Hujaunganishwa</translation> <translation id="8876661425082386199">Kagua muunganisho wako</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 95f542e6..d23c2ce 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">தேடல்+Esc</translation> <translation id="8853703225951107899">உங்கள் பின்னையோ கடவுச்சொல்லையோ இப்போதும் சரிபார்க்க முடியவில்லை. கவனத்திற்கு: நீங்கள் சமீபத்தில் கடவுச்சொல்லை மாற்றியிருந்தால் பழைய கடவுச்சொல்லைப் பயன்படுத்தவும். வெளியேறினால் மட்டுமே புதிய கடவுச்சொல்லைப் பயன்படுத்த முடியும்.</translation> <translation id="8855885154700222542">முழுத்திரை விசை</translation> +<translation id="8858369206579825206">தனியுரிமைக் கட்டுப்பாடுகள்</translation> <translation id="8870509716567206129">திரையைப் பிரிப்பதைப் ஆப்ஸ் ஆதரிக்கவில்லை.</translation> <translation id="8874184842967597500">இணைக்கப்படவில்லை</translation> <translation id="8876661425082386199">இணைய இணைப்பைச் சரிபார்க்கவும்</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 6c010bf..a09fa0d 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">మీ పిన్ లేదా పాస్వర్డ్ను వెరిఫై చేయడం ఇంకా సాధ్యం కాలేదు. గమనిక: మీరు ఇటీవలే మీ పాస్వర్డ్ను మార్చి ఉంటే, మీ పాత పాస్వర్డ్ను ఉపయోగించండి. మీరు ఖాతా నుంచి సైన్ అవుట్ చేసిన తర్వాత మీ కొత్త పాస్వర్డ్ వర్తిస్తుంది.</translation> <translation id="8855885154700222542">పూర్తిస్క్రీన్ కీ</translation> +<translation id="8858369206579825206">గోప్యతా కంట్రోల్స్</translation> <translation id="8870509716567206129">యాప్లో విభజన స్క్రీన్కు మద్దతు లేదు.</translation> <translation id="8874184842967597500">కనెక్ట్ కాలేదు</translation> <translation id="8876661425082386199">మీ కనెక్షన్ను చెక్ చేయండి</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index b29a67e..e99a30f 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -1467,6 +1467,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">ยังคงยืนยัน PIN หรือรหัสผ่านของคุณไม่ได้ หากคุณเพิ่งเปลี่ยนรหัสผ่านไปไม่นาน ให้ใช้รหัสผ่านเก่า รหัสผ่านใหม่จะมีผลเมื่อคุณออกจากระบบ</translation> <translation id="8855885154700222542">แป้นแสดงเต็มหน้าจอ</translation> +<translation id="8858369206579825206">การควบคุมความเป็นส่วนตัว</translation> <translation id="8870509716567206129">แอปไม่สนับสนุนการแยกหน้าจอ</translation> <translation id="8874184842967597500">ไม่เชื่อมต่อ</translation> <translation id="8876661425082386199">ตรวจสอบการเชื่อมต่อของคุณ</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 235bd95..82bc3bd 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Ara+Esc</translation> <translation id="8853703225951107899">PIN'iniz veya şifreniz hâlâ doğrulanamadı. Not: Şifrenizi yakın zamanda değiştirdiyseniz eski şifrenizi kullanın. Yeni şifreniz, oturumunuzu kapattıktan sonra geçerli olacaktır.</translation> <translation id="8855885154700222542">Tam ekran tuşu</translation> +<translation id="8858369206579825206">Gizlilik denetimleri</translation> <translation id="8870509716567206129">Uygulama bölünmüş ekranı desteklemiyor.</translation> <translation id="8874184842967597500">Bağlı değil</translation> <translation id="8876661425082386199">Bağlantınızı denetleyin</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 01c96ff..a655a67 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search (Пошук)+Esc</translation> <translation id="8853703225951107899">PIN-код або пароль усе ще не вдається підтвердити. Примітка: якщо ви нещодавно змінювали пароль, введіть старий. Новий пароль буде застосовано, щойно ви вийдете з облікового запису.</translation> <translation id="8855885154700222542">Клавіша повноекранного режиму</translation> +<translation id="8858369206579825206">Налаштування конфіденційності</translation> <translation id="8870509716567206129">Додаток не підтримує розділення екрана.</translation> <translation id="8874184842967597500">Не під’єднано</translation> <translation id="8876661425082386199">Перевірте з'єднання</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 836ecae..52e49225 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />، ایونٹس لوڈ ہو رہے ہیں۔</translation> <translation id="3932043219784172185">کوئی آلہ منسلک نہیں ہے</translation> <translation id="3934456833412894880">اڈاپٹیو چارجنگ آن ہے بیٹری لائف کو بڑھانے کے لیے آپ کی بیٹری %80 پر رہے گی اور جب آپ کو ضرورت ہو تو پوری طرح سے چارج ہو جائے گی۔</translation> +<translation id="3936620957945677513">ایونٹ <ph name="EVENT_SUMMARY" /> میں شامل ہونے کے انٹر دبائیں۔</translation> <translation id="3943857333388298514">پیسٹ کریں</translation> <translation id="394485226368336402">آڈیو کی ترتیبات</translation> <translation id="3945319193631853098">سیٹ اپ مکمل کرنے کیلئے تھپتھپائیں</translation> @@ -1465,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">آپ کے PIN یا پاس ورڈ کی توثیق ابھی بھی نہیں کی جا سکی۔ نوٹ: اگر آپ نے حال ہی میں اپنا پاس ورڈ تبدیل کیا ہے تو اپنا پرانا پاس ورڈ استعمال کریں۔ آپ کے سائن آؤٹ ہونے کے بعد آپ کا نیا پاس ورڈ لاگو ہوگا۔</translation> <translation id="8855885154700222542">پوری اسکرین کی کلید</translation> +<translation id="8858369206579825206">رازداری سے متعلق کنٹرولز</translation> <translation id="8870509716567206129">ایپ اسپلٹ اسکرین کو سپورٹ نہیں کرتی ہے۔</translation> <translation id="8874184842967597500">منسلک نہیں</translation> <translation id="8876661425082386199">اپنا کنکشن چیک کریں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 8098230..d82384d7 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />, Tadbirlar yuklanmoqda.</translation> <translation id="3932043219784172185">Hech qaysi qurilma ulanmagan!</translation> <translation id="3934456833412894880">Moslashuvchan quvvatlash yoniq. Batareyaning xizmat muddatini uzaytirish maqsadida batareya 80% gacha quvvatlang hamda zarur boʻlganda uni toʻliq quvvatlashingiz mumkin.</translation> +<translation id="3936620957945677513"><ph name="EVENT_SUMMARY" /> tadbiriga qoʻshilish uchun enter tugmasini bosing</translation> <translation id="3943857333388298514">Joylash</translation> <translation id="394485226368336402">Audio sozlamalari</translation> <translation id="3945319193631853098">Sozlashni yakunlash uchun bosing</translation> @@ -1466,6 +1467,7 @@ <translation id="8850991929411075241">Search + Esc</translation> <translation id="8853703225951107899">PIN kod yoki parolingiz haligacha tekshirilmadi. Eslatma: Parol yaqinda almashtirilgan boʻlsa, eskisini kiriting. Yangi parolingiz hisobdan chiqqaningizda kuchga kiradi.</translation> <translation id="8855885154700222542">Butun ekran rejimi tugmasi</translation> +<translation id="8858369206579825206">Maxfiylik sozlamalari</translation> <translation id="8870509716567206129">Bu dastur ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi.</translation> <translation id="8874184842967597500">Ulanmagan</translation> <translation id="8876661425082386199">Aloqani tekshiring</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 46ed6f8..a1df4d9 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Hệ thống vẫn chưa xác minh được mã PIN hoặc mật khẩu của bạn. Lưu ý: Nếu bạn đổi mật khẩu gần đây, hãy dùng mật khẩu cũ. Bạn có thể dùng mật khẩu mới sau khi đăng xuất.</translation> <translation id="8855885154700222542">Phím toàn màn hình</translation> +<translation id="8858369206579825206">Chế độ kiểm soát quyền riêng tư</translation> <translation id="8870509716567206129">Ứng dụng không hỗ trợ chế độ chia đôi màn hình.</translation> <translation id="8874184842967597500">Chưa kết nối</translation> <translation id="8876661425082386199">Kiểm tra kết nối của bạn</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index a621008..b9024e8 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />,正在加载活动。</translation> <translation id="3932043219784172185">未连接任何设备</translation> <translation id="3934456833412894880">已开启“自适应充电”功能。电池电量将会保持在 80% 以延长电池寿命,并会在您需要时完全充满。</translation> +<translation id="3936620957945677513">按 Enter 键即可加入<ph name="EVENT_SUMMARY" />活动</translation> <translation id="3943857333388298514">粘贴</translation> <translation id="394485226368336402">音频设置</translation> <translation id="3945319193631853098">点按即可完成设置</translation> @@ -1463,6 +1464,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">仍然无法验证您的 PIN 码或密码。注意:如果您最近更改了密码,请使用旧密码。待您退出登录后,系统才会应用新密码。</translation> <translation id="8855885154700222542">全屏键</translation> +<translation id="8858369206579825206">隐私控制</translation> <translation id="8870509716567206129">应用不支持分屏。</translation> <translation id="8874184842967597500">未连接</translation> <translation id="8876661425082386199">请检查您的网络连接状况</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index de5ee32e..07750551 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -549,6 +549,7 @@ <translation id="3925540965556789199"><ph name="DATE" />,正在載入活動。</translation> <translation id="3932043219784172185">未連接任何裝置</translation> <translation id="3934456833412894880">自動調節充電速度功能已開啟。裝置電量會維持在 80% 以延長電池壽命,並在您需要時將電池完全充滿。</translation> +<translation id="3936620957945677513">按下 Enter 即可加入「<ph name="EVENT_SUMMARY" />」活動</translation> <translation id="3943857333388298514">貼上</translation> <translation id="394485226368336402">音訊設定</translation> <translation id="3945319193631853098">輕按即可完成設定</translation> @@ -1464,6 +1465,7 @@ <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation> <translation id="8853703225951107899">系統仍然無法驗證您的 PIN 或密碼。注意:如果您最近變更過密碼,請嘗試使用舊密碼,新密碼會在您登出後立即生效。</translation> <translation id="8855885154700222542">全螢幕鍵</translation> +<translation id="8858369206579825206">私隱權設定</translation> <translation id="8870509716567206129">應用程式不支援分割畫面。</translation> <translation id="8874184842967597500">未連線</translation> <translation id="8876661425082386199">請檢查連線</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index a804b3a..eb391aa 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -548,6 +548,7 @@ <translation id="3925540965556789199"><ph name="DATE" />,正在載入活動。</translation> <translation id="3932043219784172185">未連線到任何裝置</translation> <translation id="3934456833412894880">自動調節充電功能已開啟。裝置電量會維持在 80% 以延長電池壽命,並在你需要時充飽電。</translation> +<translation id="3936620957945677513">按下 Enter 即可加入「<ph name="EVENT_SUMMARY" />」活動</translation> <translation id="3943857333388298514">貼上</translation> <translation id="394485226368336402">音訊設定</translation> <translation id="3945319193631853098">輕觸即可完成設定</translation> @@ -1463,6 +1464,7 @@ <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation> <translation id="8853703225951107899">系統仍然無法驗證你的 PIN 碼或密碼。注意:如果你最近變更了密碼,請使用舊密碼。系統會在你登出帳戶後套用新密碼。</translation> <translation id="8855885154700222542">全螢幕鍵</translation> +<translation id="8858369206579825206">隱私權控制項</translation> <translation id="8870509716567206129">這個應用程式不支援分割畫面。</translation> <translation id="8874184842967597500">未連線</translation> <translation id="8876661425082386199">請檢查連線狀態</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index c35adf2..6f3cb93f 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -1466,6 +1466,7 @@ <translation id="8850991929411075241">Search+Esc</translation> <translation id="8853703225951107899">Iphinikhodi yakho noma iphasiwedi isengaqinisekiswa. Qaphela: Uma usanda ukushintsha iphasiwedi yakho, sebenzisa iphasiwedi yakho yakudala. Iphasiwedi yakho entsha izosebenza uma usuphume ngemvume.</translation> <translation id="8855885154700222542">Ukhiye wesikrini esigcwele</translation> +<translation id="8858369206579825206">Izilawuli zobumfihlo</translation> <translation id="8870509716567206129">Uhlelo lokusebenza alusekeli isikrini esihlukanisiwe.</translation> <translation id="8874184842967597500">Ayixhunyiwe</translation> <translation id="8876661425082386199">Hlola uxhumano lwakho</translation>
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc index 38c11de0..dacceaf 100644 --- a/ash/style/ash_color_mixer.cc +++ b/ash/style/ash_color_mixer.cc
@@ -288,6 +288,7 @@ mixer[cros_tokens::kCrosRefSecondary0] = {ui::kColorRefSecondary0}; mixer[cros_tokens::kCrosRefSecondary10] = {ui::kColorRefSecondary10}; + mixer[cros_tokens::kCrosRefSecondary15] = {ui::kColorRefSecondary15}; mixer[cros_tokens::kCrosRefSecondary20] = {ui::kColorRefSecondary20}; mixer[cros_tokens::kCrosRefSecondary30] = {ui::kColorRefSecondary30}; mixer[cros_tokens::kCrosRefSecondary40] = {ui::kColorRefSecondary40};
diff --git a/ash/style/style_viewer/system_ui_components_grid_view.cc b/ash/style/style_viewer/system_ui_components_grid_view.cc index 48832a4..cc0fd74 100644 --- a/ash/style/style_viewer/system_ui_components_grid_view.cc +++ b/ash/style/style_viewer/system_ui_components_grid_view.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <numeric> +#include "ui/gfx/text_constants.h" #include "ui/views/controls/label.h" #include "ui/views/layout/layout_manager.h" #include "ui/views/view.h" @@ -96,16 +97,20 @@ ori_x[0] = border_insets_.left(); ori_y[0] = border_insets_.top(); for (size_t i = 0; i < children_.size(); i++) { - int row_i = i / col_num_; - int col_i = i % col_num_; + int row_index = i / col_num_; + int col_index = i % col_num_; // Calculate the origin posisitons. - if (row_i == 0 && col_i > 0) { - int col_padding = (col_i % col_group_size_) ? 0 : col_group_spacing_; - ori_x[col_i] = ori_x[col_i - 1] + col_width_[col_i - 1] + col_padding; + if (row_index == 0 && col_index > 0) { + int col_padding = + (col_index % col_group_size_) ? 0 : col_group_spacing_; + ori_x[col_index] = + ori_x[col_index - 1] + col_width_[col_index - 1] + col_padding; } - if (row_i > 0 && col_i == 0) { - int row_padding = (row_i % row_group_size_) ? 0 : row_group_spacing_; - ori_y[row_i] = ori_y[row_i - 1] + row_height_[row_i - 1] + row_padding; + if (row_index > 0 && col_index == 0) { + int row_padding = + (row_index % row_group_size_) ? 0 : row_group_spacing_; + ori_y[row_index] = + ori_y[row_index - 1] + row_height_[row_index - 1] + row_padding; } // Skip empty instances. @@ -115,10 +120,10 @@ // Put the view in the center of the grid. int view_width = children_[i]->GetPreferredSize().width(); int view_height = children_[i]->GetPreferredSize().height(); - children_[i]->SetBoundsRect( - gfx::Rect(ori_x[col_i] + inner_padding_, - ori_y[row_i] + (row_height_[row_i] - view_height) / 2, - view_width, view_height)); + children_[i]->SetBoundsRect(gfx::Rect( + ori_x[col_index] + inner_padding_, + ori_y[row_index] + (row_height_[row_index] - view_height) / 2, + view_width, view_height)); } } @@ -158,18 +163,40 @@ // Get the index of `view` in `children_`. auto iter = std::find(children_.begin(), children_.end(), view); DCHECK(iter != children_.end()); - const int index = std::distance(children_.begin(), iter); + const int view_index = std::distance(children_.begin(), iter); // When a view size is changed, updates the max width of the column and max // height of the row. - int row_i = index / col_num_; - int col_i = index % col_num_; - gfx::Size view_size = view->GetPreferredSize(); + int row_index = view_index / col_num_; + int col_index = view_index % col_num_; - row_height_[row_i] = - std::max(row_height_[row_i], view_size.height() + 2 * inner_padding_); - col_width_[col_i] = - std::max(col_width_[col_i], view_size.width() + 2 * inner_padding_); + for (size_t i = 0; i < col_num_; i++) { + const size_t index = row_index * col_num_ + i; + if (index >= children_.size()) { + break; + } + + const auto* child = children_[index]; + if (child) { + row_height_[row_index] = + std::max(row_height_[row_index], + child->GetPreferredSize().height() + 2 * inner_padding_); + } + } + + for (size_t i = 0; i < row_num_; i++) { + const size_t index = i * col_num_ + col_index; + if (index >= children_.size()) { + break; + } + + const auto* child = children_[index]; + if (child) { + col_width_[col_index] = + std::max(col_width_[col_index], + child->GetPreferredSize().width() + 2 * inner_padding_); + } + } // Re-layout the host view. Layout(host); @@ -224,13 +251,17 @@ void SystemUIComponentsGridView::AddInstanceImpl(const std::u16string& name, views::View* instance_view) { - views::View* label = nullptr; + views::Label* label_ptr = nullptr; if (instance_view) { // Add a label and an instance in the contents. - label = AddChildView(std::make_unique<views::Label>(name)); + auto label = std::make_unique<views::Label>(name); + label->SetMultiLine(true); + label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + label_ptr = AddChildView(std::move(label)); AddChildView(instance_view); } - grid_layout_->AppendView(this, label); + + grid_layout_->AppendView(this, label_ptr); grid_layout_->AppendView(this, instance_view); }
diff --git a/ash/style/style_viewer/system_ui_components_style_viewer_view.cc b/ash/style/style_viewer/system_ui_components_style_viewer_view.cc index c3da7a0..8745a96 100644 --- a/ash/style/style_viewer/system_ui_components_style_viewer_view.cc +++ b/ash/style/style_viewer/system_ui_components_style_viewer_view.cc
@@ -69,6 +69,7 @@ label()->SetSubpixelRenderingEnabled(false); label()->SetFontList(views::Label::GetDefaultFontList().Derive( 1, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM)); + SetFocusBehavior(views::View::FocusBehavior::NEVER); } ComponentButton(const ComponentButton&) = delete; ComponentButton& operator=(const ComponentButton&) = delete;
diff --git a/ash/style/style_viewer/tab_slider_instances_grid_view_factory.cc b/ash/style/style_viewer/tab_slider_instances_grid_view_factory.cc index 0514028..1521b7c 100644 --- a/ash/style/style_viewer/tab_slider_instances_grid_view_factory.cc +++ b/ash/style/style_viewer/tab_slider_instances_grid_view_factory.cc
@@ -14,7 +14,7 @@ namespace { // Configurations of grid view for `TabSlider` instances. -constexpr size_t kGridViewRowNum = 6; +constexpr size_t kGridViewRowNum = 9; constexpr size_t kGridViewColNum = 1; constexpr size_t kGridViewRowGroupSize = 3; constexpr size_t kGirdViewColGroupSize = 1; @@ -69,61 +69,116 @@ u"video mode"); icon_slider_two_disabled->SetEnabled(false); - // Create an instance of label slider with two buttons. - auto label_slider_two = std::make_unique<TabSlider>(); + // Create an instance of label slider with two buttons and unevenly + // distributed space. + auto label_slider_two_unevenly = std::make_unique<TabSlider>( + /*has_background=*/true, /*has_selector_animation=*/true, + /*distribute_space_evenly=*/false); // Add the buttons with `TabSliderButton` unique pointer. auto* label_button = - label_slider_two->AddButton(std::make_unique<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 1", u"label 1")); + label_slider_two_unevenly->AddButton(std::make_unique<LabelSliderButton>( + LabelSliderButton::PressedCallback(), u"one", u"label 1")); label_button->SetSelected(true); - label_slider_two->AddButton(std::make_unique<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 2", u"label 2")); + label_slider_two_unevenly->AddButton(std::make_unique<LabelSliderButton>( + LabelSliderButton::PressedCallback(), u"one two three", u"label 2")); - // Create an instance of label slider with three buttons with customized - // layout. + // Create an instance of label slider with two buttons and evenly distributed + // space. + auto label_slider_two = std::make_unique<TabSlider>(); + auto* label_button_two_1 = label_slider_two->AddButton<LabelSliderButton>( + LabelSliderButton::PressedCallback(), u"one", u"label 1"); + label_button_two_1->SetSelected(true); + label_slider_two->AddButton<LabelSliderButton>( + LabelSliderButton::PressedCallback(), u"one two three", u"label 2"); + + // Create an instance of label slider with three buttons and evenly + // distributed space. auto label_slider_three = std::make_unique<TabSlider>(); - label_slider_three->SetCustomLayout( - {/*button_container_spacing=*/2, /*between_buttons_spacing=*/16}); - // Add the buttons with ctor arguments of `TabSliderButton`. - auto* label_button_1 = label_slider_three->AddButton<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 1", u"label 1"); - label_button_1->SetSelected(true); + auto* label_button_three_1 = label_slider_three->AddButton<LabelSliderButton>( + LabelSliderButton::PressedCallback(), u"one", u"label 1"); + label_button_three_1->SetSelected(true); label_slider_three->AddButton<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 2", u"label 2"); + LabelSliderButton::PressedCallback(), u"one two three", u"label 2"); label_slider_three->AddButton<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 3", u"label 3"); + LabelSliderButton::PressedCallback(), u"one two three four five", + u"label 3"); - // Create an instance of disabled label slider with two buttons. - auto label_slider_two_disabled = std::make_unique<TabSlider>(); - auto* disabled_label_button = - label_slider_two_disabled->AddButton<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 1", u"label 1"); - disabled_label_button->SetSelected(true); - label_slider_two_disabled->AddButton<LabelSliderButton>( - LabelSliderButton::PressedCallback(), u"Label 2", u"label 2"); - label_slider_two_disabled->SetEnabled(false); + // Create an instance of icon + label slider with two buttons and unevenly + // distributed space. + auto icon_label_slider_two_unevenly = std::make_unique<TabSlider>( + /*has_background=*/true, /*has_selector_animation=*/true, + /*distribute_space_evenly=*/false); + auto* icon_label_button = + icon_label_slider_two_unevenly->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsCameraIcon, u"one", u"button 1"); + icon_label_button->SetSelected(true); + icon_label_slider_two_unevenly->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsMicrophoneIcon, u"one two three", u"button 2"); + + // Create an instance of icon + label slider with three buttons and evenly + // distributed space. + auto icon_label_slider_three = std::make_unique<TabSlider>(); + auto* icon_label_button_1 = + icon_label_slider_three->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsMicrophoneIcon, u"one", u"button 1"); + icon_label_button_1->SetSelected(true); + icon_label_slider_three->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsMicrophoneIcon, u"one two three", u"button 2"); + icon_label_slider_three->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsMicrophoneIcon, u"ont two three four five", + u"button 3"); + + // Create an instance of disabled icon + label slider with two buttons. + auto icon_label_slider_two_disabled = std::make_unique<TabSlider>(); + auto* icon_label_button_disabled = + icon_label_slider_two_disabled->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsCameraIcon, u"one", u"button 1"); + icon_label_button_disabled->SetSelected(true); + icon_label_slider_two_disabled->AddButton<IconLabelSliderButton>( + IconLabelSliderButton::PressedCallback(), + &kPrivacyIndicatorsMicrophoneIcon, u"one two three", u"button 2"); + icon_label_slider_two_disabled->SetEnabled(false); grid_view->AddInstance( - u"Icon tab slider with 2 buttons, recommended layout, selector " + u"Icon tab slider with 2 buttons, recommended layout, selector \n" u"animation, and background", std::move(icon_slider_two)); grid_view->AddInstance( - u"Icon tab slider with 3 buttons, custom layout, no selector " + u"Icon tab slider with 3 buttons, custom layout, no selector \n" u"animation, and no background", std::move(icon_slider_three)); grid_view->AddInstance(u"Disabled icon slider with 2 buttons", std::move(icon_slider_two_disabled)); grid_view->AddInstance( - u"Label tab slider with 2 buttons, recommended layout, selector " - u"animation, and background", + u"Label tab slider with 2 buttons, recommended layout, selector \n" + u"animation, background, and unevenly distributed spaces", + std::move(label_slider_two_unevenly)); + grid_view->AddInstance( + u"Label tab slider with 2 buttons, recommended layout, selector \n" + u"animation, background, and evenly distributed space", std::move(label_slider_two)); grid_view->AddInstance( - u"Label tab slider with 3 buttons, recommended layout, selector " - u"animation, and background", + u"Label tab slider with 3 buttons, recommended layout, selector \n" + u"animation, background, and evenly distributed space", std::move(label_slider_three)); - grid_view->AddInstance(u"Disabled label slider with 2 buttons", - std::move(label_slider_two_disabled)); + + grid_view->AddInstance( + u"Icon + label tab slider with 2 buttons, recommended layout, selector \n" + u"animation, background, and unevenly distributed space", + std::move(icon_label_slider_two_unevenly)); + grid_view->AddInstance( + u"Icon + label tab slider with 3 buttons, recommended layout, selector \n" + u"animation, background, and evenly distributed space", + std::move(icon_label_slider_three)); + grid_view->AddInstance(u"Disabled icon + label slider with 2 buttons", + std::move(icon_label_slider_two_disabled)); return grid_view; }
diff --git a/ash/style/tab_slider.h b/ash/style/tab_slider.h index 7372d1e..16bc5f9 100644 --- a/ash/style/tab_slider.h +++ b/ash/style/tab_slider.h
@@ -38,7 +38,7 @@ // distributed evenly between buttons. explicit TabSlider(bool has_background = true, bool has_selector_animation = true, - bool distribute_space_evenly = false); + bool distribute_space_evenly = true); TabSlider(const TabSlider&) = delete; TabSlider& operator=(const TabSlider&) = delete; ~TabSlider() override;
diff --git a/ash/system/accessibility/dictation_bubble_controller.cc b/ash/system/accessibility/dictation_bubble_controller.cc index dc4798f..c767c88 100644 --- a/ash/system/accessibility/dictation_bubble_controller.cc +++ b/ash/system/accessibility/dictation_bubble_controller.cc
@@ -23,6 +23,7 @@ } DictationBubbleController::~DictationBubbleController() { + input_method_observer_.Reset(); if (widget_ && !widget_->IsClosed()) widget_->CloseNow(); }
diff --git a/ash/system/notification_center/notification_center_tray.cc b/ash/system/notification_center/notification_center_tray.cc index aa54e3a..b336351 100644 --- a/ash/system/notification_center/notification_center_tray.cc +++ b/ash/system/notification_center/notification_center_tray.cc
@@ -81,7 +81,7 @@ } std::u16string NotificationCenterTray::GetAccessibleNameForTray() { - return std::u16string(); + return l10n_util::GetStringUTF16(IDS_ASH_MESSAGE_CENTER_ACCESSIBLE_NAME); } void NotificationCenterTray::HandleLocaleChange() {}
diff --git a/ash/system/time/calendar_event_list_item_view_jelly.cc b/ash/system/time/calendar_event_list_item_view_jelly.cc index 2c34554..59f76033 100644 --- a/ash/system/time/calendar_event_list_item_view_jelly.cc +++ b/ash/system/time/calendar_event_list_item_view_jelly.cc
@@ -13,6 +13,7 @@ #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/pill_button.h" +#include "ash/style/style_util.h" #include "ash/system/model/system_tray_model.h" #include "ash/system/time/calendar_metrics.h" #include "ash/system/time/calendar_utils.h" @@ -29,6 +30,7 @@ #include "ui/gfx/geometry/insets.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/background.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" @@ -41,6 +43,8 @@ gfx::Insets::VH(6, calendar_utils::kEventListItemViewStartEndMargin); constexpr auto kEventListItemHorizontalChildSpacing = 8; constexpr int kEventListItemCornerRadius = 16; +constexpr int kEventListItemCornerDefaultRadius = 4; +constexpr float kEventListItemFocusCornerRadius = 3.0f; // Radius of the event color dot. constexpr int kColorDotRadius = 4; @@ -129,16 +133,37 @@ .SetTooltipText(tooltip_text); } +// A `HighlightPathGenerator` that uses caller-supplied rounded rect corners. +class VIEWS_EXPORT RoundedCornerHighlightPathGenerator + : public views::HighlightPathGenerator { + public: + explicit RoundedCornerHighlightPathGenerator( + const gfx::RoundedCornersF& corners) + : corners_(corners) {} + + RoundedCornerHighlightPathGenerator( + const RoundedCornerHighlightPathGenerator&) = delete; + RoundedCornerHighlightPathGenerator& operator=( + const RoundedCornerHighlightPathGenerator&) = delete; + + // views::HighlightPathGenerator: + absl::optional<gfx::RRectF> GetRoundRect(const gfx::RectF& rect) override { + return gfx::RRectF(rect, corners_); + } + + private: + // The user-supplied rounded rect corners. + const gfx::RoundedCornersF corners_; +}; + } // namespace CalendarEventListItemViewJelly::CalendarEventListItemViewJelly( CalendarViewController* calendar_view_controller, SelectedDateParams selected_date_params, google_apis::calendar::CalendarEvent event, - const bool round_top_corners, - const bool round_bottom_corners, - const bool show_event_list_dot, - const int fixed_width) + UIParams ui_params, + EventListItemIndex event_list_item_index) : ActionableView(TrayPopupInkDropStyle::FILL_BOUNDS), calendar_view_controller_(calendar_view_controller), selected_date_params_(selected_date_params), @@ -154,23 +179,32 @@ event_date_formatter_util::GetStartAndEndTimeAccessibleNames(start_time, end_time); GetViewAccessibility().OverrideRole(ax::mojom::Role::kButton); + const std::u16string event_item_index_in_list_string = + l10n_util::GetStringFUTF16( + IDS_ASH_CALENDAR_EVENT_POSITION_ACCESSIBLE_DESCRIPTION, + base::NumberToString16(event_list_item_index.item_index), + base::NumberToString16(event_list_item_index.total_count_of_events)); SetAccessibleName(l10n_util::GetStringFUTF16( - IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION, + IDS_ASH_CALENDAR_EVENT_ENTRY_ACCESSIBLE_DESCRIPTION_JELLY, + event_item_index_in_list_string, base::UTF8ToUTF16(event.summary()), start_time_accessible_name, end_time_accessible_name, - calendar_utils::GetTimeZone(start_time), - base::UTF8ToUTF16(event.summary()))); + calendar_utils::GetTimeZone(start_time))); SetFocusBehavior(FocusBehavior::ALWAYS); // Conditionally round the items corners depending upon where it sits in the // list. - const int top_radius = round_top_corners ? kEventListItemCornerRadius : 0; - const int bottom_radius = - round_bottom_corners ? kEventListItemCornerRadius : 0; + const int top_radius = ui_params.round_top_corners + ? kEventListItemCornerRadius + : kEventListItemCornerDefaultRadius; + const int bottom_radius = ui_params.round_bottom_corners + ? kEventListItemCornerRadius + : kEventListItemCornerDefaultRadius; const gfx::RoundedCornersF item_corner_radius = gfx::RoundedCornersF( top_radius, top_radius, bottom_radius, bottom_radius); SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); layer()->SetRoundedCornerRadius(item_corner_radius); + SetUpFocusHighlight(item_corner_radius); std::u16string formatted_time_text; if (calendar_utils::IsMultiDayEvent(&event) || event.all_day_event()) { @@ -195,7 +229,7 @@ std::move(horizontal_layout_manager)); // Event list dot. - if (show_event_list_dot) { + if (ui_params.show_event_list_dot) { views::View* event_list_dot_container = horizontal_container->AddChildView(std::make_unique<views::View>()); auto* layout_vertical_start = event_list_dot_container->SetLayoutManager( @@ -215,7 +249,8 @@ vertical_container->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); vertical_container->AddChildView( - CreateSummaryLabel(event.summary(), tooltip_text, fixed_width).Build()); + CreateSummaryLabel(event.summary(), tooltip_text, ui_params.fixed_width) + .Build()); vertical_container->AddChildView( CreateTimeLabel(formatted_time_text, tooltip_text).Build()); horizontal_container_layout_manager->SetFlexForView(vertical_container, 1); @@ -265,6 +300,23 @@ return true; } +void CalendarEventListItemViewJelly::SetUpFocusHighlight( + const gfx::RoundedCornersF& item_corner_radius) { + StyleUtil::SetUpInkDropForButton(this, gfx::Insets(), + /*highlight_on_hover=*/false, + /*highlight_on_focus=*/false, + /*background_color=*/ + gfx::kPlaceholderColor); + views::FocusRing::Get(this)->SetColorId(ui::kColorAshFocusRing); + views::FocusRing::Get(this)->SetHaloThickness( + kEventListItemFocusCornerRadius); + views::HighlightPathGenerator::Install( + this, std::make_unique<RoundedCornerHighlightPathGenerator>( + item_corner_radius)); + // Unset the focus painter set by `ActionableView`. + SetFocusPainter(nullptr); +} + void CalendarEventListItemViewJelly::OnJoinMeetingButtonPressed( const ui::Event& event) { calendar_view_controller_->RecordJoinMeetingButtonPressed(event);
diff --git a/ash/system/time/calendar_event_list_item_view_jelly.h b/ash/system/time/calendar_event_list_item_view_jelly.h index d52acc1..03711d8 100644 --- a/ash/system/time/calendar_event_list_item_view_jelly.h +++ b/ash/system/time/calendar_event_list_item_view_jelly.h
@@ -15,6 +15,10 @@ class Event; } // namespace ui +namespace gfx { +class RoundedCornersF; +} + namespace ash { // Label ID's. @@ -31,6 +35,24 @@ base::Time selected_date_midnight_utc; }; +struct UIParams { + bool round_top_corners = false; + bool round_bottom_corners = false; + // Show the calendar indicator dots which show the event colors. If + // false this piece of UI is not added to the view hierarchy. + bool show_event_list_dot = false; + // Used in `Label::SizeToFit()` to fix the width of this view. If 0, no + // fixed width is enforced. + int fixed_width = 0; +}; + +// The index of the event in the event list. Used for the accessibility +// description to show "Event n of n". +struct EventListItemIndex { + int item_index; + int total_count_of_events; +}; + // This view displays a jelly version of a calendar event entry. class ASH_EXPORT CalendarEventListItemViewJelly : public ActionableView { public: @@ -40,14 +62,8 @@ CalendarViewController* calendar_view_controller, SelectedDateParams selected_date_params, google_apis::calendar::CalendarEvent event, - const bool round_top_corners, - const bool round_bottom_corners, - // Show the calendar indicator dots which show the event colors. If - // false this piece of UI is not added to the view hierarchy. - const bool show_event_list_dot, - // Used in `Label::SizeToFit()` to fix the width of this view. If 0, no - // fixed width is enforced. - const int fixed_width = 0); + UIParams ui_params, + EventListItemIndex event_list_item_index); CalendarEventListItemViewJelly(const CalendarEventListItemViewJelly& other) = delete; CalendarEventListItemViewJelly& operator=( @@ -60,6 +76,11 @@ // ActionableView: bool PerformAction(const ui::Event& event) override; + // Sets up a custom highlight path for when the + // `CalendarEventListItemViewJelly` view is focused. Conditionally follows the + // same corner rounding as the view. + void SetUpFocusHighlight(const gfx::RoundedCornersF& item_corner_radius); + void OnJoinMeetingButtonPressed(const ui::Event& event); private:
diff --git a/ash/system/time/calendar_event_list_item_view_jelly_unittest.cc b/ash/system/time/calendar_event_list_item_view_jelly_unittest.cc index 5f2c0d8..0719a3c0 100644 --- a/ash/system/time/calendar_event_list_item_view_jelly_unittest.cc +++ b/ash/system/time/calendar_event_list_item_view_jelly_unittest.cc
@@ -53,10 +53,7 @@ void CreateEventListItemView(base::Time date, google_apis::calendar::CalendarEvent* event, - bool round_top_corners = false, - bool round_bottom_corners = false, - bool show_event_list_dot = true, - int fixed_width = 0) { + UIParams ui_params = {}) { event_list_item_view_jelly_.reset(); controller_->UpdateMonth(date); controller_->selected_date_ = date; @@ -66,8 +63,7 @@ SelectedDateParams{controller_->selected_date().value(), controller_->selected_date_midnight(), controller_->selected_date_midnight_utc()}, - *event, round_top_corners, round_bottom_corners, - show_event_list_dot, fixed_width); + *event, ui_params, EventListItemIndex{1, 1}); } void SetSelectedDateInController(base::Time date) { @@ -132,8 +128,9 @@ EXPECT_EQ(u"summary_0, 9:00\u2009\x2013\u200910:00\u202fAM", time_label->GetTooltipText()); EXPECT_EQ( - u"9:00\u202fAM to\n 10:00\u202fAM,\n GMT+02:00,\n " - u"summary_0. Select for more details in Google Calendar.", + u"Event 1 of 1\n summary_0,\n 9:00\x202F" + u"AM to\n 10:00\x202F" + u"AM,\n GMT+02:00. Select for more details in Google Calendar.", event_list_item_view()->GetAccessibleName()); } @@ -145,11 +142,12 @@ const char* end_time_string = "22 Nov 2021 10:00 GMT"; const auto event = CreateEvent(start_time_string, end_time_string); - CreateEventListItemView(date, event.get(), true); + CreateEventListItemView(date, event.get(), + UIParams{/*round_top_corners=*/true}); const ui::Layer* background_layer = event_list_item_view()->GetLayersInOrder().back(); - EXPECT_EQ(gfx::RoundedCornersF(16, 16, 0, 0), + EXPECT_EQ(gfx::RoundedCornersF(16, 16, 4, 4), background_layer->rounded_corner_radii()); } @@ -161,12 +159,13 @@ const char* end_time_string = "22 Nov 2021 10:00 GMT"; const auto event = CreateEvent(start_time_string, end_time_string); - CreateEventListItemView(date, event.get(), /*round_top_corners=*/false, - /*round_bottom_corners=*/true); + CreateEventListItemView( + date, event.get(), + UIParams{/*round_top_corners=*/false, /*round_bottom_corners=*/true}); const ui::Layer* background_layer = event_list_item_view()->GetLayersInOrder().back(); - EXPECT_EQ(gfx::RoundedCornersF(0, 0, 16, 16), + EXPECT_EQ(gfx::RoundedCornersF(4, 4, 16, 16), background_layer->rounded_corner_radii()); } @@ -178,8 +177,9 @@ const char* end_time_string = "22 Nov 2021 10:00 GMT"; const auto event = CreateEvent(start_time_string, end_time_string); - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true); + CreateEventListItemView( + date, event.get(), + UIParams{/*round_top_corners=*/true, /*round_bottom_corners=*/true}); const ui::Layer* background_layer = event_list_item_view()->GetLayersInOrder().back(); @@ -197,19 +197,18 @@ // If we don't set `fixed_width`, it will default to 0 (which the // `views::Label::SizeToFit()` method will ignore). - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true); + CreateEventListItemView(date, event.get()); // The label should have it's preferred size as we didn't set a `fixed_width`. EXPECT_TRUE(GetSummaryLabel()->width() > 0); // Set a fixed width. The label should be this size exactly. const auto fixed_width = 150; - CreateEventListItemView(date, event.get(), - /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/true, - /*fixed_width=*/fixed_width); + CreateEventListItemView( + date, event.get(), + UIParams{/*round_top_corners=*/ + true, /*round_bottom_corners=*/true, + /*show_event_list_dot=*/true, /*fixed_width=*/fixed_width}); EXPECT_EQ(fixed_width, GetSummaryLabel()->width()); } @@ -224,17 +223,19 @@ const auto event = CreateEvent(start_time_string, end_time_string); // Set `show_event_list_dot` to false. - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/false); + CreateEventListItemView(date, event.get(), + UIParams{/*round_top_corners=*/ + true, /*round_bottom_corners=*/true, + /*show_event_list_dot=*/false}); // Event list dot should not exist. EXPECT_FALSE(GetEventListItemDot()); // Set `show_event_list_dot` to true. - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/true); + CreateEventListItemView(date, event.get(), + UIParams{/*round_top_corners=*/ + true, /*round_bottom_corners=*/true, + /*show_event_list_dot=*/true}); // Event list dot should exist. EXPECT_TRUE(GetEventListItemDot()); @@ -250,9 +251,7 @@ const auto event = CreateEvent(start_time_string, end_time_string, false, "https://meet.google.com/my-meeting"); - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/false); + CreateEventListItemView(date, event.get()); EXPECT_TRUE(GetJoinButton()); } @@ -266,9 +265,7 @@ const char* end_time_string = "22 Nov 2021 10:00 GMT"; const auto event = CreateEvent(start_time_string, end_time_string); - CreateEventListItemView(date, event.get(), /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/false); + CreateEventListItemView(date, event.get()); EXPECT_FALSE(GetJoinButton()); }
diff --git a/ash/system/time/calendar_event_list_view.cc b/ash/system/time/calendar_event_list_view.cc index 7a021dd..aa5b366b 100644 --- a/ash/system/time/calendar_event_list_view.cc +++ b/ash/system/time/calendar_event_list_view.cc
@@ -225,8 +225,10 @@ views::BoxLayout::Orientation::kVertical, gfx::Insets(), kChildEventListBetweenChildSpacing)); + const int events_size = events.size(); for (SingleDayEventList::iterator it = events.begin(); it != events.end(); ++it) { + const int event_index = std::distance(events.begin(), it) + 1; container->AddChildView(std::make_unique<CalendarEventListItemViewJelly>( /*calendar_view_controller=*/calendar_view_controller_, /*selected_date_params=*/ @@ -235,9 +237,14 @@ calendar_view_controller_->selected_date_midnight(), calendar_view_controller_->selected_date_midnight_utc()}, /*event=*/ *it, - /*round_top_corners=*/it == events.begin(), - /*round_bottom_corners=*/it->id() == events.rbegin()->id(), - /*show_event_list_dot=*/true)); + /*ui_params=*/ + UIParams{/*round_top_corners=*/it == events.begin(), + /*round_bottom_corners=*/it->id() == events.rbegin()->id(), + /*show_event_list_dot=*/true, + /*fixed_width=*/0}, + /*event_list_item_index=*/ + EventListItemIndex{/*item_index=*/event_index, + /*total_count_of_events=*/events_size})); } return container;
diff --git a/ash/system/time/calendar_up_next_view.cc b/ash/system/time/calendar_up_next_view.cc index 6f110b42..6292f77 100644 --- a/ash/system/time/calendar_up_next_view.cc +++ b/ash/system/time/calendar_up_next_view.cc
@@ -108,7 +108,7 @@ views::Button::PressedCallback callback) { return views::Builder<views::Button>( std::make_unique<IconButton>( - std::move(callback), IconButton::Type::kXSmall, + std::move(callback), IconButton::Type::kXSmallFloating, &kCalendarUpNextTodaysEventsButtonIcon, IDS_ASH_CALENDAR_UP_NEXT_TODAYS_EVENTS_BUTTON)) .Build(); @@ -207,12 +207,14 @@ base::Unretained(this)), IconButton::Type::kXSmallFloating, &kCaretLeftIcon, IDS_ASH_CALENDAR_UP_NEXT_SCROLL_LEFT_BUTTON)); + left_scroll_button_->SetFocusBehavior(FocusBehavior::NEVER); right_scroll_button_ = button_container->AddChildView(std::make_unique<IconButton>( base::BindRepeating(&CalendarUpNextView::OnScrollRightButtonPressed, base::Unretained(this)), IconButton::Type::kXSmallFloating, &kCaretRightIcon, IDS_ASH_CALENDAR_UP_NEXT_SCROLL_RIGHT_BUTTON)); + right_scroll_button_->SetFocusBehavior(FocusBehavior::NEVER); header_view_->AddChildView(std::move(button_container)); // Scroll view. @@ -222,6 +224,9 @@ scroll_view_->SetHorizontalScrollBarMode( views::ScrollView::ScrollBarMode::kHiddenButEnabled); scroll_view_->SetTreatAllScrollEventsAsHorizontal(true); + // Set the `scroll_view_` contents to receive focus first, followed by the + // todays events button. + scroll_view_->InsertBeforeInFocusList(todays_events_button_container_); // Contents. const auto events = calendar_view_controller_->UpcomingEvents(); @@ -280,10 +285,13 @@ calendar_view_controller_, SelectedDateParams{now, selected_date_midnight, selected_date_midnight_utc}, - /*event=*/event, /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/false, - /*fixed_width=*/kLabelFullWidth)); + /*event=*/event, /*ui_params=*/ + UIParams{/*round_top_corners=*/true, /*round_bottom_corners=*/true, + /*show_event_list_dot=*/false, + /*fixed_width=*/kLabelFullWidth}, + /*event_list_item_index=*/ + EventListItemIndex{/*item_index=*/1, + /*total_count_of_events=*/1})); content_layout_manager->SetFlexForView(child_view, 1); @@ -296,16 +304,22 @@ // Multiple events are displayed in a scroll view of events with a max item // width. Longer event names will have an ellipsis applied. - for (auto& event : events) { + const int events_size = events.size(); + for (auto it = events.begin(); it != events.end(); ++it) { + const int event_index = std::distance(events.begin(), it) + 1; content_view_->AddChildView( std::make_unique<CalendarEventListItemViewJelly>( calendar_view_controller_, SelectedDateParams{now, selected_date_midnight, selected_date_midnight_utc}, - /*event=*/event, /*round_top_corners=*/true, - /*round_bottom_corners=*/true, - /*show_event_list_dot=*/false, - /*fixed_width=*/kLabelCappedWidth)); + /*event=*/*it, + /*ui_params=*/ + UIParams{/*round_top_corners=*/true, /*round_bottom_corners=*/true, + /*show_event_list_dot=*/false, + /*fixed_width=*/kLabelCappedWidth}, + /*event_list_item_index=*/ + EventListItemIndex{/*item_index=*/event_index, + /*total_count_of_events=*/events_size})); } // Show scroll buttons if we have multiple events.
diff --git a/ash/system/time/calendar_up_next_view_unittest.cc b/ash/system/time/calendar_up_next_view_unittest.cc index c33e22e..dd681c9 100644 --- a/ash/system/time/calendar_up_next_view_unittest.cc +++ b/ash/system/time/calendar_up_next_view_unittest.cc
@@ -128,6 +128,16 @@ PressScrollButton(GetScrollRightButton()); } + void PressTab() { + ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); + generator.PressKey(ui::KeyboardCode::VKEY_TAB, ui::EF_NONE); + } + + void PressShiftTab() { + ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); + generator.PressKey(ui::KeyboardCode::VKEY_TAB, ui::EF_SHIFT_DOWN); + } + int ScrollPosition() { return GetScrollView()->GetVisibleRect().x(); } void ScrollHorizontalPositionTo(int position_in_px) { @@ -463,6 +473,62 @@ "Ash.Calendar.UpNextView.JoinMeetingButton.Pressed", 1); } +// Greenlines can be found in b/258648030. +TEST_F(CalendarUpNextViewTest, ShouldFocusViewsInCorrectOrder_WhenPressingTab) { + // Set time override. + base::subtle::ScopedTimeClockOverrides time_override( + []() { return base::subtle::TimeNowIgnoringOverride().LocalMidnight(); }, + nullptr, nullptr); + + // Create up next view with 2 upcoming google meet events. + CreateUpNextView( + CreateUpcomingEvents(2, false, "https://meet.google.com/abc-123")); + EXPECT_EQ(GetContentsView()->children().size(), size_t(2)); + auto* focus_manager = up_next_view()->GetFocusManager(); + + // First the event list item view should be focused. + PressTab(); + auto* first_item = GetContentsView()->children()[0]; + ASSERT_TRUE(first_item); + EXPECT_EQ(first_item, focus_manager->GetFocusedView()); + EXPECT_STREQ("CalendarEventListItemViewJelly", + focus_manager->GetFocusedView()->GetClassName()); + + // Next, the "Join" button should be focused. + PressTab(); + EXPECT_EQ(first_item->GetViewByID(kJoinButtonID), + focus_manager->GetFocusedView()); + + // Next, the second event list item view should be focused. + PressTab(); + auto* second_item = GetContentsView()->children()[1]; + ASSERT_TRUE(second_item); + EXPECT_EQ(second_item, focus_manager->GetFocusedView()); + EXPECT_STREQ("CalendarEventListItemViewJelly", + focus_manager->GetFocusedView()->GetClassName()); + + // Next, the second event list item view "Join" button should be focused. + PressTab(); + EXPECT_EQ(second_item->GetViewByID(kJoinButtonID), + focus_manager->GetFocusedView()); + + // Finally, the show upcoming events button should be focused. + PressTab(); + EXPECT_EQ(GetTodaysEventsButton(), focus_manager->GetFocusedView()); + + // Going back, the second event list item view "Join" button should be + // focused. + PressShiftTab(); + EXPECT_EQ(second_item->GetViewByID(kJoinButtonID), + focus_manager->GetFocusedView()); + + // Going back again, the second event list item view should be focused. + PressShiftTab(); + EXPECT_EQ(second_item, focus_manager->GetFocusedView()); + EXPECT_STREQ("CalendarEventListItemViewJelly", + focus_manager->GetFocusedView()->GetClassName()); +} + class CalendarUpNextViewAnimationTest : public CalendarUpNextViewTest { public: CalendarUpNextViewAnimationTest()
diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc index cc34d89..668c761 100644 --- a/ash/system/time/calendar_view.cc +++ b/ash/system/time/calendar_view.cc
@@ -1857,8 +1857,7 @@ if (up_next_view_ && up_next_view_mask_) { // Once the animation is complete, the `up_next_view_` needs to be invisible - // otherwise ChromeVox will pick it - // up. + // otherwise ChromeVox will pick it up. up_next_view_->SetVisible(false); // Remove the layer mask, otherwise it repositions to the top of the @@ -1877,8 +1876,8 @@ calendar_view_controller_->OnEventListOpened(); // Moves focusing ring to the close button of the event list if it's opened - // from the date cell view focus. - if (IsDateCellViewFocused()) { + // from the date cell view focus or from the `up_next_view_`. + if (IsDateCellViewFocused() || up_next_view_) { RequestFocusForEventListCloseButton(); }
diff --git a/ash/system/time/calendar_view_unittest.cc b/ash/system/time/calendar_view_unittest.cc index 4563382..fb52dbe6 100644 --- a/ash/system/time/calendar_view_unittest.cc +++ b/ash/system/time/calendar_view_unittest.cc
@@ -2605,4 +2605,33 @@ EXPECT_EQ(u"2021", header_year()->GetText()); } +TEST_F( + CalendarViewWithJellyEnabledTest, + ShouldFocusEventListCloseButton_WhenEventListViewLaunchedFromUpNextView) { + base::Time date; + ASSERT_TRUE(base::Time::FromString("18 Nov 2021 10:00 GMT", &date)); + // Set time override. + SetFakeNow(date); + base::subtle::ScopedTimeClockOverrides time_override( + &CalendarViewTest::FakeTimeNow, /*time_ticks_override=*/nullptr, + /*thread_ticks_override=*/nullptr); + + CreateCalendarView(); + MockEventsFetched(calendar_utils::GetStartOfMonthUTC(date), + CreateMockEventListWithEventStartTimeTenMinsAway()); + + // When fetched events are in the next 10 mins, then up next should have been + // created. + ASSERT_TRUE(up_next_view()); + + auto* focus_manager = calendar_view()->GetFocusManager(); + up_next_todays_events_button()->RequestFocus(); + ASSERT_EQ(up_next_todays_events_button(), focus_manager->GetFocusedView()); + + PressEnter(); + ASSERT_TRUE(event_list_view()); + + EXPECT_EQ(focus_manager->GetFocusedView(), close_button()); +} + } // namespace ash
diff --git a/ash/system/tray/tray_detailed_view.cc b/ash/system/tray/tray_detailed_view.cc index f3f180d..89f4a9b 100644 --- a/ash/system/tray/tray_detailed_view.cc +++ b/ash/system/tray/tray_detailed_view.cc
@@ -41,6 +41,7 @@ #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/background.h" #include "ui/views/border.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/controls/progress_bar.h" @@ -485,6 +486,15 @@ AshColorProvider::ContentLayerType::kIconColorPrimary)), text); } + + if (features::IsQsRevampEnabled()) { + views::FocusRing::Install(item); + views::InstallRoundRectHighlightPathGenerator(item, gfx::Insets(2), + /*corner_radius=*/0); + // Unset the focus painter set by `ActionableView`. + item->SetFocusPainter(nullptr); + } + return item; }
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index aa98207a..6acc495 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -586,18 +586,8 @@ void UnifiedSystemTrayController::EnsureExpanded() { if (detailed_view_controller_) { - showing_audio_detailed_view_ = false; - showing_display_detailed_view_ = false; - if (features::IsQsRevampEnabled()) { - quick_settings_view_->ResetDetailedView(); - } else { - unified_view_->ResetDetailedView(); - } - - // Destroy `detailed_view_controller_` after resetting - // `quick_settings_view_`'s `detailed_view_` because the detailed view has a - // reference to its `detailed_view_controller_` which is used in shutdown. - detailed_view_controller_.reset(); + // If a detailed view is showing, first transit to the main view. + TransitionToMainView(false); } StartAnimation(true /*expand*/);
diff --git a/ash/system/unified/unified_system_tray_unittest.cc b/ash/system/unified/unified_system_tray_unittest.cc index b579db0a..4d0f4c4 100644 --- a/ash/system/unified/unified_system_tray_unittest.cc +++ b/ash/system/unified/unified_system_tray_unittest.cc
@@ -20,6 +20,7 @@ #include "ash/system/status_area_widget_test_helper.h" #include "ash/system/time/time_tray_item_view.h" #include "ash/system/time/time_view.h" +#include "ash/system/unified/date_tray.h" #include "ash/system/unified/ime_mode_view.h" #include "ash/system/unified/unified_slider_bubble_controller.h" #include "ash/system/unified/unified_system_tray_bubble.h" @@ -42,6 +43,12 @@ namespace ash { +namespace { + +constexpr int kQsDetailedViewHeight = 464; + +} // namespace + using message_center::MessageCenter; using message_center::Notification; @@ -166,6 +173,28 @@ return bubble ? bubble->GetBoundsInScreen() : gfx::Rect(); } + void TransferFromCalendarViewToMainViewByFuncKeys(UnifiedSystemTray* tray, + TrayBubbleView* bubble_view, + ui::KeyboardCode key) { + ShellTestApi().PressAccelerator(ui::Accelerator(key, ui::EF_NONE)); + EXPECT_FALSE(tray->IsShowingCalendarView()); + // Tests that `UnifiedSystemTray` is active and has the ink drop, while + // `DateTray` becomes inactive. + EXPECT_TRUE(tray->is_active()); + EXPECT_FALSE(date_tray()->is_active()); + // For QsRevamp: the main bubble is shorter than the detailed view bubble. + EXPECT_GT(kQsDetailedViewHeight, bubble_view->height()); + } + + void CheckDetailedViewHeight(TrayBubbleView* bubble_view) { + if (IsQsRevampEnabled()) { + // The bubble height should be fixed to the detailed view height. + EXPECT_EQ(kQsDetailedViewHeight, bubble_view->height()); + } else { + EXPECT_GT(kQsDetailedViewHeight, bubble_view->height()); + } + } + TimeTrayItemView* time_view() { return GetPrimaryUnifiedSystemTray()->time_view_; } @@ -174,6 +203,13 @@ return GetPrimaryUnifiedSystemTray()->ime_mode_view_; } + DateTray* date_tray() { + return Shell::GetPrimaryRootWindowController() + ->shelf() + ->GetStatusAreaWidget() + ->date_tray(); + } + FakeVideoConferenceTrayController* fake_video_conference_tray_controller() { return fake_video_conference_tray_controller_.get(); } @@ -580,6 +616,39 @@ EXPECT_FALSE(tray->IsShowingCalendarView()); } +// Tests that using functional keys to change brightness/volume when the +// `CalendarView` is open will make ink drop transfer(before and after +// QsRevamp) and bubble height change(after QsRevamp). +TEST_P(UnifiedSystemTrayTest, CalendarGoesToMainViewByFunctionalKeys) { + auto* tray = GetPrimaryUnifiedSystemTray(); + tray->ShowBubble(); + auto* bubble_view = tray->bubble()->GetBubbleView(); + + ShellTestApi().PressAccelerator( + ui::Accelerator(ui::VKEY_C, ui::EF_COMMAND_DOWN)); + EXPECT_TRUE(tray->IsShowingCalendarView()); + CheckDetailedViewHeight(bubble_view); + + // Tests the volume up/down/mute functional keys. It should hide the calendar + // view and open the `unified_system_tray_bubble_`. The ink drop should + // transfer from `DateTray` to `UnifiedSystemTray` and the `bubble_view` + // should shrink for the revamped Qs main page. + TransferFromCalendarViewToMainViewByFuncKeys(tray, bubble_view, + ui::VKEY_VOLUME_UP); + TransferFromCalendarViewToMainViewByFuncKeys(tray, bubble_view, + ui::VKEY_VOLUME_DOWN); + TransferFromCalendarViewToMainViewByFuncKeys(tray, bubble_view, + ui::VKEY_VOLUME_MUTE); + + // Tests the brightness up/down functional keys. + TransferFromCalendarViewToMainViewByFuncKeys(tray, bubble_view, + ui::VKEY_BRIGHTNESS_UP); + TransferFromCalendarViewToMainViewByFuncKeys(tray, bubble_view, + ui::VKEY_BRIGHTNESS_DOWN); + + tray->CloseBubble(); +} + // Tests if the microphone mute toast is displayed when the mute state is // toggled by the software switches. TEST_P(UnifiedSystemTrayTest, InputMuteStateToggledBySoftwareSwitch) { @@ -810,7 +879,7 @@ auto* bubble_view = tray->bubble()->GetBubbleView(); // The main page height should be smaller than the detailed view height. - EXPECT_GT(464, bubble_view->height()); + EXPECT_GT(kQsDetailedViewHeight, bubble_view->height()); // Goes to a detailed view (here using calendar view). ShellTestApi().PressAccelerator( @@ -819,12 +888,7 @@ // Asserts that calendar is actually shown. EXPECT_TRUE(GetPrimaryUnifiedSystemTray()->IsShowingCalendarView()); - if (IsQsRevampEnabled()) { - // The bubble height should be fixed to the detailed view height. - EXPECT_EQ(464, bubble_view->height()); - } else { - EXPECT_GT(464, bubble_view->height()); - } + CheckDetailedViewHeight(bubble_view); tray->CloseBubble(); } @@ -837,7 +901,7 @@ auto* bubble_view = tray->bubble()->GetBubbleView(); // The main page height should be smaller than the detailed view height. - EXPECT_GT(464, bubble_view->height()); + EXPECT_GT(kQsDetailedViewHeight, bubble_view->height()); // Goes to a detailed view (here using calendar view). ShellTestApi().PressAccelerator( @@ -846,7 +910,7 @@ EXPECT_TRUE(GetPrimaryUnifiedSystemTray()->IsShowingCalendarView()); // No enough space for the fixed detailed view height. - EXPECT_GT(464, bubble_view->height()); + EXPECT_GT(kQsDetailedViewHeight, bubble_view->height()); tray->CloseBubble(); }
diff --git a/ash/system/video_conference/bubble/set_value_effects_view.cc b/ash/system/video_conference/bubble/set_value_effects_view.cc index 3b4cc9d..22de931a 100644 --- a/ash/system/video_conference/bubble/set_value_effects_view.cc +++ b/ash/system/video_conference/bubble/set_value_effects_view.cc
@@ -60,9 +60,7 @@ absl::optional<int> current_state = effect->get_state_callback().Run(); DCHECK(current_state.has_value()); - auto tab_slider = std::make_unique<TabSlider>( - /*has_background=*/true, /*has_selector_animation=*/true, - /*distribute_space_evenly=*/true); + auto tab_slider = std::make_unique<TabSlider>(); const int num_states = effect->GetNumStates(); DCHECK_LE(num_states, 3) << "UX Requests no more than 3 states, otherwise " "the bubble will need to be wider."; @@ -118,4 +116,4 @@ } } -} // namespace ash::video_conference \ No newline at end of file +} // namespace ash::video_conference
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn index d1c8fcc7..b566a53 100644 --- a/ash/webui/common/resources/BUILD.gn +++ b/ash/webui/common/resources/BUILD.gn
@@ -223,7 +223,7 @@ resource_path_prefix = "ash/common" } -generate_grd("build_grdp") { +generate_grd("build_grd") { input_files = [ "fake_method_resolver.js", "fake_observables.js", @@ -275,11 +275,37 @@ "network_health/test_warning.png", ] input_files_base_dir = rebase_path(".", "//") - public_deps = [ ":preprocess" ] - manifest_files = [ "$target_gen_dir/$preprocessed_manifest" ] - grd_prefix = "ash_common" - out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp" + grd_prefix = "ash_webui_common" + out_grd = "$target_gen_dir/resources.grd" resource_path_prefix = "ash/common" + + deps = [ + ":build_html_css_wrapper_files_grdp", + ":preprocess", + "hotspot:build_grdp", + "typescript_utils:build_grdp", + ] + + manifest_files = [ "$target_gen_dir/$preprocessed_manifest" ] + grdp_files = [ + "$target_gen_dir/hotspot/resources.grdp", + "$target_gen_dir/typescript_utils/resources.grdp", + "$target_gen_dir/html_css_wrapper_files_resources.grdp", + ] +} + +grit("resources") { + enable_input_discovery_for_gn_analyze = false + source = "$target_gen_dir/resources.grd" + deps = [ ":build_grd" ] + + outputs = [ + "grit/ash_webui_common_resources.h", + "grit/ash_webui_common_resources_map.cc", + "grit/ash_webui_common_resources_map.h", + "ash_webui_common_resources.pak", + ] + output_dir = "$root_gen_dir/ash/webui" } generate_definitions_js_files = [
diff --git a/ash/webui/common/resources/network/network_config.js b/ash/webui/common/resources/network/network_config.js index 41d453c7..637b0fa9 100644 --- a/ash/webui/common/resources/network/network_config.js +++ b/ash/webui/common/resources/network/network_config.js
@@ -1826,12 +1826,6 @@ this.managedProperties_.source !== OncSource.kNone) { return false; } - - // Insecure WiFi networks are always shared. - if (this.mojoType_ === NetworkType.kWiFi && - this.securityType_ === SecurityType.kNone) { - return false; - } return true; },
diff --git a/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js b/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js index cda9a988..cc948f9 100644 --- a/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js +++ b/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js
@@ -91,6 +91,7 @@ recordNavbarButtonClick(page) { chrome.metricsPrivateIndividualApis.recordUserAction( 'DemoMode_Highlights_Navbar_Click_' + page + 'Button'); + this.recordFirstInteraction(page); } /**
diff --git a/ash/webui/network_ui/BUILD.gn b/ash/webui/network_ui/BUILD.gn index a32a1602..83e59b0 100644 --- a/ash/webui/network_ui/BUILD.gn +++ b/ash/webui/network_ui/BUILD.gn
@@ -14,10 +14,10 @@ deps = [ "//ash/constants", + "//ash/webui/common/resources:resources_grit", "//chromeos/strings/", "//content/public/browser", "//ui/base", - "//ui/resources:webui_resources_grd_grit", ] } @@ -28,10 +28,10 @@ ] deps = [ + "//ash/webui/common/resources:resources_grit", "//chromeos/strings/", "//content/public/browser", "//ui/base", - "//ui/resources:webui_resources_grd_grit", ] } @@ -46,6 +46,5 @@ "//chromeos/strings/", "//content/public/browser", "//ui/base", - "//ui/resources:webui_resources_grd_grit", ] }
diff --git a/ash/webui/network_ui/network_diagnostics_resource_provider.cc b/ash/webui/network_ui/network_diagnostics_resource_provider.cc index 8180cff..38b97c4 100644 --- a/ash/webui/network_ui/network_diagnostics_resource_provider.cc +++ b/ash/webui/network_ui/network_diagnostics_resource_provider.cc
@@ -4,10 +4,10 @@ #include "ash/webui/network_ui/network_diagnostics_resource_provider.h" +#include "ash/webui/grit/ash_webui_common_resources.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/base/webui/web_ui_util.h" -#include "ui/resources/grit/webui_resources.h" namespace ash { namespace network_diagnostics { @@ -139,11 +139,12 @@ }; constexpr WebUiResource kResources[] = { - {"test_canceled.png", IDR_ASH_COMMON_NETWORK_HEALTH_TEST_CANCELED_PNG}, - {"test_failed.png", IDR_ASH_COMMON_NETWORK_HEALTH_TEST_FAILED_PNG}, - {"test_not_run.png", IDR_ASH_COMMON_NETWORK_HEALTH_TEST_NOT_RUN_PNG}, - {"test_passed.png", IDR_ASH_COMMON_NETWORK_HEALTH_TEST_PASSED_PNG}, - {"test_warning.png", IDR_ASH_COMMON_NETWORK_HEALTH_TEST_WARNING_PNG}, + {"test_canceled.png", + IDR_ASH_WEBUI_COMMON_NETWORK_HEALTH_TEST_CANCELED_PNG}, + {"test_failed.png", IDR_ASH_WEBUI_COMMON_NETWORK_HEALTH_TEST_FAILED_PNG}, + {"test_not_run.png", IDR_ASH_WEBUI_COMMON_NETWORK_HEALTH_TEST_NOT_RUN_PNG}, + {"test_passed.png", IDR_ASH_WEBUI_COMMON_NETWORK_HEALTH_TEST_PASSED_PNG}, + {"test_warning.png", IDR_ASH_WEBUI_COMMON_NETWORK_HEALTH_TEST_WARNING_PNG}, }; struct StringMap {
diff --git a/ash/webui/network_ui/network_health_resource_provider.cc b/ash/webui/network_ui/network_health_resource_provider.cc index 0e332e4c..aba47832 100644 --- a/ash/webui/network_ui/network_health_resource_provider.cc +++ b/ash/webui/network_ui/network_health_resource_provider.cc
@@ -4,10 +4,10 @@ #include "ash/webui/network_ui/network_health_resource_provider.h" +#include "ash/webui/grit/ash_webui_common_resources.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/base/webui/web_ui_util.h" -#include "ui/resources/grit/webui_resources.h" namespace ash { namespace network_health { @@ -56,10 +56,10 @@ }; constexpr WebUiResource kResources[] = { - {"ethernet.svg", IDR_ASH_COMMON_NETWORK_ETHERNET_SVG}, - {"vpn.svg", IDR_ASH_COMMON_NETWORK_VPN_SVG}, - {"wifi_0.svg", IDR_ASH_COMMON_NETWORK_WIFI_0_SVG}, - {"cellular_0.svg", IDR_ASH_COMMON_NETWORK_CELLULAR_0_SVG}, + {"ethernet.svg", IDR_ASH_WEBUI_COMMON_NETWORK_ETHERNET_SVG}, + {"vpn.svg", IDR_ASH_WEBUI_COMMON_NETWORK_VPN_SVG}, + {"wifi_0.svg", IDR_ASH_WEBUI_COMMON_NETWORK_WIFI_0_SVG}, + {"cellular_0.svg", IDR_ASH_WEBUI_COMMON_NETWORK_CELLULAR_0_SVG}, }; } // namespace
diff --git a/ash/webui/network_ui/traffic_counters_resource_provider.cc b/ash/webui/network_ui/traffic_counters_resource_provider.cc index c5b3b88a..66d1b28 100644 --- a/ash/webui/network_ui/traffic_counters_resource_provider.cc +++ b/ash/webui/network_ui/traffic_counters_resource_provider.cc
@@ -8,7 +8,6 @@ #include "chromeos/strings/grit/chromeos_strings.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/base/webui/web_ui_util.h" -#include "ui/resources/grit/webui_resources.h" namespace ash { namespace traffic_counters {
diff --git a/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.html b/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.html index 420b93f..670cc57 100644 --- a/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.html +++ b/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.html
@@ -1,4 +1,4 @@ -<style> +<style include="cros-button-style"> cr-dialog::part(dialog) { min-width: 288px; width: 288px; @@ -7,7 +7,7 @@ <cr-dialog id="dialog" show-on-attach> <div slot="body">$i18n{ambientModeLastArtAlbumMessage}</div> <div slot="button-container"> - <cr-button class="action-button" on-click="onClose_"> + <cr-button class="action-button primary" on-click="onClose_"> $i18n{ambientModeArtAlbumDialogCloseButtonLabel} </cr-button> </div>
diff --git a/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.ts b/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.ts index 7ab25f73..c2b2468 100644 --- a/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.ts +++ b/ash/webui/personalization_app/resources/js/ambient/art_album_dialog_element.ts
@@ -6,6 +6,8 @@ * @fileoverview The element for displaying information for art albums. */ +import '../../css/cros_button_style.css.js'; + import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {WithPersonalizationStore} from '../personalization_store.js';
diff --git a/ash/webui/personalization_app/resources/js/user/avatar_list_element.html b/ash/webui/personalization_app/resources/js/user/avatar_list_element.html index 68f0257e..ddd2094 100644 --- a/ash/webui/personalization_app/resources/js/user/avatar_list_element.html +++ b/ash/webui/personalization_app/resources/js/user/avatar_list_element.html
@@ -117,7 +117,8 @@ <div class="image-border-container"> <img class$="[[getImageClassForOption_(item)]]" src="[[item.imgSrc]]" - style$="[[getImgBackgroundStyle_(item.imgSrc, item.defaultImageIndex)]]"> + style$="[[getImgBackgroundStyle_(item.imgSrc, item.defaultImageIndex)]]" + on-error="onImgError_"> <iron-icon icon$="[[item.icon]]"></iron-icon> </div> </div>
diff --git a/ash/webui/personalization_app/resources/js/user/avatar_list_element.ts b/ash/webui/personalization_app/resources/js/user/avatar_list_element.ts index 3fbb499..3ff2ed4 100644 --- a/ash/webui/personalization_app/resources/js/user/avatar_list_element.ts +++ b/ash/webui/personalization_app/resources/js/user/avatar_list_element.ts
@@ -262,9 +262,22 @@ } } - // Called when (1) avatar images fail to load, (2) device goes - // offline while the avatar picker is open, (3) user tries to - // select an avatar while the device is offline. + /** + * Called when there's an image load error. + * + * The most common case would be when trying to load default avatars + * from gstatic resources for the first time while the device is offline. + */ + private onImgError_(e: Event) { + const divElement = e.currentTarget as HTMLDivElement; + divElement.setAttribute('hidden', 'true'); + } + + /** + * Called when (1) avatar images fail to load, (2) the device goes + * offline while the avatar picker window is open, or (3) the user + * tries to select an avatar while the device is offline. + */ private onAvatarNetworkError_ = () => { this.dispatch(setErrorAction({ id: 'AvatarList',
diff --git a/ash/webui/personalization_app/resources/js/user/user_preview_element.html b/ash/webui/personalization_app/resources/js/user/user_preview_element.html index 93813776..20430a7 100644 --- a/ash/webui/personalization_app/resources/js/user/user_preview_element.html +++ b/ash/webui/personalization_app/resources/js/user/user_preview_element.html
@@ -245,7 +245,8 @@ role="button" on-click="onClickUserSubpageLink_" on-keypress="onClickUserSubpageLink_" - style$="[[getImgBackgroudStyle_(imageUrl_.url)]]"> + on-error="onImgError_" + style$="[[getImgBackgroundStyle_(imageUrl_.url)]]"> </div> </template> <template is="dom-if"
diff --git a/ash/webui/personalization_app/resources/js/user/user_preview_element.ts b/ash/webui/personalization_app/resources/js/user/user_preview_element.ts index 8e6cdc0..5af883c 100644 --- a/ash/webui/personalization_app/resources/js/user/user_preview_element.ts +++ b/ash/webui/personalization_app/resources/js/user/user_preview_element.ts
@@ -107,6 +107,11 @@ } } + private onImgError_(e: Event) { + const divElement = e.currentTarget as HTMLDivElement; + divElement.setAttribute('hidden', 'true'); + } + private shouldShowMainPageView_(path: string, isEnterpriseManaged: boolean): boolean { return path === Paths.ROOT && !isEnterpriseManaged; @@ -153,7 +158,7 @@ * images . Static image loads faster and will provide a smooth experience * when the animated image complete loading. */ - private getImgBackgroudStyle_(url: Url|null): string { + private getImgBackgroundStyle_(url: Url|null): string { // Only add background image for default user images. if (!this.image_ || this.image_.invalidImage || !this.image_.defaultImage) { return '';
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc index d3383b14..3fe2b20 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -668,7 +668,7 @@ {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN, TAKE_WINDOW_SCREENSHOT}, - {/*trigger_on_press=*/true, ui::VKEY_PRIOR, + {/*trigger_on_press=*/true, ui::VKEY_UP, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DESKS_NEW_DESK}, {/*trigger_on_press=*/true, ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN, @@ -690,9 +690,9 @@ // done. [Left]+[Alt]>[Left]+[Alt]. {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU}, - // When [Search] is the only modifier, no remapping is done. - // [Left]+[Search]->[Left]+[Search]. + // When [Search] is the only modifier, [Left]+[Search]->[Home]. {/*trigger_on_press=*/true, ui::VKEY_LEFT, ui::EF_COMMAND_DOWN, NEW_TAB}, + {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_NONE, NEW_TAB}, // When key code is not reversed six pack key, no remapping is done. // [Tab]+[Search]+[Alt]->[Tab]+[Search]+[Alt]. {/*trigger_on_press=*/true, ui::VKEY_TAB, @@ -709,10 +709,11 @@ TAKE_WINDOW_SCREENSHOT}, {/*trigger_on_press=*/true, ui::VKEY_HOME, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, TAKE_WINDOW_SCREENSHOT}, - // [Prior]+[Search]+[Alt]->[Up]+[Alt]. - {/*trigger_on_press=*/true, ui::VKEY_PRIOR, + // [Up]+[Search]+[Alt]->[Prior]+[Alt]. + {/*trigger_on_press=*/true, ui::VKEY_UP, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, DESKS_NEW_DESK}, - {/*trigger_on_press=*/true, ui::VKEY_UP, ui::EF_ALT_DOWN, DESKS_NEW_DESK}, + {/*trigger_on_press=*/true, ui::VKEY_PRIOR, ui::EF_ALT_DOWN, + DESKS_NEW_DESK}, // [Right]+[Search]+[Shift]+[Alt]->[End]+[Shift]+[Alt]. {/*trigger_on_press=*/true, ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, @@ -736,11 +737,10 @@ SHOW_TASK_MANAGER}, {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_ALT_DOWN, SHOW_TASK_MANAGER}, - - // If the accelerator is just the reverse of [Insert], no remapping is - // done. [Back]+[Search]+[Shift] -> [Back]+[Search]+[Shift]. + // [Back]+[Search]+[Shift] -> [Insert]. {/*trigger_on_press=*/true, ui::VKEY_BACK, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, BRIGHTNESS_UP}, + {/*trigger_on_press=*/true, ui::VKEY_INSERT, ui::EF_NONE, BRIGHTNESS_UP}, }; Shell::Get()->ash_accelerator_configuration()->Initialize(test_data);
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 30f7d07b..3c438fc 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -62,6 +62,7 @@ #include "base/metrics/histogram_macros.h" #include "base/notreached.h" #include "base/ranges/algorithm.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" @@ -118,6 +119,13 @@ // interval. constexpr base::TimeDelta kDeskTraversalsTimeout = base::Seconds(5); +constexpr char kCloseAllZombieWindowsFoundHistogramName[] = + "Ash.Desks.CloseAllZombieWindowsFound"; + +// The amount of time we wait after `CleanUpClosedAppWindowsTask` runs before +// we check how many of those windows are still in memory. +constexpr base::TimeDelta kCloseAllWindowsZombieCheckTimeout = base::Minutes(1); + constexpr int kDeskDefaultNameIds[] = { IDS_ASH_DESKS_DESK_1_MINI_VIEW_TITLE, IDS_ASH_DESKS_DESK_2_MINI_VIEW_TITLE, @@ -261,6 +269,13 @@ ToastManager::Get()->Show(std::move(undo_toast_data)); } +// Reports the number of windows that still exist in `window_tracker`. +void ReportNumberOfZombieWindows( + std::unique_ptr<aura::WindowTracker> window_tracker) { + base::UmaHistogramCounts100(kCloseAllZombieWindowsFoundHistogramName, + window_tracker->windows().size()); +} + } // namespace // Class that can hold the data for a removed desk while it waits for a user @@ -2017,6 +2032,8 @@ void DesksController::CleanUpClosedAppWindowsTask( std::unique_ptr<aura::WindowTracker> closing_window_tracker) { + auto widgetless_windows = std::make_unique<aura::WindowTracker>(); + // We have waited long enough for these app windows to close cleanly. // If there is any app windows still around, we will close them forcefully. // These window's desk has already been removed. We should not let these @@ -2024,75 +2041,27 @@ while (!closing_window_tracker->windows().empty()) { aura::Window* window = closing_window_tracker->Pop(); views::Widget* widget = views::Widget::GetWidgetForNativeView(window); - DCHECK(widget); - - // TODO(b/266617023): Clean this up when bug is resolved. - // Crash keys for b/266617023. - // We want to understand everything about the window that is causing the - // crash so we know how to reproduce. - SCOPED_CRASH_KEY_NUMBER("CloseAll", "window_type", window->GetType()); - SCOPED_CRASH_KEY_NUMBER("CloseAll", "window_app_type", - window->GetProperty(aura::client::kAppType)); - SCOPED_CRASH_KEY_NUMBER( - "CloseAll", "window_z_level", - static_cast<int>(window->GetProperty(aura::client::kZOrderingKey))); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_is_visible", window->IsVisible()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_has_focus", window->HasFocus()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_visible_all", - desks_util::IsWindowVisibleOnAllWorkspaces(window)); - - // Window bounds logging. - SCOPED_CRASH_KEY_STRING64("CloseAll", "window_bounds", - window->bounds().ToString()); - - // Window state logging. - WindowState* window_state = WindowState::Get(window); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_exists", !!window_state); - if (window_state) { - SCOPED_CRASH_KEY_NUMBER("CloseAll", "window_state_type", - static_cast<int>(window_state->GetStateType())); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_minimized", - window_state->IsMinimized()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_maximized", - window_state->IsMaximized()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_fullscreen", - window_state->IsFullscreen()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_snapped", - window_state->IsSnapped()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_pinned", - window_state->IsPinned()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_trustedpinned", - window_state->IsTrustedPinned()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_pip", - window_state->IsPip()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_floated", - window_state->IsFloated()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_is_active", - window_state->IsActive()); - SCOPED_CRASH_KEY_BOOL("CloseAll", "window_state_userpositionable", - window_state->IsUserPositionable()); - } - - // Environment logging. - SCOPED_CRASH_KEY_BOOL( - "CloseAll", "in_overview_session", - Shell::Get()->overview_controller()->InOverviewSession()); - SCOPED_CRASH_KEY_NUMBER("CloseAll", "desk_count", desks_.size()); - - // Understand the window's connection to the widget. - views::internal::NativeWidgetPrivate* native_widget = - views::internal::NativeWidgetPrivate::GetNativeWidgetForNativeView( - window); - SCOPED_CRASH_KEY_BOOL("CloseAll", "native_widget_exists", !!native_widget); - SCOPED_CRASH_KEY_BOOL("CloseAll", "native_widget_has_widget", - native_widget && native_widget->GetWidget()); // Forcefully close this app window. `CloseNow` which directly deleted the // associated native widget. This will skip many Window shutdown hook // logic. However, the desk controller has waited for the app window to // close cleanly before this. - widget->CloseNow(); + if (widget) { + widget->CloseNow(); + } else { + // If the window does not have a widget, we add it to the + // `widgetless_windows` tracker to check back on later. + widgetless_windows->Add(window); + } } + + // We post a delayed task to check that all of the windows in + // `widgetless_windows eventually end up closing. + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&ReportNumberOfZombieWindows, + std::move(widgetless_windows)), + kCloseAllWindowsZombieCheckTimeout); } void DesksController::MoveVisibleOnAllDesksWindowsFromActiveDeskTo( @@ -2133,12 +2102,28 @@ } } +// Temporary helper for crash debugging. Produces a comma separated a list of +// the given window and its parents up to the root. +static std::string WindowAncestry(aura::Window* window) { + std::string result = base::StringPrintf("%p", window); + while ((window = window->parent())) { + base::StringAppendF(&result, ",%p", window); + } + return result; +} + void DesksController::RestackVisibleOnAllDesksWindowsOnActiveDesk() { if (features::IsPerDeskZOrderEnabled()) { active_desk_->RestackAllDeskWindows(); return; } + // TODO(b/252556509): Clean this up once the issue has been resolved. + SCOPED_CRASH_KEY_NUMBER("Restack", "adw_count", + visible_on_all_desks_windows_.size()); + SCOPED_CRASH_KEY_NUMBER("Restack", "root_count", + Shell::GetAllRootWindows().size()); + auto mru_windows = Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk); for (auto* visible_on_all_desks_window : visible_on_all_desks_windows_) { @@ -2147,10 +2132,46 @@ if (visible_on_all_desks_window_iter == mru_windows.end()) continue; + SCOPED_CRASH_KEY_NUMBER("Restack", "adw_type", + visible_on_all_desks_window->GetType()); + SCOPED_CRASH_KEY_NUMBER( + "Restack", "adw_app_type", + visible_on_all_desks_window->GetProperty(aura::client::kAppType)); + SCOPED_CRASH_KEY_STRING256("Restack", "adw_ancestry", + WindowAncestry(visible_on_all_desks_window)); + + WindowState* window_state = WindowState::Get(visible_on_all_desks_window); + SCOPED_CRASH_KEY_BOOL("Restack", "state_exists", !!window_state); + SCOPED_CRASH_KEY_NUMBER( + "Restack", "state_type", + window_state && static_cast<int>(window_state->GetStateType())); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_minimized", + window_state && window_state->IsMinimized()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_maximized", + window_state && window_state->IsMaximized()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_fullscreen", + window_state && window_state->IsFullscreen()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_snapped", + window_state && window_state->IsSnapped()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_pinned", + window_state && window_state->IsPinned()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_trustedpinned", + window_state && window_state->IsTrustedPinned()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_pip", + window_state && window_state->IsPip()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_floated", + window_state && window_state->IsFloated()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_is_active", + window_state && window_state->IsActive()); + SCOPED_CRASH_KEY_BOOL("Restack", "adw_userpositionable", + window_state && window_state->IsUserPositionable()); + auto* desk_container = visible_on_all_desks_window->GetRootWindow()->GetChildById( active_desk_->container_id()); DCHECK_EQ(desk_container, visible_on_all_desks_window->parent()); + SCOPED_CRASH_KEY_STRING256("Restack", "container_ancestry", + WindowAncestry(desk_container)); // Search through the MRU list for the next element that shares the same // parent. This will be used to stack |visible_on_all_desks_window| in
diff --git a/ash/wm/multitask_menu_nudge_controller_unittest.cc b/ash/wm/multitask_menu_nudge_controller_unittest.cc index 9019962e..a7f1efe 100644 --- a/ash/wm/multitask_menu_nudge_controller_unittest.cc +++ b/ash/wm/multitask_menu_nudge_controller_unittest.cc
@@ -163,11 +163,11 @@ views::NamedWidgetShownWaiter waiter( views::test::AnyWidgetTestPasskey{}, std::string("MultitaskMenuBubbleWidget")); - auto* size_button = static_cast<chromeos::FrameSizeButton*>( + chromeos::FrameSizeButton* size_button = NonClientFrameViewAsh::Get(window.get()) ->GetHeaderView() ->caption_button_container() - ->size_button()); + ->size_button(); size_button->ShowMultitaskMenu( chromeos::MultitaskMenuEntryType::kFrameSizeButtonHover); views::WidgetDelegate* delegate = @@ -181,8 +181,7 @@ ->GetBoundsInScreen() .CenterPoint()); GetEventGenerator()->ClickLeftButton(); - ASSERT_TRUE(WindowState::Get(window.get())->IsFloated()); - EXPECT_TRUE(GetNudgeWidgetForWindow(window.get())); + EXPECT_TRUE(WindowState::Get(window.get())->IsFloated()); } TEST_F(MultitaskMenuNudgeControllerTest, NudgeTimeout) { @@ -287,6 +286,36 @@ EXPECT_FALSE(GetNudgeWidgetForWindow(window.get())); } +// Tests that after the multitask menu is shown, the nudge does not show +// anymore. +TEST_F(MultitaskMenuNudgeControllerTest, MenuShown) { + // Create a window, the nudge is shown on new window activation. + auto window = CreateAppWindow(gfx::Rect(300, 300)); + ASSERT_TRUE(GetNudgeWidgetForWindow(window.get())); + + // Fake waiting for nudge to dismiss and open the multitask menu. + FireDismissNudgeTimer(window.get()); + ASSERT_FALSE(GetNudgeWidgetForWindow(window.get())); + views::NamedWidgetShownWaiter waiter( + views::test::AnyWidgetTestPasskey{}, + std::string("MultitaskMenuBubbleWidget")); + chromeos::FrameSizeButton* size_button = + NonClientFrameViewAsh::Get(window.get()) + ->GetHeaderView() + ->caption_button_container() + ->size_button(); + size_button->ShowMultitaskMenu( + chromeos::MultitaskMenuEntryType::kFrameSizeButtonHover); + waiter.WaitIfNeededAndGet(); + + // Advance the clock and then destroy the window and create a new window. + // Test that the nudge does not show up. + test_clock_.Advance(base::Hours(25)); + window.reset(); + window = CreateAppWindow(gfx::Rect(300, 300)); + EXPECT_FALSE(GetNudgeWidgetForWindow(window.get())); +} + // Tests that the nudge works in tablet mode, and that its bounds in screen are // correct. TEST_F(MultitaskMenuNudgeControllerTest, TabletNudgeBounds) {
diff --git a/ash/wm/tablet_mode/tablet_mode_multitask_cue.cc b/ash/wm/tablet_mode/tablet_mode_multitask_cue.cc index da8354d0..2bfb220 100644 --- a/ash/wm/tablet_mode/tablet_mode_multitask_cue.cc +++ b/ash/wm/tablet_mode/tablet_mode_multitask_cue.cc
@@ -105,7 +105,7 @@ nudge_controller_.MaybeShowNudge(window_); } -void TabletModeMultitaskCue::DismissCue() { +void TabletModeMultitaskCue::DismissCue(bool menu_opened) { cue_dismiss_timer_.Stop(); window_observation_.Reset(); @@ -116,8 +116,13 @@ cue_layer_.reset(); - // The education nudge should not appear without the cue. - nudge_controller_.DismissNudge(); + // If we want to dismiss the cue because the menu was opened, let the nudge + // know, so we don't show it anymore. Otherwise, just dismiss it. + if (menu_opened) { + nudge_controller_.OnMenuOpened(/*tablet_mode=*/true); + } else { + nudge_controller_.DismissNudge(); + } } void TabletModeMultitaskCue::OnWindowDestroying(aura::Window* window) { @@ -189,7 +194,7 @@ .SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET) .OnEnded(base::BindOnce(&TabletModeMultitaskCue::DismissCue, - base::Unretained(this))) + base::Unretained(this), /*menu_opened=*/false)) .Once() .SetDuration(kFadeDuration) .SetOpacity(cue_layer_.get(), 0.0f, gfx::Tween::LINEAR);
diff --git a/ash/wm/tablet_mode/tablet_mode_multitask_cue.h b/ash/wm/tablet_mode/tablet_mode_multitask_cue.h index e2cd45c..b41be6a9 100644 --- a/ash/wm/tablet_mode/tablet_mode_multitask_cue.h +++ b/ash/wm/tablet_mode/tablet_mode_multitask_cue.h
@@ -42,8 +42,9 @@ void MaybeShowCue(aura::Window* active_window); // Dismisses the cue from the screen and cleans up the pointers and - // observers related to its parent window. - void DismissCue(); + // observers related to its parent window. `menu_opened` is true if we want to + // dismiss the cue because the tablet multitask menu has been opened. + void DismissCue(bool menu_opened = false); // aura::WindowObserver: void OnWindowDestroying(aura::Window* window) override;
diff --git a/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler.cc b/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler.cc index 1b62662..50bbe0fa 100644 --- a/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler.cc +++ b/ash/wm/tablet_mode/tablet_mode_multitask_menu_event_handler.cc
@@ -168,7 +168,7 @@ if (!multitask_menu_) { multitask_menu_ = std::make_unique<TabletModeMultitaskMenu>(this, active_window); - multitask_cue_->DismissCue(); + multitask_cue_->DismissCue(/*menu_opened=*/true); } }
diff --git a/base/BUILD.gn b/base/BUILD.gn index 422702c..8bc9f34 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -1261,6 +1261,8 @@ "os_compat_android.cc", "os_compat_android.h", "process/process_android.cc", + "profiler/native_unwinder_android_map_delegate.h", + "profiler/native_unwinder_android_memory_regions_map.h", "profiler/stack_sampler_android.cc", "system/sys_info_android.cc", "threading/platform_thread_android.cc",
diff --git a/base/allocator/dispatcher/reentry_guard.cc b/base/allocator/dispatcher/reentry_guard.cc index 8f4448b5..92a526a 100644 --- a/base/allocator/dispatcher/reentry_guard.cc +++ b/base/allocator/dispatcher/reentry_guard.cc
@@ -17,15 +17,25 @@ namespace base::allocator::dispatcher { #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_ANDROID) -pthread_key_t ReentryGuard::entered_key_ = 0; +// pthread_key_t has different signedness on Mac and Android. Store the null +// value in a strongly-typed constant to avoid "comparison of integers of +// different signs" warnings when comparing with 0. +constexpr pthread_key_t kNullKey = 0; + +pthread_key_t ReentryGuard::entered_key_ = kNullKey; void ReentryGuard::InitTLSSlot() { - if (entered_key_ == 0) { + if (entered_key_ == kNullKey) { int error = pthread_key_create(&entered_key_, nullptr); CHECK(!error); + // Touch the TLS slot immediately to force any allocations. + // TODO(https://crbug.com/1411454): Use this technique to avoid allocations + // in PoissonAllocationSampler::ScopedMuteThreadSamples, which will make + // ReentryGuard redundant. + pthread_setspecific(entered_key_, nullptr); } - DCHECK(entered_key_ != 0); + DCHECK_NE(entered_key_, kNullKey); } #else
diff --git a/base/allocator/dispatcher/reentry_guard.h b/base/allocator/dispatcher/reentry_guard.h index 6d13fec..52329d8 100644 --- a/base/allocator/dispatcher/reentry_guard.h +++ b/base/allocator/dispatcher/reentry_guard.h
@@ -23,8 +23,10 @@ // twice. The scoped guard allows us to detect that. // // Besides that the implementations of thread_local on macOS and Android -// seem to allocate memory lazily on the first access to thread_local variables. -// Make use of pthread TLS instead of C++ thread_local there. +// seem to allocate memory lazily on the first access to thread_local variables +// (and on Android at least thread_local is implemented on top of pthread so is +// strictly worse for performance). Make use of pthread TLS instead of C++ +// thread_local there. struct BASE_EXPORT ReentryGuard { ReentryGuard() : allowed_(!pthread_getspecific(entered_key_)) { pthread_setspecific(entered_key_, reinterpret_cast<void*>(true)); @@ -37,10 +39,11 @@ explicit operator bool() const noexcept { return allowed_; } - // This function must be called in very early of the process start-up in - // order to acquire a low TLS slot number because glibc TLS implementation - // will require a malloc call to allocate storage for a higher slot number - // (>= PTHREAD_KEY_2NDLEVEL_SIZE == 32). c.f. heap_profiling::InitTLSSlot. + // This function must be called before installing any allocator hooks because + // some TLS implementations may allocate (eg. glibc will require a malloc call + // to allocate storage for a higher slot number (>= PTHREAD_KEY_2NDLEVEL_SIZE + // == 32). This touches the thread-local storage so that any malloc happens + // before installing the hooks. static void InitTLSSlot(); // InitTLSSlot() is called before crash keys are available. At some point
diff --git a/base/allocator/partition_allocator/BUILD.gn b/base/allocator/partition_allocator/BUILD.gn index 36f2b30..d1bf283 100644 --- a/base/allocator/partition_allocator/BUILD.gn +++ b/base/allocator/partition_allocator/BUILD.gn
@@ -102,7 +102,6 @@ "partition_alloc_base/memory/ref_counted.h", "partition_alloc_base/memory/scoped_policy.h", "partition_alloc_base/memory/scoped_refptr.h", - "partition_alloc_base/migration_adapter.h", "partition_alloc_base/no_destructor.h", "partition_alloc_base/numerics/checked_math.h", "partition_alloc_base/numerics/checked_math_impl.h",
diff --git a/base/allocator/partition_allocator/extended_api.cc b/base/allocator/partition_allocator/extended_api.cc index ef2a245..4ff579c2 100644 --- a/base/allocator/partition_allocator/extended_api.cc +++ b/base/allocator/partition_allocator/extended_api.cc
@@ -53,45 +53,79 @@ #endif // PA_CONFIG(THREAD_CACHE_SUPPORTED) -void SwapOutProcessThreadCacheForTesting(ThreadSafePartitionRoot* root) { -#if PA_CONFIG(THREAD_CACHE_SUPPORTED) - -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - DisablePartitionAllocThreadCacheForProcess(); -#else - PA_CHECK(!ThreadCache::IsValid(ThreadCache::Get())); -#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - - ThreadCache::SwapForTesting(root); - EnablePartitionAllocThreadCacheForRootIfDisabled(root); - -#endif // PA_CONFIG(THREAD_CACHE_SUPPORTED) +ThreadAllocStats GetAllocStatsForCurrentThread() { + ThreadCache* thread_cache = ThreadCache::Get(); + if (ThreadCache::IsValid(thread_cache)) { + return thread_cache->thread_alloc_stats(); + } + return {}; } -void SwapInProcessThreadCacheForTesting(ThreadSafePartitionRoot* root) { #if PA_CONFIG(THREAD_CACHE_SUPPORTED) - - // First, disable the test thread cache we have. - DisableThreadCacheForRootIfEnabled(root); - +ThreadCacheProcessScopeForTesting::ThreadCacheProcessScopeForTesting( + ThreadSafePartitionRoot* root) + : root_(root) { #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) auto* regular_allocator = allocator_shim::internal::PartitionAllocMalloc::Allocator(); - EnablePartitionAllocThreadCacheForRootIfDisabled(regular_allocator); + regular_was_enabled_ = + regular_allocator && regular_allocator->flags.with_thread_cache; - ThreadCache::SwapForTesting(regular_allocator); + if (root_ != regular_allocator) { + // Another |root| is ThreadCache's PartitionRoot. Need to disable + // thread cache for the process. + DisablePartitionAllocThreadCacheForProcess(); + EnablePartitionAllocThreadCacheForRootIfDisabled(root_); + // Replace ThreadCache's PartitionRoot. + ThreadCache::SwapForTesting(root_); + } else { + if (!regular_was_enabled_) { + EnablePartitionAllocThreadCacheForRootIfDisabled(root_); + ThreadCache::SwapForTesting(root_); + } + } #else - ThreadCache::SwapForTesting(nullptr); + PA_CHECK(!ThreadCache::IsValid(ThreadCache::Get())); + EnablePartitionAllocThreadCacheForRootIfDisabled(root_); + ThreadCache::SwapForTesting(root_); #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) -#endif // PA_CONFIG(THREAD_CACHE_SUPPORTED) + PA_CHECK(ThreadCache::Get()); } -ThreadAllocStats GetAllocStatsForCurrentThread() { - ThreadCache* thread_cache = ThreadCache::Get(); - if (ThreadCache::IsValid(thread_cache)) - return thread_cache->thread_alloc_stats(); - return {}; +ThreadCacheProcessScopeForTesting::~ThreadCacheProcessScopeForTesting() { +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + auto* regular_allocator = + allocator_shim::internal::PartitionAllocMalloc::Allocator(); + bool regular_enabled = + regular_allocator && regular_allocator->flags.with_thread_cache; + + if (regular_was_enabled_) { + if (!regular_enabled) { + // Need to re-enable ThreadCache for the process. + EnablePartitionAllocThreadCacheForRootIfDisabled(regular_allocator); + // In the case, |regular_allocator| must be ThreadCache's root. + ThreadCache::SwapForTesting(regular_allocator); + } else { + // ThreadCache is enabled for the process, but we need to be + // careful about ThreadCache's PartitionRoot. If it is different from + // |regular_allocator|, we need to invoke SwapForTesting(). + if (regular_allocator != root_) { + ThreadCache::SwapForTesting(regular_allocator); + } + } + } else { + // ThreadCache for all processes was disabled. + DisableThreadCacheForRootIfEnabled(regular_allocator); + ThreadCache::SwapForTesting(nullptr); + } +#else + // First, disable the test thread cache we have. + DisableThreadCacheForRootIfEnabled(root_); + + ThreadCache::SwapForTesting(nullptr); +#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } +#endif // PA_CONFIG(THREAD_CACHE_SUPPORTED) } // namespace partition_alloc::internal
diff --git a/base/allocator/partition_allocator/extended_api.h b/base/allocator/partition_allocator/extended_api.h index 27359fa8..7146c10 100644 --- a/base/allocator/partition_allocator/extended_api.h +++ b/base/allocator/partition_allocator/extended_api.h
@@ -5,25 +5,38 @@ #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_EXTENDED_API_H_ #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_EXTENDED_API_H_ +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" #include "base/allocator/partition_allocator/partition_root.h" #include "base/allocator/partition_allocator/partition_stats.h" #include "base/allocator/partition_allocator/thread_cache.h" namespace partition_alloc::internal { -// These two functions are unsafe to run if there are multiple threads running -// in the process. -// -// Disables the thread cache for the entire process, and replaces it with a -// thread cache for |root|. -void SwapOutProcessThreadCacheForTesting(ThreadSafePartitionRoot* root); -// Disables the current thread cache, and replaces it with the default for the -// process. -void SwapInProcessThreadCacheForTesting(ThreadSafePartitionRoot* root); - // Get allocation stats for the thread cache partition on the current // thread. See the documentation of ThreadAllocStats for details. ThreadAllocStats GetAllocStatsForCurrentThread(); +// Creates a scope for testing which: +// - if the given |root| is a default malloc root for the entire process, +// enables the thread cache for the entire process. +// (This may happen if UsePartitionAllocAsMalloc is enabled.) +// - otherwise, disables the thread cache for the entire process, and +// replaces it with a thread cache for |root|. +// This class is unsafe to run if there are multiple threads running +// in the process. +class ThreadCacheProcessScopeForTesting { + public: + explicit ThreadCacheProcessScopeForTesting(ThreadSafePartitionRoot* root); + ~ThreadCacheProcessScopeForTesting(); + + ThreadCacheProcessScopeForTesting() = delete; + + private: + ThreadSafePartitionRoot* root_ = nullptr; +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + bool regular_was_enabled_ = false; +#endif +}; + } // namespace partition_alloc::internal #endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_EXTENDED_API_H_
diff --git a/base/allocator/partition_allocator/memory_reclaimer_unittest.cc b/base/allocator/partition_allocator/memory_reclaimer_unittest.cc index f033825..8c04f16 100644 --- a/base/allocator/partition_allocator/memory_reclaimer_unittest.cc +++ b/base/allocator/partition_allocator/memory_reclaimer_unittest.cc
@@ -18,6 +18,7 @@ #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \ PA_CONFIG(THREAD_CACHE_SUPPORTED) +#include "base/allocator/partition_allocator/extended_api.h" #include "base/allocator/partition_allocator/thread_cache.h" #endif @@ -120,11 +121,8 @@ TEST_F(MemoryReclaimerTest, DoNotAlwaysPurgeThreadCache) { // Make sure the thread cache is enabled in the main partition. - if (!allocator_shim::internal::PartitionAllocMalloc::Allocator() - ->thread_cache_for_testing()) { - allocator_shim::internal::PartitionAllocMalloc::Allocator() - ->EnableThreadCacheIfSupported(); - } + internal::ThreadCacheProcessScopeForTesting scope( + allocator_shim::internal::PartitionAllocMalloc::Allocator()); for (size_t i = 0; i < ThreadCache::kDefaultSizeThreshold; i++) { void* data = malloc(i);
diff --git a/base/allocator/partition_allocator/page_allocator_internals_posix.h b/base/allocator/partition_allocator/page_allocator_internals_posix.h index 45d31e7..c3b5dbf 100644 --- a/base/allocator/partition_allocator/page_allocator_internals_posix.h +++ b/base/allocator/partition_allocator/page_allocator_internals_posix.h
@@ -136,8 +136,18 @@ return base::mac::CFCast<CFBooleanRef>(jit_entitlement.get()) == kCFBooleanTrue; } -#endif // BUILDFLAG(IS_MAC) - +#elif BUILDFLAG(IS_IOS) +bool UseMapJit() { +// Always enable MAP_JIT in simulator as it is supported unconditionally. +#if TARGET_IPHONE_SIMULATOR + return true; +#else + // TODO(https://crbug.com/1413818): Fill this out when the API it is + // available. + return false; +#endif // TARGET_IPHONE_SIMULATOR +} +#endif // BUILDFLAG(IS_IOS) } // namespace // |mmap| uses a nearby address if the hint address is blocked. @@ -166,7 +176,7 @@ int access_flag = GetAccessFlags(accessibility); int map_flags = MAP_ANONYMOUS | MAP_PRIVATE; -#if BUILDFLAG(IS_MAC) +#if BUILDFLAG(IS_APPLE) // On macOS 10.14 and higher, executables that are code signed with the // "runtime" option cannot execute writable memory by default. They can opt // into this capability by specifying the "com.apple.security.cs.allow-jit"
diff --git a/base/allocator/partition_allocator/partition_alloc_base/bits.h b/base/allocator/partition_allocator/partition_alloc_base/bits.h index 613c3f55..5a3fc1d4 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/bits.h +++ b/base/allocator/partition_allocator/partition_alloc_base/bits.h
@@ -13,7 +13,6 @@ #include <type_traits> #include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_check.h" #include "build/build_config.h"
diff --git a/base/allocator/partition_allocator/partition_alloc_base/cpu.h b/base/allocator/partition_allocator/partition_alloc_base/cpu.h index 1bbe45e..570a2aa4 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/cpu.h +++ b/base/allocator/partition_allocator/partition_alloc_base/cpu.h
@@ -6,7 +6,6 @@ #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CPU_H_ #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/partition_alloc_base/debug/alias.h b/base/allocator/partition_allocator/partition_alloc_base/debug/alias.h index 57d060b..ae4e0c6 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/debug/alias.h +++ b/base/allocator/partition_allocator/partition_alloc_base/debug/alias.h
@@ -8,7 +8,6 @@ #include <stddef.h> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" namespace partition_alloc::internal::base::debug {
diff --git a/base/allocator/partition_allocator/partition_alloc_base/files/file_path.h b/base/allocator/partition_allocator/partition_alloc_base/files/file_path.h index fc2af8e..3fe2e81 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/files/file_path.h +++ b/base/allocator/partition_allocator/partition_alloc_base/files/file_path.h
@@ -107,7 +107,6 @@ #include <string> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" // Windows-style drive letter support and pathname separator characters can be
diff --git a/base/allocator/partition_allocator/partition_alloc_base/logging.h b/base/allocator/partition_allocator/partition_alloc_base/logging.h index 6594417..270d770 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/logging.h +++ b/base/allocator/partition_allocator/partition_alloc_base/logging.h
@@ -15,7 +15,6 @@ #include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" #include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error.h" #include "build/build_config.h"
diff --git a/base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h b/base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h deleted file mode 100644 index 3cbee0c..0000000 --- a/base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h +++ /dev/null
@@ -1,22 +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 BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_MIGRATION_ADAPTER_H_ -#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_MIGRATION_ADAPTER_H_ - -namespace base { - -class LapTimer; - -} // namespace base - -namespace partition_alloc::internal::base { - -// TODO(https://crbug.com/1288247): Remove these 'using' declarations once -// the migration to the new namespaces gets done. -using ::base::LapTimer; - -} // namespace partition_alloc::internal::base - -#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_MIGRATION_ADAPTER_H_
diff --git a/base/allocator/partition_allocator/partition_alloc_base/native_library.h b/base/allocator/partition_allocator/partition_alloc_base/native_library.h index 1c203a6..219d1c0 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/native_library.h +++ b/base/allocator/partition_allocator/partition_alloc_base/native_library.h
@@ -12,7 +12,6 @@ #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" #include "base/allocator/partition_allocator/partition_alloc_base/files/file_path.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" #if BUILDFLAG(IS_WIN)
diff --git a/base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.h b/base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.h index 97952b0e..fe402ed 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.h +++ b/base/allocator/partition_allocator/partition_alloc_base/posix/safe_strerror.h
@@ -10,7 +10,6 @@ #include <string> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/partition_alloc_base/rand_util.h b/base/allocator/partition_allocator/partition_alloc_base/rand_util.h index fbeb49f..3dc55df2 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/rand_util.h +++ b/base/allocator/partition_allocator/partition_alloc_base/rand_util.h
@@ -10,7 +10,6 @@ #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" #include "base/allocator/partition_allocator/partition_alloc_base/gtest_prod_util.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error.h b/base/allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error.h index 3d7c1a4..c180164 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error.h +++ b/base/allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error.h
@@ -8,7 +8,6 @@ #include <errno.h> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h index 9af29f7..a99ed13 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h +++ b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h
@@ -14,7 +14,6 @@ #include <iosfwd> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_ref.h" #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h" #include "build/build_config.h"
diff --git a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h index 1b7fb10..57b85ea 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h +++ b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h
@@ -13,7 +13,6 @@ #include <iosfwd> -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h" #include "build/build_config.h"
diff --git a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_ref.h b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_ref.h index 088a13a0..f7457a9 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_ref.h +++ b/base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_ref.h
@@ -13,7 +13,6 @@ #include <iosfwd> #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "build/build_config.h" #if BUILDFLAG(IS_WIN)
diff --git a/base/allocator/partition_allocator/partition_alloc_base/time/time.h b/base/allocator/partition_allocator/partition_alloc_base/time/time.h index e60bcc7c..82a8d6b1 100644 --- a/base/allocator/partition_allocator/partition_alloc_base/time/time.h +++ b/base/allocator/partition_allocator/partition_alloc_base/time/time.h
@@ -70,7 +70,6 @@ #include "base/allocator/partition_allocator/chromeos_buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/numerics/clamped_math.h" #include "base/allocator/partition_allocator/partition_alloc_check.h" #include "build/build_config.h"
diff --git a/base/allocator/partition_allocator/partition_alloc_perftest.cc b/base/allocator/partition_allocator/partition_alloc_perftest.cc index ad62257..880c594b 100644 --- a/base/allocator/partition_allocator/partition_alloc_perftest.cc +++ b/base/allocator/partition_allocator/partition_alloc_perftest.cc
@@ -182,7 +182,7 @@ reinterpret_cast<MemoryAllocationPerfNode*>(allocator->Alloc(kAllocSize)); size_t allocated_memory = kAllocSize; - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); MemoryAllocationPerfNode* cur = first; do { auto* next = reinterpret_cast<MemoryAllocationPerfNode*>( @@ -215,7 +215,7 @@ // Allocate an initial element to make sure the bucket stays set up. void* elem = allocator->Alloc(kAllocSize); - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); do { void* cur = allocator->Alloc(kAllocSize); PA_CHECK(cur != nullptr); @@ -234,7 +234,7 @@ MemoryAllocationPerfNode* cur = first; size_t allocated_memory = kAllocSize; - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); do { for (int i = 0; i < kMultiBucketRounds; i++) { size_t size = kMultiBucketMinimumSize + (i * kMultiBucketIncrement); @@ -276,7 +276,7 @@ elems.push_back(cur); } - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); do { for (int i = 0; i < kMultiBucketRounds; i++) { void* cur = allocator->Alloc(kMultiBucketMinimumSize + @@ -297,7 +297,7 @@ float DirectMapped(Allocator* allocator) { constexpr size_t kSize = 2 * 1000 * 1000; - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); do { void* cur = allocator->Alloc(kSize); PA_CHECK(cur != nullptr);
diff --git a/base/allocator/partition_allocator/partition_lock_perftest.cc b/base/allocator/partition_allocator/partition_lock_perftest.cc index 961f7696..ec57f4f 100644 --- a/base/allocator/partition_allocator/partition_lock_perftest.cc +++ b/base/allocator/partition_allocator/partition_lock_perftest.cc
@@ -69,7 +69,7 @@ } // namespace TEST(PartitionLockPerfTest, Simple) { - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); [[maybe_unused]] uint32_t data = 0; Lock lock; @@ -106,7 +106,7 @@ while (thread_main.started_count() != kThreads) { } - base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); + ::base::LapTimer timer(kWarmupRuns, kTimeLimit, kTimeCheckInterval); do { lock.Acquire(); data += 1;
diff --git a/base/allocator/partition_allocator/partition_lock_unittest.cc b/base/allocator/partition_allocator/partition_lock_unittest.cc index ea3d710a4..626bc4b7 100644 --- a/base/allocator/partition_allocator/partition_lock_unittest.cc +++ b/base/allocator/partition_allocator/partition_lock_unittest.cc
@@ -5,7 +5,6 @@ #include "base/allocator/partition_allocator/partition_lock.h" #include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h" #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h" #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index 81a4ee2..5f141412d6 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -922,6 +922,7 @@ // May return an invalid thread cache. PA_ALWAYS_INLINE ThreadCache* GetOrCreateThreadCache(); + PA_ALWAYS_INLINE ThreadCache* GetThreadCache(); #if PA_CONFIG(USE_PARTITION_ROOT_ENUMERATOR) static internal::Lock& GetEnumeratorLock(); @@ -1547,7 +1548,7 @@ SlotSpan* slot_span) { // PA_LIKELY: performance-sensitive partitions have a thread cache, // direct-mapped allocations are uncommon. - ThreadCache* thread_cache = GetOrCreateThreadCache(); + ThreadCache* thread_cache = GetThreadCache(); if (PA_LIKELY(ThreadCache::IsValid(thread_cache) && !IsDirectMappedBucket(slot_span->bucket))) { size_t bucket_index = @@ -2274,6 +2275,11 @@ return thread_cache; } +template <bool thread_safe> +ThreadCache* PartitionRoot<thread_safe>::GetThreadCache() { + return PA_LIKELY(flags.with_thread_cache) ? ThreadCache::Get() : nullptr; +} + using ThreadSafePartitionRoot = PartitionRoot<internal::ThreadSafe>; static_assert(offsetof(ThreadSafePartitionRoot, lock_) ==
diff --git a/base/allocator/partition_allocator/starscan/pcscan_scheduling_unittest.cc b/base/allocator/partition_allocator/starscan/pcscan_scheduling_unittest.cc index cd08f89..6f69e15b 100644 --- a/base/allocator/partition_allocator/starscan/pcscan_scheduling_unittest.cc +++ b/base/allocator/partition_allocator/starscan/pcscan_scheduling_unittest.cc
@@ -4,7 +4,6 @@ #include "base/allocator/partition_allocator/starscan/pcscan_scheduling.h" -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h" #include "base/allocator/partition_allocator/partition_alloc_base/time/time_override.h" #include "base/allocator/partition_allocator/partition_lock.h"
diff --git a/base/allocator/partition_allocator/thread_cache_unittest.cc b/base/allocator/partition_allocator/thread_cache_unittest.cc index fca01f9..9469760 100644 --- a/base/allocator/partition_allocator/thread_cache_unittest.cc +++ b/base/allocator/partition_allocator/thread_cache_unittest.cc
@@ -10,11 +10,11 @@ #include "base/allocator/partition_allocator/extended_api.h" #include "base/allocator/partition_allocator/partition_address_space.h" -#include "base/allocator/partition_allocator/partition_alloc.h" #include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h" #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h" #include "base/allocator/partition_allocator/partition_alloc_buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/partition_alloc_for_testing.h" #include "base/allocator/partition_allocator/partition_lock.h" #include "base/allocator/partition_allocator/tagging.h" #include "build/build_config.h" @@ -58,8 +58,10 @@ }; // Forbid extras, since they make finding out which bucket is used harder. -ThreadSafePartitionRoot* CreatePartitionRoot() { - ThreadSafePartitionRoot* root = new ThreadSafePartitionRoot({ +std::unique_ptr<PartitionAllocatorForTesting> CreateAllocator() { + std::unique_ptr<PartitionAllocatorForTesting> allocator = + std::make_unique<PartitionAllocatorForTesting>(); + allocator->init({ PartitionOptions::AlignedAlloc::kAllowed, #if !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) PartitionOptions::ThreadCache::kEnabled, @@ -72,15 +74,9 @@ PartitionOptions::BackupRefPtrZapping::kDisabled, PartitionOptions::UseConfigurablePool::kNo, }); + allocator->root()->UncapEmptySlotSpanMemoryForTesting(); - root->UncapEmptySlotSpanMemoryForTesting(); - - // We do this here instead of in SetUp()/TearDown() because we need this to - // run before the task environment (which creates threads and hence is racy - // with attempting to disable the thread cache). - internal::SwapOutProcessThreadCacheForTesting(root); - - return root; + return allocator; } } // namespace @@ -89,13 +85,11 @@ : public ::testing::TestWithParam< PartitionRoot<internal::ThreadSafe>::BucketDistribution> { public: - PartitionAllocThreadCacheTest() : root_(CreatePartitionRoot()) {} + PartitionAllocThreadCacheTest() + : allocator_(CreateAllocator()), scope_(allocator_->root()) {} ~PartitionAllocThreadCacheTest() override { ThreadCache::SetLargestCachedSize(ThreadCache::kDefaultSizeThreshold); - internal::SwapInProcessThreadCacheForTesting(root_); - - ThreadSafePartitionRoot::DeleteForTesting(root_); // Cleanup the global state so next test can recreate ThreadCache. if (ThreadCache::IsTombstone(ThreadCache::Get())) @@ -104,23 +98,19 @@ protected: void SetUp() override { + ThreadSafePartitionRoot* root = allocator_->root(); switch (GetParam()) { case BucketDistribution::kDefault: - root_->SwitchToDefaultBucketDistribution(); + root->SwitchToDefaultBucketDistribution(); break; case BucketDistribution::kCoarser: - root_->ResetBucketDistributionForTesting(); + root->ResetBucketDistributionForTesting(); break; case BucketDistribution::kDenser: - root_->SwitchToDenserBucketDistribution(); + root->SwitchToDenserBucketDistribution(); break; } -#if BUILDFLAG(HAS_64_BIT_POINTERS) - // Another test can uninitialize the pools, so make sure they are - // initialized. - internal::PartitionAddressSpace::Init(); -#endif // BUILDFLAG(HAS_64_BIT_POINTERS) ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( ThreadCache::kDefaultMultiplier); ThreadCache::SetLargestCachedSize(ThreadCache::kLargeSizeThreshold); @@ -132,7 +122,7 @@ FillThreadCacheAndReturnIndex(kMediumSize, 1000); // There are allocations, a thread cache is created. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root->thread_cache_for_testing(); ASSERT_TRUE(tcache); ThreadCacheRegistry::Instance().ResetForTesting(); @@ -140,21 +130,23 @@ } void TearDown() override { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); ASSERT_TRUE(tcache); tcache->Purge(); - ASSERT_EQ(root_->get_total_size_of_allocated_bytes(), + ASSERT_EQ(root()->get_total_size_of_allocated_bytes(), GetBucketSizeForThreadCache()); } + ThreadSafePartitionRoot* root() { return allocator_->root(); } + // Returns the size of the smallest bucket fitting an allocation of // |sizeof(ThreadCache)| bytes. size_t GetBucketSizeForThreadCache() { - size_t tc_bucket_index = root_->SizeToBucketIndex( + size_t tc_bucket_index = root()->SizeToBucketIndex( sizeof(ThreadCache), ThreadSafePartitionRoot::BucketDistribution::kCoarser); - auto* tc_bucket = &root_->buckets[tc_bucket_index]; + auto* tc_bucket = &root()->buckets[tc_bucket_index]; return tc_bucket->slot_size; } @@ -168,10 +160,10 @@ std::vector<void*> allocated_data; for (size_t i = 0; i < count; ++i) { - allocated_data.push_back(root_->Alloc(size, "")); + allocated_data.push_back(root()->Alloc(size, "")); } for (void* ptr : allocated_data) { - root_->Free(ptr); + root()->Free(ptr); } return bucket_index; @@ -192,7 +184,8 @@ ASSERT_GE(ThreadCache::Get()->CachedMemory(), target_cached_memory); } - ThreadSafePartitionRoot* root_; + std::unique_ptr<PartitionAllocatorForTesting> allocator_; + internal::ThreadCacheProcessScopeForTesting scope_; }; INSTANTIATE_TEST_SUITE_P(AlternateBucketDistribution, @@ -203,22 +196,22 @@ TEST_P(PartitionAllocThreadCacheTest, Simple) { // There is a cache. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_TRUE(tcache); DeltaCounter batch_fill_counter{tcache->stats_.batch_fill_count}; - void* ptr = root_->Alloc(kSmallSize, ""); + void* ptr = root()->Alloc(kSmallSize, ""); ASSERT_TRUE(ptr); uint16_t index = SizeToIndex(kSmallSize); EXPECT_EQ(kFillCountForSmallBucket - 1, tcache->bucket_count_for_testing(index)); - root_->Free(ptr); + root()->Free(ptr); // Freeing fills the thread cache. EXPECT_EQ(kFillCountForSmallBucket, tcache->bucket_count_for_testing(index)); - void* ptr2 = root_->Alloc(kSmallSize, ""); + void* ptr2 = root()->Alloc(kSmallSize, ""); // MTE-untag, because Free() changes tag. EXPECT_EQ(UntagPtr(ptr), UntagPtr(ptr2)); // Allocated from the thread cache. @@ -227,36 +220,36 @@ EXPECT_EQ(1u, batch_fill_counter.Delta()); - root_->Free(ptr2); + root()->Free(ptr2); } TEST_P(PartitionAllocThreadCacheTest, InexactSizeMatch) { - void* ptr = root_->Alloc(kSmallSize, ""); + void* ptr = root()->Alloc(kSmallSize, ""); ASSERT_TRUE(ptr); // There is a cache. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_TRUE(tcache); uint16_t index = SizeToIndex(kSmallSize); EXPECT_EQ(kFillCountForSmallBucket - 1, tcache->bucket_count_for_testing(index)); - root_->Free(ptr); + root()->Free(ptr); // Freeing fills the thread cache. EXPECT_EQ(kFillCountForSmallBucket, tcache->bucket_count_for_testing(index)); - void* ptr2 = root_->Alloc(kSmallSize + 1, ""); + void* ptr2 = root()->Alloc(kSmallSize + 1, ""); // MTE-untag, because Free() changes tag. EXPECT_EQ(UntagPtr(ptr), UntagPtr(ptr2)); // Allocated from the thread cache. EXPECT_EQ(kFillCountForSmallBucket - 1, tcache->bucket_count_for_testing(index)); - root_->Free(ptr2); + root()->Free(ptr2); } TEST_P(PartitionAllocThreadCacheTest, MultipleObjectsCachedPerBucket) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); DeltaCounter batch_fill_counter{tcache->stats_.batch_fill_count}; size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, kFillCountForMediumBucket + 2); @@ -269,14 +262,14 @@ TEST_P(PartitionAllocThreadCacheTest, ObjectsCachedCountIsLimited) { size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, 1000); - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_LT(tcache->bucket_count_for_testing(bucket_index), 1000u); } TEST_P(PartitionAllocThreadCacheTest, Purge) { size_t allocations = 10; size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, allocations); - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_EQ( (1 + allocations / kFillCountForMediumBucket) * kFillCountForMediumBucket, tcache->bucket_count_for_testing(bucket_index)); @@ -285,7 +278,8 @@ } TEST_P(PartitionAllocThreadCacheTest, NoCrossPartitionCache) { - ThreadSafePartitionRoot root({ + PartitionAllocatorForTesting allocator; + allocator.init({ PartitionOptions::AlignedAlloc::kAllowed, PartitionOptions::ThreadCache::kDisabled, PartitionOptions::Quarantine::kAllowed, @@ -296,10 +290,10 @@ }); size_t bucket_index = FillThreadCacheAndReturnIndex(kSmallSize); - void* ptr = root.Alloc(kSmallSize, ""); + void* ptr = allocator.root()->Alloc(kSmallSize, ""); ASSERT_TRUE(ptr); - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_EQ(kFillCountForSmallBucket, tcache->bucket_count_for_testing(bucket_index)); @@ -311,7 +305,7 @@ // Required to record hits and misses. #if PA_CONFIG(THREAD_CACHE_ENABLE_STATISTICS) TEST_P(PartitionAllocThreadCacheTest, LargeAllocationsAreNotCached) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses}; DeltaCounter alloc_miss_too_large_counter{ tcache->stats_.alloc_miss_too_large}; @@ -319,7 +313,7 @@ DeltaCounter cache_fill_misses_counter{tcache->stats_.cache_fill_misses}; FillThreadCacheAndReturnIndex(100 * 1024); - tcache = root_->thread_cache_for_testing(); + tcache = root()->thread_cache_for_testing(); EXPECT_EQ(1u, alloc_miss_counter.Delta()); EXPECT_EQ(1u, alloc_miss_too_large_counter.Delta()); EXPECT_EQ(1u, cache_fill_counter.Delta()); @@ -336,13 +330,13 @@ // This tests that Realloc properly handles bookkeeping, specifically the path // that reallocates in place. TEST_P(PartitionAllocThreadCacheTest, DirectMappedReallocMetrics) { - root_->ResetBookkeepingForTesting(); + root()->ResetBookkeepingForTesting(); - size_t expected_allocated_size = root_->get_total_size_of_allocated_bytes(); + size_t expected_allocated_size = root()->get_total_size_of_allocated_bytes(); EXPECT_EQ(expected_allocated_size, - root_->get_total_size_of_allocated_bytes()); - EXPECT_EQ(expected_allocated_size, root_->get_max_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); + EXPECT_EQ(expected_allocated_size, root()->get_max_size_of_allocated_bytes()); #if PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS) // One extra byte for beyond-the-end pointers: crbug.com/1364476 @@ -350,25 +344,25 @@ #else constexpr size_t kExtrasSize = 0ull; #endif // PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS) - void* ptr = root_->Alloc(10 * internal::kMaxBucketed - kExtrasSize, ""); + void* ptr = root()->Alloc(10 * internal::kMaxBucketed - kExtrasSize, ""); EXPECT_EQ(expected_allocated_size + 10 * internal::kMaxBucketed, - root_->get_total_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); void* ptr2 = - root_->Realloc(ptr, 9 * internal::kMaxBucketed - kExtrasSize, ""); + root()->Realloc(ptr, 9 * internal::kMaxBucketed - kExtrasSize, ""); ASSERT_EQ(ptr, ptr2); EXPECT_EQ(expected_allocated_size + 9 * internal::kMaxBucketed, - root_->get_total_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); - ptr2 = root_->Realloc(ptr, 10 * internal::kMaxBucketed - kExtrasSize, ""); + ptr2 = root()->Realloc(ptr, 10 * internal::kMaxBucketed - kExtrasSize, ""); ASSERT_EQ(ptr, ptr2); EXPECT_EQ(expected_allocated_size + 10 * internal::kMaxBucketed, - root_->get_total_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); - root_->Free(ptr); + root()->Free(ptr); } namespace { @@ -426,10 +420,10 @@ TEST_P(PartitionAllocThreadCacheTest, MultipleThreadCaches) { FillThreadCacheAndReturnIndex(kMediumSize); - auto* parent_thread_tcache = root_->thread_cache_for_testing(); + auto* parent_thread_tcache = root()->thread_cache_for_testing(); ASSERT_TRUE(parent_thread_tcache); - ThreadDelegateForMultipleThreadCaches delegate(parent_thread_tcache, root_, + ThreadDelegateForMultipleThreadCaches delegate(parent_thread_tcache, root(), GetParam()); internal::base::PlatformThreadHandle thread_handle; @@ -469,26 +463,26 @@ // Allocate enough objects to force a cache fill at the next allocation. std::vector<void*> tmp; for (size_t i = 0; i < kDefaultCountForMediumBucket / 4; i++) { - tmp.push_back(root_->Alloc(kMediumSize, "")); + tmp.push_back(root()->Alloc(kMediumSize, "")); } void* other_thread_ptr = nullptr; ThreadDelegateForThreadCacheReclaimedWhenThreadExits delegate( - root_, other_thread_ptr); + root(), other_thread_ptr); internal::base::PlatformThreadHandle thread_handle; internal::base::PlatformThreadForTesting::Create(0, &delegate, &thread_handle); internal::base::PlatformThreadForTesting::Join(thread_handle); - void* this_thread_ptr = root_->Alloc(kMediumSize, ""); + void* this_thread_ptr = root()->Alloc(kMediumSize, ""); // |other_thread_ptr| was returned to the central allocator, and is returned // here, as it comes from the freelist. EXPECT_EQ(UntagPtr(this_thread_ptr), UntagPtr(other_thread_ptr)); - root_->Free(other_thread_ptr); + root()->Free(other_thread_ptr); for (void* ptr : tmp) - root_->Free(ptr); + root()->Free(ptr); } namespace { @@ -523,7 +517,7 @@ } // namespace TEST_P(PartitionAllocThreadCacheTest, ThreadCacheRegistry) { - auto* parent_thread_tcache = root_->thread_cache_for_testing(); + auto* parent_thread_tcache = root()->thread_cache_for_testing(); ASSERT_TRUE(parent_thread_tcache); { @@ -532,7 +526,7 @@ EXPECT_EQ(parent_thread_tcache->next_, nullptr); } - ThreadDelegateForThreadCacheRegistry delegate(parent_thread_tcache, root_, + ThreadDelegateForThreadCacheRegistry delegate(parent_thread_tcache, root(), GetParam()); internal::base::PlatformThreadHandle thread_handle; @@ -547,7 +541,7 @@ #if PA_CONFIG(THREAD_CACHE_ENABLE_STATISTICS) TEST_P(PartitionAllocThreadCacheTest, RecordStats) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); DeltaCounter alloc_counter{tcache->stats_.alloc_count}; DeltaCounter alloc_hits_counter{tcache->stats_.alloc_hits}; DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses}; @@ -559,13 +553,13 @@ DeltaCounter cache_fill_misses_counter{tcache->stats_.cache_fill_misses}; // Cache has been purged, first allocation is a miss. - void* data = root_->Alloc(kMediumSize, ""); + void* data = root()->Alloc(kMediumSize, ""); EXPECT_EQ(1u, alloc_counter.Delta()); EXPECT_EQ(1u, alloc_miss_counter.Delta()); EXPECT_EQ(0u, alloc_hits_counter.Delta()); // Cache fill worked. - root_->Free(data); + root()->Free(data); EXPECT_EQ(1u, cache_fill_counter.Delta()); EXPECT_EQ(1u, cache_fill_hits_counter.Delta()); EXPECT_EQ(0u, cache_fill_misses_counter.Delta()); @@ -589,7 +583,7 @@ size_t expected_count = kDefaultCountForMediumBucket / 2 - 1 + (1 + allocations / kFillCountForMediumBucket) * kFillCountForMediumBucket; - EXPECT_EQ(root_->buckets[bucket_index].slot_size * expected_count, + EXPECT_EQ(root()->buckets[bucket_index].slot_size * expected_count, stats.bucket_total_memory); EXPECT_EQ(sizeof(ThreadCache), stats.metadata_overhead); } @@ -628,7 +622,6 @@ } private: - private: ThreadSafePartitionRoot* root_ = nullptr; BucketDistribution bucket_distribution_; const int alloc_count_; @@ -638,9 +631,9 @@ TEST_P(PartitionAllocThreadCacheTest, MultipleThreadCachesAccounting) { FillThreadCacheAndReturnIndex(kMediumSize); - uint64_t alloc_count = root_->thread_cache_for_testing()->stats_.alloc_count; + uint64_t alloc_count = root()->thread_cache_for_testing()->stats_.alloc_count; - ThreadDelegateForMultipleThreadCachesAccounting delegate(root_, alloc_count, + ThreadDelegateForMultipleThreadCachesAccounting delegate(root(), alloc_count, GetParam()); internal::base::PlatformThreadHandle thread_handle; @@ -714,10 +707,10 @@ std::atomic<bool> purge_called{false}; size_t bucket_index = FillThreadCacheAndReturnIndex(kSmallSize); - ThreadCache* this_thread_tcache = root_->thread_cache_for_testing(); + ThreadCache* this_thread_tcache = root()->thread_cache_for_testing(); ThreadCache* other_thread_tcache = nullptr; - ThreadDelegateForPurgeAll delegate(root_, other_thread_tcache, + ThreadDelegateForPurgeAll delegate(root(), other_thread_tcache, other_thread_started, purge_called, bucket_index, GetParam()); internal::base::PlatformThreadHandle thread_handle; @@ -878,7 +871,7 @@ std::atomic<int> allocations_done{0}; std::atomic<bool> can_finish{false}; ThreadDelegateForPeriodicPurgeSumsOverAllThreads delegate( - root_, allocations_done, can_finish, GetParam()); + root(), allocations_done, can_finish, GetParam()); internal::base::PlatformThreadHandle thread_handle; internal::base::PlatformThreadForTesting::Create(0, &delegate, @@ -907,7 +900,7 @@ #define MAYBE_DynamicCountPerBucket DynamicCountPerBucket #endif TEST_P(PartitionAllocThreadCacheTest, MAYBE_DynamicCountPerBucket) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, kDefaultCountForMediumBucket); @@ -917,13 +910,13 @@ ThreadCache::kDefaultMultiplier / 2); // No immediate batch deallocation. EXPECT_EQ(kDefaultCountForMediumBucket, tcache->buckets_[bucket_index].count); - void* data = root_->Alloc(kMediumSize, ""); + void* data = root()->Alloc(kMediumSize, ""); // Not triggered by allocations. EXPECT_EQ(kDefaultCountForMediumBucket - 1, tcache->buckets_[bucket_index].count); // Free() triggers the purge within limits. - root_->Free(data); + root()->Free(data); EXPECT_LE(tcache->buckets_[bucket_index].count, kDefaultCountForMediumBucket / 2); @@ -941,14 +934,14 @@ } TEST_P(PartitionAllocThreadCacheTest, DynamicCountPerBucketClamping) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( ThreadCache::kDefaultMultiplier / 1000.); for (size_t i = 0; i < ThreadCache::kBucketCount; i++) { // Invalid bucket. if (!tcache->buckets_[i].limit.load(std::memory_order_relaxed)) { - EXPECT_EQ(root_->buckets[i].active_slot_spans_head, nullptr); + EXPECT_EQ(root()->buckets[i].active_slot_spans_head, nullptr); continue; } EXPECT_GE(tcache->buckets_[i].limit.load(std::memory_order_relaxed), 1u); @@ -959,7 +952,7 @@ for (size_t i = 0; i < ThreadCache::kBucketCount; i++) { // Invalid bucket. if (!tcache->buckets_[i].limit.load(std::memory_order_relaxed)) { - EXPECT_EQ(root_->buckets[i].active_slot_spans_head, nullptr); + EXPECT_EQ(root()->buckets[i].active_slot_spans_head, nullptr); continue; } EXPECT_LT(tcache->buckets_[i].limit.load(std::memory_order_relaxed), 0xff); @@ -1027,7 +1020,7 @@ std::atomic<bool> other_thread_started{false}; std::atomic<bool> threshold_changed{false}; - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); size_t bucket_index = FillThreadCacheAndReturnIndex(kSmallSize, kDefaultCountForSmallBucket); EXPECT_EQ(kDefaultCountForSmallBucket, tcache->buckets_[bucket_index].count); @@ -1038,7 +1031,8 @@ ThreadCache::kDefaultMultiplier + 1); ThreadDelegateForDynamicCountPerBucketMultipleThreads delegate( - root_, other_thread_started, threshold_changed, bucket_index, GetParam()); + root(), other_thread_started, threshold_changed, bucket_index, + GetParam()); internal::base::PlatformThreadHandle thread_handle; internal::base::PlatformThreadForTesting::Create(0, &delegate, @@ -1054,7 +1048,7 @@ } TEST_P(PartitionAllocThreadCacheTest, DynamicSizeThreshold) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses}; DeltaCounter alloc_miss_too_large_counter{ tcache->stats_.alloc_miss_too_large}; @@ -1099,7 +1093,7 @@ // Disabled due to flakiness: crbug.com/1287811 TEST_P(PartitionAllocThreadCacheTest, DISABLED_DynamicSizeThresholdPurge) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); DeltaCounter alloc_miss_counter{tcache->stats_.alloc_misses}; DeltaCounter alloc_miss_too_large_counter{ tcache->stats_.alloc_miss_too_large}; @@ -1137,7 +1131,7 @@ return count; }; - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); size_t index = FillThreadCacheAndReturnIndex(kSmallSize, 10); ASSERT_GE(count_items(tcache, index), 10); void* head = tcache->buckets_[index].freelist_head; @@ -1159,92 +1153,92 @@ #endif TEST_P(PartitionAllocThreadCacheTest, MAYBE_Bookkeeping) { void* arr[kFillCountForMediumBucket] = {}; - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); - root_->PurgeMemory(PurgeFlags::kDecommitEmptySlotSpans | - PurgeFlags::kDiscardUnusedSystemPages); - root_->ResetBookkeepingForTesting(); + root()->PurgeMemory(PurgeFlags::kDecommitEmptySlotSpans | + PurgeFlags::kDiscardUnusedSystemPages); + root()->ResetBookkeepingForTesting(); // The ThreadCache is allocated before we change buckets, so its size is // always based on the sparser distribution. - size_t tc_bucket_index = root_->SizeToBucketIndex( + size_t tc_bucket_index = root()->SizeToBucketIndex( sizeof(ThreadCache), ThreadSafePartitionRoot::BucketDistribution::kCoarser); - auto* tc_bucket = &root_->buckets[tc_bucket_index]; + auto* tc_bucket = &root()->buckets[tc_bucket_index]; size_t expected_allocated_size = tc_bucket->slot_size; // For the ThreadCache itself. size_t expected_committed_size = kUseLazyCommit ? internal::SystemPageSize() : tc_bucket->get_bytes_per_span(); - EXPECT_EQ(expected_committed_size, root_->total_size_of_committed_pages); - EXPECT_EQ(expected_committed_size, root_->max_size_of_committed_pages); + EXPECT_EQ(expected_committed_size, root()->total_size_of_committed_pages); + EXPECT_EQ(expected_committed_size, root()->max_size_of_committed_pages); EXPECT_EQ(expected_allocated_size, - root_->get_total_size_of_allocated_bytes()); - EXPECT_EQ(expected_allocated_size, root_->get_max_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); + EXPECT_EQ(expected_allocated_size, root()->get_max_size_of_allocated_bytes()); - void* ptr = root_->Alloc(kMediumSize, ""); + void* ptr = root()->Alloc(kMediumSize, ""); - auto* medium_bucket = root_->buckets + SizeToIndex(kMediumSize); + auto* medium_bucket = root()->buckets + SizeToIndex(kMediumSize); size_t medium_alloc_size = medium_bucket->slot_size; expected_allocated_size += medium_alloc_size; expected_committed_size += kUseLazyCommit ? internal::SystemPageSize() : medium_bucket->get_bytes_per_span(); - EXPECT_EQ(expected_committed_size, root_->total_size_of_committed_pages); - EXPECT_EQ(expected_committed_size, root_->max_size_of_committed_pages); + EXPECT_EQ(expected_committed_size, root()->total_size_of_committed_pages); + EXPECT_EQ(expected_committed_size, root()->max_size_of_committed_pages); EXPECT_EQ(expected_allocated_size, - root_->get_total_size_of_allocated_bytes()); - EXPECT_EQ(expected_allocated_size, root_->get_max_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); + EXPECT_EQ(expected_allocated_size, root()->get_max_size_of_allocated_bytes()); expected_allocated_size += kFillCountForMediumBucket * medium_alloc_size; // These allocations all come from the thread-cache. for (size_t i = 0; i < kFillCountForMediumBucket; i++) { - arr[i] = root_->Alloc(kMediumSize, ""); - EXPECT_EQ(expected_committed_size, root_->total_size_of_committed_pages); - EXPECT_EQ(expected_committed_size, root_->max_size_of_committed_pages); + arr[i] = root()->Alloc(kMediumSize, ""); + EXPECT_EQ(expected_committed_size, root()->total_size_of_committed_pages); + EXPECT_EQ(expected_committed_size, root()->max_size_of_committed_pages); EXPECT_EQ(expected_allocated_size, - root_->get_total_size_of_allocated_bytes()); + root()->get_total_size_of_allocated_bytes()); EXPECT_EQ(expected_allocated_size, - root_->get_max_size_of_allocated_bytes()); + root()->get_max_size_of_allocated_bytes()); EXPECT_EQ((kFillCountForMediumBucket - 1 - i) * medium_alloc_size, tcache->CachedMemory()); } EXPECT_EQ(0U, tcache->CachedMemory()); - root_->Free(ptr); + root()->Free(ptr); for (auto*& el : arr) { - root_->Free(el); + root()->Free(el); } - EXPECT_EQ(root_->get_total_size_of_allocated_bytes(), + EXPECT_EQ(root()->get_total_size_of_allocated_bytes(), expected_allocated_size); tcache->Purge(); - EXPECT_EQ(root_->get_total_size_of_allocated_bytes(), + EXPECT_EQ(root()->get_total_size_of_allocated_bytes(), GetBucketSizeForThreadCache()); } TEST_P(PartitionAllocThreadCacheTest, TryPurgeNoAllocs) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); tcache->TryPurge(); } TEST_P(PartitionAllocThreadCacheTest, TryPurgeMultipleCorrupted) { - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); - void* ptr = root_->Alloc(kMediumSize, ""); + void* ptr = root()->Alloc(kMediumSize, ""); - auto* medium_bucket = root_->buckets + SizeToIndex(kMediumSize); + auto* medium_bucket = root()->buckets + SizeToIndex(kMediumSize); auto* curr = medium_bucket->active_slot_spans_head->get_freelist_head(); curr = curr->GetNextForThreadCache<true>(kMediumSize); curr->CorruptNextForTesting(0x12345678); tcache->TryPurge(); curr->SetNext(nullptr); - root_->Free(ptr); + root()->Free(ptr); } TEST(AlternateBucketDistributionTest, SizeToIndex) { @@ -1309,7 +1303,7 @@ TEST_P(PartitionAllocThreadCacheTest, AllocationRecording) { // There is a cache. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_TRUE(tcache); tcache->ResetPerThreadAllocationStatsForTesting(); @@ -1319,26 +1313,26 @@ const size_t kSingleSlot = internal::PartitionPageSize() + 1; size_t expected_total_size = 0; - void* ptr = root_->Alloc(kSmallSize, ""); + void* ptr = root()->Alloc(kSmallSize, ""); ASSERT_TRUE(ptr); - expected_total_size += root_->GetUsableSize(ptr); - void* ptr2 = root_->Alloc(kBucketedNotCached, ""); + expected_total_size += root()->GetUsableSize(ptr); + void* ptr2 = root()->Alloc(kBucketedNotCached, ""); ASSERT_TRUE(ptr2); - expected_total_size += root_->GetUsableSize(ptr2); - void* ptr3 = root_->Alloc(kDirectMapped, ""); + expected_total_size += root()->GetUsableSize(ptr2); + void* ptr3 = root()->Alloc(kDirectMapped, ""); ASSERT_TRUE(ptr3); - expected_total_size += root_->GetUsableSize(ptr3); - void* ptr4 = root_->Alloc(kSingleSlot, ""); + expected_total_size += root()->GetUsableSize(ptr3); + void* ptr4 = root()->Alloc(kSingleSlot, ""); ASSERT_TRUE(ptr4); - expected_total_size += root_->GetUsableSize(ptr4); + expected_total_size += root()->GetUsableSize(ptr4); EXPECT_EQ(4u, tcache->thread_alloc_stats().alloc_count); EXPECT_EQ(expected_total_size, tcache->thread_alloc_stats().alloc_total_size); - root_->Free(ptr); - root_->Free(ptr2); - root_->Free(ptr3); - root_->Free(ptr4); + root()->Free(ptr); + root()->Free(ptr2); + root()->Free(ptr3); + root()->Free(ptr4); EXPECT_EQ(4u, tcache->thread_alloc_stats().alloc_count); EXPECT_EQ(expected_total_size, tcache->thread_alloc_stats().alloc_total_size); @@ -1355,7 +1349,7 @@ TEST_P(PartitionAllocThreadCacheTest, AllocationRecordingAligned) { // There is a cache. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_TRUE(tcache); tcache->ResetPerThreadAllocationStatsForTesting(); @@ -1376,13 +1370,13 @@ {128, 2 * internal::PartitionPageSize()}, {(4 << 20) + 1, 1 << 19}}; for (auto [requested_size, alignment] : size_alignments) { - void* ptr = root_->AlignedAllocWithFlags(0, alignment, requested_size); + void* ptr = root()->AlignedAllocWithFlags(0, alignment, requested_size); ASSERT_TRUE(ptr); alloc_count++; - total_size += root_->GetUsableSize(ptr); + total_size += root()->GetUsableSize(ptr); EXPECT_EQ(alloc_count, tcache->thread_alloc_stats().alloc_count); EXPECT_EQ(total_size, tcache->thread_alloc_stats().alloc_total_size); - root_->Free(ptr); + root()->Free(ptr); EXPECT_EQ(alloc_count, tcache->thread_alloc_stats().dealloc_count); EXPECT_EQ(total_size, tcache->thread_alloc_stats().dealloc_total_size); } @@ -1399,7 +1393,7 @@ TEST_P(PartitionAllocThreadCacheTest, AllocationRecordingRealloc) { // There is a cache. - auto* tcache = root_->thread_cache_for_testing(); + auto* tcache = root()->thread_cache_for_testing(); EXPECT_TRUE(tcache); tcache->ResetPerThreadAllocationStatsForTesting(); @@ -1415,17 +1409,17 @@ {8 << 20, 4 << 20}, {(8 << 20) - internal::SystemPageSize(), 8 << 20}}; for (auto [size, new_size] : size_new_sizes) { - void* ptr = root_->Alloc(size, ""); + void* ptr = root()->Alloc(size, ""); ASSERT_TRUE(ptr); alloc_count++; - size_t usable_size = root_->GetUsableSize(ptr); + size_t usable_size = root()->GetUsableSize(ptr); total_alloc_size += usable_size; - ptr = root_->Realloc(ptr, new_size, ""); + ptr = root()->Realloc(ptr, new_size, ""); ASSERT_TRUE(ptr); total_dealloc_size += usable_size; dealloc_count++; - usable_size = root_->GetUsableSize(ptr); + usable_size = root()->GetUsableSize(ptr); total_alloc_size += usable_size; alloc_count++; @@ -1436,7 +1430,7 @@ tcache->thread_alloc_stats().dealloc_total_size) << new_size; - root_->Free(ptr); + root()->Free(ptr); dealloc_count++; total_dealloc_size += usable_size; @@ -1454,7 +1448,9 @@ // at runtime. This is intended to happen once, near the start of Chrome, // once we have enabled features. TEST(AlternateBucketDistributionTest, SwitchBeforeAlloc) { - auto* root = CreatePartitionRoot(); + std::unique_ptr<PartitionAllocatorForTesting> allocator(CreateAllocator()); + ThreadSafePartitionRoot* root = allocator->root(); + root->SwitchToDenserBucketDistribution(); constexpr size_t n = (1 << 12) * 3 / 2; EXPECT_NE(internal::BucketIndexLookup::GetIndex(n), @@ -1465,27 +1461,18 @@ root->ResetBucketDistributionForTesting(); root->Free(ptr); - - // Clean up - ThreadCache::SetLargestCachedSize(ThreadCache::kDefaultSizeThreshold); - internal::SwapInProcessThreadCacheForTesting(root); - - ThreadSafePartitionRoot::DeleteForTesting(root); - - // Cleanup the global state so next test can recreate ThreadCache. - if (ThreadCache::IsTombstone(ThreadCache::Get())) - ThreadCache::RemoveTombstoneForTesting(); } // This test makes sure it's safe to switch to the alternate bucket distribution // at runtime. This is intended to happen once, near the start of Chrome, // once we have enabled features. TEST(AlternateBucketDistributionTest, SwitchAfterAlloc) { - auto* root = CreatePartitionRoot(); + std::unique_ptr<PartitionAllocatorForTesting> allocator(CreateAllocator()); constexpr size_t n = (1 << 12) * 3 / 2; EXPECT_NE(internal::BucketIndexLookup::GetIndex(n), internal::BucketIndexLookup::GetIndexForDenserBuckets(n)); + ThreadSafePartitionRoot* root = allocator->root(); void* ptr = root->Alloc(n, ""); root->SwitchToDenserBucketDistribution(); @@ -1494,16 +1481,6 @@ root->Free(ptr2); root->Free(ptr); - - // Clean up - ThreadCache::SetLargestCachedSize(ThreadCache::kDefaultSizeThreshold); - internal::SwapInProcessThreadCacheForTesting(root); - - ThreadSafePartitionRoot::DeleteForTesting(root); - - // Cleanup the global state so next test can recreate ThreadCache. - if (ThreadCache::IsTombstone(ThreadCache::Get())) - ThreadCache::RemoveTombstoneForTesting(); } } // namespace partition_alloc
diff --git a/base/check.cc b/base/check.cc index f8f786ed..34378c6 100644 --- a/base/check.cc +++ b/base/check.cc
@@ -190,14 +190,12 @@ delete log_message_; // Make sure we crash even if LOG(FATAL) has been overridden. - // TODO(crbug.com/1409729): Include Windows and iOS here too. This is done in - // steps to prevent backsliding on platforms where this goes through CQ. - // Currently iOS is blocked by: - // * ListModelTest.InvalidIndexPath + // TODO(crbug.com/1409729): Include Windows here too. This is done in steps to + // prevent backsliding on platforms where this goes through CQ. // Windows is blocked by: // * All/RenderProcessHostWriteableFileDeathTest. // PassUnsafeWriteableExecutableFile/2 - if (is_fatal && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_IOS)) { + if (is_fatal && !BUILDFLAG(IS_WIN)) { base::ImmediateCrash(); } } @@ -239,6 +237,22 @@ base::ImmediateCrash(); } +LogMessage* CheckOpResult::CreateLogMessage(bool is_dcheck, + const char* file, + int line, + const char* expr_str, + char* v1_str, + char* v2_str) { + LogMessage* const log_message = + is_dcheck ? new DCheckLogMessage(file, line, LOGGING_DCHECK) + : new LogMessage(file, line, LOGGING_FATAL); + log_message->stream() << "Check failed: " << expr_str << " (" << v1_str + << " vs. " << v2_str << ")"; + free(v1_str); + free(v2_str); + return log_message; +} + void RawCheck(const char* message) { RawLog(LOGGING_FATAL, message); }
diff --git a/base/check_op.cc b/base/check_op.cc index 5ed45ca..120824d4 100644 --- a/base/check_op.cc +++ b/base/check_op.cc
@@ -76,19 +76,4 @@ return strdup(ss.str().c_str()); } -LogMessage* CheckOpResult::CreateLogMessage(bool is_dcheck, - const char* file, - int line, - const char* expr_str, - char* v1_str, - char* v2_str) { - LogMessage* const log_message = - new LogMessage(file, line, is_dcheck ? LOGGING_DCHECK : LOGGING_FATAL); - log_message->stream() << "Check failed: " << expr_str << " (" << v1_str - << " vs. " << v2_str << ")"; - free(v1_str); - free(v2_str); - return log_message; -} - } // namespace logging
diff --git a/base/check_unittest.cc b/base/check_unittest.cc index afe8824..feabb042 100644 --- a/base/check_unittest.cc +++ b/base/check_unittest.cc
@@ -58,6 +58,8 @@ // Macro which expects a DCHECK to fire if DCHECKs are enabled. // // Note: Please use the `CheckDeathTest` fixture when using this check. +// TODO(pbos): Try to update this macro to detect that non-fatal DCHECKs do +// upload crash dumps without crashing. #define EXPECT_DCHECK(msg, check_expr) \ do { \ if (DCHECK_IS_ON() && logging::LOGGING_DCHECK == logging::LOGGING_FATAL) { \
diff --git a/base/fuchsia/service_provider_impl.h b/base/fuchsia/service_provider_impl.h index eef4663..fa36ad1 100644 --- a/base/fuchsia/service_provider_impl.h +++ b/base/fuchsia/service_provider_impl.h
@@ -26,8 +26,7 @@ // Implementation of the legacy sys.ServiceProvider interface which delegates // requests to an underlying fuchsia.io.Directory of services. // TODO(https://crbug.com/1065707): Remove this when it is no longer required -// by //fuchsia_web/runners/common/modular/agent_impl.h and -// //fuchsia_web/runners/web/web_runner_smoke_test.cc. +// by //fuchsia_web/runners/common/modular/agent_impl.h. class BASE_EXPORT ServiceProviderImpl : public ::fuchsia::sys::ServiceProvider { public: // Constructor that creates ServiceProvider for public services in the
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc index 450bb41f..cea5cf6 100644 --- a/base/metrics/persistent_histogram_allocator.cc +++ b/base/metrics/persistent_histogram_allocator.cc
@@ -917,6 +917,25 @@ return persistent_location_; } +bool GlobalHistogramAllocator::HasPersistentLocation() const { + return !persistent_location_.empty(); +} + +bool GlobalHistogramAllocator::MovePersistentFile(const FilePath& dir) { + DCHECK(HasPersistentLocation()); + + FilePath new_file_path = dir.Append(persistent_location_.BaseName()); + + // Change the location of the persistent file. This is fine to do even though + // the file is currently "opened" by this process. + if (!base::ReplaceFile(persistent_location_, new_file_path, nullptr)) { + return false; + } + + SetPersistentLocation(new_file_path); + return true; +} + bool GlobalHistogramAllocator::WriteToPersistentLocation() { #if BUILDFLAG(IS_NACL) // NACL doesn't support file operations, including ImportantFileWriter. @@ -924,7 +943,7 @@ return false; #else // Stop if no destination is set. - if (persistent_location_.empty()) { + if (!HasPersistentLocation()) { NOTREACHED() << "Could not write \"" << Name() << "\" persistent histograms" << " to file because no location was set."; return false; @@ -948,8 +967,9 @@ #if BUILDFLAG(IS_NACL) NOTREACHED(); #else - if (persistent_location_.empty()) + if (!HasPersistentLocation()) { return; + } // Open (with delete) and then immediately close the file by going out of // scope. This is the only cross-platform safe way to delete a file that may
diff --git a/base/metrics/persistent_histogram_allocator.h b/base/metrics/persistent_histogram_allocator.h index 0b61caf..5c30fb5 100644 --- a/base/metrics/persistent_histogram_allocator.h +++ b/base/metrics/persistent_histogram_allocator.h
@@ -467,6 +467,14 @@ // are to be saved. const FilePath& GetPersistentLocation() const; + // Returns whether the contents of this allocator are being saved to a + // persistent file on disk. + bool HasPersistentLocation() const; + + // Moves the file being used to persist this allocator's data to the directory + // specified by |dir|. Returns whether the operation was successful. + bool MovePersistentFile(const FilePath& dir); + // Writes the internal data to a previously set location. This is generally // called when a process is exiting from a section of code that may not know // the filesystem. The data is written in an atomic manner. The return value
diff --git a/base/metrics/persistent_histogram_allocator_unittest.cc b/base/metrics/persistent_histogram_allocator_unittest.cc index dd7ee32..c57954d 100644 --- a/base/metrics/persistent_histogram_allocator_unittest.cc +++ b/base/metrics/persistent_histogram_allocator_unittest.cc
@@ -10,6 +10,8 @@ #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" #include "base/metrics/bucket_ranges.h" +#include "base/metrics/histogram.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/persistent_memory_allocator.h" #include "base/metrics/statistics_recorder.h" @@ -454,4 +456,63 @@ EXPECT_EQ(ranges_ref, data2[kRangesRefIndex]); } +TEST_F(PersistentHistogramAllocatorTest, MovePersistentFile) { + const char temp_name[] = "MovePersistentFileTest.pma"; + ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name); + const size_t temp_size = 64 << 10; // 64 KiB + + // Initialize persistent histogram system with a known file path. + DestroyPersistentHistogramAllocator(); + GlobalHistogramAllocator::CreateWithFile(temp_file, temp_size, 0, temp_name); + GlobalHistogramAllocator* allocator = GlobalHistogramAllocator::Get(); + ASSERT_TRUE(allocator->HasPersistentLocation()); + EXPECT_EQ(allocator->GetPersistentLocation(), temp_file); + EXPECT_TRUE(base::PathExists(temp_file)); + + // Move the persistent file to a new directory. + ScopedTempDir new_temp_dir; + ASSERT_TRUE(new_temp_dir.CreateUniqueTempDir()); + EXPECT_TRUE(allocator->MovePersistentFile(new_temp_dir.GetPath())); + + // Verify that the persistent file was correctly moved |new_temp_dir|. + FilePath new_temp_file = new_temp_dir.GetPath().AppendASCII(temp_name); + ASSERT_TRUE(allocator->HasPersistentLocation()); + EXPECT_EQ(allocator->GetPersistentLocation(), new_temp_file); + EXPECT_TRUE(base::PathExists(new_temp_file)); + EXPECT_FALSE(base::PathExists(temp_file)); + + // Emit a histogram after moving the file. + const char kHistogramName[] = "MovePersistentFile.Test"; + base::UmaHistogramBoolean(kHistogramName, true); + + // Release the allocator. + DestroyPersistentHistogramAllocator(); + + // Open and read the file in order to verify that |kHistogramName| was written + // to it even after being moved. + base::File file(new_temp_file, base::File::FLAG_OPEN | base::File::FLAG_READ); + std::unique_ptr<char[]> data = std::make_unique<char[]>(temp_size); + EXPECT_EQ(file.Read(/*offset=*/0, data.get(), temp_size), + static_cast<int>(temp_size)); + + // Create an allocator and iterator using the file's data. + PersistentHistogramAllocator new_file_allocator( + std::make_unique<PersistentMemoryAllocator>(data.get(), temp_size, 0, 0, + "", false)); + PersistentHistogramAllocator::Iterator it(&new_file_allocator); + + // Verify that |kHistogramName| is in the file. + std::unique_ptr<HistogramBase> histogram; + bool found_histogram = false; + while ((histogram = it.GetNext()) != nullptr) { + if (strcmp(kHistogramName, histogram->histogram_name()) == 0) { + found_histogram = true; + break; + } + } + EXPECT_TRUE(found_histogram); +} + } // namespace base
diff --git a/base/profiler/libunwindstack_unwinder_android.cc b/base/profiler/libunwindstack_unwinder_android.cc index 55bdc3398..058a294 100644 --- a/base/profiler/libunwindstack_unwinder_android.cc +++ b/base/profiler/libunwindstack_unwinder_android.cc
@@ -10,6 +10,7 @@ #include <vector> #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Elf.h" +#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Maps.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Memory.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Regs.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Unwinder.h" @@ -83,9 +84,9 @@ } // namespace LibunwindstackUnwinderAndroid::LibunwindstackUnwinderAndroid() - : memory_regions_map_(NativeUnwinderAndroid::CreateMaps()), + : memory_regions_map_(NativeUnwinderAndroid::CreateMemoryRegionsMap()), process_memory_(std::shared_ptr<unwindstack::Memory>( - NativeUnwinderAndroid::CreateProcessMemory().release())) { + memory_regions_map_->TakeMemory().release())) { TRACE_EVENT_INSTANT( TRACE_DISABLED_BY_DEFAULT("cpu_profiler"), "LibunwindstackUnwinderAndroid::LibunwindstackUnwinderAndroid"); @@ -143,7 +144,7 @@ std::unique_ptr<unwindstack::Regs> regs = CreateFromRegisterContext(thread_context); DCHECK(regs); - unwindstack::Unwinder unwinder(kMaxFrames, memory_regions_map_.get(), + unwindstack::Unwinder unwinder(kMaxFrames, memory_regions_map_->GetMaps(), regs.get(), process_memory_); unwinder.SetJitDebug(GetOrCreateJitDebug(regs->Arch())); @@ -169,7 +170,7 @@ TRACE_EVENT(TRACE_DISABLED_BY_DEFAULT("cpu_profiler.debug"), "TryUnwind Reparsing Maps"); samples_since_last_maps_parse_ = 0; - memory_regions_map_->Parse(); + memory_regions_map_->GetMaps()->Parse(); jit_debug_.reset(); dex_files_.reset();
diff --git a/base/profiler/libunwindstack_unwinder_android.h b/base/profiler/libunwindstack_unwinder_android.h index db0031e6..699b149c 100644 --- a/base/profiler/libunwindstack_unwinder_android.h +++ b/base/profiler/libunwindstack_unwinder_android.h
@@ -8,10 +8,10 @@ #include <memory> #include <vector> +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "base/profiler/unwinder.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/DexFiles.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/JitDebug.h" -#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Maps.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Memory.h" namespace base { @@ -43,11 +43,12 @@ unwindstack::DexFiles* GetOrCreateDexFiles(unwindstack::ArchEnum arch); int samples_since_last_maps_parse_ = 0; - std::unique_ptr<unwindstack::Maps> memory_regions_map_; + std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> memory_regions_map_; // libunwindstack::Unwinder requires that process_memory be provided as a // std::shared_ptr. Since this is a third_party library this exception to // normal Chromium conventions of not using shared_ptr has to exist here. std::shared_ptr<unwindstack::Memory> process_memory_; + std::unique_ptr<unwindstack::JitDebug> jit_debug_; std::unique_ptr<unwindstack::DexFiles> dex_files_; // Libraries where to search for dex and jit descriptors.
diff --git a/base/profiler/module_cache.cc b/base/profiler/module_cache.cc index b47e857..7911f89e 100644 --- a/base/profiler/module_cache.cc +++ b/base/profiler/module_cache.cc
@@ -32,9 +32,12 @@ } // namespace -std::string TransformModuleIDToBreakpadFormat(StringPiece module_id) { +std::string TransformModuleIDToSymbolServerFormat(StringPiece module_id) { std::string mangled_id(module_id); -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + // Android and Linux Chrome builds use the "breakpad" format to index their + // build id, so we transform the build id for these platforms. All other + // platforms keep their symbols indexed by the original build ID. +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) // Linux ELF module IDs are 160bit integers, which we need to mangle // down to 128bit integers to match the id that Breakpad outputs. // Example on version '66.0.3359.170' x64:
diff --git a/base/profiler/module_cache.h b/base/profiler/module_cache.h index 3fafcd8..335fd33 100644 --- a/base/profiler/module_cache.h +++ b/base/profiler/module_cache.h
@@ -23,8 +23,9 @@ namespace base { -// Converts module id to match the id that Breakpad outputs. -BASE_EXPORT std::string TransformModuleIDToBreakpadFormat( +// Converts module id to match the id that the Google-internal symbol server +// expects. +BASE_EXPORT std::string TransformModuleIDToSymbolServerFormat( StringPiece module_id); // Supports cached lookup of modules by address, with caching based on module
diff --git a/base/profiler/module_cache_unittest.cc b/base/profiler/module_cache_unittest.cc index fd4c9fa1..3329ac3 100644 --- a/base/profiler/module_cache_unittest.cc +++ b/base/profiler/module_cache_unittest.cc
@@ -480,11 +480,11 @@ EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); } -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -TEST(ModuleCacheTest, TransformELFModuleIDToBreakpadFormat) { +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) +TEST(ModuleCacheTest, TransformELFToSymbolServerFormat) { // See explanation for the module_id mangling in - // base::TransformModuleIDToBreakpadFormat implementation. - EXPECT_EQ(TransformModuleIDToBreakpadFormat( + // base::TransformModuleIDToSymbolServerFormat implementation. + EXPECT_EQ(TransformModuleIDToSymbolServerFormat( "7F0715C286F8B16C10E4AD349CDA3B9B56C7A773"), "C215077FF8866CB110E4AD349CDA3B9B0"); }
diff --git a/base/profiler/native_unwinder_android.cc b/base/profiler/native_unwinder_android.cc index a3bc9a6..866fbed 100644 --- a/base/profiler/native_unwinder_android.cc +++ b/base/profiler/native_unwinder_android.cc
@@ -10,12 +10,15 @@ #include <vector> #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Elf.h" +#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Maps.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Memory.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Regs.h" #include "base/memory/ptr_util.h" #include "base/notreached.h" #include "base/profiler/module_cache.h" +#include "base/profiler/native_unwinder_android_map_delegate.h" +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "base/profiler/profile_builder.h" #include "build/build_config.h" @@ -85,6 +88,28 @@ #endif // #if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS) } +// The wrapper class exists to avoid the reference of concrete libunwindstack +// types in chrome code. Only code in the stack unwinder DFM has the access to +// third_party/libunwindstack/src/libunwindstack. Files within the stack +// unwinder DFM can be found by searching `native_unwinder_android` source set +// in `base/BUILD.gn`. +class MemoryRegionsMap : public base::NativeUnwinderAndroidMemoryRegionsMap { + public: + MemoryRegionsMap(std::unique_ptr<unwindstack::Maps> maps, + std::unique_ptr<unwindstack::Memory> memory) + : maps_(std::move(maps)), memory_(std::move(memory)) {} + + unwindstack::Maps* GetMaps() override { return maps_.get(); } + unwindstack::Memory* GetMemory() override { return memory_.get(); } + std::unique_ptr<unwindstack::Memory> TakeMemory() override { + return std::move(memory_); + } + + private: + std::unique_ptr<unwindstack::Maps> maps_; + std::unique_ptr<unwindstack::Memory> memory_; +}; + } // namespace UnwindStackMemoryAndroid::UnwindStackMemoryAndroid(uintptr_t stack_ptr, @@ -105,30 +130,31 @@ } // static -std::unique_ptr<unwindstack::Maps> NativeUnwinderAndroid::CreateMaps() { +std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> +NativeUnwinderAndroid::CreateMemoryRegionsMap() { auto maps = std::make_unique<unwindstack::LocalMaps>(); - if (maps->Parse()) - return maps; - return nullptr; -} + const bool success = maps->Parse(); + DCHECK(success); -// static -std::unique_ptr<unwindstack::Memory> -NativeUnwinderAndroid::CreateProcessMemory() { - return unwindstack::Memory::CreateLocalProcessMemory(); + return std::make_unique<MemoryRegionsMap>( + std::move(maps), unwindstack::Memory::CreateLocalProcessMemory()); } NativeUnwinderAndroid::NativeUnwinderAndroid( - unwindstack::Maps* memory_regions_map, - unwindstack::Memory* process_memory, - uintptr_t exclude_module_with_base_address) - : memory_regions_map_(memory_regions_map), - process_memory_(process_memory), - exclude_module_with_base_address_(exclude_module_with_base_address) {} + uintptr_t exclude_module_with_base_address, + NativeUnwinderAndroidMapDelegate* map_delegate) + : exclude_module_with_base_address_(exclude_module_with_base_address), + map_delegate_(map_delegate), + memory_regions_map_(map_delegate->GetMapReference()) { + DCHECK(map_delegate_); + DCHECK(memory_regions_map_); +} NativeUnwinderAndroid::~NativeUnwinderAndroid() { if (module_cache()) module_cache()->UnregisterAuxiliaryModuleProvider(this); + + map_delegate_->ReleaseMapReference(); } void NativeUnwinderAndroid::InitializeModules() { @@ -151,14 +177,15 @@ do { uint64_t cur_pc = regs->pc(); uint64_t cur_sp = regs->sp(); - unwindstack::MapInfo* map_info = memory_regions_map_->Find(cur_pc).get(); + unwindstack::MapInfo* map_info = + memory_regions_map_->GetMaps()->Find(cur_pc).get(); if (map_info == nullptr || map_info->flags() & unwindstack::MAPS_FLAGS_DEVICE_MAP) { break; } unwindstack::Elf* elf = map_info->GetElf( - {process_memory_.get(), [](unwindstack::Memory*) {}}, arch); + {memory_regions_map_->GetMemory(), [](unwindstack::Memory*) {}}, arch); if (!elf->valid()) break; @@ -221,7 +248,8 @@ std::unique_ptr<const ModuleCache::Module> NativeUnwinderAndroid::TryCreateModuleForAddress(uintptr_t address) { - unwindstack::MapInfo* map_info = memory_regions_map_->Find(address).get(); + unwindstack::MapInfo* map_info = + memory_regions_map_->GetMaps()->Find(address).get(); if (map_info == nullptr || !(map_info->flags() & PROT_EXEC) || map_info->flags() & unwindstack::MAPS_FLAGS_DEVICE_MAP) { return nullptr; @@ -238,7 +266,8 @@ // usually not executable (.dex file). Since non-executable regions // are used much less commonly, it's lazily added here instead of from // AddInitialModulesFromMaps(). - unwindstack::MapInfo* map_info = memory_regions_map_->Find(dex_pc).get(); + unwindstack::MapInfo* map_info = + memory_regions_map_->GetMaps()->Find(dex_pc).get(); if (map_info) { auto new_module = std::make_unique<NonElfModule>(map_info); module = new_module.get();
diff --git a/base/profiler/native_unwinder_android.h b/base/profiler/native_unwinder_android.h index e139b23..cc9d848 100644 --- a/base/profiler/native_unwinder_android.h +++ b/base/profiler/native_unwinder_android.h
@@ -10,11 +10,13 @@ #include "base/memory/raw_ptr.h" #include "base/profiler/unwinder.h" -#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Maps.h" #include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Memory.h" namespace base { +class NativeUnwinderAndroidMapDelegate; +class NativeUnwinderAndroidMemoryRegionsMap; + // Implementation of unwindstack::Memory that restricts memory access to a stack // buffer, used by NativeUnwinderAndroid. While unwinding, only memory accesses // within the stack should be performed to restore registers. @@ -37,17 +39,17 @@ // Creates maps object from /proc/self/maps for use by NativeUnwinderAndroid. // Since this is an expensive call, the maps object should be re-used across // all profiles in a process. - static std::unique_ptr<unwindstack::Maps> CreateMaps(); - static std::unique_ptr<unwindstack::Memory> CreateProcessMemory(); + static std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> + CreateMemoryRegionsMap(); - // |memory_regions_map| and |process_memory| must outlive this unwinder. // |exclude_module_with_base_address| is used to exclude a specific module and // let another unwinder take control. TryUnwind() will exit with // UNRECOGNIZED_FRAME and CanUnwindFrom() will return false when a frame is // encountered in that module. - NativeUnwinderAndroid(unwindstack::Maps* memory_regions_map, - unwindstack::Memory* process_memory, - uintptr_t exclude_module_with_base_address); + // |map_delegate| is used to manage memory used by libunwindstack. It must + // outlives this object. + NativeUnwinderAndroid(uintptr_t exclude_module_with_base_address, + NativeUnwinderAndroidMapDelegate* map_delegate); ~NativeUnwinderAndroid() override; NativeUnwinderAndroid(const NativeUnwinderAndroid&) = delete; @@ -68,9 +70,9 @@ void EmitDexFrame(uintptr_t dex_pc, std::vector<Frame>* stack) const; - const raw_ptr<unwindstack::Maps> memory_regions_map_; - const raw_ptr<unwindstack::Memory> process_memory_; const uintptr_t exclude_module_with_base_address_; + raw_ptr<NativeUnwinderAndroidMapDelegate> map_delegate_; + const raw_ptr<NativeUnwinderAndroidMemoryRegionsMap> memory_regions_map_; }; } // namespace base
diff --git a/base/profiler/native_unwinder_android_map_delegate.h b/base/profiler/native_unwinder_android_map_delegate.h new file mode 100644 index 0000000..13bdc56 --- /dev/null +++ b/base/profiler/native_unwinder_android_map_delegate.h
@@ -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. + +#ifndef BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_H_ +#define BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_H_ + +namespace base { + +class NativeUnwinderAndroidMemoryRegionsMap; + +// Interface of libunwindstack Map's lifecycle management. The +// implementation is designed to live in chrome code instead of in +// the stack unwinder DFM because DFM might not have enough information to make +// the decision. +class NativeUnwinderAndroidMapDelegate { + public: + virtual ~NativeUnwinderAndroidMapDelegate() = default; + + virtual NativeUnwinderAndroidMemoryRegionsMap* GetMapReference() = 0; + virtual void ReleaseMapReference() = 0; +}; + +} // namespace base + +#endif // BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_H_
diff --git a/base/profiler/native_unwinder_android_memory_regions_map.h b/base/profiler/native_unwinder_android_memory_regions_map.h new file mode 100644 index 0000000..6fbf52e --- /dev/null +++ b/base/profiler/native_unwinder_android_memory_regions_map.h
@@ -0,0 +1,42 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MEMORY_REGIONS_MAP_H_ +#define BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MEMORY_REGIONS_MAP_H_ + +#include <memory> + +namespace unwindstack { +class Maps; +class Memory; +} // namespace unwindstack + +namespace base { + +// NativeUnwinderAndroidMemoryRegionsMap is an opaque interface that hides +// concrete libunwindstack types, i.e. `unwindstack::Maps` and +// `unwindstack::Memory`. By introducing the interface, chrome code can +// pass the underlying instances around without referencing libunwindstack. +// NativeUnwinderAndroidMemoryRegionsMap's implementation must live in the +// stack_unwinder dynamic feature module. +class NativeUnwinderAndroidMemoryRegionsMap { + public: + NativeUnwinderAndroidMemoryRegionsMap() = default; + virtual ~NativeUnwinderAndroidMemoryRegionsMap() = default; + + NativeUnwinderAndroidMemoryRegionsMap( + const NativeUnwinderAndroidMemoryRegionsMap&) = delete; + NativeUnwinderAndroidMemoryRegionsMap& operator=( + const NativeUnwinderAndroidMemoryRegionsMap&) = delete; + + virtual unwindstack::Maps* GetMaps() = 0; + virtual unwindstack::Memory* GetMemory() = 0; + // This function exists to provide a method for + // `LibunwindstackUnwinderAndroid` to take the ownership of `Memory`. + virtual std::unique_ptr<unwindstack::Memory> TakeMemory() = 0; +}; + +} // namespace base + +#endif // BASE_PROFILER_NATIVE_UNWINDER_ANDROID_MEMORY_REGIONS_MAP_H_
diff --git a/base/profiler/native_unwinder_android_unittest.cc b/base/profiler/native_unwinder_android_unittest.cc index f96b9bd..3fe4adf2 100644 --- a/base/profiler/native_unwinder_android_unittest.cc +++ b/base/profiler/native_unwinder_android_unittest.cc
@@ -16,6 +16,8 @@ #include "base/android/build_info.h" #include "base/android/jni_android.h" #include "base/functional/bind.h" +#include "base/profiler/native_unwinder_android_map_delegate.h" +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "base/profiler/register_context.h" #include "base/profiler/stack_buffer.h" #include "base/profiler/stack_copier_signal.h" @@ -26,6 +28,8 @@ #include "base/test/bind.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Maps.h" +#include "third_party/libunwindstack/src/libunwindstack/include/unwindstack/Memory.h" extern char __executable_start; @@ -47,6 +51,48 @@ map_info.set_elf_offset(map_info.offset()); } +class NativeUnwinderAndroidMemoryRegionsMapForTesting + : public NativeUnwinderAndroidMemoryRegionsMap { + public: + NativeUnwinderAndroidMemoryRegionsMapForTesting(unwindstack::Maps* maps, + unwindstack::Memory* memory) + : maps_(maps), memory_(memory) {} + unwindstack::Maps* GetMaps() override { return maps_; } + unwindstack::Memory* GetMemory() override { return memory_; } + // This function is not expected to be called within the unittest, as + // `NativeUnwinderAndroidMemoryRegionsMapForTesting` does not own + // `unwindstack::Memory`. + std::unique_ptr<unwindstack::Memory> TakeMemory() override { return nullptr; } + + private: + unwindstack::Maps* maps_; + unwindstack::Memory* memory_; +}; + +class NativeUnwinderAndroidMapDelegateForTesting + : public NativeUnwinderAndroidMapDelegate { + public: + explicit NativeUnwinderAndroidMapDelegateForTesting( + std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> memory_regions_map) + : memory_regions_map_(std::move(memory_regions_map)) {} + + NativeUnwinderAndroidMemoryRegionsMap* GetMapReference() override { + acquire_count_++; + return memory_regions_map_.get(); + } + void ReleaseMapReference() override { release_count_++; } + + uint32_t acquire_count() { return acquire_count_; } + uint32_t release_count() { return release_count_; } + + private: + const std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> + memory_regions_map_; + + uint32_t acquire_count_ = 0u; + uint32_t release_count_ = 0u; +}; + } // namespace class TestStackCopierDelegate : public StackCopier::Delegate { @@ -98,14 +144,11 @@ // if defined(ADDRESS_SANITIZER). TEST(NativeUnwinderAndroidTest, DISABLED_PlainFunction) { UnwindScenario scenario(BindRepeating(&CallWithPlainFunction)); - - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); ModuleCache module_cache; - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(maps.get(), memory.get(), 0); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder->Initialize(&module_cache); std::vector<Frame> sample = @@ -137,13 +180,11 @@ TEST(NativeUnwinderAndroidTest, DISABLED_Alloca) { UnwindScenario scenario(BindRepeating(&CallWithAlloca)); - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); ModuleCache module_cache; - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(maps.get(), memory.get(), 0); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder->Initialize(&module_cache); std::vector<Frame> sample = @@ -177,13 +218,10 @@ UnwindScenario scenario( BindRepeating(&CallThroughOtherLibrary, Unretained(other_library))); - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); - + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); ModuleCache module_cache; - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(maps.get(), memory.get(), 0); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder->Initialize(&module_cache); std::vector<Frame> sample = @@ -209,15 +247,17 @@ UnwindScenario scenario( BindRepeating(&CallThroughOtherLibrary, Unretained(other_library))); - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); ModuleCache module_cache; unwindstack::MapInfo* other_library_map = - maps->Find(GetAddressInOtherLibrary(other_library)).get(); + map_delegate.GetMapReference() + ->GetMaps() + ->Find(GetAddressInOtherLibrary(other_library)) + .get(); ASSERT_NE(nullptr, other_library_map); auto unwinder = std::make_unique<NativeUnwinderAndroid>( - maps.get(), memory.get(), other_library_map->start()); + other_library_map->start(), &map_delegate); unwinder->Initialize(&module_cache); std::vector<Frame> sample = @@ -249,9 +289,8 @@ UnwindScenario scenario( BindRepeating(&CallThroughOtherLibrary, Unretained(other_library))); - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); // Several unwinders are used to unwind different portion of the stack. Since // only 1 unwinder can be registered as a module provider, each unwinder uses @@ -261,21 +300,23 @@ // happens in production. ModuleCache module_cache_for_all; auto unwinder_for_all = - std::make_unique<NativeUnwinderAndroid>(maps.get(), memory.get(), 0); + std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder_for_all->Initialize(&module_cache_for_all); ModuleCache module_cache_for_native; auto unwinder_for_native = std::make_unique<NativeUnwinderAndroid>( - maps.get(), memory.get(), - reinterpret_cast<uintptr_t>(&__executable_start)); + reinterpret_cast<uintptr_t>(&__executable_start), &map_delegate); unwinder_for_native->Initialize(&module_cache_for_native); ModuleCache module_cache_for_chrome; unwindstack::MapInfo* other_library_map = - maps->Find(GetAddressInOtherLibrary(other_library)).get(); + map_delegate.GetMapReference() + ->GetMaps() + ->Find(GetAddressInOtherLibrary(other_library)) + .get(); ASSERT_NE(nullptr, other_library_map); auto unwinder_for_chrome = std::make_unique<NativeUnwinderAndroid>( - maps.get(), memory.get(), other_library_map->start()); + other_library_map->start(), &map_delegate); unwinder_for_chrome->Initialize(&module_cache_for_chrome); std::vector<Frame> sample = CaptureScenario( @@ -333,11 +374,9 @@ UnwindScenario scenario(base::BindRepeating(callWithJavaFunction)); - std::unique_ptr<unwindstack::Maps> maps = NativeUnwinderAndroid::CreateMaps(); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(maps.get(), memory.get(), 0); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); ModuleCache module_cache; unwinder->Initialize(&module_cache); @@ -402,10 +441,11 @@ ModuleCache module_cache; - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(&maps, memory.get(), 0); + auto memory_regions_map = NativeUnwinderAndroid::CreateMemoryRegionsMap(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + std::make_unique<NativeUnwinderAndroidMemoryRegionsMapForTesting>( + &maps, memory_regions_map->GetMemory())); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder->Initialize(&module_cache); const ModuleCache::Module* module = module_cache.GetModuleForAddress(0x1000u); @@ -421,12 +461,12 @@ AddMapInfo(0x2000u, 0x3000u, 0u, PROT_READ, "[b]", {0xAB}, maps); AddMapInfo(0x3000u, 0x4000u, 0u, PROT_READ | PROT_EXEC, "[c]", {0xAC}, maps); - std::unique_ptr<unwindstack::Memory> memory = - NativeUnwinderAndroid::CreateProcessMemory(); - + auto memory_regions_map = NativeUnwinderAndroid::CreateMemoryRegionsMap(); + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + std::make_unique<NativeUnwinderAndroidMemoryRegionsMapForTesting>( + &maps, memory_regions_map->GetMemory())); ModuleCache module_cache; - auto unwinder = - std::make_unique<NativeUnwinderAndroid>(&maps, memory.get(), 0); + auto unwinder = std::make_unique<NativeUnwinderAndroid>(0, &map_delegate); unwinder->Initialize(&module_cache); const ModuleCache::Module* module1 = @@ -443,4 +483,22 @@ EXPECT_EQ(0x3000u, module3->GetBaseAddress()); } +TEST(NativeUnwinderAndroidTest, + AcquireAndReleaseMemoryRegionsMapThroughMapDelegate) { + NativeUnwinderAndroidMapDelegateForTesting map_delegate( + NativeUnwinderAndroid::CreateMemoryRegionsMap()); + + { + ModuleCache module_cache; + auto unwinder = std::make_unique<NativeUnwinderAndroid>( + /* exclude_module_with_base_address= */ 0, &map_delegate); + unwinder->Initialize(&module_cache); + EXPECT_EQ(1u, map_delegate.acquire_count()); + EXPECT_EQ(0u, map_delegate.release_count()); + } + + EXPECT_EQ(1u, map_delegate.acquire_count()); + EXPECT_EQ(1u, map_delegate.release_count()); +} + } // namespace base
diff --git a/base/profiler/stack_sampling_profiler_test_util.cc b/base/profiler/stack_sampling_profiler_test_util.cc index 78730d2..da29e8c 100644 --- a/base/profiler/stack_sampling_profiler_test_util.cc +++ b/base/profiler/stack_sampling_profiler_test_util.cc
@@ -11,6 +11,8 @@ #include "base/functional/callback.h" #include "base/location.h" #include "base/path_service.h" +#include "base/profiler/native_unwinder_android_map_delegate.h" +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "base/profiler/profiler_buildflags.h" #include "base/profiler/stack_buffer.h" #include "base/profiler/stack_sampling_profiler.h" @@ -24,6 +26,7 @@ #include "base/android/apk_assets.h" #include "base/android/library_loader/anchor_functions.h" #include "base/files/memory_mapped_file.h" +#include "base/no_destructor.h" #include "base/profiler/chrome_unwinder_android.h" #include "base/profiler/native_unwinder_android.h" #endif @@ -96,29 +99,36 @@ } #if BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_ARM_CFI_TABLE) +class NativeUnwinderAndroidMapDelegateForTesting + : public NativeUnwinderAndroidMapDelegate { + public: + explicit NativeUnwinderAndroidMapDelegateForTesting( + std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> memory_regions_map) + : memory_regions_map_(std::move(memory_regions_map)) {} + + NativeUnwinderAndroidMemoryRegionsMap* GetMapReference() override { + return memory_regions_map_.get(); + } + void ReleaseMapReference() override {} + + private: + const std::unique_ptr<NativeUnwinderAndroidMemoryRegionsMap> + memory_regions_map_; +}; + +// `map_delegate` should outlive the unwinder instance, so we cannot make a +// derived `NativeUnwinderAndroidForTesting` to own the `map_delegate`, as +// the base class outlives the derived class. +NativeUnwinderAndroidMapDelegateForTesting* GetMapDelegateForTesting() { + static base::NoDestructor<NativeUnwinderAndroidMapDelegateForTesting> + map_delegate(NativeUnwinderAndroid::CreateMemoryRegionsMap()); + return map_delegate.get(); +} + std::unique_ptr<NativeUnwinderAndroid> CreateNativeUnwinderAndroidForTesting( uintptr_t exclude_module_with_base_address) { - class NativeUnwinderAndroidForTesting : public NativeUnwinderAndroid { - public: - explicit NativeUnwinderAndroidForTesting( - std::unique_ptr<unwindstack::Maps> memory_regions_map, - std::unique_ptr<unwindstack::Memory> process_memory, - uintptr_t exclude_module_with_base_address) - : NativeUnwinderAndroid(memory_regions_map.get(), - process_memory.get(), - exclude_module_with_base_address), - memory_regions_map_(std::move(memory_regions_map)), - process_memory_(std::move(process_memory)) {} - ~NativeUnwinderAndroidForTesting() override = default; - - private: - std::unique_ptr<unwindstack::Maps> memory_regions_map_; - std::unique_ptr<unwindstack::Memory> process_memory_; - }; - auto maps = NativeUnwinderAndroid::CreateMaps(); - auto memory = NativeUnwinderAndroid::CreateProcessMemory(); - return std::make_unique<NativeUnwinderAndroidForTesting>( - std::move(maps), std::move(memory), exclude_module_with_base_address); + return std::make_unique<NativeUnwinderAndroid>( + exclude_module_with_base_address, GetMapDelegateForTesting()); } std::unique_ptr<Unwinder> CreateChromeUnwinderAndroidForTesting(
diff --git a/base/scoped_multi_source_observation.h b/base/scoped_multi_source_observation.h index 70ed7c8..c2d763bb 100644 --- a/base/scoped_multi_source_observation.h +++ b/base/scoped_multi_source_observation.h
@@ -64,7 +64,7 @@ // Remove the object passed to the constructor as an observer from |source|. void RemoveObservation(Source* source) { auto it = base::ranges::find(sources_, source); - DCHECK(it != sources_.end()); + CHECK(it != sources_.end()); sources_.erase(it); Traits::RemoveObserver(source, observer_); }
diff --git a/base/task/thread_pool/worker_thread_unittest.cc b/base/task/thread_pool/worker_thread_unittest.cc index 02439b8..c5c2a50 100644 --- a/base/task/thread_pool/worker_thread_unittest.cc +++ b/base/task/thread_pool/worker_thread_unittest.cc
@@ -42,6 +42,7 @@ #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \ PA_CONFIG(THREAD_CACHE_SUPPORTED) +#include "base/allocator/partition_allocator/extended_api.h" // nogncheck #include "base/allocator/partition_allocator/thread_cache.h" #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && // PA_CONFIG(THREAD_CACHE_SUPPORTED) @@ -926,11 +927,8 @@ TEST(ThreadPoolWorkerThreadCachePurgeTest, Purge) { // Make sure the thread cache is enabled in the main partition. - if (!allocator_shim::internal::PartitionAllocMalloc::Allocator() - ->thread_cache_for_testing()) { - allocator_shim::internal::PartitionAllocMalloc::Allocator() - ->EnableThreadCacheIfSupported(); - } + partition_alloc::internal::ThreadCacheProcessScopeForTesting scope( + allocator_shim::internal::PartitionAllocMalloc::Allocator()); Thread service_thread = Thread("ServiceThread"); Thread::Options service_thread_options;
diff --git a/base/test/scoped_feature_list.h b/base/test/scoped_feature_list.h index 3709f1e1..fcb377ec 100644 --- a/base/test/scoped_feature_list.h +++ b/base/test/scoped_feature_list.h
@@ -48,6 +48,9 @@ const Feature* operator->() const { return &*feature_; } private: + friend bool operator==(const FeatureRef& lhs, const FeatureRef& rhs) { + return &*lhs == &*rhs; + } friend bool operator<(const FeatureRef& lhs, const FeatureRef& rhs) { return &*lhs < &*rhs; }
diff --git a/base/test/task_environment.cc b/base/test/task_environment.cc index 229dd86..a4848276 100644 --- a/base/test/task_environment.cc +++ b/base/test/task_environment.cc
@@ -525,15 +525,19 @@ observer.WillDestroyCurrentTaskEnvironment(); } - DestroyThreadPool(); + ShutdownAndJoinThreadPool(); task_queue_ = nullptr; - // SequenceManagerImpl must outlive ThreadPoolInstance() (DestroyThreadPool() - // above) as TaskEnvironment::MockTimeDomain can invoke its - // SequenceManagerImpl* from worker threads. + // SequenceManagerImpl must outlive the threads in the ThreadPoolInstance() + // (ShutdownAndJoinThreadPool() above) as TaskEnvironment::MockTimeDomain can + // invoke its SequenceManagerImpl* from worker threads. + // Additionally, Tasks owned by `sequence_manager_` can have referencees to + // PooledTaskRunnerDelegates. These are owned by the thread pool, so destroy + // `sequence_manager` before the thread pool itself. sequence_manager_.reset(); + DestroyThreadPool(); } -void TaskEnvironment::DestroyThreadPool() { +void TaskEnvironment::ShutdownAndJoinThreadPool() { DCHECK_CALLED_ON_VALID_THREAD(main_thread_checker_); if (threading_mode_ == ThreadingMode::MAIN_THREAD_ONLY) { @@ -554,6 +558,15 @@ ThreadPoolInstance::Get()->JoinForTesting(); DCHECK_EQ(g_task_tracker, task_tracker_); g_task_tracker = nullptr; +} + +void TaskEnvironment::DestroyThreadPool() { + DCHECK_CALLED_ON_VALID_THREAD(main_thread_checker_); + + if (threading_mode_ == ThreadingMode::MAIN_THREAD_ONLY) { + return; + } + DCHECK(ThreadPoolInstance::Get()); // Task runner lists will be destroyed when resetting thread pool instance. scoped_lazy_task_runner_list_for_testing_.reset();
diff --git a/base/test/task_environment.h b/base/test/task_environment.h index 47d8ba5..70f14a319 100644 --- a/base/test/task_environment.h +++ b/base/test/task_environment.h
@@ -441,6 +441,7 @@ class MockTimeDomain; void InitializeThreadPool(); + void ShutdownAndJoinThreadPool(); void DestroyThreadPool(); void CompleteInitialization();
diff --git a/base/third_party/symbolize/patches/009-include-cstdlib.patch b/base/third_party/symbolize/patches/009-include-cstdlib.patch new file mode 100644 index 0000000..ffa9edc --- /dev/null +++ b/base/third_party/symbolize/patches/009-include-cstdlib.patch
@@ -0,0 +1,12 @@ +diff --git a/base/third_party/symbolize/symbolize.cc b/base/third_party/symbolize/symbolize.cc +index 5287e5bb11007..a3b8399f411bf 100644 +--- a/base/third_party/symbolize/symbolize.cc ++++ b/base/third_party/symbolize/symbolize.cc +@@ -59,6 +59,7 @@ + #if defined(HAVE_SYMBOLIZE) + + #include <cstring> ++#include <cstdlib> + + #include <algorithm> + #include <limits>
diff --git a/base/third_party/symbolize/symbolize.cc b/base/third_party/symbolize/symbolize.cc index 5287e5b..a3b8399f 100644 --- a/base/third_party/symbolize/symbolize.cc +++ b/base/third_party/symbolize/symbolize.cc
@@ -59,6 +59,7 @@ #if defined(HAVE_SYMBOLIZE) #include <cstring> +#include <cstdlib> #include <algorithm> #include <limits>
diff --git a/base/trace_event/interned_args_helper.cc b/base/trace_event/interned_args_helper.cc index cd05087..fb7ec34 100644 --- a/base/trace_event/interned_args_helper.cc +++ b/base/trace_event/interned_args_helper.cc
@@ -80,8 +80,10 @@ void InternedMapping::Add(perfetto::EventContext* ctx, size_t iid, const base::ModuleCache::Module* module) { + // TODO(b/270470700): Remove TransformModuleIDToSymbolServerFormat on all + // platforms once tools/tracing is fixed. const auto build_id = InternedBuildId::Get( - ctx, base::TransformModuleIDToBreakpadFormat(module->GetId())); + ctx, base::TransformModuleIDToSymbolServerFormat(module->GetId())); const auto path_id = InternedMappingPath::Get(ctx, module->GetDebugBasename().MaybeAsASCII());
diff --git a/base/trace_event/interned_args_helper.h b/base/trace_event/interned_args_helper.h index 22077a3..154436d 100644 --- a/base/trace_event/interned_args_helper.h +++ b/base/trace_event/interned_args_helper.h
@@ -5,6 +5,8 @@ #ifndef BASE_TRACE_EVENT_INTERNED_ARGS_HELPER_H_ #define BASE_TRACE_EVENT_INTERNED_ARGS_HELPER_H_ +#include <string> + #include "base/base_export.h" #include "base/containers/span.h" #include "base/hash/hash.h"
diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py index 98d81fb..a51f370b 100644 --- a/build/android/pylib/local/device/local_device_environment.py +++ b/build/android/pylib/local/device/local_device_environment.py
@@ -136,6 +136,7 @@ if hasattr(args, 'trace_all'): self._trace_all = args.trace_all self._use_persistent_shell = args.use_persistent_shell + self._disable_test_server = args.disable_test_server devil_chromium.Initialize( output_directory=constants.GetOutDirectory(), @@ -264,6 +265,10 @@ def trace_output(self): return self._trace_output + @property + def disable_test_server(self): + return self._disable_test_server + #override def TearDown(self): if self.trace_output and self._trace_all:
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 5f6017d5..183305cd 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -530,6 +530,10 @@ tool.CopyFiles(dev) tool.SetupEnvironment() + if self._env.disable_test_server: + logging.warning('Not starting test server. Some tests may fail.') + return + try: # See https://crbug.com/1030827. # This is a hack that may break in the future. We're relying on the
diff --git a/build/android/test_runner.py b/build/android/test_runner.py index 702a5fb..0fd5c9f5 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py
@@ -242,6 +242,12 @@ action='store_true', help='Uses a persistent shell connection for the adb connection.') + parser.add_argument('--disable-test-server', + action='store_true', + help='Disables SpawnedTestServer which doesn' + 't work with remote adb. ' + 'WARNING: Will break tests which require the server.') + # This is currently only implemented for gtests and instrumentation tests. parser.add_argument( '--gtest_also_run_disabled_tests', '--gtest-also-run-disabled-tests',
diff --git a/build/args/README.txt b/build/args/README.txt index 825bf64..b82fb04a 100644 --- a/build/args/README.txt +++ b/build/args/README.txt
@@ -1,10 +1,6 @@ This directory is here to hold .gni files that contain sets of GN build arguments for given configurations. -(Currently this directory is empty because we removed the only thing here, but -this has come up several times so I'm confident we'll need this again. If this -directory is still empty by 2017, feel free to delete it. --Brett) - Some projects or bots may have build configurations with specific combinations of flags. Rather than making a new global flag for your specific project and adding it all over the build to each arg it should affect, you can add a .gni
diff --git a/build/chromeos/.style.yapf b/build/chromeos/.style.yapf index de0c6a70..fdd0723 100644 --- a/build/chromeos/.style.yapf +++ b/build/chromeos/.style.yapf
@@ -1,2 +1,2 @@ [style] -based_on_style = chromium +based_on_style = yapf
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn index b80e2e287..35b7ba7 100644 --- a/build/config/sanitizers/BUILD.gn +++ b/build/config/sanitizers/BUILD.gn
@@ -113,7 +113,7 @@ # unconditionally linked into targets. visibility = [ ":deps", - "//:gn_visibility", + "//:gn_all", ] sources = [ "//build/sanitizers/sanitizer_options.cc" ]
diff --git a/build/fuchsia/cipd/BUILD.gn b/build/fuchsia/cipd/BUILD.gn index 80fe93b1..0019b86 100644 --- a/build/fuchsia/cipd/BUILD.gn +++ b/build/fuchsia/cipd/BUILD.gn
@@ -226,14 +226,6 @@ } } -cipd_archive("web_runner") { - package_subdirectory = _web_engine_directory - description = "Prebuilt WebRunner binaries for Fuchsia." - - deps = [ "//fuchsia_web/runners:web_runner_pkg" ] - sources = [ "${root_gen_dir}/fuchsia_web/runners/web_runner/web_runner.far" ] -} - cipd_archive("web_engine") { package_subdirectory = _web_engine_directory description = "Prebuilt WebEngine binaries for Fuchsia." @@ -304,7 +296,6 @@ deps = [ "//base:base_unittests_pkg", "//fuchsia_web/runners:cast_runner_integration_tests_pkg", - "//fuchsia_web/runners:web_runner_integration_tests_pkg", "//fuchsia_web/webengine:web_engine_integration_tests_pkg", "//ipc:ipc_tests_pkg", "//media:media_unittests_pkg", @@ -319,7 +310,6 @@ far_sources = [ "${root_gen_dir}/base/base_unittests/base_unittests.far", "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far", - "${root_gen_dir}/fuchsia_web/runners/web_runner_integration_tests/web_runner_integration_tests.far", "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far", "${root_gen_dir}/ipc/ipc_tests/ipc_tests.far", "${root_gen_dir}/media/media_unittests/media_unittests.far", @@ -341,10 +331,7 @@ }, { manifest_path = "${target_gen_dir}/web_engine_tests_manifest.json" - far_sources = [ - "${root_gen_dir}/fuchsia_web/runners/web_runner_integration_tests/web_runner_integration_tests.far", - "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far", - ] + far_sources = [ "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far" ] }, { manifest_path = "${target_gen_dir}/cast_runner_tests_manifest.json" @@ -415,7 +402,6 @@ deps = [ ":cast_runner${_archive_suffix}", ":web_engine${_archive_suffix}", - ":web_runner${_archive_suffix}", ] }
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index fe6fc1c..8062164 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -11.20230214.1.1 +11.20230222.0.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index da3175f7..1dc428a 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision vars in //DEPS. - libcxx_revision = "09f68a400f9200921688efb34a341d9af4c0d3d8" + libcxx_revision = "e136ec5032a5e5d97e988ce66e8c269a80ff54c4" }
diff --git a/cc/base/features.cc b/cc/base/features.cc index 59fe321..fa45685 100644 --- a/cc/base/features.cc +++ b/cc/base/features.cc
@@ -54,6 +54,10 @@ base::FEATURE_ENABLED_BY_DEFAULT); #endif +BASE_FEATURE(kMainRepaintScrollPrefersNewContent, + "MainRepaintScrollPrefersNewContent", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kSchedulerSmoothnessForAnimatedScrolls, "SmoothnessModeForAnimatedScrolls", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cc/base/features.h b/cc/base/features.h index 18f5225b..b853389 100644 --- a/cc/base/features.h +++ b/cc/base/features.h
@@ -34,6 +34,10 @@ // https://docs.google.com/document/d/1smLAXs-DSLLmkEt4FIPP7PVglJXOcwRc7A5G0SEwxaY/edit CC_BASE_EXPORT BASE_DECLARE_FEATURE(kScrollUnification); +// Sets raster tree priority to NEW_CONTENT_TAKES_PRIORITY when performing a +// unified scroll with main-thread repaint reasons. +CC_BASE_EXPORT BASE_DECLARE_FEATURE(kMainRepaintScrollPrefersNewContent); + // When enabled, wheel scrolls trigger smoothness mode. When disabled, // smoothness mode is limited to non-animated (precision) scrolls, such as // touch scrolling.
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc index 274c0003..a106e3a 100644 --- a/cc/tiles/gpu_image_decode_cache.cc +++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -1497,8 +1497,8 @@ } auto entries_it = paint_image_entries_.find(it->second->paint_image_id); - DCHECK(entries_it != paint_image_entries_.end()); - DCHECK_GT(entries_it->second.count, 0u); + CHECK(entries_it != paint_image_entries_.end()); + CHECK_GT(entries_it->second.count, 0u); // If this is the last entry for this image, remove its tracking. --entries_it->second.count;
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc index 83f41ca..c9d0e87 100644 --- a/cc/trees/layer_tree_host_unittest_scroll.cc +++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -2654,6 +2654,12 @@ class LayerTreeHostScrollTestMainRepaint : public LayerTreeHostScrollTest { public: + LayerTreeHostScrollTestMainRepaint() { + scoped_feature_list.InitWithFeatures( + {features::kScrollUnification}, + {features::kMainRepaintScrollPrefersNewContent}); + } + void SetupTree() override { LayerTreeHostScrollTest::SetupTree(); GetViewportScrollNode()->main_thread_scrolling_reasons = @@ -2679,7 +2685,7 @@ // In frame 0, scroll node has main_thread_scrolling_reasons. Do not // prioritize smoothness, since we need to repaint on the main thread for // the user to see the scroll. - EXPECT_EQ(SAME_PRIORITY_FOR_BOTH_TREES, host_impl->GetTreePriority()); + EXPECT_EQ(ExpectedMainRepaintPriority(), host_impl->GetTreePriority()); input_handler.ScrollEnd(); PostSetNeedsCommitToMainThread(); } @@ -2696,6 +2702,11 @@ } } + protected: + virtual TreePriority ExpectedMainRepaintPriority() { + return SAME_PRIORITY_FOR_BOTH_TREES; + } + private: ScrollNode* GetViewportScrollNode() { LayerTreeHost* host = layer_tree_host(); @@ -2711,10 +2722,31 @@ input_handler.ScrollUpdate( UpdateState(gfx::Point(), gfx::Vector2dF(0, 10)).get()); } + + base::test::ScopedFeatureList scoped_feature_list; }; MULTI_THREAD_TEST_F(LayerTreeHostScrollTestMainRepaint); +class LayerTreeHostScrollTestMainRepaintNewContent + : public LayerTreeHostScrollTestMainRepaint { + public: + LayerTreeHostScrollTestMainRepaintNewContent() { + scoped_feature_list.InitAndEnableFeature( + features::kMainRepaintScrollPrefersNewContent); + } + + protected: + TreePriority ExpectedMainRepaintPriority() override { + return NEW_CONTENT_TAKES_PRIORITY; + } + + private: + base::test::ScopedFeatureList scoped_feature_list; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostScrollTestMainRepaintNewContent); + class NonScrollingNonFastScrollableRegion : public LayerTreeHostScrollTest { public: NonScrollingNonFastScrollableRegion() { SetUseLayerLists(); }
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index 1194b35a..cd241b7 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc
@@ -558,9 +558,16 @@ last_raster_priority_ = raster_tree_priority; - // New content always takes priority when ui resources have been evicted. + // New content takes priority in certain cases: + // - When ui resources have been evicted. + // - When the viewport is 0x0 (may be invalid/unset?) + // - When the active scroll gesture requires main-thread repainting for the + // scroll offset change to be visible. if (host_impl_->active_tree()->GetDeviceViewport().size().IsEmpty() || - host_impl_->EvictedUIResourcesExist()) { + host_impl_->EvictedUIResourcesExist() || + (host_impl_->IsCurrentScrollMainRepainted() && + base::FeatureList::IsEnabled( + features::kMainRepaintScrollPrefersNewContent))) { // Once we enter NEW_CONTENTS_TAKES_PRIORITY mode, visible tiles on active // tree might be freed. We need to set RequiresHighResToDraw to ensure that // high res tiles will be required to activate pending tree.
diff --git a/chrome/MAJOR_BRANCH_DATE b/chrome/MAJOR_BRANCH_DATE index 64d6a33..0735fd7e 100644 --- a/chrome/MAJOR_BRANCH_DATE +++ b/chrome/MAJOR_BRANCH_DATE
@@ -1 +1 @@ -MAJOR_BRANCH_DATE=2023-01-27 +MAJOR_BRANCH_DATE=2023-02-24
diff --git a/chrome/VERSION b/chrome/VERSION index 7562c54b..0a9809c 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ -MAJOR=112 +MAJOR=113 MINOR=0 -BUILD=5615 +BUILD=5616 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 2a18fbc8..c38a8877 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -806,8 +806,8 @@ ] deps = [ - "//chrome/browser/password_manager:password_manager_buildflags", "//chrome/browser/page_info:page_info_buildflags", + "//chrome/browser/password_manager:password_manager_buildflags", "//device/vr/buildflags", ] }
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 04904850..1526bbd 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -39,6 +39,7 @@ "junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java", "junit/src/org/chromium/chrome/browser/base/DexFixerTest.java", "junit/src/org/chromium/chrome/browser/base/SplitPreloaderTest.java", + "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java", "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediatorTest.java", "junit/src/org/chromium/chrome/browser/bookmarks/ReadingListSectionHeaderTest.java", "junit/src/org/chromium/chrome/browser/browserservices/ClearDataDialogResultRecorderTest.java",
diff --git a/chrome/android/expectations/lint-baseline.xml b/chrome/android/expectations/lint-baseline.xml index a7176b6a..11e54e1 100644 --- a/chrome/android/expectations/lint-baseline.xml +++ b/chrome/android/expectations/lint-baseline.xml
@@ -7005,17 +7005,6 @@ <issue id="NotifyDataSetChanged" message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." - errorLine1=" mAdapter.notifyDataSetChanged();" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="../../chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java" - line="134" - column="13"/> - </issue> - - <issue - id="NotifyDataSetChanged" - message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." errorLine1=" notifyDataSetChanged();" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> <location
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_af.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_af.xtb index 11d21e9..5f53bd5 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_af.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_af.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="af"> <translation id="1383876407941801731">Soek</translation> -<translation id="1566281227936819866">Wys tans gestoorde betaalmetodes</translation> <translation id="1717486229951421299">Lys eiebewyse wat met aanraking ingevul moet word, is teen halwe hoogte oopgemaak.</translation> <translation id="207576718733492531">Lys eiebewyse wat met aanraking ingevul moet word, is toegemaak.</translation> <translation id="2610239185026711824">Stel wagwoord voor</translation> <translation id="2652129567809778422">Kies wagwoord</translation> -<translation id="2803478378562657435">Wys gestoorde wagwoorde en wagwoordopsies</translation> <translation id="2903493209154104877">Adresse</translation> <translation id="3399357656427473483">Lys eiebewyse wat met aanraking ingevul moet word.</translation> <translation id="3688051737190211318">As jy <ph name="ORIGIN" /> vertrou, kan jy ’n gestoorde wagwoord gebruik om aan te meld</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Wys sleutelbord</translation> <translation id="4694050069269396220">As jy <ph name="ORIGIN" /> vertrou, kan jy 'n gestoorde wagwoord vir 'n ander werf gebruik.</translation> <translation id="5016175294846053194">Outovulvoorstelle is bo die sleutelbord beskikbaar</translation> -<translation id="5088366526685584589">Wys tans gestoorde adresse</translation> <translation id="5441504010984421144">Lys eiebewyse wat met aanraking ingevul moet word, is teen volle hoogte oopgemaak.</translation> <translation id="6393156038355142111">Stel sterk wagwoord voor</translation> <translation id="6558703547256592471">Probeer 'n unieke wagwoord vir elke werf gebruik.</translation> <translation id="7029809446516969842">Wagwoorde</translation> -<translation id="7299100402441711551">Wys adresse</translation> -<translation id="7494879913343971937">Wys wagwoorde</translation> <translation id="7594473730623999723">Swiep om nog voorstelle te sien</translation> <translation id="7992095260806105436">Gebruik Chrome-outovulvoorstel</translation> -<translation id="8037472847879765671">Wys betaalmetodes</translation> <translation id="8507520749471379845">Wagwoorde beskikbaar</translation> <translation id="8705308553596171387">Geen wagwoord nie</translation> <translation id="879180780857354295">Alternatiewe invulopsies is bo die sleutelbord beskikbaar</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb index 1f41f2d..cb4f01a 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_am.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1383876407941801731">ፍለጋ </translation> -<translation id="1566281227936819866">የተቀመጡ የመክፈያ ዘዴዎችን በማሳየት ላይ</translation> <translation id="1717486229951421299">በግማሽ ቁመት ላይ ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ዝርዝር።</translation> <translation id="207576718733492531">ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ተዘግቷል።</translation> <translation id="2610239185026711824">የይለፍ ቃል ጠቁም</translation> <translation id="2652129567809778422">የይለፍ ቃል ይምረጡ</translation> -<translation id="2803478378562657435">የተቀመጡ የይለፍ ቃላትን እና የይለፍ ቃል አማራጮችን በማሳየት ላይ</translation> <translation id="2903493209154104877">አድራሻዎች</translation> <translation id="3399357656427473483">ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ዝርዝር።</translation> <translation id="3688051737190211318"><ph name="ORIGIN" />ን የሚያምኑት ከሆነ ለመግባት የተቀመጠ የይለፍ ቃል መጠቀም ይችላሉ</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">የቁልፍ ሰሌዳን አሳይ</translation> <translation id="4694050069269396220"><ph name="ORIGIN" />ን የሚያምኑት ከሆነ ለሌላ ጣቢያ የተቀመጠ የይለፍ ቃልን መጠቀም ይችላሉ።</translation> <translation id="5016175294846053194">የራስ-ሙላ አስተያየት ጥቆማዎች ከቁልፍ ሰሌዳው በላይ ይገኛሉ</translation> -<translation id="5088366526685584589">የተቀመጡ አድራሻዎችን በማሳየት ላይ</translation> <translation id="5441504010984421144">በሙሉ ቁመት ላይ ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ዝርዝር።</translation> <translation id="6393156038355142111">ጠንካራ የይለፍ ቃል ጠቁም</translation> <translation id="6558703547256592471">ለእያንዳንዱ ጣቢያ የተለየ የይለፍ ቃል ለመጠቀም ይሞክሩ።</translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> -<translation id="7299100402441711551">አድራሻዎችን አሳይ</translation> -<translation id="7494879913343971937">የይለፍ ቃላትን አሳይ</translation> <translation id="7594473730623999723">ተጨማሪ አስተያየቶችን ለማየት ያንሸራትቱ</translation> <translation id="7992095260806105436">የChrome የራስ-ሙላ አስተያየት ጥቆማን ይጠቀሙ</translation> -<translation id="8037472847879765671">የመክፈያ ዘዴዎችን አሳይ</translation> <translation id="8507520749471379845">የይለፍ ቃላት ይገኛሉ</translation> <translation id="8705308553596171387">የይለፍ ቃል የለም</translation> <translation id="879180780857354295">አማራጭ መሙያ አማራጮች ከቁልፍ ሰሌዳው በላይ በኩል ይገኛል</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb index 7589ad4..234f4172 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ar.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ar"> <translation id="1383876407941801731">البحث</translation> -<translation id="1566281227936819866">عرض طرق الدفع المحفوظة</translation> <translation id="1717486229951421299">تم فتح قائمة بيانات الاعتماد التي يتم ملؤها باللمس على طول النصف السفلي من الشاشة.</translation> <translation id="207576718733492531">تم إغلاق قائمة بيانات الاعتماد التي يتم ملؤها باللمس.</translation> <translation id="2610239185026711824">اقتراح كلمة مرور</translation> <translation id="2652129567809778422">اختيار كلمة مرور</translation> -<translation id="2803478378562657435">عرض كلمات المرور المحفوظة وخيارات كلمة المرور</translation> <translation id="2903493209154104877">العناوين</translation> <translation id="3399357656427473483">قائمة ببيانات الاعتماد التي يتم ملؤها باللمس</translation> <translation id="3688051737190211318">إذا كنت تثق بالموقع الإلكتروني <ph name="ORIGIN" />، يمكنك استخدام كلمة مرور محفوظة لتسجيل الدخول.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">عرض لوحة المفاتيح</translation> <translation id="4694050069269396220">إذا كنت تثِق بالنطاق <ph name="ORIGIN" />، يمكنك استخدام نفس كلمة المرور المحفوظة لموقع إلكتروني آخر.</translation> <translation id="5016175294846053194">اقتراحات الملء التلقائي متاحة أعلى لوحة المفاتيح</translation> -<translation id="5088366526685584589">جارٍ عرض العناوين المحفوظة.</translation> <translation id="5441504010984421144">تم فتح قائمة بيانات الاعتماد التي يجب ملؤها باللمس على طول الشاشة.</translation> <translation id="6393156038355142111">اقتراح كلمة مرور قوية</translation> <translation id="6558703547256592471">حاوِل استخدام كلمة مرور فريدة لكل موقع إلكتروني.</translation> <translation id="7029809446516969842">كلمات المرور</translation> -<translation id="7299100402441711551">عرض العناوين</translation> -<translation id="7494879913343971937">عرض كلمات المرور</translation> <translation id="7594473730623999723">مرِّر سريعًا للاطّلاع على مزيد من الاقتراحات.</translation> <translation id="7992095260806105436">استخدام اقتراح الملء التلقائي في Chrome</translation> -<translation id="8037472847879765671">عرض طرق الدفع</translation> <translation id="8507520749471379845">كلمات المرور متاحة</translation> <translation id="8705308553596171387">بلا كلمة مرور</translation> <translation id="879180780857354295">تتوفر خيارات ملء بديلة أعلى لوحة المفاتيح.</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_as.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_as.xtb index 726dd964..1ff1565 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_as.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_as.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="as"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">ছেভ কৰি ৰখা পৰিশোধ পদ্ধতিসমূহ প্ৰদর্শন কৰি থকা হৈছে</translation> <translation id="1717486229951421299">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচীখন অৰ্ধ উচ্চতাত খোল খাইছে।</translation> <translation id="207576718733492531">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচীখন বন্ধ কৰা আছে।</translation> <translation id="2610239185026711824">পাছৱর্ডৰ পৰামর্শ দিয়ক</translation> <translation id="2652129567809778422">পাছৱৰ্ড বাছনি কৰক</translation> -<translation id="2803478378562657435">ছেভ হৈ থকা পাছৱৰ্ড আৰু পাছৱৰ্ডৰ বিকল্পসমূহ দেখুৱাই থকা হৈছে</translation> <translation id="2903493209154104877">ঠিকনা</translation> <translation id="3399357656427473483">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচী।</translation> <translation id="3688051737190211318">আপুনি যদি <ph name="ORIGIN" />ক বিশ্বাস কৰে, ছাইন ইন কৰিবলৈ আপুনি এটা ছেভ হৈ থকা পাছৱৰ্ড ব্যৱহাৰ কৰিব পাৰে</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">কীব’র্ড দেখুৱাওক</translation> <translation id="4694050069269396220">যদি আপোনাৰ <ph name="ORIGIN" />ৰ ওপৰত বিশ্বাস আছে, তেন্তে আপুনি অন্য এটা ছাইটৰ বাবে ছেভ কৰি থোৱা এটা পাছৱৰ্ড ব্যৱহাৰ কৰিব পাৰে।</translation> <translation id="5016175294846053194">কীব’ৰ্ডখনৰ ওপৰত স্বয়ংক্রিয়ভাৱে পূৰ হোৱা সুবিধাটোৱে দিয়া পৰামৰ্শসমূহ উপলব্ধ</translation> -<translation id="5088366526685584589">ছেভ কৰি থোৱা ঠিকনাবোৰ দেখুওৱা হৈছে</translation> <translation id="5441504010984421144">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচীখন সম্পূৰ্ণ উচ্চতাত খোল খাইছে।</translation> <translation id="6393156038355142111">জটিল পাছৱৰ্ডৰ পৰামৰ্শ দিয়ক</translation> <translation id="6558703547256592471">প্ৰতিটো ছাইটৰ বাবে এটা অদ্বিতীয় পাছৱৰ্ড ব্যৱহাৰ কৰিবলৈ চেষ্টা কৰক।</translation> <translation id="7029809446516969842">পাছৱৰ্ডসমূহ</translation> -<translation id="7299100402441711551">ঠিকনাবোৰ দেখুৱাওক</translation> -<translation id="7494879913343971937">পাছৱৰ্ডবোৰ দেখুৱাওক</translation> <translation id="7594473730623999723">অধিক পৰামৰ্শ চাবলৈ ছোৱাইপ কৰক</translation> <translation id="7992095260806105436">Chrome স্বয়ংক্ৰিয়ভাৱে পূৰ হোৱা পৰামৰ্শৰ সুবিধাটো ব্যৱহাৰ কৰক</translation> -<translation id="8037472847879765671">পৰিশোধ পদ্ধতিসমূহ দেখুৱাওক</translation> <translation id="8507520749471379845">পাছৱৰ্ড উপলব্ধ</translation> <translation id="8705308553596171387">কোনো পাছৱৰ্ড নাই</translation> <translation id="879180780857354295">পূৰ্ণ কৰাৰ বিকল্পসমূহ কীব’ৰ্ডখনৰ ওপৰত আছে</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_az.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_az.xtb index 3ec3027..af2bcba 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_az.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_az.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="az"> <translation id="1383876407941801731">Axtar</translation> -<translation id="1566281227936819866">Yadda saxlanılmış ödəniş metodları göstərilir</translation> <translation id="1717486229951421299">Yarı hündürlükdə açılan toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="207576718733492531">Toxunuşla doldurulacaq kredensialların siyahısı bağlıdır.</translation> <translation id="2610239185026711824">Parol təklif edin</translation> <translation id="2652129567809778422">Parol seçin</translation> -<translation id="2803478378562657435">Yadda saxlanmış parollar və parol seçimləri göstərilir</translation> <translation id="2903493209154104877">Ünvanlar</translation> <translation id="3399357656427473483">Toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> mənbəyinə etibar edirsinizsə, saxlanmış parolu giriş üçün istifadə edə bilərsiniz</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Klaviaturanı göstərin</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> mənbəyinə etibar edirsinizsə, saxlanmış parolu başqa sayt üçün istifadə edə bilərsiniz.</translation> <translation id="5016175294846053194">Avtomatik doldurma təklifləri klaviaturanın yuxarısında əlçatandır</translation> -<translation id="5088366526685584589">Yadda saxlanılan ünvanlar göstərilir</translation> <translation id="5441504010984421144">Tam hündürlükdə açılan toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="6393156038355142111">Güclü parol təklif edin</translation> <translation id="6558703547256592471">Hər sayt üçün unikal parol istifadə edin.</translation> <translation id="7029809446516969842">Parollar</translation> -<translation id="7299100402441711551">Ünvanları Göstərin</translation> -<translation id="7494879913343971937">Parolları göstərin</translation> <translation id="7594473730623999723">Daha çox təklif görmək üçün sürüşdürün</translation> <translation id="7992095260806105436">Chrome'un avto doldurma təklifindən istifadə edin</translation> -<translation id="8037472847879765671">Ödəniş metodlarını göstərin</translation> <translation id="8507520749471379845">Parollar əlçatandır</translation> <translation id="8705308553596171387">Parol yoxdur</translation> <translation id="879180780857354295">Alternativ doldurma seçimləri klaviaturanın yuxarısında əlçatandır</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_be.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_be.xtb index b38e637..f39ced4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_be.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_be.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="be"> <translation id="1383876407941801731">Пошук</translation> -<translation id="1566281227936819866">Паказваюцца захаваныя спосабы аплаты</translation> <translation id="1717486229951421299">Спіс уліковых даных, якія трэба ўнесці па націсканні, адкрыты на палову экрана.</translation> <translation id="207576718733492531">Спіс уліковых даных, якія трэба ўнесці па націсканні, закрыты.</translation> <translation id="2610239185026711824">Прапанаваць пароль</translation> <translation id="2652129567809778422">Выберыце пароль</translation> -<translation id="2803478378562657435">Паказваюцца захаваныя паролі і параметры пароляў</translation> <translation id="2903493209154104877">Адрасы</translation> <translation id="3399357656427473483">Спіс уліковых даных, якія трэба ўнесці па націсканні.</translation> <translation id="3688051737190211318">Калі вы давяраеце сайту <ph name="ORIGIN" />, можаце выкарыстаць для ўваходу захаваны пароль</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Паказаць клавіятуру</translation> <translation id="4694050069269396220">Калі вы давяраеце сайту <ph name="ORIGIN" />, можаце выкарыстаць захаваны пароль і для іншага сайта.</translation> <translation id="5016175294846053194">Над клавіятурай даступныя прапановы аўтазапаўнення</translation> -<translation id="5088366526685584589">Паказваюцца захаваныя адрасы</translation> <translation id="5441504010984421144">Спіс уліковых даных, якія трэба ўнесці па націсканні, адкрыты на ўвесь экран.</translation> <translation id="6393156038355142111">Прапанаваць надзейны пароль</translation> <translation id="6558703547256592471">Паспрабуйце выкарыстоўваць унікальны пароль для кожнага сайта.</translation> <translation id="7029809446516969842">Паролі</translation> -<translation id="7299100402441711551">Паказаць адрасы</translation> -<translation id="7494879913343971937">Паказаць паролі</translation> <translation id="7594473730623999723">Каб пабачыць больш прапаноў, правядзіце пальцам</translation> <translation id="7992095260806105436">Выкарыстайце прапанову аўтазапаўнення Chrome</translation> -<translation id="8037472847879765671">Паказаць спосабы аплаты</translation> <translation id="8507520749471379845">Даступныя паролі</translation> <translation id="8705308553596171387">Без пароля</translation> <translation id="879180780857354295">Над клавіятурай паказваюцца альтэрнатыўныя варыянты запаўнення</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bg.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bg.xtb index 4e64017..37ca684 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bg.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bg.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="bg"> <translation id="1383876407941801731">Търсене</translation> -<translation id="1566281227936819866">Показани са запазените начини на плащане</translation> <translation id="1717486229951421299">Списъкът с идентификационни данни, които да бъдат попълнени при докосване, е отворен на половината височина.</translation> <translation id="207576718733492531">Списъкът с идентификационни данни, които да бъдат попълнени при докосване, е затворен.</translation> <translation id="2610239185026711824">Предложение за парола</translation> <translation id="2652129567809778422">Изберете парола</translation> -<translation id="2803478378562657435">Запазените пароли и опциите за пароли са показани</translation> <translation id="2903493209154104877">Адреси</translation> <translation id="3399357656427473483">Списък с идентификационни данни, които да бъдат попълнени при докосване.</translation> <translation id="3688051737190211318">Ако имате доверие на <ph name="ORIGIN" />, можете да използвате запазена парола за влизане в профила</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Показване на клавиатурата</translation> <translation id="4694050069269396220">Ако имате доверие на <ph name="ORIGIN" />, можете да използвате запазена парола за друг сайт.</translation> <translation id="5016175294846053194">Над клавиатурата има предложения за автоматично попълване</translation> -<translation id="5088366526685584589">Показани са запазените адреси</translation> <translation id="5441504010984421144">Списъкът с идентификационни данни, които да бъдат попълнени при докосване, е отворен на пълната височина.</translation> <translation id="6393156038355142111">Предложение за надеждна парола</translation> <translation id="6558703547256592471">Опитайте да използвате уникална парола за всеки сайт.</translation> <translation id="7029809446516969842">Пароли</translation> -<translation id="7299100402441711551">Показване на адресите</translation> -<translation id="7494879913343971937">Показване на паролите</translation> <translation id="7594473730623999723">Прекарайте пръст, за да видите още предложения</translation> <translation id="7992095260806105436">Използване на предложението от функцията за автоматично попълване в Chrome</translation> -<translation id="8037472847879765671">Показване на начините на плащане</translation> <translation id="8507520749471379845">Има налични пароли</translation> <translation id="8705308553596171387">Няма парола</translation> <translation id="879180780857354295">Над клавиатурата има алтернативни опции за попълване</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb index eb41829b6..caf0552 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bn.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="bn"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">সেভ করা পেমেন্টের পদ্ধতি দেখানো হচ্ছে</translation> <translation id="1717486229951421299">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা হাফ স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="207576718733492531">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা বন্ধ রয়েছে।</translation> <translation id="2610239185026711824">পাসওয়ার্ড সাজেস্ট করুন</translation> <translation id="2652129567809778422">পাসওয়ার্ড বেছে নিন</translation> -<translation id="2803478378562657435">সেভ করা পাসওয়ার্ড এবং পাসওয়ার্ড বিকল্পগুলি দেখানো হচ্ছে</translation> <translation id="2903493209154104877">ঠিকানা</translation> <translation id="3399357656427473483">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা।</translation> <translation id="3688051737190211318"><ph name="ORIGIN" />-এর উপর ভরসা থাকলে, আপনি সেভ করা পাসওয়ার্ড সাইন-ইন করার জন্য ব্যবহার করতে পারেন</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">কীবোর্ড দেখান</translation> <translation id="4694050069269396220"><ph name="ORIGIN" />-এর উপর ভরসা থাকলে, আপনি সেভ করা পাসওয়ার্ড অন্য সাইটে ব্যবহার করতে পারেন।</translation> <translation id="5016175294846053194">কীবোর্ডের ঠিক উপরে অটোমেটিক পূরণ হয়ে যাওয়ার সাজেশন পাবেন</translation> -<translation id="5088366526685584589">সেভ করে রাখা ঠিকানা দেখানো হচ্ছে</translation> <translation id="5441504010984421144">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা ফুল স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="6393156038355142111">শক্তিশালী পাসওয়ার্ড সাজেস্ট করুন</translation> <translation id="6558703547256592471">প্রতিটি সাইটের জন্য অনন্য পাসওয়ার্ড ব্যবহারের চেষ্টা করুন।</translation> <translation id="7029809446516969842">পাসওয়ার্ড</translation> -<translation id="7299100402441711551">ঠিকানা দেখুন</translation> -<translation id="7494879913343971937">পাসওয়ার্ড দেখান</translation> <translation id="7594473730623999723">আরও সাজেশন দেখতে সোয়াইপ করুন</translation> <translation id="7992095260806105436">Chrome-এর 'অটোফিল সাজেশন' ফিচার ব্যবহার করুন</translation> -<translation id="8037472847879765671">পেমেন্টের পদ্ধতিগুলি দেখুন</translation> <translation id="8507520749471379845">পাসওয়ার্ড উপলভ্য</translation> <translation id="8705308553596171387">পাসওয়ার্ড নেই</translation> <translation id="879180780857354295">কীবোর্ডের ঠিক উপরে অটোমেটিক পূরণ হয়ে যাওয়ার বিকল্প উপলভ্য</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bs.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bs.xtb index dc760f06..b5126fc7 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bs.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_bs.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="bs"> <translation id="1383876407941801731">Traži</translation> -<translation id="1566281227936819866">Prikazuju se sačuvani načini plaćanja</translation> <translation id="1717486229951421299">Lista akreditiva za popunjavanje dodirom je otvorena na pola visine.</translation> <translation id="207576718733492531">Lista akreditiva za popunjavanje dodirom je zatvorena.</translation> <translation id="2610239185026711824">Predloži lozinku</translation> <translation id="2652129567809778422">Odaberite lozinku</translation> -<translation id="2803478378562657435">Prikazivanje sačuvanih lozinki i opcija za lozinke</translation> <translation id="2903493209154104877">Adrese</translation> <translation id="3399357656427473483">Lista akreditiva za popunjavanje dodirom.</translation> <translation id="3688051737190211318">Ako web lokaciju <ph name="ORIGIN" /> smatrate pouzdanom, možete koristiti sačuvanu lozinku za prijavu.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Prikaz tastature</translation> <translation id="4694050069269396220">Ako web lokaciju <ph name="ORIGIN" /> smatrate pouzdanom, možete koristiti sačuvanu lozinku za drugu web lokaciju.</translation> <translation id="5016175294846053194">Prijedlozi za automatsko popunjavanje su dostupni iznad tastature</translation> -<translation id="5088366526685584589">Prikazane su sačuvane adrese</translation> <translation id="5441504010984421144">Lista akreditiva za popunjavanje dodirom je otvorena na cijelom ekranu.</translation> <translation id="6393156038355142111">Predloži jaku lozinku</translation> <translation id="6558703547256592471">Pokušajte koristiti jedinstvenu lozinku za svaku web lokaciju.</translation> <translation id="7029809446516969842">Lozinke</translation> -<translation id="7299100402441711551">Prikaz adresa</translation> -<translation id="7494879913343971937">Prikaži lozinke</translation> <translation id="7594473730623999723">Prevucite da vidite više prijedloga</translation> <translation id="7992095260806105436">Koristite prijedlog Chromea za automatsko popunjavanje</translation> -<translation id="8037472847879765671">Prikaz načina plaćanja</translation> <translation id="8507520749471379845">Dostupne su lozinke</translation> <translation id="8705308553596171387">Nema lozinke</translation> <translation id="879180780857354295">Alternativne opcije popunjavanja su dostupne iznad tastature</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ca.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ca.xtb index 37307b1..d17c4a83 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ca.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ca.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ca"> <translation id="1383876407941801731">Cerca</translation> -<translation id="1566281227936819866">S'estan mostrant les formes de pagament desades</translation> <translation id="1717486229951421299">La llista de credencials que s'emplenen amb un toc s'ha obert a mitja alçada.</translation> <translation id="207576718733492531">La llista de credencials que s'emplenaran amb un toc està tancada.</translation> <translation id="2610239185026711824">Suggereix una contrasenya</translation> <translation id="2652129567809778422">Selecciona una contrasenya</translation> -<translation id="2803478378562657435">S'estan mostrant les contrasenyes desades i les opcions de contrasenyes</translation> <translation id="2903493209154104877">Adreces</translation> <translation id="3399357656427473483">Llista de credencials que s'emplenaran amb un toc.</translation> <translation id="3688051737190211318">Si confies en <ph name="ORIGIN" />, pots utilitzar una contrasenya desada per iniciar la sessió</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostra el teclat</translation> <translation id="4694050069269396220">Si confies en <ph name="ORIGIN" />, pots utilitzar una contrasenya desada per a un altre lloc web.</translation> <translation id="5016175294846053194">A sobre del teclat hi ha suggeriments d'Emplenament automàtic</translation> -<translation id="5088366526685584589">S'estan mostrant les adreces desades</translation> <translation id="5441504010984421144">La llista de credencials que s'emplenaran amb un toc s'ha obert a alçada completa.</translation> <translation id="6393156038355142111">Suggereix una contrasenya segura</translation> <translation id="6558703547256592471">Prova d'utilitzar una contrasenya única per a cada lloc web.</translation> <translation id="7029809446516969842">Contrasenyes</translation> -<translation id="7299100402441711551">Mostra les adreces</translation> -<translation id="7494879913343971937">Mostra les contrasenyes</translation> <translation id="7594473730623999723">Llisca per veure més suggeriments</translation> <translation id="7992095260806105436">Utilitza el suggeriment d'Emplenament automàtic de Chrome</translation> -<translation id="8037472847879765671">Mostra les formes de pagament</translation> <translation id="8507520749471379845">Contrasenyes disponibles</translation> <translation id="8705308553596171387">Sense contrasenya</translation> <translation id="879180780857354295">Opcions alternatives d'emplenament disponibles a sobre del teclat</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cs.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cs.xtb index 009de39..179a223 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cs.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cs.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="cs"> <translation id="1383876407941801731">Vyhledávání</translation> -<translation id="1566281227936819866">Zobrazují se uložené platební metody</translation> <translation id="1717486229951421299">Seznam identifikačních údajů k vyplnění při klepnutí je otevřený na polovinu výšky.</translation> <translation id="207576718733492531">Seznam identifikačních údajů k vyplnění při klepnutí je zavřený.</translation> <translation id="2610239185026711824">Navrhnout heslo</translation> <translation id="2652129567809778422">Vyberte heslo</translation> -<translation id="2803478378562657435">Zobrazování uložených hesel a možností hesel</translation> <translation id="2903493209154104877">Adresy</translation> <translation id="3399357656427473483">Seznam identifikačních údajů k vyplnění při klepnutí.</translation> <translation id="3688051737190211318">Pokud webu <ph name="ORIGIN" /> důvěřujete, můžete k přihlášení použít uložené heslo</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Zobrazit klávesnici</translation> <translation id="4694050069269396220">Pokud webu <ph name="ORIGIN" /> důvěřujete, můžete použít uložené heslo k jinému webu.</translation> <translation id="5016175294846053194">Nad klávesnicí jsou k dispozici návrhy automatického vyplňování</translation> -<translation id="5088366526685584589">Zobrazují se uložené adresy</translation> <translation id="5441504010984421144">Seznam identifikačních údajů k vyplnění při klepnutí je otevřený na celou výšku.</translation> <translation id="6393156038355142111">Navrhnout silné heslo</translation> <translation id="6558703547256592471">Pro každý web se pokuste použít jedinečné heslo.</translation> <translation id="7029809446516969842">Hesla</translation> -<translation id="7299100402441711551">Zobrazit adresy</translation> -<translation id="7494879913343971937">Zobrazovat hesla</translation> <translation id="7594473730623999723">Přejetím prstem zobrazíte další návrhy</translation> <translation id="7992095260806105436">Používat návrhy automatického vyplňování Chromu</translation> -<translation id="8037472847879765671">Zobrazit platební metody</translation> <translation id="8507520749471379845">Jsou k dispozici hesla</translation> <translation id="8705308553596171387">Žádné heslo</translation> <translation id="879180780857354295">Alternativní možnosti vyplnění jsou k dispozici nad klávesnicí</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cy.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cy.xtb index a6e7b16..c64f90c 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cy.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_cy.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="cy"> <translation id="1383876407941801731">Chwilio</translation> -<translation id="1566281227936819866">Wrthi'n dangos dulliau talu a gadwyd</translation> <translation id="1717486229951421299">Rhestr o fanylion adnabod i'w llenwi ar ôl agor ar hanner uchder.</translation> <translation id="207576718733492531">Mae'r rhestr o fanylion adnabod sydd i'w llenwi wrth gyffwrdd ar gau.</translation> <translation id="2610239185026711824">Awgrymu cyfrinair</translation> <translation id="2652129567809778422">Dewiswch gyfrinair</translation> -<translation id="2803478378562657435">Wrthi'n dangos cyfrineiriau a dewisiadau cyfrinair wedi'u cadw</translation> <translation id="2903493209154104877">Cyfeiriadau</translation> <translation id="3399357656427473483">Rhestr o fanylion adnabod sydd i'w llenwi wrth gyffwrdd.</translation> <translation id="3688051737190211318">Os ydych yn ymddiried yn <ph name="ORIGIN" />, gallwch ddefnyddio cyfrinair a gadwyd i fewngofnodi</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Dangos y bysellfwrdd</translation> <translation id="4694050069269396220">Os ydych yn ymddiried yn <ph name="ORIGIN" />, gallwch ddefnyddio cyfrinair a gadwyd ar gyfer gwefan arall.</translation> <translation id="5016175294846053194">Mae awgrymiadau llenwi awtomatig ar gael uwchben y bysellfwrdd</translation> -<translation id="5088366526685584589">Yn dangos cyfeiriadau sydd wedi'u cadw</translation> <translation id="5441504010984421144">Rhestr o fanylion adnabod i'w llenwi ar ôl agor ar uchder llawn.</translation> <translation id="6393156038355142111">Awgrymu cyfrinair cryf</translation> <translation id="6558703547256592471">Rhowch gynnig ar ddefnyddio cyfrinair unigryw ar gyfer pob gwefan.</translation> <translation id="7029809446516969842">Cyfrineiriau</translation> -<translation id="7299100402441711551">Dangos Cyfeiriadau</translation> -<translation id="7494879913343971937">Dangos cyfrineiriau</translation> <translation id="7594473730623999723">Sweipiwch i weld rhagor o awgrymiadau</translation> <translation id="7992095260806105436">Defnyddio awgrym awtolenwi Chrome</translation> -<translation id="8037472847879765671">Dangos dulliau talu</translation> <translation id="8507520749471379845">Mae cyfrineiriau ar gael</translation> <translation id="8705308553596171387">Dim cyfrinair</translation> <translation id="879180780857354295">Mae dewisiadau llenwi amgen ar gael uwchben y bysellfwrdd</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_da.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_da.xtb index a43e7db..129e3ee 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_da.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_da.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="da"> <translation id="1383876407941801731">Søg</translation> -<translation id="1566281227936819866">Viser gemte betalingsmetoder</translation> <translation id="1717486229951421299">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i halv højde.</translation> <translation id="207576718733492531">Listen over loginoplysninger, der udfyldes ved berøring, er lukket.</translation> <translation id="2610239185026711824">Foreslå en adgangskode</translation> <translation id="2652129567809778422">Vælg adgangskode</translation> -<translation id="2803478378562657435">Viser gemte adgangskoder og valgmuligheder for adgangskoder</translation> <translation id="2903493209154104877">Adresser</translation> <translation id="3399357656427473483">Liste over loginoplysninger, der udfyldes ved berøring.</translation> <translation id="3688051737190211318">Hvis du har tillid til <ph name="ORIGIN" />, kan du bruge en gemt adgangskode til at logge ind</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Vis tastatur</translation> <translation id="4694050069269396220">Hvis du har tillid til <ph name="ORIGIN" />, kan du bruge en gemt adgangskode til et andet website.</translation> <translation id="5016175294846053194">Der er tilgængelige forslag fra Autofyld over tastaturet</translation> -<translation id="5088366526685584589">Viser gemte adresser</translation> <translation id="5441504010984421144">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i fuld højde.</translation> <translation id="6393156038355142111">Foreslå en stærk adgangskode</translation> <translation id="6558703547256592471">Prøv at bruge en unik adgangskode til hvert website.</translation> <translation id="7029809446516969842">Adgangskoder</translation> -<translation id="7299100402441711551">Vis adresser</translation> -<translation id="7494879913343971937">Vis adgangskoder</translation> <translation id="7594473730623999723">Stryg for at se flere forslag</translation> <translation id="7992095260806105436">Brug forslag fra Autofyld i Chrome</translation> -<translation id="8037472847879765671">Vis betalingsmetoder</translation> <translation id="8507520749471379845">Tilgængelige adgangskoder</translation> <translation id="8705308553596171387">Ingen adgangskode</translation> <translation id="879180780857354295">Alternative udfyldningsmuligheder er tilgængelige over tastaturet</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_de.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_de.xtb index 393d3a5..9118b5f 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_de.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_de.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="de"> <translation id="1383876407941801731">Durchsuchen</translation> -<translation id="1566281227936819866">Gespeicherte Zahlungsmethoden werden angezeigt</translation> <translation id="1717486229951421299">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist halb geöffnet.</translation> <translation id="207576718733492531">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist geschlossen.</translation> <translation id="2610239185026711824">Passwort vorschlagen</translation> <translation id="2652129567809778422">Passwort auswählen</translation> -<translation id="2803478378562657435">Gespeicherte Passwörter und Passwortoptionen werden angezeigt</translation> <translation id="2903493209154104877">Adressen</translation> <translation id="3399357656427473483">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist geöffnet.</translation> <translation id="3688051737190211318">Wenn du <ph name="ORIGIN" /> vertraust, kannst du ein gespeichertes Passwort zur Anmeldung verwenden</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Tastatur anzeigen</translation> <translation id="4694050069269396220">Wenn du <ph name="ORIGIN" /> vertraust, kannst du ein gespeichertes Passwort für eine andere Website verwenden.</translation> <translation id="5016175294846053194">Über der Tastatur werden Autofill-Vorschläge angezeigt</translation> -<translation id="5088366526685584589">Gespeicherte Adressen werden angezeigt</translation> <translation id="5441504010984421144">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist ganz geöffnet.</translation> <translation id="6393156038355142111">Starkes Passwort vorschlagen</translation> <translation id="6558703547256592471">Es empfiehlt sich aber, für jede Website ein eigenes Passwort zu verwenden.</translation> <translation id="7029809446516969842">Passwörter</translation> -<translation id="7299100402441711551">Adressen anzeigen</translation> -<translation id="7494879913343971937">Passwörter anzeigen</translation> <translation id="7594473730623999723">Wischen, um weitere Vorschläge zu sehen</translation> <translation id="7992095260806105436">Chrome-Autofill-Vorschlag verwenden</translation> -<translation id="8037472847879765671">Zahlungsmethoden anzeigen</translation> <translation id="8507520749471379845">Passwörter verfügbar</translation> <translation id="8705308553596171387">Kein Passwort</translation> <translation id="879180780857354295">Über der Tastatur werden alternative Ausfüll-Optionen angezeigt</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_el.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_el.xtb index aea8add..0809e3a 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_el.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_el.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="el"> <translation id="1383876407941801731">Αναζήτηση</translation> -<translation id="1566281227936819866">Εμφάνιση αποθηκευμένων τρόπων πληρωμής</translation> <translation id="1717486229951421299">Η λίστα με τα διαπιστευτήρια για συμπλήρωση μέσω αφής είναι ανοιχτή στο κάτω μισό της οθόνης.</translation> <translation id="207576718733492531">Η λίστα με τα διαπιστευτήρια για συμπλήρωση μέσω αφής είναι κλειστή.</translation> <translation id="2610239185026711824">Πρόταση κωδικού πρόσβασης</translation> <translation id="2652129567809778422">Επιλογή κωδικού πρόσβασης</translation> -<translation id="2803478378562657435">Εμφάνιση αποθηκευμένων κωδικών πρόσβασης και επιλογών κωδικού πρόσβασης</translation> <translation id="2903493209154104877">Διευθύνσεις</translation> <translation id="3399357656427473483">Η λίστα με τα διαπιστευτήρια για συμπλήρωση μέσω αφής.</translation> <translation id="3688051737190211318">Εάν εμπιστεύεστε την προέλευση <ph name="ORIGIN" />, μπορείτε να χρησιμοποιήσετε έναν αποθηκευμένο κωδικό πρόσβασης για σύνδεση</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Εμφάνιση πληκτρολογίου</translation> <translation id="4694050069269396220">Εάν εμπιστεύεστε την προέλευση <ph name="ORIGIN" />, μπορείτε να χρησιμοποιήσετε έναν αποθηκευμένο κωδικό πρόσβασης για άλλον ιστότοπο.</translation> <translation id="5016175294846053194">Υπάρχουν διαθέσιμες προτάσεις αυτόματης συμπλήρωσης πάνω από το πληκτρολόγιο.</translation> -<translation id="5088366526685584589">Εμφάνιση αποθηκευμένων διευθύνσεων</translation> <translation id="5441504010984421144">Η λίστα με τα διαπιστευτήρια για συμπλήρωση μέσω αφής είναι ανοιχτή σε όλη την οθόνη.</translation> <translation id="6393156038355142111">Πρόταση ισχυρού κωδικού πρόσβασης</translation> <translation id="6558703547256592471">Προσπαθήστε να χρησιμοποιείτε έναν μοναδικό κωδικό πρόσβασης για κάθε ιστότοπο.</translation> <translation id="7029809446516969842">Κωδ. πρόσβασης</translation> -<translation id="7299100402441711551">Εμφάνιση διευθύνσεων</translation> -<translation id="7494879913343971937">Εμφάνιση κωδικών πρόσβασης</translation> <translation id="7594473730623999723">Σύρετε για να δείτε περισσότερες προτάσεις</translation> <translation id="7992095260806105436">Χρησιμοποιήστε την πρόταση αυτόματης συμπλήρωσης του Chrome.</translation> -<translation id="8037472847879765671">Εμφάνιση τρόπων πληρωμής</translation> <translation id="8507520749471379845">Υπάρχουν διαθέσιμοι κωδικοί πρόσβασης</translation> <translation id="8705308553596171387">Κανένας κωδικός πρόσβασης</translation> <translation id="879180780857354295">Διατίθενται εναλλακτικές επιλογές συμπλήρωσης πάνω από το πληκτρολόγιο</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb index f156803..db5b181f 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="en-GB"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">Showing saved payment methods</translation> <translation id="1717486229951421299">List of credentials to be filled in on touch opened at half height.</translation> <translation id="207576718733492531">List of credentials to be filled in on touch is closed.</translation> <translation id="2610239185026711824">Suggest password</translation> <translation id="2652129567809778422">Select password</translation> -<translation id="2803478378562657435">Showing saved passwords and password options</translation> <translation id="2903493209154104877">Addresses</translation> <translation id="3399357656427473483">List of credentials to be filled in on touch.</translation> <translation id="3688051737190211318">If you trust <ph name="ORIGIN" />, you can use a saved password to sign in</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Show keyboard</translation> <translation id="4694050069269396220">If you trust <ph name="ORIGIN" />, you can use a saved password for another site.</translation> <translation id="5016175294846053194">Auto-fill suggestions available above the keyboard</translation> -<translation id="5088366526685584589">Showing saved addresses</translation> <translation id="5441504010984421144">List of credentials to be filled in on touch opened at full height.</translation> <translation id="6393156038355142111">Suggest strong password</translation> <translation id="6558703547256592471">Try to use a unique password for every site.</translation> <translation id="7029809446516969842">Passwords</translation> -<translation id="7299100402441711551">Show addresses</translation> -<translation id="7494879913343971937">Show passwords</translation> <translation id="7594473730623999723">Swipe to see more suggestions</translation> <translation id="7992095260806105436">Use Chrome autofill suggestion</translation> -<translation id="8037472847879765671">Show payment methods</translation> <translation id="8507520749471379845">Passwords available</translation> <translation id="8705308553596171387">No password</translation> <translation id="879180780857354295">Alternative filling options available above the keyboard</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es-419.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es-419.xtb index 57ac0dcf..3494eda 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es-419.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es-419.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="es-419"> <translation id="1383876407941801731">Buscar</translation> -<translation id="1566281227936819866">Mostrando las formas de pago guardadas</translation> <translation id="1717486229951421299">La lista de credenciales que se debe tocar para completar está abierta a media altura.</translation> <translation id="207576718733492531">La lista de credenciales que se debe tocar para completar está cerrada.</translation> <translation id="2610239185026711824">Sugerir contraseña</translation> <translation id="2652129567809778422">Seleccionar contraseña</translation> -<translation id="2803478378562657435">Se muestran las contraseñas guardadas y las opciones de contraseña</translation> <translation id="2903493209154104877">Direcciones</translation> <translation id="3399357656427473483">Lista de credenciales que se debe tocar para completar.</translation> <translation id="3688051737190211318">Si confías en <ph name="ORIGIN" />, puedes usar una contraseña guardada para acceder.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostrar teclado</translation> <translation id="4694050069269396220">Si confías en <ph name="ORIGIN" />, puedes usar una contraseña guardada para otro sitio.</translation> <translation id="5016175294846053194">Las sugerencias de Autocompletar están disponibles arriba del teclado</translation> -<translation id="5088366526685584589">Se muestran las direcciones guardadas</translation> <translation id="5441504010984421144">La lista de credenciales que se debe tocar para completar está totalmente abierta.</translation> <translation id="6393156038355142111">Sugerir contraseña segura</translation> <translation id="6558703547256592471">Intenta usar una contraseña única para cada sitio.</translation> <translation id="7029809446516969842">Contraseñas</translation> -<translation id="7299100402441711551">Mostrar direcciones</translation> -<translation id="7494879913343971937">Mostrar contraseñas</translation> <translation id="7594473730623999723">Desliza el dedo para ver más sugerencias</translation> <translation id="7992095260806105436">Usa la sugerencia de Autocompletar de Chrome.</translation> -<translation id="8037472847879765671">Muestra formas de pago</translation> <translation id="8507520749471379845">Contraseñas disponibles</translation> <translation id="8705308553596171387">Sin contraseña</translation> <translation id="879180780857354295">Las opciones alternativas de relleno están disponibles arriba del teclado</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es.xtb index 69d34e4..1150793 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_es.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="es"> <translation id="1383876407941801731">Buscar</translation> -<translation id="1566281227936819866">Mostrando métodos de pago guardados</translation> <translation id="1717486229951421299">La lista de credenciales que puedes rellenar con un toque está abierta a media altura.</translation> <translation id="207576718733492531">La lista de credenciales que puedes rellenar con un toque está cerrada.</translation> <translation id="2610239185026711824">Sugerir contraseña</translation> <translation id="2652129567809778422">Seleccionar contraseña</translation> -<translation id="2803478378562657435">Mostrando contraseñas guardadas y opciones de contraseña</translation> <translation id="2903493209154104877">Direcciones</translation> <translation id="3399357656427473483">Lista de credenciales que puedes rellenar con un toque.</translation> <translation id="3688051737190211318">Si confías en <ph name="ORIGIN" />, puedes usar una contraseña guardada para iniciar sesión.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostrar teclado</translation> <translation id="4694050069269396220">Si confías en <ph name="ORIGIN" />, puedes usar una contraseña guardada de otro sitio web.</translation> <translation id="5016175294846053194">Sugerencias de la función Autocompletar disponibles sobre el teclado</translation> -<translation id="5088366526685584589">Mostrando direcciones guardadas</translation> <translation id="5441504010984421144">La lista de credenciales que puedes rellenar con un toque está abierta a altura completa.</translation> <translation id="6393156038355142111">Sugerir contraseña segura</translation> <translation id="6558703547256592471">Intenta usar una contraseña exclusiva en cada sitio web.</translation> <translation id="7029809446516969842">Contraseñas</translation> -<translation id="7299100402441711551">Mostrar direcciones</translation> -<translation id="7494879913343971937">Mostrar contraseñas</translation> <translation id="7594473730623999723">Desliza el dedo para ver más sugerencias</translation> <translation id="7992095260806105436">Utilizar sugerencia de Autocompletar de Chrome</translation> -<translation id="8037472847879765671">Mostrar métodos de pago</translation> <translation id="8507520749471379845">Contraseñas disponibles</translation> <translation id="8705308553596171387">Sin contraseña</translation> <translation id="879180780857354295">Opciones alternativas para rellenar disponibles sobre el teclado</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb index cb5924e..d6908cb2 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="et"> <translation id="1383876407941801731">Otsi</translation> -<translation id="1566281227936819866">Kuvatud on salvestatud makseviisid</translation> <translation id="1717486229951421299">Loend mandaatidest, mis tuleb puudutusega täita, on avatud poolele kõrgusele.</translation> <translation id="207576718733492531">Loend mandaatidest, mis tuleb puudutusega täita, on suletud.</translation> <translation id="2610239185026711824">Soovita parooli</translation> <translation id="2652129567809778422">Parooli valimine</translation> -<translation id="2803478378562657435">Kuvatud on salvestatud paroolid ja paroolivalikud</translation> <translation id="2903493209154104877">Aadressid</translation> <translation id="3399357656427473483">Loend mandaatidest, mis tuleb puudutusega täita.</translation> <translation id="3688051737190211318">Kui usaldate saiti <ph name="ORIGIN" />, saate sisselogimiseks kasutada salvestatud parooli</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Kuva klaviatuur</translation> <translation id="4694050069269396220">Kui saiti <ph name="ORIGIN" /> usaldate, saate kasutada mõne teise saidi jaoks salvestatud parooli.</translation> <translation id="5016175294846053194">Automaattäite soovitused on saadaval klaviatuuri kohal</translation> -<translation id="5088366526685584589">Kuvatakse salvestatud aadresse</translation> <translation id="5441504010984421144">Loend mandaatidest, mis tuleb puudutusega täita, on avatud täiskõrgusele.</translation> <translation id="6393156038355142111">Soovita tugevat parooli</translation> <translation id="6558703547256592471">Üritage iga saidi puhul kasutada kordumatut parooli.</translation> <translation id="7029809446516969842">Paroolid</translation> -<translation id="7299100402441711551">Kuva aadressid</translation> -<translation id="7494879913343971937">Kuva paroolid</translation> <translation id="7594473730623999723">Pühkige, et näha rohkem soovitusi</translation> <translation id="7992095260806105436">Kasuta Chrome'i automaattäite soovitust</translation> -<translation id="8037472847879765671">Makseviiside kuvamine</translation> <translation id="8507520749471379845">Paroolid on saadaval</translation> <translation id="8705308553596171387">Parooli pole</translation> <translation id="879180780857354295">Klaviatuuri kohal on saadaval alternatiivsed täitevõimalused</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_eu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_eu.xtb index cf704df..3177ee0 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_eu.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_eu.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="eu"> <translation id="1383876407941801731">Bilaketa</translation> -<translation id="1566281227936819866">Gordetako ordainketa-metodoak daude ikusgai</translation> <translation id="1717486229951421299">Ukitzean bete beharreko kredentzialen zerrenda altuera erdian irekita dago.</translation> <translation id="207576718733492531">Ukitzean bete beharreko kredentzialen zerrenda itxita dago.</translation> <translation id="2610239185026711824">Iradoki pasahitza</translation> <translation id="2652129567809778422">Hautatu pasahitz bat</translation> -<translation id="2803478378562657435">Gordetako pasahitzak eta pasahitz-aukerak daude ikusgai</translation> <translation id="2903493209154104877">Helbideak</translation> <translation id="3399357656427473483">Ukitzean bete beharreko kredentzialen zerrenda.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> fidagarria dela uste baduzu, gordetako pasahitz bat erabil dezakezu saioa hasteko</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Erakutsi teklatua</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> fidagarria dela uste baduzu, beste webgune baterako gordetako pasahitz bat erabil dezakezu.</translation> <translation id="5016175294846053194">Teklatuaren gainean agertzen dira eremuak automatikoki betetzeko iradokizunak</translation> -<translation id="5088366526685584589">Gordetako helbideak daude ikusgai</translation> <translation id="5441504010984421144">Ukitzean bete beharreko kredentzialen zerrenda altuera osoan irekita dago.</translation> <translation id="6393156038355142111">Iradoki pasahitz konplexu bat</translation> <translation id="6558703547256592471">Erabili pasahitz esklusiboa webgune bakoitzerako.</translation> <translation id="7029809446516969842">Pasahitzak</translation> -<translation id="7299100402441711551">Erakutsi helbideak</translation> -<translation id="7494879913343971937">Erakutsi pasahitzak</translation> <translation id="7594473730623999723">Pasatu hatza iradokizun gehiago ikusteko</translation> <translation id="7992095260806105436">Erabili Chrome-ren automatikoki betetzeko iradokizuna</translation> -<translation id="8037472847879765671">Erakutsi ordainketa-metodoak</translation> <translation id="8507520749471379845">Pasahitzak daude erabilgarri</translation> <translation id="8705308553596171387">Ez da ezarri pasahitzik</translation> <translation id="879180780857354295">Eremuak betetzeko beste aukera batzuk erabilgarri daude teklatuaren gainean</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fa.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fa.xtb index 0abe63e..e9ac812 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fa.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fa.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="fa"> <translation id="1383876407941801731">جستجو</translation> -<translation id="1566281227936819866">درحال نمایش روشهای پرداخت ذخیرهشده</translation> <translation id="1717486229951421299">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود، بهصورت نیمه باز شده است.</translation> <translation id="207576718733492531">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود بسته شده است.</translation> <translation id="2610239185026711824">پیشنهاد گذرواژه</translation> <translation id="2652129567809778422">گذرواژه را انتخاب کنید</translation> -<translation id="2803478378562657435">درحال نمایش گذرواژههای ذخیرهشده و گزینههای گذرواژه</translation> <translation id="2903493209154104877">آدرسها</translation> <translation id="3399357656427473483">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود.</translation> <translation id="3688051737190211318">اگر به <ph name="ORIGIN" /> اعتماد دارید، میتوانید از گذرواژه ذخیرهشده برای ورود به سیستم استفاده کنید</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">نمایش صفحهکلید</translation> <translation id="4694050069269396220">اگر به <ph name="ORIGIN" /> اعتماد دارید، میتوانید از گذرواژه ذخیرهشده برای سایتی دیگر استفاده کنید.</translation> <translation id="5016175294846053194">پیشنهادهای تکمیل خودکار در بالای صفحهکلید در دسترس است</translation> -<translation id="5088366526685584589">درحال نمایش نشانیهای ذخیرهشده</translation> <translation id="5441504010984421144">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود کاملاً باز شد.</translation> <translation id="6393156038355142111">پیشنهاد گذرواژه قوی</translation> <translation id="6558703547256592471">از گذرواژه غیرتکراری برای همه سایتها استفاده کنید.</translation> <translation id="7029809446516969842">گذرواژهها</translation> -<translation id="7299100402441711551">نمایش نشانیها</translation> -<translation id="7494879913343971937">نمایش گذرواژهها</translation> <translation id="7594473730623999723">برای دیدن پیشنهادهای بیشتر، تند بکشید</translation> <translation id="7992095260806105436">از پیشنهاد تکمیل خودکار Chrome استفاده کنید</translation> -<translation id="8037472847879765671">نمایش روشهای پرداخت</translation> <translation id="8507520749471379845">گذرواژهها دردسترس است</translation> <translation id="8705308553596171387">گذرواژه لازم نیست</translation> <translation id="879180780857354295">گزینههای تکمیل جایگزین در بالای صفحهکلید دردسترس است</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fi.xtb index f637fdb7..c42ce97 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fi.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fi.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="fi"> <translation id="1383876407941801731">Haku</translation> -<translation id="1566281227936819866">Näytetään tallennetut maksutavat</translation> <translation id="1717486229951421299">Kosketuksella täytettävien kirjautumistietojen lista avattu puolen näytön korkeudella.</translation> <translation id="207576718733492531">Kosketuksella täytettävien kirjautumistietojen lista on suljettu.</translation> <translation id="2610239185026711824">Ehdota salasanaa</translation> <translation id="2652129567809778422">Valitse salasana</translation> -<translation id="2803478378562657435">Näytetään tallennetut salasanat ja salasana-asetukset</translation> <translation id="2903493209154104877">Osoitteet</translation> <translation id="3399357656427473483">Kosketuksella täytettävien kirjautumistietojen lista</translation> <translation id="3688051737190211318">Jos <ph name="ORIGIN" /> on luotettava, voit kirjautua sisään tallennetulla salasanalla</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Näytä näppäimistö</translation> <translation id="4694050069269396220">Jos <ph name="ORIGIN" /> on luotettava, voit käyttää tallennettua salasanaa toisella sivustolla.</translation> <translation id="5016175294846053194">Automaattisen täytön ehdotukset saatavilla näppäimistön yläpuolella</translation> -<translation id="5088366526685584589">Näytetään tallennetut osoitteet</translation> <translation id="5441504010984421144">Kosketuksella täytettävien kirjautumistietojen lista avattu koko näytön korkeudella.</translation> <translation id="6393156038355142111">Ehdota vahvaa salasanaa</translation> <translation id="6558703547256592471">Yritä käyttää jokaisella sivustolla yksilöllistä salasanaa.</translation> <translation id="7029809446516969842">Salasanat</translation> -<translation id="7299100402441711551">Näytä osoitteet</translation> -<translation id="7494879913343971937">Näytä salasanat</translation> <translation id="7594473730623999723">Pyyhkäise nähdäksesi lisää ehdotuksia</translation> <translation id="7992095260806105436">Käytä Chromen automaattisen täytön ehdotusta</translation> -<translation id="8037472847879765671">Näytä maksutavat</translation> <translation id="8507520749471379845">Käytettävissä ovat salasanat</translation> <translation id="8705308553596171387">Ei salasanaa</translation> <translation id="879180780857354295">Vaihtoehtoiset täyttövalinnat saatavilla näppäimistön yläpuolella</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb index 27e62c0..c3a58968 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fil.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="fil"> <translation id="1383876407941801731">Hanapin</translation> -<translation id="1566281227936819866">Ipinapakita ang mga na-save na paraan ng pagbabayad</translation> <translation id="1717486229951421299">Nakabukas nang kalahati ang taas ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="207576718733492531">Nakasara ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="2610239185026711824">Magmungkahi ng password</translation> <translation id="2652129567809778422">Pumili ng password</translation> -<translation id="2803478378562657435">Ipinapakita ang mga naka-save na password at mga opsyon sa password</translation> <translation id="2903493209154104877">Mga Address</translation> <translation id="3399357656427473483">Listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="3688051737190211318">Kung pinagkakatiwalaan mo ang <ph name="ORIGIN" />, puwede kang gumamit ng naka-save na password para mag-sign in</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Ipakita ang keyboard</translation> <translation id="4694050069269396220">Kung pinagkakatiwalaan mo ang <ph name="ORIGIN" />, puwede kang gumamit ng naka-save na password para sa isa pang site.</translation> <translation id="5016175294846053194">Available ang mga suhestyon ng autofill sa itaas ng keyboard</translation> -<translation id="5088366526685584589">Ipinapakita ang mga naka-save na address</translation> <translation id="5441504010984421144">Nakabukas nang buo ang taas ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="6393156038355142111">Magmungkahi ng malakas na password</translation> <translation id="6558703547256592471">Subukang gumamit ng natatanging password para sa bawat site.</translation> <translation id="7029809446516969842">Mga Password</translation> -<translation id="7299100402441711551">Ipakita ang Mga Address</translation> -<translation id="7494879913343971937">Ipakita ang mga password</translation> <translation id="7594473730623999723">Mag-swipe para makita ang higit pang suhestyon</translation> <translation id="7992095260806105436">Gamitin ang suhestyon sa autofill ng Chrome</translation> -<translation id="8037472847879765671">Ipakita ang mga paraan ng pagbabayad</translation> <translation id="8507520749471379845">May mga password</translation> <translation id="8705308553596171387">Walang password</translation> <translation id="879180780857354295">Available sa itaas ng keyboard ang mga alternatibong opsyon sa pagpunan</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr-CA.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr-CA.xtb index 9e304d14..317d078 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr-CA.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr-CA.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="fr-CA"> <translation id="1383876407941801731">Rechercher</translation> -<translation id="1566281227936819866">Affichage des modes paiement enregistrés</translation> <translation id="1717486229951421299">La liste d'authentifiants à remplir au toucher est ouverte à la mi-hauteur.</translation> <translation id="207576718733492531">La liste d'authentifiants à remplir au toucher est fermée.</translation> <translation id="2610239185026711824">Suggérer un mot de passe</translation> <translation id="2652129567809778422">Sélectionner un mot de passe</translation> -<translation id="2803478378562657435">Affichage des options de mot de passe et des mots de passe enregistrés</translation> <translation id="2903493209154104877">Adresses</translation> <translation id="3399357656427473483">Liste d'authentifiants à remplir au toucher.</translation> <translation id="3688051737190211318">Si vous faites confiance à <ph name="ORIGIN" />, vous pouvez utiliser un mot de passe enregistré pour vous connecter.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Afficher le clavier</translation> <translation id="4694050069269396220">Si vous faites confiance à <ph name="ORIGIN" />, vous pouvez utiliser un mot de passe enregistré pour un autre site.</translation> <translation id="5016175294846053194">Les suggestions de remplissage automatique sont affichées au-dessus du clavier</translation> -<translation id="5088366526685584589">Affichage des adresses enregistrées</translation> <translation id="5441504010984421144">La liste d'authentifiants à remplir au toucher est ouverte à la pleine hauteur.</translation> <translation id="6393156038355142111">Suggérer un mot de passe fort</translation> <translation id="6558703547256592471">Tâchez d'utiliser un mot de passe différent pour chaque site.</translation> <translation id="7029809446516969842">Mots de passe</translation> -<translation id="7299100402441711551">Afficher les adresses</translation> -<translation id="7494879913343971937">Afficher les mots de passe</translation> <translation id="7594473730623999723">Balayez l'écran pour afficher plus de suggestions</translation> <translation id="7992095260806105436">Utiliser la suggestion de remplissage automatique de Chrome</translation> -<translation id="8037472847879765671">Afficher les modes de paiement</translation> <translation id="8507520749471379845">Mots de passe disponibles</translation> <translation id="8705308553596171387">Aucun mot de passe</translation> <translation id="879180780857354295">Les autres options de remplissage automatique sont affichées au-dessus du clavier</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb index 08ad6ed..dd8f7c17 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_fr.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="fr"> <translation id="1383876407941801731">Rechercher</translation> -<translation id="1566281227936819866">Affichage des modes de paiement enregistrés en cours</translation> <translation id="1717486229951421299">La liste des identifiants à renseigner de façon tactile est ouverte à mi-hauteur.</translation> <translation id="207576718733492531">La liste des identifiants à renseigner de façon tactile est fermée.</translation> <translation id="2610239185026711824">Suggérer un mot de passe</translation> <translation id="2652129567809778422">Sélectionner un mot de passe</translation> -<translation id="2803478378562657435">Affichage des mots de passe enregistrés et des options de mot de passe</translation> <translation id="2903493209154104877">Adresses</translation> <translation id="3399357656427473483">Liste des identifiants à renseigner de façon tactile.</translation> <translation id="3688051737190211318">Si vous faites confiance à <ph name="ORIGIN" />, vous pouvez utiliser un mot de passe enregistré pour vous connecter</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Afficher le clavier</translation> <translation id="4694050069269396220">Si vous faites confiance à <ph name="ORIGIN" />, vous pouvez utiliser un mot de passe enregistré pour un autre site.</translation> <translation id="5016175294846053194">Insérer automatiquement les suggestions proposées au-dessus du clavier</translation> -<translation id="5088366526685584589">Affichage des adresses enregistrées</translation> <translation id="5441504010984421144">La liste des identifiants à renseigner de façon tactile est ouverte à pleine hauteur.</translation> <translation id="6393156038355142111">Suggérer un mot de passe sécurisé</translation> <translation id="6558703547256592471">Essayez de ne pas réutiliser un même mot de passe sur plusieurs sites.</translation> <translation id="7029809446516969842">Mots de passe</translation> -<translation id="7299100402441711551">Afficher les adresses</translation> -<translation id="7494879913343971937">Afficher les mots de passe</translation> <translation id="7594473730623999723">Balayez l'écran pour voir plus de suggestions</translation> <translation id="7992095260806105436">Utiliser la suggestion de la saisie automatique de Chrome</translation> -<translation id="8037472847879765671">Afficher les modes de paiement</translation> <translation id="8507520749471379845">Mots de passe disponibles</translation> <translation id="8705308553596171387">Aucun mot de passe</translation> <translation id="879180780857354295">Autres options de remplissage disponibles au-dessus du clavier</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gl.xtb index c1689925..801f56e 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gl.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gl.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="gl"> <translation id="1383876407941801731">Buscar</translation> -<translation id="1566281227936819866">Mostrando métodos de pago gardados</translation> <translation id="1717486229951421299">A lista de credenciais que se completarán ao tocar está aberta ata a metade da pantalla.</translation> <translation id="207576718733492531">A lista de credenciais que se completarán ao tocar está pechada.</translation> <translation id="2610239185026711824">Suxerir contrasinal</translation> <translation id="2652129567809778422">Seleccionar un contrasinal</translation> -<translation id="2803478378562657435">Mostrando contrasinais gardados e opcións de contrasinais</translation> <translation id="2903493209154104877">Enderezos</translation> <translation id="3399357656427473483">A lista de credenciais que se completarán ao tocar.</translation> <translation id="3688051737190211318">Se confías en <ph name="ORIGIN" />, podes usar un contrasinal gardado para iniciar sesión</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostrar teclado</translation> <translation id="4694050069269396220">Se confías en <ph name="ORIGIN" />, podes usar un contrasinal gardado para outro sitio.</translation> <translation id="5016175294846053194">Autocompletar suxestións dispoñibles sobre o teclado</translation> -<translation id="5088366526685584589">Mostrando enderezos gardados</translation> <translation id="5441504010984421144">A lista de credenciais que se completarán ao tocar está aberta a pantalla completa.</translation> <translation id="6393156038355142111">Suxerir contrasinal seguro</translation> <translation id="6558703547256592471">Tenta usar un contrasinal distinto para cada sitio.</translation> <translation id="7029809446516969842">Contrasinais</translation> -<translation id="7299100402441711551">Mostrar enderezos</translation> -<translation id="7494879913343971937">Mostra os contrasinais</translation> <translation id="7594473730623999723">Pasa o dedo para ver máis suxestións</translation> <translation id="7992095260806105436">Usar a suxestión da función de autocompletar de Chrome</translation> -<translation id="8037472847879765671">Mostrar métodos de pago</translation> <translation id="8507520749471379845">Contrasinais dispoñibles</translation> <translation id="8705308553596171387">Sen contrasinal</translation> <translation id="879180780857354295">Sobre o teclado hai opcións alternativas para completar</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb index a664ac3..0eb655d 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_gu.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="gu"> <translation id="1383876407941801731">શોધો</translation> -<translation id="1566281227936819866">સાચવેલી ચુકવણી પદ્ધતિઓ બતાવી રહ્યાં છીએ</translation> <translation id="1717486229951421299">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ અડધી ઊંચાઈએ ખૂલી.</translation> <translation id="207576718733492531">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ બંધ છે.</translation> <translation id="2610239185026711824">પાસવર્ડ સૂચવો</translation> <translation id="2652129567809778422">પાસવર્ડ પસંદ કરો</translation> -<translation id="2803478378562657435">સાચવેલા પાસવર્ડ અને પાસવર્ડ માટેના વિકલ્પો બતાવી રહ્યા છીએ</translation> <translation id="2903493209154104877">સરનામાંઓ</translation> <translation id="3399357656427473483">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ.</translation> <translation id="3688051737190211318">જો <ph name="ORIGIN" /> તમારા માટે વિશ્વસનીય હોય, તો તમે સાઇન ઇન કરવા માટે સાચવેલા પાસવર્ડનો ઉપયોગ કરી શકો છો</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">કીબોર્ડ બતાવો</translation> <translation id="4694050069269396220">જો <ph name="ORIGIN" /> તમારા માટે વિશ્વસનીય હોય, તો તમે અન્ય સાઇટ માટે સાચવેલા પાસવર્ડનો ઉપયોગ કરી શકો છો.</translation> <translation id="5016175294846053194">કીબોર્ડની ઉપર ઉપલબ્ધ સૂચનોને ઑટોમૅટિક રીતે ભરો</translation> -<translation id="5088366526685584589">સાચવેલાં સરનામાં</translation> <translation id="5441504010984421144">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ સંપૂર્ણ ઊંચાઈએ ખૂલી.</translation> <translation id="6393156038355142111">સશક્ત પાસવર્ડ સૂચવો</translation> <translation id="6558703547256592471">દરેક સાઇટ માટે વિશિષ્ટ પાસવર્ડનો ઉપયોગ કરી જુઓ.</translation> <translation id="7029809446516969842">પાસવર્ડ</translation> -<translation id="7299100402441711551">સરનામાં બતાવો</translation> -<translation id="7494879913343971937">પાસવર્ડ બતાવો</translation> <translation id="7594473730623999723">વધુ સૂચનો જોવા માટે સ્વાઇપ કરો</translation> <translation id="7992095260806105436">Chromeમાં ઑટોમૅટિક રીતે ભરવાની સુવિધાના સૂચનનો ઉપયોગ કરો</translation> -<translation id="8037472847879765671">ચુકવણી પદ્ધતિઓ બતાવો</translation> <translation id="8507520749471379845">પાસવર્ડ ઉપલબ્ધ છે</translation> <translation id="8705308553596171387">કોઈ પાસવર્ડ જરૂરી નથી</translation> <translation id="879180780857354295">ભરણ માટેના વૈકલ્પિક વિકલ્પો કીબોર્ડની ઉપર ઉપલબ્ધ છે</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb index 9d4c0ae..6ca2d247 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hi.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">सेव किए गए भुगतान के तरीके दिखाए जा रहे हैं</translation> <translation id="1717486229951421299">टच करके भरी जाने वाली क्रेडेंशियल की सूची आधी स्क्रीन में खुली हुई है.</translation> <translation id="207576718733492531">टच करके भरी जाने वाली क्रेडेंशियल की सूची बंद है.</translation> <translation id="2610239185026711824">पासवर्ड सुझाएं</translation> <translation id="2652129567809778422">पासवर्ड चुनें</translation> -<translation id="2803478378562657435">सेव किए हुए पासवर्ड और पासवर्ड के विकल्प दिखाए जा रहे हैं</translation> <translation id="2903493209154104877">पते</translation> <translation id="3399357656427473483">टच करके भरी जाने वाली क्रेडेंशियल की सूची.</translation> <translation id="3688051737190211318">अगर आपको <ph name="ORIGIN" /> पर भरोसा है, तो साइन इन करने के लिए सेव किए गए पासवर्ड का इस्तेमाल करें</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">कीबोर्ड दिखाएं</translation> <translation id="4694050069269396220">अगर आपको <ph name="ORIGIN" /> पर भरोसा है, तो आप सेव किए गए पासवर्ड को किसी दूसरी साइट के लिए इस्तेमाल कर सकते हैं.</translation> <translation id="5016175294846053194">ऑटोमैटिक भरे जाने वाले सुझाव, कीबोर्ड के ऊपर दिए गए हैं</translation> -<translation id="5088366526685584589">सेव किए गए पते दिखाए जा रहे हैं</translation> <translation id="5441504010984421144">टच करके भरी जाने वाली क्रेडेंशियल की सूची पूरी स्क्रीन में खुली हुई है.</translation> <translation id="6393156038355142111">मज़बूत पासवर्ड सुझाएं</translation> <translation id="6558703547256592471">हर साइट के लिए एक अलग पासवर्ड इस्तेमाल करें.</translation> <translation id="7029809446516969842">पासवर्ड</translation> -<translation id="7299100402441711551">पतों की जानकारी दिखाओ</translation> -<translation id="7494879913343971937">पासवर्ड दिखाएं</translation> <translation id="7594473730623999723">ज़्यादा सुझाव देखने के लिए स्वाइप करें</translation> <translation id="7992095260806105436">ऑटोमैटिक जानकारी भरने के Chrome के सुझाव का इस्तेमाल करें</translation> -<translation id="8037472847879765671">भुगतान के तरीके दिखाएं</translation> <translation id="8507520749471379845">पासवर्ड उपलब्ध हैं</translation> <translation id="8705308553596171387">पासवर्ड नहीं है</translation> <translation id="879180780857354295">अपने-आप भरने के विकल्प कीबोर्ड के ऊपर उपलब्ध हैं</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hr.xtb index 1dd98fe..84d8b04 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hr.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="hr"> <translation id="1383876407941801731">Traži</translation> -<translation id="1566281227936819866">Prikazuju se spremljeni načini plaćanja</translation> <translation id="1717486229951421299">Popis vjerodajnica za unos dodirom otvoren je na pola visine.</translation> <translation id="207576718733492531">Popis vjerodajnica za unos dodirom zatvoren je.</translation> <translation id="2610239185026711824">Predloži zaporku</translation> <translation id="2652129567809778422">Odaberite zaporku</translation> -<translation id="2803478378562657435">Prikazivanje spremljenih zaporki i opcija zaporki</translation> <translation id="2903493209154104877">Adrese</translation> <translation id="3399357656427473483">Popis vjerodajnica za unos dodirom.</translation> <translation id="3688051737190211318">Ako web-lokaciju <ph name="ORIGIN" /> smatrate pouzdanom, možete upotrijebiti spremljenu zaporku za prijavu</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Prikaži tipkovnicu</translation> <translation id="4694050069269396220">Ako web-lokaciju <ph name="ORIGIN" /> smatrate pouzdanom, možete upotrijebiti spremljenu zaporku za neku drugu web-lokaciju.</translation> <translation id="5016175294846053194">Prijedlozi automatskog popunjavanja dostupni iznad tipkovnice</translation> -<translation id="5088366526685584589">Prikazivanje spremljenih adresa</translation> <translation id="5441504010984421144">Popis vjerodajnica za unos dodirom otvoren je preko cijelog zaslona.</translation> <translation id="6393156038355142111">Predloži snažnu zaporku</translation> <translation id="6558703547256592471">Pokušajte koristiti jedinstvenu zaporku za svaku web-lokaciju.</translation> <translation id="7029809446516969842">Zaporke</translation> -<translation id="7299100402441711551">Prikaži adrese</translation> -<translation id="7494879913343971937">Prikaz zaporki</translation> <translation id="7594473730623999723">Prijeđite prstom da biste vidjeli više prijedloga</translation> <translation id="7992095260806105436">Upotrijebite Chromeov prijedlog za automatsko popunjavanje</translation> -<translation id="8037472847879765671">Prikaz načina plaćanja</translation> <translation id="8507520749471379845">Dostupne zaporke</translation> <translation id="8705308553596171387">Nema zaporke</translation> <translation id="879180780857354295">Alternativne opcije popunjavanja dostupne iznad tipkovnice</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hu.xtb index 24eec30b..f06c4b2 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hu.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hu.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="hu"> <translation id="1383876407941801731">Keresés</translation> -<translation id="1566281227936819866">Mentett fizetési módok megjelenítése</translation> <translation id="1717486229951421299">Az érintéssel kitöltendő hitelesítő adatok listája félmagasságban megnyitva.</translation> <translation id="207576718733492531">Az érintéssel kitölthető hitelesítési adatok listája be van zárva.</translation> <translation id="2610239185026711824">Jelszó ajánlása</translation> <translation id="2652129567809778422">Jelszó kiválasztása</translation> -<translation id="2803478378562657435">Mentett jelszavak és jelszóbeállítások megjelenítve</translation> <translation id="2903493209154104877">Címek</translation> <translation id="3399357656427473483">Az érintéssel kitöltendő hitelesítő adatok listája.</translation> <translation id="3688051737190211318">Ha megbízik a(z) <ph name="ORIGIN" /> webhelyben, a bejelentkezéshez használhatja mentett jelszavát.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Billentyűzet megjelenítése</translation> <translation id="4694050069269396220">Ha megbízik a(z) <ph name="ORIGIN" /> webhelyben, használhatja másik webhelyhez mentett jelszavát.</translation> <translation id="5016175294846053194">Az Automatikus kitöltés javaslatai a billentyűzet felett találhatók</translation> -<translation id="5088366526685584589">Mentett címek megjelenítése</translation> <translation id="5441504010984421144">Az érintéssel kitöltendő hitelesítő adatok listája teljes magasságban megnyitva.</translation> <translation id="6393156038355142111">Erős jelszó ajánlása</translation> <translation id="6558703547256592471">Próbáljon minden webhelyen egyedi jelszót használni.</translation> <translation id="7029809446516969842">Jelszavak</translation> -<translation id="7299100402441711551">Címek megjelenítése</translation> -<translation id="7494879913343971937">Jelszavak mutatása</translation> <translation id="7594473730623999723">További javaslatok megtekintéséhez csúsztasson</translation> <translation id="7992095260806105436">A Chrome automatikus kitöltési javaslatának használata</translation> -<translation id="8037472847879765671">Fizetési módok megjelenítése</translation> <translation id="8507520749471379845">Mentett jelszavak használhatók</translation> <translation id="8705308553596171387">Nincs jelszó</translation> <translation id="879180780857354295">A billentyűzet fölött alternatív kitöltési lehetőségek találhatók</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hy.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hy.xtb index 2733bb0..c7607c3 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hy.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_hy.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="hy"> <translation id="1383876407941801731">Որոնում</translation> -<translation id="1566281227936819866">Ցուցադրվում են պահված վճարման եղանակները</translation> <translation id="1717486229951421299">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված են էկրանի կեսով:</translation> <translation id="207576718733492531">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված չեն։</translation> <translation id="2610239185026711824">Ստեղծել գաղտնաբառ…</translation> <translation id="2652129567809778422">Ընտրել գաղտնաբառ</translation> -<translation id="2803478378562657435">Ցուցադրվում են պահված գաղտնաբառերն ու գաղտնաբառերի ընտրանքները</translation> <translation id="2903493209154104877">Հասցեներ</translation> <translation id="3399357656427473483">Մուտքի տվյալները, որոնք պետք է լրացվեն հպման ժամանակ։</translation> <translation id="3688051737190211318">Եթե վստահում եք <ph name="ORIGIN" /> կայքին, մուտք գործելու համար կարող եք օգտագործել պահված գաղտնաբառ</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Ցուցադրել ստեղնաշարը</translation> <translation id="4694050069269396220">Եթե վստահում եք <ph name="ORIGIN" /> կայքին, կարող եք օգտագործել այլ կայքում պահված գաղտնաբառ։</translation> <translation id="5016175294846053194">Ինքնալրացման առաջարկները հասանելի են վերևի ստեղնաշարում</translation> -<translation id="5088366526685584589">Ցուցադրվում են պահված հասցեները</translation> <translation id="5441504010984421144">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված են ամբողջ էկրանով:</translation> <translation id="6393156038355142111">Ստեղծել հուսալի գաղտնաբառ…</translation> <translation id="6558703547256592471">Փորձեք յուրաքանչյուր կայքի համար օգտագործել եզակի գաղտնաբառ։</translation> <translation id="7029809446516969842">Գաղտնաբառեր</translation> -<translation id="7299100402441711551">Ցույց տալ հասցեները</translation> -<translation id="7494879913343971937">Ցուցադրել գաղտնաբառերը</translation> <translation id="7594473730623999723">Սահեցրեք մատը՝ այլ առաջարկներ տեսնելու համար</translation> <translation id="7992095260806105436">Օգտագործել Chrome-ի ինքնալրացման առաջարկը</translation> -<translation id="8037472847879765671">Ցուցադրել վճարման եղանակները</translation> <translation id="8507520749471379845">Հասանելի գաղտնաբառեր</translation> <translation id="8705308553596171387">Գաղտնաբառ չի պահանջվում</translation> <translation id="879180780857354295">Ստեղնաշարի վերևում հասանելի են լրացման այլ տարբերակներ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb index 142f157..f9073b03 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_id.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="id"> <translation id="1383876407941801731">Telusuri</translation> -<translation id="1566281227936819866">Menampilkan metode pembayaran yang tersimpan</translation> <translation id="1717486229951421299">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka setengah.</translation> <translation id="207576718733492531">Daftar kredensial yang terisi dengan gestur sentuhan sedang tertutup.</translation> <translation id="2610239185026711824">Sarankan sandi</translation> <translation id="2652129567809778422">Pilih sandi</translation> -<translation id="2803478378562657435">Menampilkan opsi sandi dan sandi yang disimpan</translation> <translation id="2903493209154104877">Alamat</translation> <translation id="3399357656427473483">Daftar kredensial yang terisi dengan gestur sentuhan.</translation> <translation id="3688051737190211318">Jika Anda memercayai <ph name="ORIGIN" />, Anda dapat menggunakan sandi tersimpan untuk login</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Tampilkan keyboard</translation> <translation id="4694050069269396220">Jika Anda memercayai <ph name="ORIGIN" />, Anda dapat menggunakan sandi yang tersimpan untuk situs lainnya.</translation> <translation id="5016175294846053194">Saran IsiOtomatis tersedia di atas keyboard</translation> -<translation id="5088366526685584589">Menampilkan alamat yang disimpan</translation> <translation id="5441504010984421144">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka sepenuhnya.</translation> <translation id="6393156038355142111">Sarankan sandi yang kuat</translation> <translation id="6558703547256592471">Coba gunakan sandi yang unik untuk setiap situs.</translation> <translation id="7029809446516969842">Sandi</translation> -<translation id="7299100402441711551">Tampilkan Alamat</translation> -<translation id="7494879913343971937">Tampilkan sandi</translation> <translation id="7594473730623999723">Geser untuk melihat saran lainnya</translation> <translation id="7992095260806105436">Gunakan saran isi otomatis Chrome</translation> -<translation id="8037472847879765671">Tampilkan metode pembayaran</translation> <translation id="8507520749471379845">Sandi tersedia</translation> <translation id="8705308553596171387">Tidak ada sandi</translation> <translation id="879180780857354295">Opsi pengisian alternatif tersedia di atas keyboard</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_is.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_is.xtb index eb1bf47..72f61fc 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_is.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_is.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="is"> <translation id="1383876407941801731">Leita</translation> -<translation id="1566281227936819866">Sýnir vistaða greiðslumáta</translation> <translation id="1717486229951421299">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu opinn í hálfri hæð.</translation> <translation id="207576718733492531">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu er lokaður.</translation> <translation id="2610239185026711824">Leggja til aðgangsorð</translation> <translation id="2652129567809778422">Velja aðgangsorð</translation> -<translation id="2803478378562657435">Sýnir vistuð aðgangsorð og valkosti fyrir aðgangsorð</translation> <translation id="2903493209154104877">Heimilisföng</translation> <translation id="3399357656427473483">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu.</translation> <translation id="3688051737190211318">Ef þú treystir <ph name="ORIGIN" /> geturðu notað vistað aðgangsorð til að skrá þig inn</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Sýna lyklaborð</translation> <translation id="4694050069269396220">Ef þú treystir <ph name="ORIGIN" /> geturðu notað vistað aðgangsorð fyrir annað vefsvæði.</translation> <translation id="5016175294846053194">Tillögur um sjálfvirka útfyllingu eru fyrir ofan lyklaborðið</translation> -<translation id="5088366526685584589">Sýnir vistuð heimilisföng</translation> <translation id="5441504010984421144">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu opinn í fullri hæð.</translation> <translation id="6393156038355142111">Leggja til traust aðgangsorð</translation> <translation id="6558703547256592471">Reyndu að nota einkvæmt aðgangsorð á hverju vefsvæði.</translation> <translation id="7029809446516969842">Aðgangsorð</translation> -<translation id="7299100402441711551">Sýna heimilisföng</translation> -<translation id="7494879913343971937">Sýna aðgangsorð</translation> <translation id="7594473730623999723">Strjúktu til að sjá fleiri tillögur</translation> <translation id="7992095260806105436">Nota tillögu fyrir sjálfvirka útfyllingu í Chrome</translation> -<translation id="8037472847879765671">Sýna greiðslumáta</translation> <translation id="8507520749471379845">Tiltæk aðgangsorð</translation> <translation id="8705308553596171387">Ekkert aðgangsorð</translation> <translation id="879180780857354295">Aðrir útfyllingarkostir í boði fyrir ofan lyklaborðið</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_it.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_it.xtb index eeaf000..83819218 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_it.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_it.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="it"> <translation id="1383876407941801731">Cerca</translation> -<translation id="1566281227936819866">Ecco i metodi di pagamento salvati</translation> <translation id="1717486229951421299">Elenco di credenziali da compilare con il tocco aperte nella metà inferiore dello schermo.</translation> <translation id="207576718733492531">L'elenco di credenziali da compilare con il tocco è chiuso.</translation> <translation id="2610239185026711824">Suggerisci password</translation> <translation id="2652129567809778422">Seleziona password</translation> -<translation id="2803478378562657435">Mostra password salvate e opzioni password</translation> <translation id="2903493209154104877">Indirizzi</translation> <translation id="3399357656427473483">Elenco di credenziali da compilare con il tocco.</translation> <translation id="3688051737190211318">Se ritieni attendibile <ph name="ORIGIN" />, puoi usare una password salvata per eseguire l'accesso</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostra tastiera</translation> <translation id="4694050069269396220">Se ritieni attendibile il sito <ph name="ORIGIN" />, puoi usare una password salvata per un altro sito.</translation> <translation id="5016175294846053194">Suggerimenti di compilazione automatica disponibili sopra la tastiera</translation> -<translation id="5088366526685584589">Visualizzazione degli indirizzi salvati</translation> <translation id="5441504010984421144">Elenco di credenziali da compilare con il tocco aperte a schermo intero.</translation> <translation id="6393156038355142111">Suggerisci password efficace</translation> <translation id="6558703547256592471">Prova a usare una password univoca per ogni sito.</translation> <translation id="7029809446516969842">Password</translation> -<translation id="7299100402441711551">Mostra indirizzi</translation> -<translation id="7494879913343971937">Mostra password</translation> <translation id="7594473730623999723">Scorri per vedere altri suggerimenti</translation> <translation id="7992095260806105436">Utilizza suggerimento della compilazione automatica di Chrome</translation> -<translation id="8037472847879765671">Mostra metodi di pagamento</translation> <translation id="8507520749471379845">Password disponibili</translation> <translation id="8705308553596171387">Nessuna password</translation> <translation id="879180780857354295">Opzioni di inserimento alternative disponibili sopra la tastiera</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_iw.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_iw.xtb index 6d5ffab..216e6d40c 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_iw.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_iw.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="iw"> <translation id="1383876407941801731">חיפוש</translation> -<translation id="1566281227936819866">מוצגים אמצעי התשלום השמורים</translation> <translation id="1717486229951421299">רשימת פרטי הכניסה למילוי במגע פתוחה בחצי מגובה המסך.</translation> <translation id="207576718733492531">רשימת פרטי הכניסה למילוי במגע סגורה.</translation> <translation id="2610239185026711824">הצעת סיסמה</translation> <translation id="2652129567809778422">בחירת סיסמה</translation> -<translation id="2803478378562657435">הצגת סיסמאות שמורות ואפשרויות סיסמה</translation> <translation id="2903493209154104877">כתובות</translation> <translation id="3399357656427473483">רשימת פרטי הכניסה למילוי במגע.</translation> <translation id="3688051737190211318">אם הכתובת <ph name="ORIGIN" /> מהימנה מבחינתך, אפשר להשתמש בסיסמה שנשמרה כדי להיכנס לחשבון</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">הצגת מקלדת</translation> <translation id="4694050069269396220">אם הכתובת <ph name="ORIGIN" /> מהימנה מבחינתך, אפשר להשתמש בסיסמה שנשמרה באתר אחר.</translation> <translation id="5016175294846053194">הצעות המילוי האוטומטי מוצגות מעל למקלדת</translation> -<translation id="5088366526685584589">מוצגות הכתובות השמורות</translation> <translation id="5441504010984421144">רשימת פרטי הכניסה למילוי במגע פתוחה בגובה המלא של המסך.</translation> <translation id="6393156038355142111">הצעת סיסמה חזקה</translation> <translation id="6558703547256592471">כדאי לנסות להשתמש בסיסמה ייחודית בכל אתר.</translation> <translation id="7029809446516969842">סיסמאות</translation> -<translation id="7299100402441711551">הצגת כתובות</translation> -<translation id="7494879913343971937">הצגת סיסמאות</translation> <translation id="7594473730623999723">יש להחליק כדי לראות עוד הצעות</translation> <translation id="7992095260806105436">ניתן להשתמש בהצעות המילוי האוטומטי של Chrome</translation> -<translation id="8037472847879765671">הצגת אמצעי תשלום</translation> <translation id="8507520749471379845">סיסמאות זמינות</translation> <translation id="8705308553596171387">ללא סיסמה</translation> <translation id="879180780857354295">אפשרויות מילוי חלופיות מוצגות מעל למקלדת</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb index 08de433..26bbaed1 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ja.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ja"> <translation id="1383876407941801731">検索</translation> -<translation id="1566281227936819866">保存されているお支払い方法を表示します</translation> <translation id="1717486229951421299">タップ操作で入力する認証情報のリストが画面の下半分に表示されています。</translation> <translation id="207576718733492531">タップ操作で入力する認証情報のリストは閉じています。</translation> <translation id="2610239185026711824">パスワードを自動生成</translation> <translation id="2652129567809778422">パスワードの選択</translation> -<translation id="2803478378562657435">保存したパスワードとパスワードのオプションを表示しています</translation> <translation id="2903493209154104877">住所</translation> <translation id="3399357656427473483">タップ操作で入力する認証情報のリスト。</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> を信頼できる場合は、保存済みのパスワードを使用してログインできます</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">キーボードを表示</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> を信用できる場合は、他のサイトで保存したパスワードを使用できます。</translation> <translation id="5016175294846053194">キーボード上部で自動入力の候補を選択できます</translation> -<translation id="5088366526685584589">保存された住所を表示しています</translation> <translation id="5441504010984421144">タップ操作で入力する認証情報のリストが画面全体に表示されています。</translation> <translation id="6393156038355142111">安全なパスワードを自動生成</translation> <translation id="6558703547256592471">各サイトで個別のパスワードを使用することをご検討ください。</translation> <translation id="7029809446516969842">パスワード</translation> -<translation id="7299100402441711551">住所を表示</translation> -<translation id="7494879913343971937">パスワードを表示</translation> <translation id="7594473730623999723">スワイプして他の候補を表示</translation> <translation id="7992095260806105436">Chrome の自動入力候補を使用する</translation> -<translation id="8037472847879765671">お支払い方法を表示</translation> <translation id="8507520749471379845">使用可能なパスワード</translation> <translation id="8705308553596171387">パスワードなし</translation> <translation id="879180780857354295">キーボード上部で別の入力候補を選択できます</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ka.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ka.xtb index 59f564a3..58a0a82 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ka.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ka.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ka"> <translation id="1383876407941801731">ძიება</translation> -<translation id="1566281227936819866">ნაჩვენებია გადახდის შენახული მეთოდები</translation> <translation id="1717486229951421299">შეხებისას შესავსები ავტორიზაციის მონაცემების სია გახსნილია ნახევარ სიმაღლეზე.</translation> <translation id="207576718733492531">შეხებისას შესავსები ავტორიზაციის მონაცემების სია დახურულია.</translation> <translation id="2610239185026711824">პაროლის შემოთავაზება</translation> <translation id="2652129567809778422">აირჩიეთ პაროლი</translation> -<translation id="2803478378562657435">ნაჩვენებია შენახული პაროლები და პაროლების ვარიანტები</translation> <translation id="2903493209154104877">მისამართები</translation> <translation id="3399357656427473483">შეხებისას შესავსები ავტორიზაციის მონაცემების სია.</translation> <translation id="3688051737190211318">თუ <ph name="ORIGIN" />-ს ენდობით, შესასვლელად შეგიძლიათ გამოიყენოთ შენახული პაროლი</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">კლავიატურის ჩვენება</translation> <translation id="4694050069269396220">თუ <ph name="ORIGIN" />-ს ენდობით, შეგიძლიათ სხვა საიტისთვის შენახული პაროლის გამოყენება.</translation> <translation id="5016175294846053194">ავტომატური შევსების შემოთავაზებები ხელმისაწვდომია კლავიატურის ზემოთ</translation> -<translation id="5088366526685584589">ნაჩვენებია შენახული მისამართები</translation> <translation id="5441504010984421144">შეხებისას შესავსები ავტორიზაციის მონაცემების სია გახსნილია სრულ სიმაღლეზე.</translation> <translation id="6393156038355142111">ძლიერი პაროლის შემოთავაზება</translation> <translation id="6558703547256592471">შეეცადეთ, თითოეული საიტისთვის უნიკალური პაროლი გამოიყენოთ.</translation> <translation id="7029809446516969842">პაროლები</translation> -<translation id="7299100402441711551">მისამართების ჩვენება</translation> -<translation id="7494879913343971937">პაროლების ჩვენება</translation> <translation id="7594473730623999723">გადაფურცლეთ სხვა შემოთავაზებების სანახავად</translation> <translation id="7992095260806105436">Chrome-ის ავტომატური შევსების შემოთავაზების გამოყენება</translation> -<translation id="8037472847879765671">გადახდის მეთოდების ჩვენება</translation> <translation id="8507520749471379845">პაროლები ხელმისაწვდომია</translation> <translation id="8705308553596171387">პაროლის გარეშე</translation> <translation id="879180780857354295">კლავიატურის ზემოთ ხელმისაწვდომია შევსების ალტერნატიული ვარიანტები</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kk.xtb index c9f58a71b..93d8c224 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kk.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kk.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="kk"> <translation id="1383876407941801731">Іздеу</translation> -<translation id="1566281227936819866">Сақталған төлеу әдістері көрсетілуде.</translation> <translation id="1717486229951421299">Түрту арқылы толтырылатын тіркелу деректерінің тізімі жарты экранға ашылған.</translation> <translation id="207576718733492531">Түрту арқылы толтырылатын тіркелу деректерінің тізімі жабық.</translation> <translation id="2610239185026711824">Құпия сөз ұсыну</translation> <translation id="2652129567809778422">Құпия сөз таңдау</translation> -<translation id="2803478378562657435">Сақталған құпия сөздер мен құпия сөз опциялары көрсетіліп тұр</translation> <translation id="2903493209154104877">Мекенжайлар</translation> <translation id="3399357656427473483">Түрту арқылы толтырылатын тіркелу деректері тізімі.</translation> <translation id="3688051737190211318">Егер <ph name="ORIGIN" /> сайты сенімді болса, сақталған құпия сөз арқылы кіре аласыз.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Пернетақтаны көрсету</translation> <translation id="4694050069269396220">Егер <ph name="ORIGIN" /> сайты сенімді болса, сақталған құпия сөзді басқа сайтқа пайдалана аласыз.</translation> <translation id="5016175294846053194">Пернетақтаның жоғарғы жағында автотолтыру ұсыныстары бар.</translation> -<translation id="5088366526685584589">Сақталған мекенжайларды көрсету</translation> <translation id="5441504010984421144">Түрту арқылы толтырылатын тіркелу деректері тізімі толық экранға ашылған.</translation> <translation id="6393156038355142111">Күрделі құпия сөз ұсыну</translation> <translation id="6558703547256592471">Әрбір сайтқа бірегей құпия сөз пайдаланып көріңіз.</translation> <translation id="7029809446516969842">Құпия сөздер</translation> -<translation id="7299100402441711551">Мекенжайларды көрсету</translation> -<translation id="7494879913343971937">Құпия сөздерді көрсету</translation> <translation id="7594473730623999723">Басқа ұсыныстарды көру үшін сырғытыңыз.</translation> <translation id="7992095260806105436">Ұсыныстарды автоматты түрде толтыру үшін Chrome-ды пайдаланыңыз.</translation> -<translation id="8037472847879765671">Төлеу әдістерін көрсету</translation> <translation id="8507520749471379845">Қолжетімді құпия сөздер</translation> <translation id="8705308553596171387">Құпия сөз жоқ</translation> <translation id="879180780857354295">Пернетақтаның жоғарғы жағында балама толтыру опциялары бар.</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_km.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_km.xtb index 0f9b859c..323b9489 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_km.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_km.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="km"> <translation id="1383876407941801731">ស្វែងរក</translation> -<translation id="1566281227936819866">កំពុងបង្ហាញវិធីបង់ប្រាក់ដែលបានរក្សាទុក</translation> <translation id="1717486229951421299">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះត្រូវបានបើកពាក់កណ្ដាលអេក្រង់។</translation> <translation id="207576718733492531">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះត្រូវបានបិទ។</translation> <translation id="2610239185026711824">ណែនាំពាក្យសម្ងាត់</translation> <translation id="2652129567809778422">ជ្រើសរើសពាក្យសម្ងាត់</translation> -<translation id="2803478378562657435">កំពុងបង្ហាញពាក្យសម្ងាត់ដែលបានរក្សាទុក និងជម្រើសពាក្យសម្ងាត់</translation> <translation id="2903493209154104877">អាសយដ្ឋាន</translation> <translation id="3399357656427473483">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះ។</translation> <translation id="3688051737190211318">ប្រសិនបើអ្នកជឿទុកចិត្ត <ph name="ORIGIN" /> អ្នកអាចប្រើពាក្យសម្ងាត់ដែលបានរក្សាទុក ដើម្បីចូលគណនី</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">បង្ហាញក្តារចុច</translation> <translation id="4694050069269396220">ប្រសិនបើអ្នកជឿទុកចិត្ត <ph name="ORIGIN" /> អ្នកអាចប្រើពាក្យសម្ងាត់ដែលបានរក្សាទុកសម្រាប់គេហទំព័រផ្សេងទៀតបាន។</translation> <translation id="5016175294846053194">ការណែនាំអំពីការបំពេញដោយស្វ័យប្រវត្តិមាននៅផ្នែកខាងលើក្ដារចុច</translation> -<translation id="5088366526685584589">កំពុងបង្ហាញអាសយដ្ឋានដែលបានរក្សាទុក</translation> <translation id="5441504010984421144">បញ្ជីព័ត៌មានផ្ទៀងផ្ទាត់ ដែលត្រូវបំពេញដោយការប៉ះត្រូវបានបើកពេញអេក្រង់។</translation> <translation id="6393156038355142111">ណែនាំពាក្យសម្ងាត់ខ្លាំង</translation> <translation id="6558703547256592471">សូមព្យាយាមប្រើពាក្យសម្ងាត់ខុសប្លែកពីគេសម្រាប់រាល់គេហទំព័រ។</translation> <translation id="7029809446516969842">ពាក្យសម្ងាត់</translation> -<translation id="7299100402441711551">បង្ហាញអាសយដ្ឋាន</translation> -<translation id="7494879913343971937">បង្ហាញពាក្យសម្ងាត់</translation> <translation id="7594473730623999723">អូសដើម្បីមើលការណែនាំច្រើនទៀត</translation> <translation id="7992095260806105436">ប្រើការណែនាំអំពីការបំពេញស្វ័យប្រវត្តិរបស់ Chrome</translation> -<translation id="8037472847879765671">បង្ហាញវិធីបង់ប្រាក់</translation> <translation id="8507520749471379845">ពាក្យសម្ងាត់ដែលអាចប្រើបាន</translation> <translation id="8705308553596171387">គ្មានពាក្យសម្ងាត់ទេ</translation> <translation id="879180780857354295">មានជម្រើសបំពេញជំនួសនៅខាងលើក្ដារចុច</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb index 8f5ac759..8cbec16 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_kn.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="kn"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">ಉಳಿಸಲಾದ ಪಾವತಿ ವಿಧಾನಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1717486229951421299">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿಯನ್ನು ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="207576718733492531">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.</translation> <translation id="2610239185026711824">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೂಚಿಸಿ</translation> <translation id="2652129567809778422">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> -<translation id="2803478378562657435">ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2903493209154104877">ವಿಳಾಸಗಳು</translation> <translation id="3399357656427473483">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿ.</translation> <translation id="3688051737190211318">ನೀವು <ph name="ORIGIN" /> ಅನ್ನು ನಂಬಿದರೆ, ಸೈನ್ ಇನ್ ಮಾಡಲು ನೀವು ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಬಹುದು</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">ಕೀಬೋರ್ಡ್ ತೋರಿಸಿ</translation> <translation id="4694050069269396220">ನೀವು <ph name="ORIGIN" /> ಅನ್ನು ನಂಬಿದರೆ, ನೀವು ಇತರ ಸೈಟ್ನಲ್ಲಿ ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಬಹುದು.</translation> <translation id="5016175294846053194">ಸ್ವಯಂ ಭರ್ತಿ ಸಲಹೆಗಳು ಮೇಲಿರುವ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಲಭ್ಯವಿರುತ್ತವೆ</translation> -<translation id="5088366526685584589">ಉಳಿಸಿರುವ ವಿಳಾಸಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="5441504010984421144">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿಯನ್ನು ಸಂಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="6393156038355142111">ಸದೃಢವಾದ ಪಾಸ್ವರ್ಡ್ ಸೂಚಿಸಿ</translation> <translation id="6558703547256592471">ಪ್ರತಿ ಸೈಟ್ಗೆ ಅನನ್ಯ ಪಾಸ್ವರ್ಡ್ ಬಳಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="7029809446516969842">ಪಾಸ್ವರ್ಡ್ಗಳು</translation> -<translation id="7299100402441711551">ವಿಳಾಸಗಳನ್ನು ತೋರಿಸಿ</translation> -<translation id="7494879913343971937">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="7594473730623999723">ಇನ್ನಷ್ಟು ಸಲಹೆಗಳನ್ನು ನೋಡಲು ಸ್ವೈಪ್ ಮಾಡಿ</translation> <translation id="7992095260806105436">Chrome ಸ್ವಯಂ ಭರ್ತಿ ಸಲಹೆಗಳನ್ನು ಬಳಸಿ</translation> -<translation id="8037472847879765671">ಪಾವತಿ ವಿಧಾನಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="8507520749471379845">ಪಾಸ್ವರ್ಡ್ಗಳು ಲಭ್ಯವಿವೆ</translation> <translation id="8705308553596171387">ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ ಇಲ್ಲ</translation> <translation id="879180780857354295">ಭರ್ತಿ ಮಾಡುವ ಕುರಿತ ಪರ್ಯಾಯ ಆಯ್ಕೆಗಳು ಕೀಬೋರ್ಡ್ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಲಭ್ಯವಿವೆ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb index 5ad08855..c1b6145 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ko.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ko"> <translation id="1383876407941801731">검색</translation> -<translation id="1566281227936819866">저장된 결제 수단 표시 중</translation> <translation id="1717486229951421299">터치 시 작성되는 사용자 인증 정보 목록이 절반 높이로 열렸습니다.</translation> <translation id="207576718733492531">터치 시 작성되는 사용자 인증 정보 목록이 닫혔습니다.</translation> <translation id="2610239185026711824">비밀번호 추천</translation> <translation id="2652129567809778422">비밀번호 선택</translation> -<translation id="2803478378562657435">저장된 비밀번호 및 비밀번호 옵션 표시 중</translation> <translation id="2903493209154104877">주소</translation> <translation id="3399357656427473483">터치 시 작성되는 사용자 인증 정보 목록입니다.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" />을(를) 신뢰하는 경우 저장된 비밀번호를 사용할 수 있습니다</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">키보드 표시</translation> <translation id="4694050069269396220"><ph name="ORIGIN" />을(를) 신뢰하는 경우 다른 사이트의 저장된 비밀번호를 사용할 수 있습니다.</translation> <translation id="5016175294846053194">키보드 위에 사용 가능한 자동 완성 제안 표시</translation> -<translation id="5088366526685584589">저장된 주소를 표시합니다</translation> <translation id="5441504010984421144">터치 시 작성되는 사용자 인증 정보 목록이 전체 높이로 열렸습니다.</translation> <translation id="6393156038355142111">안전한 비밀번호 추천</translation> <translation id="6558703547256592471">모든 사이트에 고유한 비밀번호를 사용하세요.</translation> <translation id="7029809446516969842">비밀번호</translation> -<translation id="7299100402441711551">주소 표시</translation> -<translation id="7494879913343971937">비밀번호 표시</translation> <translation id="7594473730623999723">스와이프하여 추천 더보기</translation> <translation id="7992095260806105436">Chrome 자동 완성 추천 사용</translation> -<translation id="8037472847879765671">결제 수단 표시</translation> <translation id="8507520749471379845">사용할 수 있는 비밀번호</translation> <translation id="8705308553596171387">비밀번호 없음</translation> <translation id="879180780857354295">키보드 위에서 사용할 수 있는 대체 채우기 옵션</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ky.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ky.xtb index 58bb07dd..9155b3c 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ky.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ky.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ky"> <translation id="1383876407941801731">Издөө</translation> -<translation id="1566281227936819866">Сакталган төлөм ыкмалары көрсөтүлүүдө</translation> <translation id="1717486229951421299">Аккаунтка киргизүүчү маалыматтардын басып коюп толтурула турган тизмеси жарымына чейин ачылды.</translation> <translation id="207576718733492531">Аккаунтка киргизүүчү маалыматтардын басып коюп толтурула турган тизмеси жабык.</translation> <translation id="2610239185026711824">Сырсөз сунушталсын</translation> <translation id="2652129567809778422">Сырсөздү тандоо</translation> -<translation id="2803478378562657435">Сакталган сырсөздөр жана сырсөздүн параметрлери көрсөтүлүүдө</translation> <translation id="2903493209154104877">Даректер</translation> <translation id="3399357656427473483">Аккаунтка киргизүүчү маалыматтардын басып коюп толтурула турган тизмеси.</translation> <translation id="3688051737190211318">Эгер <ph name="ORIGIN" /> сайтына ишенсеңиз, кирүү үчүн сакталган сырсөзүңүздү колдоно бериңиз</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Баскычтопту көрсөтүү</translation> <translation id="4694050069269396220">Эгер <ph name="ORIGIN" /> сайтына ишенсеңиз, башка сайтта сакталган сырсөзүңүздү колдоно бериңиз.</translation> <translation id="5016175294846053194">Автотолтуруу сунуштары баскычтоптун жогору жагында жеткиликтүү</translation> -<translation id="5088366526685584589">Сакталган даректер көрсөтүлүүдө</translation> <translation id="5441504010984421144">Аккаунтка киргизүүчү маалыматтардын басып коюп толтурула турган тизмеси толугу менен ачылды.</translation> <translation id="6393156038355142111">Татаал сырсөз сунушталсын</translation> <translation id="6558703547256592471">Ар бир сайт үчүн өзүнчө сырсөздү колдонуп көрүңүз.</translation> <translation id="7029809446516969842">Сырсөздөр</translation> -<translation id="7299100402441711551">Даректерди көрсөтүү</translation> -<translation id="7494879913343971937">Сырсөз көрүнсүн</translation> <translation id="7594473730623999723">Дагы сунуштарды көрүү үчүн экранды сүрүп коюңуз</translation> <translation id="7992095260806105436">Chrome'дун автотолтуруу сунушун колдонуңуз</translation> -<translation id="8037472847879765671">Төлөм ыкмаларын көрсөтүү</translation> <translation id="8507520749471379845">Сырсөздөр жеткиликтүү</translation> <translation id="8705308553596171387">Сырсөз талап кылынбайт</translation> <translation id="879180780857354295">Кошумча толтуруу параметрлери баскычтоптун жогору жагында жеткиликтүү</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lo.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lo.xtb index c980dcc..84e8d27 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lo.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lo.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="lo"> <translation id="1383876407941801731">ຊອກຫາ</translation> -<translation id="1566281227936819866">ກຳລັງສະແດງວິທີການຈ່າຍເງິນທີ່ບັນທຶກໄວ້</translation> <translation id="1717486229951421299">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຈະຕື່ມເມື່ອແຕະເປີດຢູ່ລະດັບລວງສູງເຄິ່ງຈໍ.</translation> <translation id="207576718733492531">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຕ້ອງຕື່ມເມື່ອແຕະປິດຢູ່.</translation> <translation id="2610239185026711824">ແນະນຳລະຫັດຜ່ານ</translation> <translation id="2652129567809778422">ເລືອກລະຫັດຜ່ານ</translation> -<translation id="2803478378562657435">ກຳລັງສະແດງລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ ແລະ ຕົວເລືອກລະຫັດຜ່ານ</translation> <translation id="2903493209154104877">ທີ່ຢູ່</translation> <translation id="3399357656427473483">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຕ້ອງຕື່ມເມື່ອແຕະ.</translation> <translation id="3688051737190211318">ຫາກທ່ານເຊື່ອຖື <ph name="ORIGIN" />, ທ່ານສາມາດໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ເພື່ອເຂົ້າສູ່ລະບົບໄດ້</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">ສະແດງແປ້ນພິມ</translation> <translation id="4694050069269396220">ຖ້າທ່ານເຊື່ອຖື <ph name="ORIGIN" />, ທ່ານສາມາດໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ສຳລັບເວັບໄຊອື່ນໄດ້.</translation> <translation id="5016175294846053194">ມີການແນະນຳການຕື່ມໃສ່ອັດຕະໂນມັດຢູ່ເທິງແປ້ນພິມ</translation> -<translation id="5088366526685584589">ກຳລັງສະແດງທີ່ຢູ່ທີ່ບັນທຶກໄວ້</translation> <translation id="5441504010984421144">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຈະຕື່ມເມື່ອແຕະເປີດຢູ່ລະດັບລວງສູງເຕັມຈໍ.</translation> <translation id="6393156038355142111">ແນະນຳລະຫັດຜ່ານທີ່ຄາດເດົາໄດ້ຍາກ</translation> <translation id="6558703547256592471">ພະຍາຍາມໃຊ້ລະຫັດຜ່ານສະເພາະສຳລັບທຸກໆເວັບໄຊ.</translation> <translation id="7029809446516969842">ລະຫັດຜ່ານ</translation> -<translation id="7299100402441711551">ສະແດງທີ່ຢູ່</translation> -<translation id="7494879913343971937">ສະແດງລະຫັດຜ່ານ</translation> <translation id="7594473730623999723">ປັດເພື່ອເບິ່ງການແນະນຳເພີ່ມເຕີມ</translation> <translation id="7992095260806105436">ໃຊ້ການແນະນຳການຕື່ມຂໍ້ມູນອັດຕະໂນມັດຂອງ Chrome</translation> -<translation id="8037472847879765671">ສະແດງວິທີການຈ່າຍເງິນ</translation> <translation id="8507520749471379845">ມີລະຫັດຜ່ານ</translation> <translation id="8705308553596171387">ບໍ່ມີລະຫັດຜ່ານ</translation> <translation id="879180780857354295">ມີຕົວເລືອກການຕື່ມຂໍ້ມູນສຳຮອງຢູ່ທາງເທິງຂອງແປ້ນພິມ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lt.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lt.xtb index a8cae46..a09706fb 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lt.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lt.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="lt"> <translation id="1383876407941801731">Ieškoti</translation> -<translation id="1566281227936819866">Rodomi išsaugoti mokėjimo metodai</translation> <translation id="1717486229951421299">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per pusę ekrano aukščio.</translation> <translation id="207576718733492531">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas uždarytas.</translation> <translation id="2610239185026711824">Siūlyti slaptažodį</translation> <translation id="2652129567809778422">Pasirinkite slaptažodį</translation> -<translation id="2803478378562657435">Rodomi išsaugoti slaptažodžiai ir slaptažodžių parinktys</translation> <translation id="2903493209154104877">Adresai</translation> <translation id="3399357656427473483">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas.</translation> <translation id="3688051737190211318">Jei pasitikite <ph name="ORIGIN" />, prisijungdami galite naudoti išsaugotą slaptažodį</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Rodyti klaviatūrą</translation> <translation id="4694050069269396220">Jei pasitikite <ph name="ORIGIN" />, išsaugotą slaptažodį galite naudoti kitoje svetainėje.</translation> <translation id="5016175294846053194">Automatinio pildymo pasiūlymai pateikiami virš klaviatūros</translation> -<translation id="5088366526685584589">Rodomi išsaugoti adresai</translation> <translation id="5441504010984421144">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per visą ekrano aukštį.</translation> <translation id="6393156038355142111">Siūlyti sudėtingą slaptažodį</translation> <translation id="6558703547256592471">Kiekvienoje svetainėje stenkitės naudoti unikalius slaptažodžius.</translation> <translation id="7029809446516969842">Slaptažodžiai</translation> -<translation id="7299100402441711551">Rodyti adresus</translation> -<translation id="7494879913343971937">Rodyti slaptažodžius</translation> <translation id="7594473730623999723">Perbraukite, kad peržiūrėtumėte daugiau pasiūlymų</translation> <translation id="7992095260806105436">Naudoti „Chrome“ automatinio pildymo pasiūlymą</translation> -<translation id="8037472847879765671">Rodyti mokėjimo metodus</translation> <translation id="8507520749471379845">Pasiekiami slaptažodžiai</translation> <translation id="8705308553596171387">Nepateiktas slaptažodis</translation> <translation id="879180780857354295">Alternatyvios užpildymo parinktys pateikiamos virš klaviatūros</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb index b56ac8d0..cd16e83 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="lv"> <translation id="1383876407941801731">Meklēt</translation> -<translation id="1566281227936819866">Tiek rādīti saglabātie maksājumu veidi</translation> <translation id="1717486229951421299">Pieskaroties aizpildāmo akreditācijas datu saraksts ir atvērts pusekrāna augstumā.</translation> <translation id="207576718733492531">Pieskaroties aizpildāmo akreditācijas datu saraksts ir aizvērts.</translation> <translation id="2610239185026711824">Ieteikt paroli</translation> <translation id="2652129567809778422">Paroles atlase</translation> -<translation id="2803478378562657435">Tiek rādītas saglabātās paroles un paroļu iespējas</translation> <translation id="2903493209154104877">Adreses</translation> <translation id="3399357656427473483">Pieskaroties aizpildāmo akreditācijas datu saraksts.</translation> <translation id="3688051737190211318">Ja uzticaties vietnei <ph name="ORIGIN" />, varat izmantot saglabāto paroli, lai pierakstītos.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Rādīt tastatūru</translation> <translation id="4694050069269396220">Ja uzticaties vietnei <ph name="ORIGIN" />, varat izmantot saglabāto paroli citā vietnē.</translation> <translation id="5016175294846053194">Virs tastatūras ir pieejami automātiskās aizpildes ieteikumi</translation> -<translation id="5088366526685584589">Tiek rādītas saglabātās adreses</translation> <translation id="5441504010984421144">Pieskaroties aizpildāmo akreditācijas datu saraksts ir atvērts pilna ekrāna augstumā.</translation> <translation id="6393156038355142111">Ieteikt drošu paroli</translation> <translation id="6558703547256592471">Mēģiniet izmantot unikālu paroli katrai vietnei.</translation> <translation id="7029809446516969842">Paroles</translation> -<translation id="7299100402441711551">Rādīt adreses</translation> -<translation id="7494879913343971937">Rādīt paroles</translation> <translation id="7594473730623999723">Velciet, lai skatītu citus ieteikumus</translation> <translation id="7992095260806105436">Izmantojiet Chrome automātiskās aizpildes ieteikumu</translation> -<translation id="8037472847879765671">Rādīt maksājumu veidus</translation> <translation id="8507520749471379845">Ir pieejamas paroles</translation> <translation id="8705308553596171387">Nav paroles</translation> <translation id="879180780857354295">Virs tastatūras ir pieejami alternatīvi aizpildījuma ieteikumi</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mk.xtb index 1c30fc9..557def4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mk.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mk.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="mk"> <translation id="1383876407941801731">Барај</translation> -<translation id="1566281227936819866">Се прикажуваат зачуваните начини на плаќање</translation> <translation id="1717486229951421299">Списокот со акредитиви што се пополнуваат со допир е отворен на половина екран.</translation> <translation id="207576718733492531">Списокот со акредитиви што се пополнуваат со допир е затворен.</translation> <translation id="2610239185026711824">Предложи лозинка</translation> <translation id="2652129567809778422">Изберете лозинка</translation> -<translation id="2803478378562657435">Се прикажуваат зачуваните лозинки и опциите за лозинки</translation> <translation id="2903493209154104877">Адреси</translation> <translation id="3399357656427473483">Список со акредитиви што се пополнуваат со допир.</translation> <translation id="3688051737190211318">Ако имате доверба во <ph name="ORIGIN" />, може да користите зачувана лозинка за да се најавите</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Прикажи тастатура</translation> <translation id="4694050069269396220">Ако имате доверба во <ph name="ORIGIN" />, може да користите зачувана лозинка од друг сајт.</translation> <translation id="5016175294846053194">Предлозите за автоматско пополнување се прикажуваат над тастатурата</translation> -<translation id="5088366526685584589">Се прикажуваат зачувани адреси</translation> <translation id="5441504010984421144">Списокот со акредитиви што се пополнуваат со допир е отворен на цел екран.</translation> <translation id="6393156038355142111">Предложи силна лозинка</translation> <translation id="6558703547256592471">Добро би било да користите единствена лозинка за секој сајт.</translation> <translation id="7029809446516969842">Лозинки</translation> -<translation id="7299100402441711551">Прикажи ги адресите</translation> -<translation id="7494879913343971937">Прикажи ги лозинките</translation> <translation id="7594473730623999723">Повлечете за да видите повеќе предлози</translation> <translation id="7992095260806105436">Користете го предлогот за автоматско пополнување на Chrome</translation> -<translation id="8037472847879765671">Прикажете ги начините на плаќање</translation> <translation id="8507520749471379845">Достапни лозинки</translation> <translation id="8705308553596171387">Нема лозинка</translation> <translation id="879180780857354295">Алтернативни опции за пополнување се достапни над тастатурата</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb index e45a86e..518c535 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ml.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ml"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">സംരക്ഷിച്ച പേയ്മെന്റ് രീതികൾ കാണിക്കുന്നു</translation> <translation id="1717486229951421299">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ് പകുതി ഉയരത്തിൽ തുറന്നിരിക്കുന്നു.</translation> <translation id="207576718733492531">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ് അടച്ചിരിക്കുന്നു.</translation> <translation id="2610239185026711824">പാസ്വേഡ് നിർദ്ദേശിക്കുക</translation> <translation id="2652129567809778422">പാസ്വേഡ് തിരഞ്ഞെടുക്കുക</translation> -<translation id="2803478378562657435">സംരക്ഷിച്ച പാസ്വേഡുകളും പാസ്വേഡ് ഓപ്ഷനുകളും കാണിക്കുന്നു</translation> <translation id="2903493209154104877">വിലാസങ്ങള്</translation> <translation id="3399357656427473483">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ്.</translation> <translation id="3688051737190211318">നിങ്ങൾക്ക് <ph name="ORIGIN" /> എന്നതിനെ വിശ്വാസമാണെങ്കിൽ സംരക്ഷിച്ച ഒരു പാസ്വേഡ് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യാം</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">കീബോര്ഡ് കാണിക്കുക</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> -നെ വിശ്വസിക്കുന്നുവെങ്കിൽ, സംരക്ഷിച്ച പാസ്വേഡ് മറ്റൊരു സൈറ്റിനായി നിങ്ങൾക്ക് ഉപയോഗിക്കാം.</translation> <translation id="5016175294846053194">കീബോർഡിന് മുകളിൽ സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശങ്ങൾ ലഭ്യമാണ്</translation> -<translation id="5088366526685584589">സംരക്ഷിച്ച വിലാസങ്ങൾ കാണിക്കുന്നു</translation> <translation id="5441504010984421144">ടച്ച് ചെയ്യുമ്പോൾ പൂരിപ്പിക്കേണ്ട ക്രെഡൻഷ്യലുകളുടെ ലിസ്റ്റ് പൂർണ്ണ ഉയരത്തിൽ തുറന്നിരിക്കുന്നു.</translation> <translation id="6393156038355142111">ശക്തമായ പാസ്വേഡ് നിർദ്ദേശിക്കുക</translation> <translation id="6558703547256592471">ഓരോ സൈറ്റിനും വ്യത്യസ്തമായ പാസ്വേഡ് ഉപയോഗിക്കാൻ ശ്രമിക്കുക.</translation> <translation id="7029809446516969842">പാസ്വേഡുകള്</translation> -<translation id="7299100402441711551">വിലാസങ്ങൾ കാണിക്കുക</translation> -<translation id="7494879913343971937">പാസ്വേഡുകൾ കാണിക്കുക</translation> <translation id="7594473730623999723">കൂടുതൽ നിർദ്ദേശങ്ങൾ കാണാൻ സ്വൈപ്പ് ചെയ്യുക</translation> <translation id="7992095260806105436">Chrome ഓട്ടോഫിൽ നിർദ്ദേശം ഉപയോഗിക്കുക</translation> -<translation id="8037472847879765671">പേയ്മെന്റ് രീതികൾ കാണിക്കുക</translation> <translation id="8507520749471379845">പാസ്വേഡുകള് ലഭ്യമാണ്</translation> <translation id="8705308553596171387">പാസ്വേഡ് ഇല്ല</translation> <translation id="879180780857354295">കീബോർഡിന് മുകളിൽ ഇതര പൂരിപ്പിക്കൽ ഓപ്ഷനുകൾ ലഭ്യമാണ്</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mn.xtb index 0c3efbd0..df73e78 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mn.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="mn"> <translation id="1383876407941801731">Хайлт</translation> -<translation id="1566281227936819866">Хадгалсан төлбөрийн хэрэгслийг харуулж байна</translation> <translation id="1717486229951421299">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалтыг хагас өндрөөр нээлээ.</translation> <translation id="207576718733492531">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалт хаалттай байна.</translation> <translation id="2610239185026711824">Нууц үг санал болгох</translation> <translation id="2652129567809778422">Нууц үг сонгох</translation> -<translation id="2803478378562657435">Хадгалсан нууц үг болон нууц үгийн сонголтыг харуулж байна</translation> <translation id="2903493209154104877">Хаягууд</translation> <translation id="3399357656427473483">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалт.</translation> <translation id="3688051737190211318">Та <ph name="ORIGIN" />-д итгэж байвал нэвтрэхдээ хадгалсан нууц үгээ ашиглах боломжтой</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Гарыг харуулах</translation> <translation id="4694050069269396220">Та <ph name="ORIGIN" />-д итгэж байвал өөр сайтад хадгалсан нууц үг ашиглах боломжтой.</translation> <translation id="5016175294846053194">Гар дээр боломжтой байгаа автоматаар бөглөх хэсгийн саналууд</translation> -<translation id="5088366526685584589">Хадгалсан хаягийг харуулж байна</translation> <translation id="5441504010984421144">Хүрэхэд гүйцээж бөглөх мандат үнэмлэхийн жагсаалтыг бүтэн өндрөөр нээлээ.</translation> <translation id="6393156038355142111">Сайн нууц үг санал болгох</translation> <translation id="6558703547256592471">Сайт бүрд өвөрмөц нууц үг ашиглахыг оролдож үзнэ үү.</translation> <translation id="7029809446516969842">Нууц үг</translation> -<translation id="7299100402441711551">Хаяг харуулах</translation> -<translation id="7494879913343971937">Нууц үгийг харуулах</translation> <translation id="7594473730623999723">Илүү олон зөвлөмж харахын тулд шударна уу</translation> <translation id="7992095260806105436">Chrome-н автоматаар бөглөх хэсгийн зөвлөмжийг ашиглана уу</translation> -<translation id="8037472847879765671">Төлбөрийн хэрэгслийг харуулах</translation> <translation id="8507520749471379845">Боломжтой нууц үг</translation> <translation id="8705308553596171387">Нууц үг алга</translation> <translation id="879180780857354295">Бөглөх өөр сонголт гарын дээр боломжтой байна</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mr.xtb index 23d49b3..504ab68 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_mr.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="mr"> <translation id="1383876407941801731">शोधा</translation> -<translation id="1566281227936819866">सेव्ह केलेल्या पेमेंट पद्धती दाखवत आहे</translation> <translation id="1717486229951421299">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची अर्ध्या भागावर उघडली आहे.</translation> <translation id="207576718733492531">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची बंद आहे.</translation> <translation id="2610239185026711824">पासवर्ड सुचवा</translation> <translation id="2652129567809778422">पासवर्ड निवडा</translation> -<translation id="2803478378562657435">सेव्ह केलेले पासवर्ड आणि पासवर्ड पर्याय दाखवत आहे</translation> <translation id="2903493209154104877">पत्ते</translation> <translation id="3399357656427473483">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची.</translation> <translation id="3688051737190211318">तुम्हाला <ph name="ORIGIN" /> वर विश्वास असल्यास, साइन इन करण्यासाठी तुम्ही सेव्ह केलेला पासवर्ड वापरू शकता</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">कीबोर्ड दाखवा</translation> <translation id="4694050069269396220">तुमचा <ph name="ORIGIN" /> वर विश्वास असल्यास, तुम्ही दुसर्या साइटसाठी सेव्ह केलेला पासवर्ड वापरू शकता.</translation> <translation id="5016175294846053194">ऑटोफिल सूचना कीबोर्डवर उपलब्ध आहेत</translation> -<translation id="5088366526685584589">सेव्ह केलेले ॲड्रेस दाखवत आहे</translation> <translation id="5441504010984421144">स्पर्श करून भरायची असलेली क्रेडेंशियलची सूची संपूर्ण भागावर उघडली आहे.</translation> <translation id="6393156038355142111">क्लिष्ट पासवर्ड सुचवा</translation> <translation id="6558703547256592471">प्रत्येक साइटसाठी युनिक पासवर्ड वापरण्याचा प्रयत्न करा.</translation> <translation id="7029809446516969842">पासवर्ड</translation> -<translation id="7299100402441711551">पत्ते दाखवा</translation> -<translation id="7494879913343971937">पासवर्ड दाखवा</translation> <translation id="7594473730623999723">आणखी सूचना पाहण्यासाठी स्वाइप करा</translation> <translation id="7992095260806105436">Chrome ऑटोफिल सूचना वापरा</translation> -<translation id="8037472847879765671">पेमेंट पद्धती दाखवा</translation> <translation id="8507520749471379845">पासवर्ड उपलब्ध आहे</translation> <translation id="8705308553596171387">पासवर्ड नाही</translation> <translation id="879180780857354295">कीबोर्डच्या वरती पर्यायी भरण्याचे पर्याय उपलब्ध आहेत</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ms.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ms.xtb index fb31abf..65da251 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ms.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ms.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ms"> <translation id="1383876407941801731">Carian</translation> -<translation id="1566281227936819866">Menunjukkan kaedah pembayaran yang disimpan</translation> <translation id="1717486229951421299">Senarai bukti kelayakan untuk diisi apabila disentuh, dibuka pada ketinggian separuh.</translation> <translation id="207576718733492531">Senarai bukti kelayakan untuk diisi apabila disentuh telah ditutup.</translation> <translation id="2610239185026711824">Cadangkan kata laluan</translation> <translation id="2652129567809778422">Pilih kata laluan</translation> -<translation id="2803478378562657435">Menunjukkan kata laluan yang disimpan dan pilihan kata laluan</translation> <translation id="2903493209154104877">Alamat</translation> <translation id="3399357656427473483">Senarai bukti kelayakan untuk diisi apabila disentuh.</translation> <translation id="3688051737190211318">Jika anda mempercayai <ph name="ORIGIN" />, anda boleh menggunakan kata laluan yang disimpan untuk log masuk</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Tunjukkan papan kekunci</translation> <translation id="4694050069269396220">Jika anda mempercayai <ph name="ORIGIN" />, anda boleh menggunakan kata laluan yang disimpan untuk tapak lain.</translation> <translation id="5016175294846053194">Autolengkap cadangan tersedia di atas papan kekunci</translation> -<translation id="5088366526685584589">Menunjukkan alamat yang disimpan</translation> <translation id="5441504010984421144">Senarai bukti kelayakan untuk diisi apabila disentuh, dibuka pada ketinggian penuh.</translation> <translation id="6393156038355142111">Cadangkan kata laluan yang kukuh</translation> <translation id="6558703547256592471">Cuba gunakan kata laluan yang unik untuk setiap tapak.</translation> <translation id="7029809446516969842">Kata laluan</translation> -<translation id="7299100402441711551">Tunjukkan Alamat</translation> -<translation id="7494879913343971937">Tunjukkan kata laluan</translation> <translation id="7594473730623999723">Leret untuk melihat pelbagai lagi cadangan</translation> <translation id="7992095260806105436">Gunakan cadangan autolengkap Chrome</translation> -<translation id="8037472847879765671">Tunjukkan kaedah pembayaran</translation> <translation id="8507520749471379845">Kata laluan tersedia</translation> <translation id="8705308553596171387">Tiada kata laluan</translation> <translation id="879180780857354295">Pilihan pengisian alternatif tersedia di atas papan kekunci</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_my.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_my.xtb index 2c69b3d5..0177a5ad 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_my.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_my.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="my"> <translation id="1383876407941801731">ရှာဖွေမှု</translation> -<translation id="1566281227936819866">သိမ်းထားသော ငွေပေးချေနည်းလမ်းများကို ပြထားသည်</translation> <translation id="1717486229951421299">ထိလိုက်သည့်အခါ ဖြည့်ရန်အတွက် အထောက်အထားများ၏ စာရင်းကို မြင်ကွင်းတစ်ဝက်ဖြင့်ထားသည်။</translation> <translation id="207576718733492531">ထိတွေ့သည့်အခါ ဖြည့်ရန် အထောက်အထားစာရင်းကို ပိတ်ထားသည်။</translation> <translation id="2610239185026711824">စကားဝှက် အကြံပြုရန်</translation> <translation id="2652129567809778422">စကားဝှက်ရွေးခြင်း</translation> -<translation id="2803478378562657435">သိမ်းဆည်းထားသည့် စကားဝှက်များနှင့် စကားဝှက်ရွေးချယ်စရာများကို ပြနေသည်</translation> <translation id="2903493209154104877">လိပ်စာများ</translation> <translation id="3399357656427473483">ထိလိုက်သည့်အခါ ဖြည့်ရန်အတွက် အထောက်အထားများ၏ စာရင်း</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> ကို ယုံကြည်ပါက သိမ်းထားသည့် စကားဝှက်တစ်ခုကို လက်မှတ်ထိုးဝင်ရန် သုံးနိုင်သည်</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">ကီးဘုတ်ကို ပြရန်</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> ကို ယုံကြည်ပါက အခြားဝဘ်ဆိုက်အတွက် သိမ်းထားသောစကားဝှက်ကို အသုံးပြုနိုင်သည်။</translation> <translation id="5016175294846053194">လက်ကွက်အပေါ်တွင် အော်တိုဖြည့်အကြံပြုချက်များ ရနိုင်သည်</translation> -<translation id="5088366526685584589">သိမ်းထားသော လိပ်စာများ ပြနေသည်</translation> <translation id="5441504010984421144">ထိလိုက်သည့်အခါ ဖြည့်ရန်အတွက် အထောက်အထားများ၏ စာရင်းကို မြင်ကွင်းအပြည့်ဖြင့်ထားသည်။</translation> <translation id="6393156038355142111">လုံခြုံမှုမြင့်သည့် စကားဝှက် အကြံပြုရန်</translation> <translation id="6558703547256592471">ဝဘ်ဆိုက်တိုင်းအတွက် သီးသန့်စကားဝှက် အသုံးပြုပါ။</translation> <translation id="7029809446516969842">စကားဝှက်များ</translation> -<translation id="7299100402441711551">လိပ်စာများ ပြရန်</translation> -<translation id="7494879913343971937">စကားဝှက်များကို ပြရန်</translation> <translation id="7594473730623999723">နောက်ထပ်အကြံပြုချက်များ ကြည့်ရန် ပွတ်ဆွဲပါ</translation> <translation id="7992095260806105436">Chrome အော်တိုဖြည့် အကြံပြုချက် အသုံးပြုပါ</translation> -<translation id="8037472847879765671">ငွေပေးချေနည်းလမ်းများ ပြရန်</translation> <translation id="8507520749471379845">စကားဝှက်များ ရနိုင်သည်</translation> <translation id="8705308553596171387">စကားဝှက် မရှိပါ</translation> <translation id="879180780857354295">လက်ကွက်အပေါ်တွင် အခြားဖြည့်စွက်ရွေးစရာများ ရနိုင်သည်</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ne.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ne.xtb index 7a18ef4..078b4145 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ne.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ne.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ne"> <translation id="1383876407941801731">खोज्नुहोस्</translation> -<translation id="1566281227936819866">सुरक्षित गरिएका भुक्तानी विधिहरू देखाउँदै</translation> <translation id="1717486229951421299">छुँदाखेरि भरिने प्रमाणहरूको सूची आधा उचाइमा खोलिएको छ।</translation> <translation id="207576718733492531">छुँदाखेरि भरिने प्रमाणहरूको सूची बन्द छ।</translation> <translation id="2610239185026711824">पासवर्ड सिफारिस गर्नुहोस्</translation> <translation id="2652129567809778422">पासवर्ड चयन गर्नुहोस्</translation> -<translation id="2803478378562657435">सेभ गरिएका पासवर्ड तथा पासवर्डका विकल्पहरू देखाउँदै</translation> <translation id="2903493209154104877">ठेगानाहरू</translation> <translation id="3399357656427473483">छुँदाखेरि भरिने प्रमाणहरूको सूची।</translation> <translation id="3688051737190211318">तपाईंलाई <ph name="ORIGIN" /> माथि विश्वास छ भने तपाईं सेभ गरिएको पासवर्ड प्रयोग गरेर साइन इन गर्न सक्नुहुन्छ</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">किबोर्ड देखाउनुहोस्</translation> <translation id="4694050069269396220">तपाईंलाई <ph name="ORIGIN" /> माथि विश्वास छ भने तपाईं सुरक्षित गरिएको पासवर्ड कुनै अर्को साइटमा प्रयोग गर्न सक्नुहुन्छ।</translation> <translation id="5016175294846053194">स्वतः भरणसम्बन्धी सुझावहरू किबोर्डको माथिपट्टि दिइएका छन्</translation> -<translation id="5088366526685584589">सुरक्षित गरिएका ठेगानाहरू देखाउँदै</translation> <translation id="5441504010984421144">छुँदाखेरि भरिने प्रमाणहरूको सूची पूर्ण उचाइमा खोलिएको छ।</translation> <translation id="6393156038355142111">भरपर्दो पासवर्ड सिफारिस गर्नुहोस्</translation> <translation id="6558703547256592471">हरेक साइटमा एउटा अद्वितीय पासवर्ड प्रयोग गर्ने प्रयास गर्नुहोस्।</translation> <translation id="7029809446516969842">पासवर्डहरू</translation> -<translation id="7299100402441711551">ठेगानाहरू देखाउनुहोस्</translation> -<translation id="7494879913343971937">पासवर्डहरू देखाउनुहोस्</translation> <translation id="7594473730623999723">थप सुझावहरू हेर्न स्वाइप गर्नुहोस्</translation> <translation id="7992095260806105436">Chrome को अटोफिलसम्बन्धी सुझाव प्रयोग गर्नुहोस्</translation> -<translation id="8037472847879765671">भुक्तानी विधिहरू देखाउनुहोस्</translation> <translation id="8507520749471379845">पासवर्डहरू उपलब्ध छन्</translation> <translation id="8705308553596171387">कुनै पासवर्ड छैन</translation> <translation id="879180780857354295">जानकारी भर्ने वैकल्पिक विकल्पहरू किबोर्डमाथि उपलब्ध छन्</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_nl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_nl.xtb index ac57702..869c3ae 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_nl.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_nl.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="nl"> <translation id="1383876407941801731">Zoeken</translation> -<translation id="1566281227936819866">Opgeslagen betaalmethoden bekijken</translation> <translation id="1717486229951421299">De lijst met gegevens die moeten worden ingevuld als je tikt, is op halve hoogte geopend.</translation> <translation id="207576718733492531">De lijst met gegevens die moeten worden ingevuld als je tikt, is gesloten.</translation> <translation id="2610239185026711824">Wachtwoord voorstellen</translation> <translation id="2652129567809778422">Wachtwoord selecteren</translation> -<translation id="2803478378562657435">Opgeslagen wachtwoorden en wachtwoordopties bekijken</translation> <translation id="2903493209154104877">Adressen</translation> <translation id="3399357656427473483">De lijst met gegevens die moeten worden ingevuld als je tikt.</translation> <translation id="3688051737190211318">Als je <ph name="ORIGIN" /> vertrouwt, kun je een opgeslagen wachtwoord gebruiken om in te loggen</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Toetsenbord bekijken</translation> <translation id="4694050069269396220">Als je <ph name="ORIGIN" /> vertrouwt, kun je een opgeslagen wachtwoord gebruiken voor een andere site.</translation> <translation id="5016175294846053194">Suggesties via automatisch invullen zijn beschikbaar boven het toetsenbord</translation> -<translation id="5088366526685584589">Opgeslagen adressen bekijken</translation> <translation id="5441504010984421144">De lijst met gegevens die moeten worden ingevuld als je tikt, is op volledige hoogte geopend.</translation> <translation id="6393156038355142111">Sterk wachtwoord voorstellen</translation> <translation id="6558703547256592471">Probeer een uniek wachtwoord te gebruiken voor elke site.</translation> <translation id="7029809446516969842">Wachtwoorden</translation> -<translation id="7299100402441711551">Adressen bekijken</translation> -<translation id="7494879913343971937">Wachtwoorden bekijken</translation> <translation id="7594473730623999723">Swipe om meer suggesties te zien</translation> <translation id="7992095260806105436">Suggesties voor automatisch invullen van Chrome gebruiken</translation> -<translation id="8037472847879765671">Betaalmethoden bekijken</translation> <translation id="8507520749471379845">Wachtwoorden beschikbaar</translation> <translation id="8705308553596171387">Geen wachtwoord</translation> <translation id="879180780857354295">Alternatieve invulopties beschikbaar boven het toetsenbord</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb index 9fb1c41..7c00886 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_no.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="no"> <translation id="1383876407941801731">Søk</translation> -<translation id="1566281227936819866">Viser lagrede betalingsmåter</translation> <translation id="1717486229951421299">Listen over legitimasjon som kan fylles ut ved å trykke, er åpnet i halv høyde.</translation> <translation id="207576718733492531">Listen over legitimasjon som kan fylles ut ved å trykke, er lukket.</translation> <translation id="2610239185026711824">Foreslå passord</translation> <translation id="2652129567809778422">Velg passord</translation> -<translation id="2803478378562657435">Viser lagrede passord og passordalternativer</translation> <translation id="2903493209154104877">Adresser</translation> <translation id="3399357656427473483">Listen over legitimasjon som kan fylles ut ved å trykke.</translation> <translation id="3688051737190211318">Hvis du stoler på <ph name="ORIGIN" />, kan du logge på med et lagret passord</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Vis tastatur</translation> <translation id="4694050069269396220">Hvis du stoler på <ph name="ORIGIN" />, kan du bruke lagrede passord for andre nettsteder.</translation> <translation id="5016175294846053194">Autofyllforslag er tilgjengelige ovenfor tastaturet</translation> -<translation id="5088366526685584589">Viser lagrede adresser</translation> <translation id="5441504010984421144">Listen over legitimasjon som kan fylles ut ved å trykke, er åpnet i full høyde.</translation> <translation id="6393156038355142111">Foreslå et sterkt passord</translation> <translation id="6558703547256592471">Prøv å bruke unike passord for hvert nettsted.</translation> <translation id="7029809446516969842">Passord</translation> -<translation id="7299100402441711551">Vis adresser</translation> -<translation id="7494879913343971937">Vis passord</translation> <translation id="7594473730623999723">Sveip for å se flere forslag</translation> <translation id="7992095260806105436">Bruk autofyllforslag fra Chrome</translation> -<translation id="8037472847879765671">Vis betalingsmåter</translation> <translation id="8507520749471379845">Passord er tilgjengelige</translation> <translation id="8705308553596171387">Ingen passord</translation> <translation id="879180780857354295">Du finner andre utfyllingsalternativer over tastaturet</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_or.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_or.xtb index aaf790c..18e322f 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_or.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_or.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="or"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">ସେଭ୍ ଥିବା ପେମେଣ୍ଟ ପଦ୍ଧତିଗୁଡ଼ିକ ଦେଖାଯାଉଛି</translation> <translation id="1717486229951421299">ଅଧା ସ୍କ୍ରିନ୍ରେ ଖୋଲିଥିବା Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକା।</translation> <translation id="207576718733492531">Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକାକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି।</translation> <translation id="2610239185026711824">ଏକ ପାସ୍ୱର୍ଡ କୁହନ୍ତୁ</translation> <translation id="2652129567809778422">ପାସୱାର୍ଡ ଚୟନ କରନ୍ତୁ</translation> -<translation id="2803478378562657435">ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକ ଏବଂ ପାସ୍ୱର୍ଡ ବିକଳ୍ପଗୁଡ଼ିକ</translation> <translation id="2903493209154104877">ଠିକଣାଗୁଡ଼ିକ</translation> <translation id="3399357656427473483">Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକା।</translation> <translation id="3688051737190211318">ଯଦି ଆପଣ <ph name="ORIGIN" />କୁ ବିଶ୍ୱାସ କରନ୍ତି, ତେବେ ସାଇନ ଇନ କରିବା ପାଇଁ ଆପଣ ସେଭ କରାଯାଇଥିବା ଏକ ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରିପାରିବେ</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">କୀବୋର୍ଡ ଦେଖାନ୍ତୁ</translation> <translation id="4694050069269396220">ଯଦି ଆପଣ <ph name="ORIGIN" />କୁ ବିଶ୍ୱାସ କରନ୍ତି, ତେବେ ଆପଣ ଅନ୍ୟ ଏକ ସାଇଟ୍ ପାଇଁ ସେଭ୍ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରିପାରିବେ।</translation> <translation id="5016175294846053194">ସ୍ୱତଃପୂରଣ ପ୍ରସ୍ତାବଗୁଡ଼ିକ କୀବୋର୍ଡ ଉପରେ ଉପଲବ୍ଧ ଅଛି</translation> -<translation id="5088366526685584589">ସେଭ୍ କରାଯାଇଥିବା ଠିକଣାଗୁଡ଼ିକ ଦେଖାଉଛି</translation> <translation id="5441504010984421144">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ରେ ଖୋଲିଥିବା Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକା।</translation> <translation id="6393156038355142111">ଜଟିଳ ପାସ୍ୱର୍ଡ ପରାମର୍ଶ କରନ୍ତୁ</translation> <translation id="6558703547256592471">ପ୍ରତ୍ୟେକ ସାଇଟ୍ ପାଇଁ ଏକ ସ୍ଵତନ୍ତ୍ର ପାସୱାର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="7029809446516969842">ପାସୱାର୍ଡଗୁଡିକ</translation> -<translation id="7299100402441711551">ଠିକଣାଗୁଡ଼ିକ ଦେଖାନ୍ତୁ</translation> -<translation id="7494879913343971937">ପାସ୍ୱର୍ଡଗୁଡ଼ିକ ଦେଖାନ୍ତୁ</translation> <translation id="7594473730623999723">ଅଧିକ ପରାମର୍ଶ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ</translation> <translation id="7992095260806105436">Chromeର ସ୍ୱତଃପୂରଣ ପରାମର୍ଶ ବ୍ୟବହାର କରନ୍ତୁ</translation> -<translation id="8037472847879765671">ପେମେଣ୍ଟ ପଦ୍ଧତି ଦେଖାନ୍ତୁ</translation> <translation id="8507520749471379845">ପାସ୍ୱାର୍ଡ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="8705308553596171387">କୌଣସି ପାସୱାର୍ଡ ନାହିଁ</translation> <translation id="879180780857354295">କୀବୋର୍ଡ ଉପରେ ବୈକଳ୍ପିକ ଭାବେ ପୂରଣ କରିବାର ବିକଳ୍ପ ଉପଲବ୍ଧ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pa.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pa.xtb index c25d3d8b..4d23dad2 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pa.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pa.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="pa"> <translation id="1383876407941801731">ਖੋਜੋ</translation> -<translation id="1566281227936819866">ਰੱਖਿਅਤ ਕੀਤੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦਿਖਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ</translation> <translation id="1717486229951421299">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਅੱਧੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="207576718733492531">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਹੈ।</translation> <translation id="2610239185026711824">ਪਾਸਵਰਡ ਸੁਝਾਓ</translation> <translation id="2652129567809778422">ਪਾਸਵਰਡ ਚੁਣੋ</translation> -<translation id="2803478378562657435">ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਅਤੇ ਪਾਸਵਰਡ ਵਿਕਲਪਾਂ ਨੂੰ ਦਿਖਾ ਰਿਹਾ ਹੈ</translation> <translation id="2903493209154104877">ਪਤੇ</translation> <translation id="3399357656427473483">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ</translation> <translation id="3688051737190211318">ਜੇ ਤੁਹਾਨੂੰ <ph name="ORIGIN" /> 'ਤੇ ਭਰੋਸਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵਰਤ ਸਕਦੇ ਹੋ</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">ਕੀ-ਬੋਰਡ ਦਿਖਾਓ</translation> <translation id="4694050069269396220">ਜੇ ਤੁਹਾਨੂੰ <ph name="ORIGIN" /> 'ਤੇ ਭਰੋਸਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਸਾਈਟ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵਰਤ ਸਕਦੇ ਹੋ।</translation> <translation id="5016175294846053194">ਆਟੋਫਿਲ ਸੁਝਾਅ ਕੀ-ਬੋਰਡ ਉੱਪਰ ਉਪਲਬਧ ਹਨ</translation> -<translation id="5088366526685584589">ਰੱਖਿਅਤ ਪਤੇ ਦਿਖਾਏ ਜਾ ਰਹੇ ਹਨ</translation> <translation id="5441504010984421144">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="6393156038355142111">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਸੁਝਾਓ</translation> <translation id="6558703547256592471">ਹਰੇਕ ਸਾਈਟ ਲਈ ਇੱਕ ਵਿਲੱਖਣ ਪਾਸਵਰਡ ਵਰਤ ਕੇ ਦੇਖੋ।</translation> <translation id="7029809446516969842">ਪਾਸਵਰਡ</translation> -<translation id="7299100402441711551">ਪਤੇ ਦਿਖਾਓ</translation> -<translation id="7494879913343971937">ਪਾਸਵਰਡ ਦਿਖਾਓ</translation> <translation id="7594473730623999723">ਹੋਰ ਸੁਝਾਅ ਦੇਖਣ ਲਈ ਸਵਾਈਪ ਕਰੋ</translation> <translation id="7992095260806105436">Chrome ਆਟੋਫਿਲ ਸੁਝਾਅ ਵਰਤੋ</translation> -<translation id="8037472847879765671">ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦਿਖਾਓ</translation> <translation id="8507520749471379845">ਪਾਸਵਰਡ ਉਪਲਬਧ ਹਨ</translation> <translation id="8705308553596171387">ਕੋਈ ਪਾਸਵਰਡ ਨਹੀਂ</translation> <translation id="879180780857354295">ਜਾਣਕਾਰੀ ਭਰਨ ਵਾਲੇ ਵਿਕਲਪਿਕ ਵਿਕਲਪ ਕੀ-ਬੋਰਡ ਦੇ ਉੱਪਰ ਉਪਲਬਧ ਹਨ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb index 01b1b85..169b8229 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="pl"> <translation id="1383876407941801731">Szukaj</translation> -<translation id="1566281227936819866">Pokazuję zapisane formy płatności</translation> <translation id="1717486229951421299">Lista uprawnień do wypełnienia po kliknięciu jest otwarta do połowy wysokości.</translation> <translation id="207576718733492531">Lista uprawnień do wypełnienia po kliknięciu jest zamknięta.</translation> <translation id="2610239185026711824">Zaproponuj hasło</translation> <translation id="2652129567809778422">Wybierz hasło</translation> -<translation id="2803478378562657435">Wyświetlam zapisane hasła i opcje haseł</translation> <translation id="2903493209154104877">Adresy</translation> <translation id="3399357656427473483">Lista uprawnień do wypełnienia po kliknięciu.</translation> <translation id="3688051737190211318">Jeśli ufasz stronie <ph name="ORIGIN" />, możesz użyć zapisanego hasła, aby się zalogować.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Pokaż klawiaturę</translation> <translation id="4694050069269396220">Jeśli ufasz stronie <ph name="ORIGIN" />, możesz użyć zapisanego hasła z innej witryny.</translation> <translation id="5016175294846053194">Nad klawiaturą dostępne są sugestie autouzupełniania</translation> -<translation id="5088366526685584589">Pokazuję zapisane adresy</translation> <translation id="5441504010984421144">Lista uprawnień do wypełnienia po kliknięciu jest otwarta na całą wysokość.</translation> <translation id="6393156038355142111">Zaproponuj silne hasło</translation> <translation id="6558703547256592471">Postaraj się używać innego hasła w każdej witrynie.</translation> <translation id="7029809446516969842">Hasła</translation> -<translation id="7299100402441711551">Pokaż adresy</translation> -<translation id="7494879913343971937">Pokazuj hasła</translation> <translation id="7594473730623999723">Przesuń palcem, by zobaczyć więcej sugestii</translation> <translation id="7992095260806105436">Użyj sugestii autouzupełniania Chrome</translation> -<translation id="8037472847879765671">Pokaż formy płatności</translation> <translation id="8507520749471379845">Dostępne są hasła</translation> <translation id="8705308553596171387">Brak hasła</translation> <translation id="879180780857354295">Nad klawiaturą dostępne są alternatywne opcje wypełnienia</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-BR.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-BR.xtb index 8ed2b5e..9ac81d6 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-BR.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-BR.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="pt-BR"> <translation id="1383876407941801731">Pesquisar</translation> -<translation id="1566281227936819866">Mostrando formas de pagamento salvas</translation> <translation id="1717486229951421299">Lista de credenciais a serem preenchidas por toque aberta na metade da altura.</translation> <translation id="207576718733492531">A lista de credenciais a serem preenchidas por toque está fechada.</translation> <translation id="2610239185026711824">Sugerir senha</translation> <translation id="2652129567809778422">Selecionar senha</translation> -<translation id="2803478378562657435">Mostrando as senhas salvas e as opções de senha</translation> <translation id="2903493209154104877">Endereços</translation> <translation id="3399357656427473483">Lista de credenciais a serem preenchidas por toque.</translation> <translation id="3688051737190211318">Se você confia em <ph name="ORIGIN" />, pode usar uma senha salva para fazer login</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostrar teclado</translation> <translation id="4694050069269396220">Se você confia em <ph name="ORIGIN" />, use uma senha salva para outro site.</translation> <translation id="5016175294846053194">Sugestões do preenchimento automático disponíveis acima do teclado</translation> -<translation id="5088366526685584589">Mostrando endereços salvos</translation> <translation id="5441504010984421144">Lista de credenciais a serem preenchidas por toque aberta no tamanho máximo.</translation> <translation id="6393156038355142111">Sugerir senha forte</translation> <translation id="6558703547256592471">Tente usar uma senha exclusiva para cada site.</translation> <translation id="7029809446516969842">Senhas</translation> -<translation id="7299100402441711551">Mostrar endereços</translation> -<translation id="7494879913343971937">Mostrar senhas</translation> <translation id="7594473730623999723">Deslize para ver mais sugestões</translation> <translation id="7992095260806105436">Usar a sugestão de preenchimento automático do Chrome</translation> -<translation id="8037472847879765671">Mostrar formas de pagamento</translation> <translation id="8507520749471379845">Senhas disponíveis</translation> <translation id="8705308553596171387">Nenhuma senha</translation> <translation id="879180780857354295">Opções alternativas de preenchimento disponíveis acima do teclado</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb index 5372f45..75d6032 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="pt-PT"> <translation id="1383876407941801731">Pesquisar</translation> -<translation id="1566281227936819866">A mostrar métodos de pagamento guardados…</translation> <translation id="1717486229951421299">Lista de credenciais a preencher com o toque aberta a meia altura.</translation> <translation id="207576718733492531">A lista de credenciais a preencher com o toque está fechada.</translation> <translation id="2610239185026711824">Sugerir palavra-passe</translation> <translation id="2652129567809778422">Selecione a palavra-passe</translation> -<translation id="2803478378562657435">A mostrar palavras-passe guardadas e opções de palavra-passe</translation> <translation id="2903493209154104877">Moradas</translation> <translation id="3399357656427473483">Lista de credenciais a preencher com o toque.</translation> <translation id="3688051737190211318">Se confiar em <ph name="ORIGIN" />, pode usar uma palavra-passe guardada para iniciar sessão</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Mostrar teclado</translation> <translation id="4694050069269396220">Se confiar em <ph name="ORIGIN" />, pode utilizar uma palavra-passe guardada para outro site.</translation> <translation id="5016175294846053194">Sugestões do preenchimento automático disponíveis acima do teclado.</translation> -<translation id="5088366526685584589">A mostrar endereços guardados</translation> <translation id="5441504010984421144">Lista de credenciais a preencher com o toque aberta em ecrã cheio.</translation> <translation id="6393156038355142111">Sugerir palavra-passe forte</translation> <translation id="6558703547256592471">Experimente utilizar uma palavra-passe exclusiva para cada site.</translation> <translation id="7029809446516969842">Palavras-passe</translation> -<translation id="7299100402441711551">Mostrar endereços</translation> -<translation id="7494879913343971937">Mostrar palavras-passe</translation> <translation id="7594473730623999723">Deslize rapidamente para ver mais sugestões</translation> <translation id="7992095260806105436">Utilize as sugestões de preenchimento automático do Chrome.</translation> -<translation id="8037472847879765671">Mostrar métodos de pagamento</translation> <translation id="8507520749471379845">Palavras-passe disponíveis</translation> <translation id="8705308553596171387">Sem palavra-passe</translation> <translation id="879180780857354295">Opções de preenchimento alternativas disponíveis acima do teclado</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ro.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ro.xtb index 5f15eb8..f5c6fb58 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ro.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ro.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ro"> <translation id="1383876407941801731">Caută</translation> -<translation id="1566281227936819866">Se afișează metodele de plată salvate</translation> <translation id="1717486229951421299">Lista datelor de conectare care trebuie completate la atingere este deschisă la jumătate din înălțime.</translation> <translation id="207576718733492531">Lista datelor de conectare care trebuie completate la atingere s-a închis.</translation> <translation id="2610239185026711824">Sugerează o parolă</translation> <translation id="2652129567809778422">Selectează o parolă</translation> -<translation id="2803478378562657435">Se afișează parolele salvate și opțiunile pentru parole</translation> <translation id="2903493209154104877">Adrese</translation> <translation id="3399357656427473483">Lista datelor de conectare care trebuie completate la atingere.</translation> <translation id="3688051737190211318">Dacă ai încredere în <ph name="ORIGIN" />, poți folosi o parolă salvată pentru a te conecta</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Afișează tastatura</translation> <translation id="4694050069269396220">Dacă ai încredere în <ph name="ORIGIN" />, poți folosi o parolă salvată pentru alt site.</translation> <translation id="5016175294846053194">Completează automat sugestiile disponibile deasupra tastaturii</translation> -<translation id="5088366526685584589">Se afișează adresele salvate</translation> <translation id="5441504010984421144">Lista datelor de conectare care trebuie completate la atingere este deschisă la înălțimea completă.</translation> <translation id="6393156038355142111">Sugerează o parolă puternică</translation> <translation id="6558703547256592471">Folosește o parolă unică pentru fiecare site.</translation> <translation id="7029809446516969842">Parole</translation> -<translation id="7299100402441711551">Arată adresele</translation> -<translation id="7494879913343971937">Afișează parolele</translation> <translation id="7594473730623999723">Glisează pentru a vedea mai multe sugestii</translation> <translation id="7992095260806105436">Folosește sugestia de completare automată din Chrome</translation> -<translation id="8037472847879765671">Afișează metodele de plată</translation> <translation id="8507520749471379845">Parole disponibile</translation> <translation id="8705308553596171387">Nicio parolă</translation> <translation id="879180780857354295">Opțiuni de completare alternative disponibile deasupra tastaturii</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ru.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ru.xtb index c7860df8..f1daaef3 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ru.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ru.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ru"> <translation id="1383876407941801731">Поиск</translation> -<translation id="1566281227936819866">Показаны сохраненные способы оплаты</translation> <translation id="1717486229951421299">Список учетных данных, которые можно ввести прикосновением, развернут на половину экрана.</translation> <translation id="207576718733492531">Список учетных данных, которые можно ввести прикосновением, закрыт.</translation> <translation id="2610239185026711824">Сгенерировать пароль</translation> <translation id="2652129567809778422">Выберите пароль</translation> -<translation id="2803478378562657435">На экране показаны сохраненные пароли и настройки паролей</translation> <translation id="2903493209154104877">Адреса</translation> <translation id="3399357656427473483">Список учетных данных, которые можно ввести прикосновением.</translation> <translation id="3688051737190211318">Если вы доверяете сайту <ph name="ORIGIN" />, то можете использовать для входа сохраненный пароль.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Показать клавиатуру</translation> <translation id="4694050069269396220">Если вы доверяете сайту <ph name="ORIGIN" />, то можете использовать для него сохраненный пароль из другого сервиса.</translation> <translation id="5016175294846053194">Над клавиатурой доступны варианты заполнения</translation> -<translation id="5088366526685584589">Показаны сохраненные адреса</translation> <translation id="5441504010984421144">Список учетных данных, которые можно ввести прикосновением, развернут на весь экран.</translation> <translation id="6393156038355142111">Сгенерировать надежный пароль</translation> <translation id="6558703547256592471">Для каждого сайта желательно использовать уникальный пароль.</translation> <translation id="7029809446516969842">Пароли</translation> -<translation id="7299100402441711551">Показать адреса</translation> -<translation id="7494879913343971937">Показать пароли</translation> <translation id="7594473730623999723">Проведите по экрану, чтобы увидеть другие подсказки</translation> <translation id="7992095260806105436">Использовать вариант автозаполнения, предложенный Chrome</translation> -<translation id="8037472847879765671">Показать способы оплаты</translation> <translation id="8507520749471379845">Доступные варианты паролей</translation> <translation id="8705308553596171387">Без пароля</translation> <translation id="879180780857354295">Над клавиатурой доступны другие варианты заполнения</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_si.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_si.xtb index b7c31d71..7e6120f8 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_si.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_si.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="si"> <translation id="1383876407941801731">සොයන්න</translation> -<translation id="1566281227936819866">සුරැකි ගෙවීම් ක්රම පෙන්වීම</translation> <translation id="1717486229951421299">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව අඩ උසින් විවෘත වී ඇත.</translation> <translation id="207576718733492531">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව වසා ඇත.</translation> <translation id="2610239185026711824">මුරපදය යෝජනා කරන්න</translation> <translation id="2652129567809778422">මුරපදය තෝරන්න</translation> -<translation id="2803478378562657435">සුරැකි මුරපද සහ මුරපද විකල්ප පෙන්වීම</translation> <translation id="2903493209154104877">ලිපින</translation> <translation id="3399357656427473483">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව.</translation> <translation id="3688051737190211318">ඔබ <ph name="ORIGIN" /> විශ්වාස කරන්නේ නම්, ඔබට පිරීමට සුරැකි මුරපදයක් භාවිත කළ හැකිය</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">යතුරු පුවරුව පෙන්වන්න</translation> <translation id="4694050069269396220">ඔබ <ph name="ORIGIN" /> විශ්වාස කරන්නේ නම්, ඔබට වෙනත් අඩවියකට සුරැකි මුරපදයක් භාවිත කළ හැකිය.</translation> <translation id="5016175294846053194">ස්වයංපිරවුම් යෝජනා යතුරු පුවරුවට ඉහළින් ලැබේ</translation> -<translation id="5088366526685584589">සුරැකි ලිපින පෙන්වීම</translation> <translation id="5441504010984421144">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව පූර්ණ උසින් විවෘත වී ඇත.</translation> <translation id="6393156038355142111">ප්රබල මුරපදයක් යෝජනා කරන්න</translation> <translation id="6558703547256592471">සෑම අඩවියකටම අනන්ය මුරපදයක් භාවිත කිරීමට උත්සාහ කරන්න.</translation> <translation id="7029809446516969842">මුරපද</translation> -<translation id="7299100402441711551">ලිපින පෙන්වන්න</translation> -<translation id="7494879913343971937">මුරපද පෙන්වන්න</translation> <translation id="7594473730623999723">තව යෝජනා බැලීමට ස්වයිප් කරන්න</translation> <translation id="7992095260806105436">Chrome ස්වයං පිරවුම් යෝජනාව භාවිත කරන්න</translation> -<translation id="8037472847879765671">ගෙවීමේ ක්රම පෙන්වන්න</translation> <translation id="8507520749471379845">මුරපද තිබේ</translation> <translation id="8705308553596171387">මුරපදයක් නැත</translation> <translation id="879180780857354295">යතුරු පුවරුවට ඉහළින් විකල්ප පිරවුම් විකල්ප තිබේ</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb index 57e9008..7cb3a028 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sk.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sk"> <translation id="1383876407941801731">Vyhľadávanie</translation> -<translation id="1566281227936819866">Zobrazujú sa uložené spôsoby platby</translation> <translation id="1717486229951421299">Zoznam prihlasovacích údajov na vyplnenie po klepnutí je otvorený na polovičnú výšku.</translation> <translation id="207576718733492531">Zoznam prihlasovacích údajov na vyplnenie po klepnutí je zatvorený.</translation> <translation id="2610239185026711824">Navrhnúť heslo</translation> <translation id="2652129567809778422">Vyberte heslo</translation> -<translation id="2803478378562657435">Zobrazujú sa uložené heslá a možnosti hesiel</translation> <translation id="2903493209154104877">Adresy</translation> <translation id="3399357656427473483">Zoznam prihlasovacích údajov na vyplnenie po klepnutí.</translation> <translation id="3688051737190211318">Ak považujete doménu <ph name="ORIGIN" /> za dôveryhodnú, môžete sa prihlásiť pomocou uloženého hesla</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Zobraziť klávesnicu</translation> <translation id="4694050069269396220">Ak považujete web <ph name="ORIGIN" /> za dôveryhodný, môžete použiť uložené heslo na inom webe.</translation> <translation id="5016175294846053194">Návrhy automatického dopĺňania sú k dispozícii nad klávesnicou</translation> -<translation id="5088366526685584589">Zobrazujú sa uložené adresy</translation> <translation id="5441504010984421144">Zoznam prihlasovacích údajov na vyplnenie po klepnutí je otvorený na úplnú výšku.</translation> <translation id="6393156038355142111">Navrhnúť silné heslo</translation> <translation id="6558703547256592471">Pre každý web skúste použiť jedinečné heslo.</translation> <translation id="7029809446516969842">Heslá</translation> -<translation id="7299100402441711551">Zobraziť adresy</translation> -<translation id="7494879913343971937">Zobrazovať heslá</translation> <translation id="7594473730623999723">Potiahnutím zobrazíte ďalšie návrhy</translation> <translation id="7992095260806105436">Použite návrh automtického dopĺňania v Chrome</translation> -<translation id="8037472847879765671">Zobraziť spôsoby platby</translation> <translation id="8507520749471379845">K dispozícii sú heslá</translation> <translation id="8705308553596171387">Žiadne heslo</translation> <translation id="879180780857354295">Alternatívne možnosti dopĺňania nad klávesnicou</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sl.xtb index 2e9c273..801b862 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sl.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sl.xtb
@@ -2,28 +2,22 @@ <!DOCTYPE translationbundle> <translationbundle lang="sl"> <translation id="1383876407941801731">Išči</translation> -<translation id="1566281227936819866">Prikaz shranjenih plačilnih sredstev</translation> <translation id="1717486229951421299">Seznam poverilnic, ki naj se izpolnijo ob dotiku, odprt pri polovični višini.</translation> <translation id="207576718733492531">Seznam poverilnic, ki naj se izpolnijo ob dotiku, je zaprt.</translation> <translation id="2610239185026711824">Predlagaj geslo</translation> <translation id="2652129567809778422">Izbira gesla</translation> -<translation id="2803478378562657435">Prikazovanje shranjenih gesel in možnosti za gesla</translation> <translation id="2903493209154104877">Naslovi</translation> <translation id="3399357656427473483">Seznam poverilnic, ki naj se izpolnijo ob dotiku.</translation> <translation id="3688051737190211318">Če zaupate izvoru <ph name="ORIGIN" />, lahko uporabite shranjeno geslo za prijavo.</translation> <translation id="4631649115723685955">Vključuje vračilo gotovine</translation> <translation id="4694050069269396220">Če zaupate izvoru <ph name="ORIGIN" />, lahko uporabite shranjeno geslo za drugo spletno mesto.</translation> <translation id="5016175294846053194">Predlogi samodejnega izpolnjevanja so na voljo nad tipkovnico</translation> -<translation id="5088366526685584589">Prikaz shranjenih naslovov</translation> <translation id="5441504010984421144">Seznam poverilnic, ki naj se izpolnijo ob dotiku, odprt pri polni višini.</translation> <translation id="6393156038355142111">Predlagaj zapleteno geslo</translation> <translation id="6558703547256592471">Poskusite uporabljati enolično geslo za vsako spletno mesto.</translation> <translation id="7029809446516969842">Gesla</translation> -<translation id="7299100402441711551">Pokaži naslove</translation> -<translation id="7494879913343971937">Prikaz gesel</translation> <translation id="7594473730623999723">Povlecite, če si želite ogledati več predlogov.</translation> <translation id="7992095260806105436">Uporabite Chromov predlog samodejnega izpolnjevanja</translation> -<translation id="8037472847879765671">Prikaz plačilnih sredstev</translation> <translation id="8507520749471379845">Gesla so na voljo</translation> <translation id="8705308553596171387">Brez gesla</translation> <translation id="879180780857354295">Druge možnosti izpolnjevanja so na voljo nad tipkovnico</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sq.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sq.xtb index a14edeb..e8b6e96 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sq.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sq.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sq"> <translation id="1383876407941801731">Kërko</translation> -<translation id="1566281227936819866">Po shfaq mënyrat e ruajtura të pagesës</translation> <translation id="1717486229951421299">Lista e kredencialeve për t'u plotësuar me prekje është hapur në gjysmë lartësi.</translation> <translation id="207576718733492531">Lista e kredencialeve për t'u plotësuar me prekje është mbyllur.</translation> <translation id="2610239185026711824">Sugjero fjalëkalim</translation> <translation id="2652129567809778422">Zgjidh fjalëkalimin</translation> -<translation id="2803478378562657435">Shfaqja e fjalëkalimeve të ruajtura dhe e opsioneve të fjalëkalimeve</translation> <translation id="2903493209154104877">Adresat</translation> <translation id="3399357656427473483">Lista e kredencialeve për t'u plotësuar me prekje.</translation> <translation id="3688051737190211318">Nëse ke besim te <ph name="ORIGIN" />, mund të përdorësh një fjalëkalim të ruajtur për t'u identifikuar</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Shfaq tastierën</translation> <translation id="4694050069269396220">Nëse ke besim te <ph name="ORIGIN" />, mund të përdorësh një fjalëkalim të ruajtur për një sajt tjetër.</translation> <translation id="5016175294846053194">Sugjerimet për plotësimin automatik ofrohen mbi tastierë</translation> -<translation id="5088366526685584589">Po shfaq adresat e ruajtura</translation> <translation id="5441504010984421144">Lista e kredencialeve për t'u plotësuar me prekje është hapur në lartësi të plotë.</translation> <translation id="6393156038355142111">Sugjero fjalëkalim të fortë</translation> <translation id="6558703547256592471">Provo të përdorësh një fjalëkalim unik për çdo sajt.</translation> <translation id="7029809446516969842">Fjalëkalimet</translation> -<translation id="7299100402441711551">Shfaq adresat</translation> -<translation id="7494879913343971937">Shfaq fjalëkalimet</translation> <translation id="7594473730623999723">Rrëshqit shpejt për të parë më shumë sugjerime</translation> <translation id="7992095260806105436">Përdor sugjerimin për plotësimin automatik të Chrome</translation> -<translation id="8037472847879765671">Shfaq mënyrat e pagesës</translation> <translation id="8507520749471379845">Fjalëkalimet që ofrohen</translation> <translation id="8705308553596171387">Pa fjalëkalim</translation> <translation id="879180780857354295">Opsionet alternative të mbushjes ofrohen mbi tastierë</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr-Latn.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr-Latn.xtb index 7361861..514bfb2 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr-Latn.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr-Latn.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr-Latn"> <translation id="1383876407941801731">Pretraži</translation> -<translation id="1566281227936819866">Prikazuju se sačuvani načini plaćanja</translation> <translation id="1717486229951421299">Lista akreditiva koji treba da se unesu na dodir se otvorila do polovine ekrana.</translation> <translation id="207576718733492531">Lista akreditiva koji treba da se unesu na dodir je zatvorena.</translation> <translation id="2610239185026711824">Predloži lozinku</translation> <translation id="2652129567809778422">Izaberite lozinku</translation> -<translation id="2803478378562657435">Prikazuju se sačuvane lozinke i opcije za lozinke</translation> <translation id="2903493209154104877">Adrese</translation> <translation id="3399357656427473483">Lista akreditiva koji treba da se unesu na dodir.</translation> <translation id="3688051737190211318">Ako veb-sajt <ph name="ORIGIN" /> smatrate pouzdanim, možete da koristite sačuvanu lozinku za prijavljivanje</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Prikaži tastaturu</translation> <translation id="4694050069269396220">Ako veb-sajt <ph name="ORIGIN" /> smatrate pouzdanim, možete da koristite sačuvanu lozinku za drugi sajt.</translation> <translation id="5016175294846053194">Predlozi za automatsko popunjavanje su dostupni iznad tastature</translation> -<translation id="5088366526685584589">Prikazuju se sačuvane adrese</translation> <translation id="5441504010984421144">Lista akreditiva koji treba da se unesu na dodir se otvorila na celom ekranu,</translation> <translation id="6393156038355142111">Predloži jaku lozinku</translation> <translation id="6558703547256592471">Potrudite se da koristite jedinstvenu lozinku za svaki sajt.</translation> <translation id="7029809446516969842">Lozinke</translation> -<translation id="7299100402441711551">Prikaži adrese</translation> -<translation id="7494879913343971937">Prikazuj lozinke</translation> <translation id="7594473730623999723">Prevucite da biste videli još predloga</translation> <translation id="7992095260806105436">Koristite predlog Chrome automatskog popunjavanja</translation> -<translation id="8037472847879765671">Prikaži načine plaćanja</translation> <translation id="8507520749471379845">Dostupne su lozinke</translation> <translation id="8705308553596171387">Bez lozinke</translation> <translation id="879180780857354295">Alternativne opcije popunjavanja su dostupne iznad tastature</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr.xtb index d61feda..9bf006f 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sr.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr"> <translation id="1383876407941801731">Претражи</translation> -<translation id="1566281227936819866">Приказују се сачувани начини плаћања</translation> <translation id="1717486229951421299">Листа акредитива који треба да се унесу на додир се отворила до половине екрана.</translation> <translation id="207576718733492531">Листа акредитива који треба да се унесу на додир је затворена.</translation> <translation id="2610239185026711824">Предложи лозинку</translation> <translation id="2652129567809778422">Изаберите лозинку</translation> -<translation id="2803478378562657435">Приказују се сачуване лозинке и опције за лозинке</translation> <translation id="2903493209154104877">Адресе</translation> <translation id="3399357656427473483">Листа акредитива који треба да се унесу на додир.</translation> <translation id="3688051737190211318">Ако веб-сајт <ph name="ORIGIN" /> сматрате поузданим, можете да користите сачувану лозинку за пријављивање</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Прикажи тастатуру</translation> <translation id="4694050069269396220">Ако веб-сајт <ph name="ORIGIN" /> сматрате поузданим, можете да користите сачувану лозинку за други сајт.</translation> <translation id="5016175294846053194">Предлози за аутоматско попуњавање су доступни изнад тастатуре</translation> -<translation id="5088366526685584589">Приказују се сачуване адресе</translation> <translation id="5441504010984421144">Листа акредитива који треба да се унесу на додир се отворила на целом екрану,</translation> <translation id="6393156038355142111">Предложи јаку лозинку</translation> <translation id="6558703547256592471">Потрудите се да користите јединствену лозинку за сваки сајт.</translation> <translation id="7029809446516969842">Лозинке</translation> -<translation id="7299100402441711551">Прикажи адресе</translation> -<translation id="7494879913343971937">Приказуј лозинке</translation> <translation id="7594473730623999723">Превуците да бисте видели још предлога</translation> <translation id="7992095260806105436">Користите предлог Chrome аутоматског попуњавања</translation> -<translation id="8037472847879765671">Прикажи начине плаћања</translation> <translation id="8507520749471379845">Доступне су лозинке</translation> <translation id="8705308553596171387">Без лозинке</translation> <translation id="879180780857354295">Алтернативне опције попуњавања су доступне изнад тастатуре</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb index 617cff19..437dfab 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sv.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sv"> <translation id="1383876407941801731">Sök</translation> -<translation id="1566281227936819866">Sparade betalningsmetoder visas</translation> <translation id="1717486229951421299">Listan över användaruppgifter som ska fyllas i med ett tryck har öppnats över halva skärmen.</translation> <translation id="207576718733492531">Listan över användaruppgifter som ska fyllas i med ett tryck är stängd.</translation> <translation id="2610239185026711824">Föreslå lösenord</translation> <translation id="2652129567809778422">Välj lösenord</translation> -<translation id="2803478378562657435">Sparade lösenord och lösenordsalternativ visas</translation> <translation id="2903493209154104877">Adresser</translation> <translation id="3399357656427473483">Lista över användaruppgifter som ska fyllas i med ett tryck.</translation> <translation id="3688051737190211318">Om du litar på <ph name="ORIGIN" /> kan du använda ett sparat lösenord när du loggar in.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Visa tangentbord</translation> <translation id="4694050069269396220">Om du litar på <ph name="ORIGIN" /> kan du använda ett lösenord du sparat för en annan webbplats.</translation> <translation id="5016175294846053194">Det finns tillgängliga förslag från autofyll ovanför tangentbordet</translation> -<translation id="5088366526685584589">Visa sparade adresser</translation> <translation id="5441504010984421144">Listan över användaruppgifter som ska fyllas i med ett tryck har öppnats över hela skärmen.</translation> <translation id="6393156038355142111">Föreslå ett starkt lösenord</translation> <translation id="6558703547256592471">Sträva efter att använda ett unikt lösenord för varje webbplats.</translation> <translation id="7029809446516969842">Lösenord</translation> -<translation id="7299100402441711551">Visa adresser</translation> -<translation id="7494879913343971937">Visa lösenord</translation> <translation id="7594473730623999723">Svep om du vill se fler förslag</translation> <translation id="7992095260806105436">Använd förslag från Autofyll i Chrome</translation> -<translation id="8037472847879765671">Visa betalningsmetoder</translation> <translation id="8507520749471379845">Lösenord finns tillgängliga</translation> <translation id="8705308553596171387">Inget lösenord</translation> <translation id="879180780857354295">Alternativa fyllnadsalternativ är tillgängliga ovanför tangentbordet</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb index 9d1dc501..fb7b40e 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_sw.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="sw"> <translation id="1383876407941801731">Tafuta</translation> -<translation id="1566281227936819866">Inaonyesha njia za kulipa ulizohifadhi</translation> <translation id="1717486229951421299">Orodha ya vitambulisho vya kujaza kwa kugusa imefunguliwa kwenye nusu ya skrini.</translation> <translation id="207576718733492531">Orodha ya vitambulisho vya kujaza kwa kugusa imefungwa.</translation> <translation id="2610239185026711824">Pendekeza nenosiri</translation> <translation id="2652129567809778422">Chagua nenosiri</translation> -<translation id="2803478378562657435">Inaonyesha manenosiri yaliyohifadhiwa na chaguo za manenosiri</translation> <translation id="2903493209154104877">Anwani</translation> <translation id="3399357656427473483">Orodha ya vitambulisho vya kujaza kwa kugusa.</translation> <translation id="3688051737190211318">Ikiwa unaiamini <ph name="ORIGIN" />, unaweza kutumia nenosiri ulilohifadhi ili uingie katika akaunti</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Onyesha kibodi</translation> <translation id="4694050069269396220">Ikiwa unaiamini <ph name="ORIGIN" />, unaweza kutumia nenosiri la tovuti nyingine ulilohifadhi.</translation> <translation id="5016175294846053194">Mapendekezo ya kujaza kiotomatiki yanapatikana juu ya kibodi</translation> -<translation id="5088366526685584589">Inaonyesha anwani zilizohifadhiwa</translation> <translation id="5441504010984421144">Orodha ya vitambulisho vya kujaza kwa kugusa imefunguliwa kwenye skrini nzima.</translation> <translation id="6393156038355142111">Pendekeza nenosiri thabiti</translation> <translation id="6558703547256592471">Jaribu kutumia nenosiri la kipekee kwa kila tovuti.</translation> <translation id="7029809446516969842">Manenosiri</translation> -<translation id="7299100402441711551">Onyesha Anwani</translation> -<translation id="7494879913343971937">Onyesha manenosiri</translation> <translation id="7594473730623999723">Telezesha kidole ili uone mapendekezo zaidi</translation> <translation id="7992095260806105436">Tumia pendekezo la kujaza kiotomatiki la Chrome</translation> -<translation id="8037472847879765671">Onyesha njia za kulipa</translation> <translation id="8507520749471379845">Manenosiri yanapatikana</translation> <translation id="8705308553596171387">Hakuna nenosiri</translation> <translation id="879180780857354295">Chaguo mbadala za kujaza zinapatikana juu ya kibodi</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb index f727c16..4b729a7b 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ta.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ta"> <translation id="1383876407941801731">Search</translation> -<translation id="1566281227936819866">சேமித்துள்ள கட்டண முறைகளைக் காட்டுகிறது</translation> <translation id="1717486229951421299">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல் பாதித் திரையில் திறக்கப்பட்டுள்ளது.</translation> <translation id="207576718733492531">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல் மூடப்பட்டுள்ளது.</translation> <translation id="2610239185026711824">கடவுச்சொல்லைப் பரிந்துரை</translation> <translation id="2652129567809778422">கடவுச்சொல்லைத் தேர்ந்தெடுங்கள்</translation> -<translation id="2803478378562657435">சேமித்த கடவுச்சொற்களையும் கடவுச்சொல் விருப்பங்களையும் காண்பிக்கிறது</translation> <translation id="2903493209154104877">முகவரிகள்</translation> <translation id="3399357656427473483">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல்.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> தளம் நம்பகமானது என நீங்கள் கருதினால் சேமித்த கடவுச்சொல்லை உள்நுழைவதற்குப் பயன்படுத்தலாம்</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">விசைப்பலகையைக் காட்டு</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> என்பது நம்பகமான தளம் என்று நீங்கள் கருதினால், சேமித்த ஒரு கடவுச்சொல்லை வேறொரு தளத்தில் பயன்படுத்தலாம்.</translation> <translation id="5016175294846053194">கீபோர்டுக்கு மேலே தன்னிரப்பிப் பரிந்துரைகள் உள்ளன</translation> -<translation id="5088366526685584589">சேமித்த முகவரிகளைக் காட்டுகிறது</translation> <translation id="5441504010984421144">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல் முழுத் திரையில் திறக்கப்பட்டுள்ளது.</translation> <translation id="6393156038355142111">வலுவான கடவுச்சொல்லைப் பரிந்துரை</translation> <translation id="6558703547256592471">ஒவ்வொரு தளத்திற்கும் தனித்துவமான கடவுச்சொல்லைப் பயன்படுத்த முயலவும்.</translation> <translation id="7029809446516969842">கடவுச்சொற்கள்</translation> -<translation id="7299100402441711551">முகவரிகளைக் காட்டும்</translation> -<translation id="7494879913343971937">கடவுச்சொற்களைக் காட்டும்</translation> <translation id="7594473730623999723">மேலும் பரிந்துரைகளைப் பார்க்க ஸ்வைப் செய்யவும்</translation> <translation id="7992095260806105436">Chromeமின் தன்னிரப்பிப் பரிந்துரையைப் பயன்படுத்துங்கள்</translation> -<translation id="8037472847879765671">கட்டண முறைகளைக் காட்டும்</translation> <translation id="8507520749471379845">கடவுச்சொற்கள் உள்ளன</translation> <translation id="8705308553596171387">கடவுச்சொல் இல்லை</translation> <translation id="879180780857354295">மாற்று நிரப்புதல் விருப்பங்கள் கீபோர்டுக்கு மேலே உள்ளன</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_te.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_te.xtb index 6713c41c..0b36886 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_te.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_te.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="te"> <translation id="1383876407941801731">సెర్చ్</translation> -<translation id="1566281227936819866">సేవ్ చేసిన పేమెంట్ ఆప్షన్లను చూపుతోంది</translation> <translation id="1717486229951421299">'టచ్ చేసి నింపాల్సిన ఆధారాల లిస్ట్' సగం ఎత్తులో తెరవబడింది.</translation> <translation id="207576718733492531">'టచ్ చేసి నింపాల్సిన ఆధారాల లిస్ట్' మూసివేయబడింది.</translation> <translation id="2610239185026711824">పాస్వర్డ్ని సూచించు</translation> <translation id="2652129567809778422">పాస్వర్డ్ను ఎంచుకోండి</translation> -<translation id="2803478378562657435">సేవ్ చేసిన పాస్వర్డ్లు మరియు పాస్వర్డ్ ఎంపికలను చూపిస్తోంది</translation> <translation id="2903493209154104877">అడ్రస్లు</translation> <translation id="3399357656427473483">'టచ్ చేసి నింపాల్సిన ఆధారాల లిస్ట్'.</translation> <translation id="3688051737190211318">మీకు <ph name="ORIGIN" /> మీద నమ్మకం ఉంటే, సైన్ ఇన్ చేయడం కోసం మీరు సేవ్ చేసిన పాస్ట్వర్డ్ను ఉపయోగించవచ్చు</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">కీబోర్డ్ను చూపు</translation> <translation id="4694050069269396220">మీకు <ph name="ORIGIN" /> మీద నమ్మకం ఉంటే, ఇదివరకే సేవ్ చేసిన మీ పాస్వర్డ్ను మీరు మరొక సైట్కు ఉపయోగించవచ్చు.</translation> <translation id="5016175294846053194">కీబోర్డ్ పైభాగాన స్వీయ పూరణ సూచనలు అందుబాటులో ఉన్నాయి</translation> -<translation id="5088366526685584589">సేవ్ చేసిన అడ్రస్లను చూపుతోంది</translation> <translation id="5441504010984421144">'టచ్ చేసి నింపాల్సిన ఆధారాల లిస్ట్' పూర్తి ఎత్తులో తెరవబడింది.</translation> <translation id="6393156038355142111">శక్తివంతమైన పాస్వర్డ్ని సూచించు</translation> <translation id="6558703547256592471">ప్రతి సైట్కు ఒక విభిన్నమైన పాస్వర్డ్ను ఉపయోగించడానికి ట్రై చేయండి.</translation> <translation id="7029809446516969842">పాస్వర్డ్లు</translation> -<translation id="7299100402441711551">అడ్రస్లను చూపుతుంది</translation> -<translation id="7494879913343971937">పాస్వర్డ్లను చూపుతుంది</translation> <translation id="7594473730623999723">మరిన్ని సూచనలను చూడటం కోసం స్వైప్ చేయండి</translation> <translation id="7992095260806105436">Chrome ఆటోఫిల్ సూచనను ఉపయోగించండి</translation> -<translation id="8037472847879765671">పేమెంట్ ఆప్షన్లను చూపుతుంది</translation> <translation id="8507520749471379845">అందుబాటులో ఉన్న పాస్వర్డ్లు</translation> <translation id="8705308553596171387">పాస్వర్డ్ ఏదీ లేదు</translation> <translation id="879180780857354295">ప్రత్యామ్నాయంగా పూరించే ఆప్షన్లు కీబోర్డ్ పైన అందుబాటులో ఉన్నాయి</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_th.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_th.xtb index 17bf91b9..dfa191b 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_th.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_th.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="th"> <translation id="1383876407941801731">ค้นหา</translation> -<translation id="1566281227936819866">กำลังแสดงวิธีการชำระเงินที่บันทึกไว้</translation> <translation id="1717486229951421299">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะเปิดอยู่ที่ระดับความสูงครึ่งหนึ่งของหน้าจอ</translation> <translation id="207576718733492531">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะปิดอยู่</translation> <translation id="2610239185026711824">แนะนำรหัสผ่าน</translation> <translation id="2652129567809778422">เลือกรหัสผ่าน</translation> -<translation id="2803478378562657435">กำลังแสดงรหัสผ่านที่บันทึกไว้และตัวเลือกรหัสผ่าน</translation> <translation id="2903493209154104877">ที่อยู่</translation> <translation id="3399357656427473483">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะ</translation> <translation id="3688051737190211318">หากคุณเชื่อถือ <ph name="ORIGIN" /> ก็ใช้รหัสผ่านที่บันทึกไว้ในการลงชื่อเข้าใช้ได้</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">แสดงแป้นพิมพ์</translation> <translation id="4694050069269396220">หากคุณเชื่อถือ <ph name="ORIGIN" /> ก็ใช้รหัสผ่านที่บันทึกไว้กับเว็บไซต์อื่นได้</translation> <translation id="5016175294846053194">คำแนะนำในการป้อนข้อความอัตโนมัติแสดงอยู่เหนือแป้นพิมพ์</translation> -<translation id="5088366526685584589">กำลังแสดงที่อยู่ที่บันทึกไว้</translation> <translation id="5441504010984421144">รายการข้อมูลเข้าสู่ระบบที่จะกรอกเมื่อแตะเปิดอยู่ที่ระดับความสูงเต็มหน้าจอ</translation> <translation id="6393156038355142111">แนะนำรหัสผ่านที่รัดกุม</translation> <translation id="6558703547256592471">ขอแนะนำให้ใช้รหัสผ่านที่ไม่ซ้ำกันสำหรับทุกเว็บไซต์</translation> <translation id="7029809446516969842">รหัสผ่าน</translation> -<translation id="7299100402441711551">แสดงที่อยู่</translation> -<translation id="7494879913343971937">แสดงรหัสผ่าน</translation> <translation id="7594473730623999723">เลื่อนเพื่อดูคำแนะนำเพิ่มเติม</translation> <translation id="7992095260806105436">ใช้คำแนะนำการป้อนข้อความอัตโนมัติใน Chrome</translation> -<translation id="8037472847879765671">แสดงวิธีการชำระเงิน</translation> <translation id="8507520749471379845">รหัสผ่านที่มีอยู่</translation> <translation id="8705308553596171387">ไม่มีรหัสผ่าน</translation> <translation id="879180780857354295">ตัวเลือกการกรอกอื่นๆ แสดงอยู่เหนือแป้นพิมพ์</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb index 97804e6..a168def 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_tr.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="tr"> <translation id="1383876407941801731">Ara</translation> -<translation id="1566281227936819866">Kayıtlı ödeme yöntemleri</translation> <translation id="1717486229951421299">Dokunarak doldurulacak kimlik bilgisi listesi ekranın yarısında açıldı.</translation> <translation id="207576718733492531">Dokunarak doldurulacak kimlik bilgisi listesi kapatıldı.</translation> <translation id="2610239185026711824">Şifre öner</translation> <translation id="2652129567809778422">Şifre'yi seçin</translation> -<translation id="2803478378562657435">Kayıtlı şifreler ve şifre seçenekleri gösteriliyor</translation> <translation id="2903493209154104877">Adresler</translation> <translation id="3399357656427473483">Dokunarak doldurulacak kimlik bilgisi listesi.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> kaynağına güveniyorsanız kayıtlı bir şifre kullanarak oturum açabilirsiniz</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Klavyeyi göster</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> sitesine güveniyorsanız başka bir site için kaydedilmiş şifreyi kullanabilirsiniz.</translation> <translation id="5016175294846053194">Klavyenin üzerinde otomatik doldurma önerileri mevcut</translation> -<translation id="5088366526685584589">Kayıtlı adresler gösteriliyor</translation> <translation id="5441504010984421144">Dokunarak doldurulacak kimlik bilgisi listesi tam ekranda açıldı.</translation> <translation id="6393156038355142111">Güçlü şifre öner</translation> <translation id="6558703547256592471">Her site için benzersiz bir şifre kullanmaya çalışın.</translation> <translation id="7029809446516969842">Şifreler</translation> -<translation id="7299100402441711551">Adresleri Göster</translation> -<translation id="7494879913343971937">Şifreleri göster</translation> <translation id="7594473730623999723">Diğer önerileri görmek için kaydırın</translation> <translation id="7992095260806105436">Chrome otomatik doldurma önerisini kullan</translation> -<translation id="8037472847879765671">Ödeme yöntemlerini göster</translation> <translation id="8507520749471379845">Kullanılabilir şifreler</translation> <translation id="8705308553596171387">Şifre yok</translation> <translation id="879180780857354295">Klavyenin üzerinde alternatif doldurma seçenekleri mevcut</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uk.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uk.xtb index 068eb58..40490ff5 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uk.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uk.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="uk"> <translation id="1383876407941801731">Пошук</translation> -<translation id="1566281227936819866">Показано збережені способи оплати</translation> <translation id="1717486229951421299">Список облікових даних, які вставляються дотиком, відкрито на половину висоти екрана.</translation> <translation id="207576718733492531">Список облікових даних, які вставляються дотиком, закритий.</translation> <translation id="2610239185026711824">Запропонувати пароль</translation> <translation id="2652129567809778422">Вибрати пароль</translation> -<translation id="2803478378562657435">Показано збережені паролі та їх параметри</translation> <translation id="2903493209154104877">Адреси</translation> <translation id="3399357656427473483">Список облікових даних, які вставляються дотиком.</translation> <translation id="3688051737190211318">Якщо ви довіряєте сайту <ph name="ORIGIN" />, то можете входити за допомогою збереженого пароля</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Показати клавіатуру</translation> <translation id="4694050069269396220">Якщо ви довіряєте сайту <ph name="ORIGIN" />, то можете скористатися збереженим паролем для іншого сайту.</translation> <translation id="5016175294846053194">Над клавіатурою показано пропозиції автозаповнення</translation> -<translation id="5088366526685584589">Показано збережені адреси</translation> <translation id="5441504010984421144">Список облікових даних, які вставляються дотиком, відкрито на всю висоту екрана.</translation> <translation id="6393156038355142111">Запропонувати надійний пароль</translation> <translation id="6558703547256592471">Намагайтеся використовувати для кожного сайту унікальний пароль.</translation> <translation id="7029809446516969842">Паролі</translation> -<translation id="7299100402441711551">Показати адреси</translation> -<translation id="7494879913343971937">Показати паролі</translation> <translation id="7594473730623999723">Гортайте, щоб переглянути інші пропозиції</translation> <translation id="7992095260806105436">Використати пропозицію автозаповнення Chrome</translation> -<translation id="8037472847879765671">Показати способи оплати</translation> <translation id="8507520749471379845">Доступні паролі</translation> <translation id="8705308553596171387">Немає пароля</translation> <translation id="879180780857354295">Над клавіатурою показано альтернативні варіанти заповнення</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ur.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ur.xtb index e6d95dee..f3872ed 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ur.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_ur.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="ur"> <translation id="1383876407941801731">تلاش کریں</translation> -<translation id="1566281227936819866">ادائیگی کے محفوظ کردہ طریقے دکھائے جا رہے ہیں</translation> <translation id="1717486229951421299">ٹچ پر پُر کی جانے والی اسناد کی فہرست نصف اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="207576718733492531">ٹچ پر پُر کی جانے والی اسناد کی فہرست بند ہے۔</translation> <translation id="2610239185026711824">پاس ورڈ تجویز کریں</translation> <translation id="2652129567809778422">پاس ورڈ منتخب کریں</translation> -<translation id="2803478378562657435">محفوظ کردہ پاس ورڈز اور پاس ورڈز کے اختیارات دکھائے جا رہے ہیں</translation> <translation id="2903493209154104877">پتے</translation> <translation id="3399357656427473483">ٹچ پر پُر کی جانے والی اسناد کی فہرست۔</translation> <translation id="3688051737190211318">اگر آپ کو <ph name="ORIGIN" /> پر اعتماد ہے تو آپ سائن ان کرنے کے لیے محفوظ کردہ پاس ورڈ استعمال کر سکتے ہیں</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">کی بورڈ دکھائیں</translation> <translation id="4694050069269396220">اگر آپ کو <ph name="ORIGIN" /> پر اعتماد ہے تو آپ کسی اور سائٹ کے لئے محفوظ کردہ پاس ورڈ استعمال کر سکتے ہیں۔</translation> <translation id="5016175294846053194">کی بورڈ کے اوپر آٹو فل تجاویز دستیاب ہیں</translation> -<translation id="5088366526685584589">محفوظہ پتے دکھائے جا رہے ہیں</translation> <translation id="5441504010984421144">ٹچ پر پُر کی جانے والی اسناد کی فہرست مکمل اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="6393156038355142111">مضبوط پاس ورڈ تجویز کریں</translation> <translation id="6558703547256592471">ہر سائٹ کے لئے ایک منفرد پاس ورڈ استعمال کرنے کی کوشش کریں۔</translation> <translation id="7029809446516969842">پاس ورڈز</translation> -<translation id="7299100402441711551">پتے دکھائیں</translation> -<translation id="7494879913343971937">پاس ورڈز دکھائیں</translation> <translation id="7594473730623999723">مزید تجاویز دیکھنے کے لئے سوائپ کریں</translation> <translation id="7992095260806105436">Chrome آٹو فل تجویز استعمال کریں</translation> -<translation id="8037472847879765671">ادائیگی کے طریقے دکھائیں</translation> <translation id="8507520749471379845">پاس ورڈز دستیاب ہیں</translation> <translation id="8705308553596171387">کوئی پاس ورڈ نہیں</translation> <translation id="879180780857354295">کی بورڈ کے اوپر پُر کرنے کے متبادل اختیارات دستیاب ہیں</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uz.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uz.xtb index 8dbd174c..8615507 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uz.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_uz.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="uz"> <translation id="1383876407941801731">Qidiruv</translation> -<translation id="1566281227936819866">Saqlangan toʻlov usullari koʻrsatilmoqda</translation> <translation id="1717486229951421299">Teginib kiritiladigan login va parollar yarim hajmda ochildi.</translation> <translation id="207576718733492531">Teginib kiritiladigan login va parollar roʻyxati yopiq.</translation> <translation id="2610239185026711824">Parol yaratish</translation> <translation id="2652129567809778422">Parolni tanlang</translation> -<translation id="2803478378562657435">Saqlangan parollar va ularning parametrlari shu yerda turadi</translation> <translation id="2903493209154104877">Manzillar</translation> <translation id="3399357656427473483">Teginib kiritiladigan login va parollar roʻyxati.</translation> <translation id="3688051737190211318"><ph name="ORIGIN" /> saytiga ishonsangiz, kirish uchun saqlangan parolingizni ishlatishingiz mumkin.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Klaviaturani ko‘rsatish</translation> <translation id="4694050069269396220"><ph name="ORIGIN" /> saytiga ishonsangiz, saqlangan parolingizni boshqa saytda ishlatishingiz mumkin.</translation> <translation id="5016175294846053194">Avtomatik kiritish takliflari klaviatura tepasida chiqadi</translation> -<translation id="5088366526685584589">Bu yerda saqlangan manzillar chiqadi</translation> <translation id="5441504010984421144">Teginib kiritiladigan login va parollar toʻliq hajmda ochildi.</translation> <translation id="6393156038355142111">Ishonchli parol yaratish</translation> <translation id="6558703547256592471">Har bir sayt uchun alohida parol ishlating.</translation> <translation id="7029809446516969842">Parollar</translation> -<translation id="7299100402441711551">Manzillarni chiqarish</translation> -<translation id="7494879913343971937">Parollarni chiqarish</translation> <translation id="7594473730623999723">Yana takliflar olish uchun suring</translation> <translation id="7992095260806105436">Chrome avtomatik kiritish taklifidan foydalanish</translation> -<translation id="8037472847879765671">Toʻlov usullarini chiqarish</translation> <translation id="8507520749471379845">Saqlangan parollar</translation> <translation id="8705308553596171387">Parolsiz</translation> <translation id="879180780857354295">Muqobil kiritish sozlamalari klaviatura tepasida chiqadi</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb index b8bed62..ee1118bc 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_vi.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="vi"> <translation id="1383876407941801731">Tìm kiếm</translation> -<translation id="1566281227936819866">Đang hiển thị các phương thức thanh toán đã lưu</translation> <translation id="1717486229951421299">Danh sách thông tin đăng nhập mà bạn có thể chạm để điền đã được mở ở nửa dưới của màn hình.</translation> <translation id="207576718733492531">Danh sách thông tin đăng nhập mà bạn có thể chạm để điền đã bị đóng.</translation> <translation id="2610239185026711824">Đề xuất mật khẩu</translation> <translation id="2652129567809778422">Chọn mật khẩu</translation> -<translation id="2803478378562657435">Đang hiển thị mật khẩu đã lưu và các tùy chọn mật khẩu</translation> <translation id="2903493209154104877">Địa chỉ</translation> <translation id="3399357656427473483">Danh sách các thông tin đăng nhập mà bạn có thể chạm để điền.</translation> <translation id="3688051737190211318">Nếu tin tưởng <ph name="ORIGIN" />, bạn có thể sử dụng mật khẩu đã lưu để đăng nhập.</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Hiện bàn phím</translation> <translation id="4694050069269396220">Nếu tin tưởng <ph name="ORIGIN" />, bạn có thể sử dụng mật khẩu đã lưu cho trang web khác.</translation> <translation id="5016175294846053194">Nội dung tự động điền đề xuất có sẵn phía trên bàn phím</translation> -<translation id="5088366526685584589">Đang hiển thị các địa chỉ đã lưu</translation> <translation id="5441504010984421144">Danh sách các thông tin xác thực mà bạn có thể chạm để điền đã được mở ở toàn độ cao.</translation> <translation id="6393156038355142111">Đề xuất mật khẩu mạnh</translation> <translation id="6558703547256592471">Hãy cố gắng sử dụng một mật khẩu riêng cho mỗi trang web.</translation> <translation id="7029809446516969842">Mật khẩu</translation> -<translation id="7299100402441711551">Hiển thị địa chỉ</translation> -<translation id="7494879913343971937">Hiện mật khẩu</translation> <translation id="7594473730623999723">Vuốt để xem thêm mục đề xuất</translation> <translation id="7992095260806105436">Sử dụng nội dung tự động điền do Chrome đề xuất</translation> -<translation id="8037472847879765671">Hiển thị các phương thức thanh toán</translation> <translation id="8507520749471379845">Mật khẩu sẵn có</translation> <translation id="8705308553596171387">Không có mật khẩu</translation> <translation id="879180780857354295">Các tuỳ chọn điền thay thế hiển thị phía trên bàn phím</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb index 7819ed3e..9be7be6 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-CN.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> <translation id="1383876407941801731">搜索</translation> -<translation id="1566281227936819866">显示的是已保存的付款方式</translation> <translation id="1717486229951421299">轻触即可填充的凭据的列表已半屏打开。</translation> <translation id="207576718733492531">轻触即可填充的凭据的列表已关闭。</translation> <translation id="2610239185026711824">建议一个密码</translation> <translation id="2652129567809778422">选择密码</translation> -<translation id="2803478378562657435">正在显示已保存的密码和密码选项</translation> <translation id="2903493209154104877">地址</translation> <translation id="3399357656427473483">轻触即可填充的凭据的列表。</translation> <translation id="3688051737190211318">如果您信任 <ph name="ORIGIN" />,则可使用已保存的密码登录</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">显示键盘</translation> <translation id="4694050069269396220">如果您信任 <ph name="ORIGIN" />,则可使用其他网站已保存的密码。</translation> <translation id="5016175294846053194">键盘上方显示了自动填充建议</translation> -<translation id="5088366526685584589">目前显示的是已保存的地址</translation> <translation id="5441504010984421144">轻触即可填充的凭据的列表已全屏打开。</translation> <translation id="6393156038355142111">建议一个安全系数高的密码</translation> <translation id="6558703547256592471">尽量为每个网站使用独一无二的密码。</translation> <translation id="7029809446516969842">密码</translation> -<translation id="7299100402441711551">显示地址</translation> -<translation id="7494879913343971937">显示密码</translation> <translation id="7594473730623999723">滑动可查看更多建议</translation> <translation id="7992095260806105436">使用 Chrome 自动填充建议</translation> -<translation id="8037472847879765671">显示付款方式</translation> <translation id="8507520749471379845">有可用密码</translation> <translation id="8705308553596171387">无密码</translation> <translation id="879180780857354295">键盘上方显示了备用的填充选项</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-HK.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-HK.xtb index 3b03249da..eeb147e4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-HK.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-HK.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-HK"> <translation id="1383876407941801731">搜尋</translation> -<translation id="1566281227936819866">顯示緊儲存咗嘅付款方法</translation> <translation id="1717486229951421299">㩒一下先可以填嘅憑證清單宜家顯示喺畫面下半部。</translation> <translation id="207576718733492531">㩒一下先可以填嘅憑證清單閂咗。</translation> <translation id="2610239185026711824">建議密碼</translation> <translation id="2652129567809778422">選擇密碼</translation> -<translation id="2803478378562657435">顯示緊儲存咗嘅密碼同密碼選項</translation> <translation id="2903493209154104877">地址</translation> <translation id="3399357656427473483">㩒一下先可以填嘅憑證清單。</translation> <translation id="3688051737190211318">如果您信任 <ph name="ORIGIN" />,可使用已儲存的密碼來登入</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">顯示鍵盤</translation> <translation id="4694050069269396220">如果您信任 <ph name="ORIGIN" />,可使用已儲存的其他網站密碼。</translation> <translation id="5016175294846053194">顯示喺鍵盤上面嘅自動填入建議</translation> -<translation id="5088366526685584589">顯示已儲存的地址</translation> <translation id="5441504010984421144">㩒一下先可以填嘅憑證清單,宜家顯示喺成個畫面。</translation> <translation id="6393156038355142111">建議安全性強的密碼</translation> <translation id="6558703547256592471">請嘗試為每個網站使用不重複的密碼。</translation> <translation id="7029809446516969842">密碼</translation> -<translation id="7299100402441711551">顯示地址</translation> -<translation id="7494879913343971937">顯示密碼</translation> <translation id="7594473730623999723">滑動即可查看更多建議</translation> <translation id="7992095260806105436">使用 Chrome 自動填入建議</translation> -<translation id="8037472847879765671">顯示付款方法</translation> <translation id="8507520749471379845">有可用嘅密碼</translation> <translation id="8705308553596171387">無需密碼</translation> <translation id="879180780857354295">顯示喺鍵盤上面嘅其他填入選項</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb index bc4c5a5..38792f0b 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zh-TW.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-TW"> <translation id="1383876407941801731">搜尋</translation> -<translation id="1566281227936819866">正在顯示已儲存的付款方式</translation> <translation id="1717486229951421299">輕觸即可填入的憑證清單已開啟,顯示在畫面下半部。</translation> <translation id="207576718733492531">輕觸即可填入的憑證清單已關閉。</translation> <translation id="2610239185026711824">建議密碼</translation> <translation id="2652129567809778422">選取密碼</translation> -<translation id="2803478378562657435">正在顯示已儲存的密碼和密碼選項</translation> <translation id="2903493209154104877">地址</translation> <translation id="3399357656427473483">輕觸即可填入的憑證清單。</translation> <translation id="3688051737190211318">如果你信任 <ph name="ORIGIN" />,可以使用已儲存的密碼登入</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">顯示鍵盤</translation> <translation id="4694050069269396220">如果你信任 <ph name="ORIGIN" />,可以使用已在其他網站儲存的密碼。</translation> <translation id="5016175294846053194">鍵盤上方是系統提供的自動填入建議</translation> -<translation id="5088366526685584589">顯示已儲存的地址</translation> <translation id="5441504010984421144">輕觸即可填入的憑證清單已開啟,顯示於整個畫面。</translation> <translation id="6393156038355142111">建議高強度密碼</translation> <translation id="6558703547256592471">請試著為每個網站使用專屬的密碼。</translation> <translation id="7029809446516969842">密碼</translation> -<translation id="7299100402441711551">顯示地址</translation> -<translation id="7494879913343971937">顯示密碼</translation> <translation id="7594473730623999723">滑動即可查看更多建議項目</translation> <translation id="7992095260806105436">使用 Chrome 自動填入建議項目</translation> -<translation id="8037472847879765671">顯示付款方式</translation> <translation id="8507520749471379845">有可用的密碼</translation> <translation id="8705308553596171387">沒有密碼</translation> <translation id="879180780857354295">鍵盤上方是系統提供的其他填入選項</translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zu.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zu.xtb index c9146f3..9e66d920 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zu.xtb +++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_zu.xtb
@@ -2,12 +2,10 @@ <!DOCTYPE translationbundle> <translationbundle lang="zu"> <translation id="1383876407941801731">Sesha</translation> -<translation id="1566281227936819866">Bonisa izindlela zokukhokha ezilondoloziwe</translation> <translation id="1717486229951421299">Uhlu lokuqinisekisa elizogcwaliswa ekuthintweni livulwe ngobude obuhhafu.</translation> <translation id="207576718733492531">Uhlu lokuqinisekisa oluzogcwaliswa ekuthinteni luvaliwe.</translation> <translation id="2610239185026711824">Iphakamisa iphasiwedi</translation> <translation id="2652129567809778422">Khetha iphasiwedi</translation> -<translation id="2803478378562657435">Ukubonisa izinketho zamaphasiwedi alondoloziwe namaphasiwedi</translation> <translation id="2903493209154104877">Amakheli</translation> <translation id="3399357656427473483">Uhlu lokuqinisekisa oluzogcwaliswa ekuthinteni.</translation> <translation id="3688051737190211318">Uma uyethemba i-<ph name="ORIGIN" />, ungasebenzisa iphasiwedi elondoloziwe ukuze ungene ngemvume</translation> @@ -15,16 +13,12 @@ <translation id="4660011489602794167">Bonisa ikhibhodi</translation> <translation id="4694050069269396220">Uma wethemba i-<ph name="ORIGIN" />, ungase usebenzise iphasiwedi elondolozelwe elinye isayithi.</translation> <translation id="5016175294846053194">Iziphakamiso zokugcwalisa ngokuzenzakalela ziyatholakala ngaphezu kwekhibhodi</translation> -<translation id="5088366526685584589">Ibonisa amakheli alondoloziwe</translation> <translation id="5441504010984421144">Uhlu lokuqinisekisa oluzogcwaliswa ekuthinteni livulwe ngobude obugcwele.</translation> <translation id="6393156038355142111">Iphakamisa iphasiwedi eqinile</translation> <translation id="6558703547256592471">Zama ukusebenzisa iphasiwedi eyingqayizivele kusayithi ngayinye.</translation> <translation id="7029809446516969842">Amaphasiwedi</translation> -<translation id="7299100402441711551">Bonisa amakheli</translation> -<translation id="7494879913343971937">Bonisa amaphasiwedi</translation> <translation id="7594473730623999723">Swayipha ukuze ubone iziphakamiso eziningi</translation> <translation id="7992095260806105436">Sebenzisa isiphakamiso sokugcwalisa ngokuzenzakalela se-Chrome</translation> -<translation id="8037472847879765671">Bonisa izindlela zokukhokha</translation> <translation id="8507520749471379845">Amaphasiwedi atholakalayo</translation> <translation id="8705308553596171387">Ayikho iphasiwedi</translation> <translation id="879180780857354295">Okunye okukhethwa kukho okutholakala ngenhla kwekhibhodi</translation>
diff --git a/chrome/android/features/stack_unwinder/public/BUILD.gn b/chrome/android/features/stack_unwinder/public/BUILD.gn index 91a381b..18e32b08 100644 --- a/chrome/android/features/stack_unwinder/public/BUILD.gn +++ b/chrome/android/features/stack_unwinder/public/BUILD.gn
@@ -3,9 +3,5 @@ # found in the LICENSE file. source_set("native") { - public = [ - "function_types.h", - "memory_regions_map.h", - ] - sources = [ "memory_regions_map.cc" ] + public = [ "function_types.h" ] }
diff --git a/chrome/android/features/stack_unwinder/public/function_types.h b/chrome/android/features/stack_unwinder/public/function_types.h index 38a3a48..3c77b9a 100644 --- a/chrome/android/features/stack_unwinder/public/function_types.h +++ b/chrome/android/features/stack_unwinder/public/function_types.h
@@ -9,16 +9,18 @@ namespace base { class Unwinder; +class NativeUnwinderAndroidMapDelegate; +class NativeUnwinderAndroidMemoryRegionsMap; } namespace stack_unwinder { -class MemoryRegionsMap; - // Type declarations for C++ functions exported by the module. -using CreateMemoryRegionsMapFunction = std::unique_ptr<MemoryRegionsMap> (*)(); +using CreateMemoryRegionsMapFunction = + std::unique_ptr<base::NativeUnwinderAndroidMemoryRegionsMap> (*)(); using CreateNativeUnwinderFunction = - std::unique_ptr<base::Unwinder> (*)(MemoryRegionsMap*, uintptr_t); + std::unique_ptr<base::Unwinder> (*)(base::NativeUnwinderAndroidMapDelegate*, + uintptr_t); using CreateLibunwindstackUnwinderFunction = std::unique_ptr<base::Unwinder> (*)();
diff --git a/chrome/android/features/stack_unwinder/public/memory_regions_map.cc b/chrome/android/features/stack_unwinder/public/memory_regions_map.cc deleted file mode 100644 index bd008db..0000000 --- a/chrome/android/features/stack_unwinder/public/memory_regions_map.cc +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/android/features/stack_unwinder/public/memory_regions_map.h" - -namespace stack_unwinder { - -MemoryRegionsMap::MemoryRegionsMap() = default; -MemoryRegionsMap::~MemoryRegionsMap() = default; - -} // namespace stack_unwinder
diff --git a/chrome/android/features/stack_unwinder/public/memory_regions_map.h b/chrome/android/features/stack_unwinder/public/memory_regions_map.h deleted file mode 100644 index 92c26149..0000000 --- a/chrome/android/features/stack_unwinder/public/memory_regions_map.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_ANDROID_FEATURES_STACK_UNWINDER_PUBLIC_MEMORY_REGIONS_MAP_H_ -#define CHROME_ANDROID_FEATURES_STACK_UNWINDER_PUBLIC_MEMORY_REGIONS_MAP_H_ - -namespace stack_unwinder { - -// MemoryRegionsMap is intended to provide an opaque interface to Chrome code. -// It must only be subclassed within the module implementation. -class MemoryRegionsMap { - public: - MemoryRegionsMap(); - virtual ~MemoryRegionsMap() = 0; - - MemoryRegionsMap(const MemoryRegionsMap&) = delete; - MemoryRegionsMap& operator=(const MemoryRegionsMap&) = delete; -}; - -} // namespace stack_unwinder - -#endif // CHROME_ANDROID_FEATURES_STACK_UNWINDER_PUBLIC_MEMORY_REGIONS_MAP_H_
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java index 727ff34e..bd284edc 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
@@ -20,6 +20,7 @@ import android.os.Build; import android.support.test.InstrumentationRegistry; +import android.support.test.runner.lifecycle.Stage; import android.view.View; import androidx.test.espresso.contrib.RecyclerViewActions; @@ -36,6 +37,7 @@ import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; import org.chromium.base.test.params.ParameterSet; import org.chromium.base.test.params.ParameterizedRunner; +import org.chromium.base.test.util.ApplicationTestUtils; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; @@ -150,6 +152,39 @@ mMostVisitedSites = StartSurfaceTestUtils.setMVTiles(mSuggestionsDeps); } + // Test that back press on start surface should exit app rather than closing tab. + @Test + @MediumTest + @Feature({"StartSurface"}) + @DisableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + @CommandLineFlags.Add({START_SURFACE_TEST_SINGLE_ENABLED_PARAMS}) + public void testShow_SingleAsHomepage_BackButton_ClosableTab() { + if (!mImmediateReturn) { + StartSurfaceTestUtils.pressHomePageButton(mActivityTestRule.getActivity()); + } + + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + StartSurfaceTestUtils.waitForStartSurfaceVisible( + mLayoutChangedCallbackHelper, mCurrentlyActiveLayout, cta); + mActivityTestRule.loadUrlInNewTab("about:blank", false, TabLaunchType.FROM_LINK); + StartSurfaceTestUtils.pressHomePageButton(mActivityTestRule.getActivity()); + StartSurfaceTestUtils.waitForStartSurfaceVisible( + mLayoutChangedCallbackHelper, mCurrentlyActiveLayout, cta); + onViewWaiting(withId(R.id.primary_tasks_surface_view)); + StartSurfaceTestUtils.pressBack(mActivityTestRule); + TabUiTestHelper.verifyTabModelTabCount(cta, 2, 0); + ApplicationTestUtils.waitForActivityState(cta, Stage.STOPPED); + } + + @Test + @MediumTest + @Feature({"StartSurface"}) + @EnableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + @CommandLineFlags.Add({START_SURFACE_TEST_SINGLE_ENABLED_PARAMS}) + public void testShow_SingleAsHomepage_BackButton_ClosableTab_BackGestureRefactor() { + testShow_SingleAsHomepage_BackButton_ClosableTab(); + } + @Test @MediumTest @Feature({"StartSurface"})
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java index 8c54b57..98f530b 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -78,7 +78,6 @@ import org.chromium.base.Callback; import org.chromium.base.GarbageCollectionTestUtils; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.test.metrics.HistogramTestRule; import org.chromium.base.test.util.ApplicationTestUtils; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; @@ -86,6 +85,7 @@ import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.HistogramWatcher; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.compositor.layouts.Layout; @@ -179,9 +179,6 @@ .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_START) .build(); - @Rule - public HistogramTestRule mHistogramTester = new HistogramTestRule(); - @SuppressWarnings("FieldCanBeLocal") private EmbeddedTestServer mTestServer; private TabSwitcherAndStartSurfaceLayout mTabSwitcherAndStartSurfaceLayout; @@ -1164,28 +1161,17 @@ @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) @CommandLineFlags.Add({BASE_PARAMS}) public void testThumbnailFetchingResult_liveLayer() throws Exception { + var histograms = HistogramWatcher.newSingleRecordWatcher( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); + prepareTabs(1, 0, "about:blank"); enterTabSwitcher(mActivityTestRule.getActivity()); // There might be an additional one from capturing thumbnail for the live layer. CriteriaHelper.pollUiThread( () -> Criteria.checkThat(mAllBitmaps.size(), Matchers.greaterThanOrEqualTo(1))); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG)); - assertEquals(1, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING)); + histograms.assertExpected(); } @Test @@ -1193,6 +1179,10 @@ @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) @CommandLineFlags.Add({BASE_PARAMS}) public void testThumbnailFetchingResult_jpeg() throws Exception { + var histograms = HistogramWatcher.newSingleRecordWatcher( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + prepareTabs(1, 0, "about:blank"); simulateJpegHasCachedWithDefaultAspectRatio(); @@ -1201,22 +1191,7 @@ CriteriaHelper.pollUiThread( () -> Criteria.checkThat(mAllBitmaps.size(), Matchers.greaterThanOrEqualTo(1))); - assertEquals(1, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING)); + histograms.assertExpected(); } @Test @@ -1225,6 +1200,10 @@ @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/2.0/allow_to_refetch/true"}) @DisabledTest(message = "crbug.com/1315676#c20") public void testThumbnailFetchingResult_changingAspectRatio() throws Exception { + var histograms = HistogramWatcher.newSingleRecordWatcher( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); + prepareTabs(1, 0, "about:blank"); // Simulate Jpeg has cached with default aspect ratio. simulateJpegHasCachedWithDefaultAspectRatio(); @@ -1233,19 +1212,7 @@ CriteriaHelper.pollUiThread( () -> Criteria.checkThat(mAllBitmaps.size(), Matchers.greaterThanOrEqualTo(1))); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG)); - assertEquals(0, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1)); - assertEquals(1, - mHistogramTester.getHistogramValueCount( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG)); - + histograms.assertExpected(); onViewWaiting(tabSwitcherViewMatcher()) .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 7b95a221..098dcda 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2297,7 +2297,10 @@ return true; } - final Tab currentTab = getActivityTab(); + // crbug.com/1416719: back press on start surface should close the app. + final boolean isStartSurfaceHomepageShowing = + mStartSurfaceSupplier.hasValue() && mStartSurfaceSupplier.get().isHomepageShown(); + final Tab currentTab = isStartSurfaceHomepageShowing ? null : getActivityTab(); if (currentTab == null) { BackPressManager.record(BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB); MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.MINIMIZE_APP); @@ -2379,7 +2382,9 @@ } private void assertOnLastBackPress() { - var currentTab = getActivityTab(); + final boolean isStartSurfaceHomepageShowing = + mStartSurfaceSupplier.hasValue() && mStartSurfaceSupplier.get().isHomepageShown(); + final Tab currentTab = isStartSurfaceHomepageShowing ? null : getActivityTab(); var activityTab = getActivityTabProvider().get(); MinimizeAppAndCloseTabBackPressHandler.assertOnLastBackPress(currentTab, activityTab, this::backShouldCloseTab, mLayoutStateProviderSupplier,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index dac3c96..b6cbd16 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -204,12 +204,6 @@ public static final String EXTRA_WINDOW_ID = "org.chromium.chrome.browser.window_id"; /** - * A boolean to indicate whether the source of the Intent was a dragged link. - */ - public static final String EXTRA_SOURCE_DRAG_DROP = - "org.chromium.chrome.browser.source_drag_drop"; - - /** * Extra to indicate the launch type of the tab to be created. */ private static final String EXTRA_TAB_LAUNCH_TYPE =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java index 97f49575..09c954fe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
@@ -28,7 +28,6 @@ import org.chromium.base.Log; import org.chromium.base.PackageManagerUtils; import org.chromium.base.StrictModeContext; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.app.video_tutorials.VideoTutorialShareHelper; import org.chromium.chrome.browser.browserservices.SessionDataHolder; import org.chromium.chrome.browser.browserservices.ui.splashscreen.trustedwebactivity.TwaSplashController; @@ -449,15 +448,6 @@ newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); - if ((mIntent.getFlags() & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) != 0) { - newIntent.setFlags(newIntent.getFlags() | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); - if (Intent.ACTION_VIEW.equals(mIntent.getAction())) { - RecordHistogram.recordBooleanHistogram( - "Startup.Android.NewInstance.LaunchedFromDraggedLinkViewIntent", - mIntent.getBooleanExtra(IntentHandler.EXTRA_SOURCE_DRAG_DROP, false)); - } - } - Uri uri = newIntent.getData(); boolean isContentScheme = false; if (uri != null && UrlConstants.CONTENT_SCHEME.equals(uri.getScheme())) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java index 63748ed..dc4910e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java
@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.bookmarks.BookmarkManager; import org.chromium.chrome.browser.bookmarks.BookmarkPage; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.embedder_support.util.UrlConstants; @@ -38,7 +39,7 @@ mBookmarkManager = new BookmarkManager(this, IntentUtils.safeGetParcelableExtra( getIntent(), IntentHandler.EXTRA_PARENT_COMPONENT), - true, isIncognito, getSnackbarManager()); + true, isIncognito, getSnackbarManager(), Profile.getLastUsedRegularProfile()); String url = getIntent().getDataString(); if (TextUtils.isEmpty(url)) url = UrlConstants.BOOKMARKS_URL; mBookmarkManager.updateForUrl(url);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/OWNERS new file mode 100644 index 0000000..50bb1fa7b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/OWNERS
@@ -0,0 +1 @@ +file://chrome/android/java/src/org/chromium/chrome/browser/bookmarks/OWNERS
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 c99b712..ff1f43c8 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
@@ -89,7 +89,6 @@ ChromeFeatureList.sCriticalPersistedTabData, ChromeFeatureList.sDiscoverMultiColumn, ChromeFeatureList.sTabStripRedesign, - ChromeFeatureList.sDownloadsAutoResumptionNative, ChromeFeatureList.sEarlyLibraryLoad, ChromeFeatureList.sFeedLoadingPlaceholder, ChromeFeatureList.sFoldableJankFix, @@ -108,7 +107,6 @@ ChromeFeatureList.sPaintPreviewDemo, ChromeFeatureList.sQueryTiles, ChromeFeatureList.sQueryTilesOnStart, - ChromeFeatureList.sReadLater, ChromeFeatureList.sShouldIgnoreIntentSkipInternalCheck, ChromeFeatureList.sStartSurfaceAndroid, ChromeFeatureList.sStartSurfaceDisabledFeedImprovement,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java index 96dca3d1..a3e6788 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
@@ -13,6 +13,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.ViewHolder; @@ -38,6 +39,7 @@ import org.chromium.components.power_bookmarks.PowerBookmarkMeta; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -61,13 +63,13 @@ private final List<BookmarkId> mTopLevelFolders = new ArrayList<>(); private final Profile mProfile; private final SyncService mSyncService; + private final BookmarkPromoHeader mPromoHeaderManager; // There can only be one promo header at a time. This takes on one of the values: // ViewType.PERSONALIZED_SIGNIN_PROMO, ViewType.SYNC_PROMO, or ViewType.INVALID. @ViewType private int mPromoHeaderType = ViewType.INVALID; private BookmarkDelegate mDelegate; - private BookmarkPromoHeader mPromoHeaderManager; private ViewFactory mViewFactory; private String mSearchText; private BookmarkId mCurrentFolder; @@ -91,15 +93,10 @@ clearHighlight(); if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING) { - if (TextUtils.equals(mSearchText, EMPTY_QUERY)) { - mDelegate.closeSearchUI(); - } else { - // We cannot rely on removing the specific list item that corresponds to the - // removed node because the node might be a parent with children also shown - // in the list. - search(mSearchText); - } - + // We cannot rely on removing the specific list item that corresponds to the + // removed node because the node might be a parent with children also shown + // in the list. + search(mSearchText); return; } @@ -134,6 +131,12 @@ mProfile = profile; mSyncService = SyncService.get(); mSyncService.addSyncStateChangedListener(this); + + Runnable promoHeaderChangeAction = () -> { + // Notify the view of changes to the elements list as the promo might be showing. + updateHeader(true); + }; + mPromoHeaderManager = new BookmarkPromoHeader(mContext, promoHeaderChangeAction); } /** @@ -287,12 +290,6 @@ mDelegate.getModel().addObserver(mBookmarkModelObserver); mDelegate.getSelectionDelegate().addObserver(this); - Runnable promoHeaderChangeAction = () -> { - // Notify the view of changes to the elements list as the promo might be showing. - updateHeader(true); - }; - - mPromoHeaderManager = new BookmarkPromoHeader(mContext, promoHeaderChangeAction); populateTopLevelFoldersList(); mViewFactory = viewFactory; @@ -370,11 +367,14 @@ * * @param query The query text to search for. */ - public void search(String query) { - mSearchText = query.trim(); - List<BookmarkId> result = - mDelegate.getModel().searchBookmarks(mSearchText, MAXIMUM_NUMBER_OF_SEARCH_RESULTS); - setBookmarks(result); + public void search(@Nullable String query) { + mSearchText = query == null ? "" : query.trim(); + + List<BookmarkId> bookmarks = TextUtils.isEmpty(query) + ? Collections.emptyList() + : mDelegate.getModel().searchBookmarks( + mSearchText, MAXIMUM_NUMBER_OF_SEARCH_RESULTS); + setBookmarks(bookmarks); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java index afb4b6ee..9790c4c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -7,18 +7,14 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.accessibility.AccessibilityManager; import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.RecyclerView; -import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver; import org.chromium.base.ContextUtils; -import org.chromium.base.ObserverList; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; @@ -26,175 +22,36 @@ import org.chromium.chrome.browser.app.bookmarks.BookmarkActivity; import org.chromium.chrome.browser.commerce.ShoppingFeatures; import org.chromium.chrome.browser.commerce.ShoppingServiceFactory; -import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksReader; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.native_page.BasicNativePage; import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.components.bookmarks.BookmarkItem; -import org.chromium.components.bookmarks.BookmarkType; import org.chromium.components.browser_ui.util.ConversionUtils; -import org.chromium.components.browser_ui.widget.dragreorder.DragStateDelegate; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar.SearchDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.favicon.LargeIconBridge; -import org.chromium.url.GURL; - -import java.util.List; -import java.util.Stack; /** * The new bookmark manager that is planned to replace the existing bookmark manager. It holds all * views and shared logics between tablet and phone. For tablet/phone specific logics, see * {@link BookmarkActivity} (phone) and {@link BookmarkPage} (tablet). */ -public class BookmarkManager implements BookmarkDelegate, SearchDelegate, - PartnerBookmarksReader.FaviconUpdateObserver, - BackPressHandler { +public class BookmarkManager implements SearchDelegate, BackPressHandler { private static final int FAVICON_MAX_CACHE_SIZE_BYTES = 10 * ConversionUtils.BYTES_PER_MEGABYTE; // 10MB - private static boolean sPreventLoadingForTesting; - - private Context mContext; - private ViewGroup mMainView; - private BookmarkModel mBookmarkModel; - private BookmarkUndoController mUndoController; - private final ObserverList<BookmarkUIObserver> mUIObservers = new ObserverList<>(); - private BasicNativePage mNativePage; - private SelectableListLayout<BookmarkId> mSelectableListLayout; - private RecyclerView mRecyclerView; - private BookmarkActionBar mToolbar; - private SelectionDelegate<BookmarkId> mSelectionDelegate; - private final Stack<BookmarkUIState> mStateStack = new Stack<>() { - @Override - public BookmarkUIState push(BookmarkUIState item) { - // The back press state depends on the size of stack. So push/pop item first in order - // to keep the size update-to-date. - var state = super.push(item); - onBackPressStateChanged(); - return state; - } - - @Override - public synchronized BookmarkUIState pop() { - var state = super.pop(); - onBackPressStateChanged(); - return state; - } - }; - private LargeIconBridge mLargeIconBridge; - private boolean mFaviconsNeedRefresh; - private String mInitialUrl; - private boolean mIsDialogUi; - private boolean mIsIncognito; - private boolean mIsDestroyed; - - private final BookmarkItemsAdapter mAdapter; - private final BookmarkManagerCoordinator mBookmarkManagerCoordinator; - private final BookmarkDragStateDelegate mDragStateDelegate; - private final AdapterDataObserver mAdapterDataObserver; - private final BookmarkOpener mBookmarkOpener; - private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier = new ObservableSupplierImpl<>(); - - private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() { - @Override - public void bookmarkNodeChildrenReordered(BookmarkItem node) { - mAdapter.refresh(); - } - - @Override - public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, - boolean isDoingExtensiveChanges) { - // If the folder is removed in folder mode, show the parent folder or falls back to all - // bookmarks mode. - if (getCurrentState() == BookmarkUIState.STATE_FOLDER - && node.getId().equals(mStateStack.peek().mFolder)) { - if (mBookmarkModel.getTopLevelFolderIDs(true, true).contains( - node.getId())) { - openFolder(mBookmarkModel.getDefaultFolderViewLocation()); - } else { - openFolder(parent.getId()); - } - } - - // This is necessary as long as we rely on RecyclerView.ItemDecorations to apply padding - // at the bottom of the bookmarks list to avoid the bottom navigation menu. This ensures - // the item decorations are reapplied correctly when item indices change as the result - // of an item being deleted. - mAdapter.notifyDataSetChanged(); - } - - @Override - public void bookmarkNodeChanged(BookmarkItem node) { - if (getCurrentState() == BookmarkUIState.STATE_FOLDER && !mStateStack.isEmpty() - && node.getId().equals(mStateStack.peek().mFolder)) { - notifyUI(mStateStack.peek()); - return; - } - super.bookmarkNodeChanged(node); - } - - @Override - public void bookmarkModelChanged() { - // If the folder no longer exists in folder mode, we need to fall back. Relying on the - // default behavior by setting the folder mode again. - if (getCurrentState() == BookmarkUIState.STATE_FOLDER) { - setState(mStateStack.peek()); - } - } - }; - - /** - * Keeps track of whether drag is enabled / active for bookmark lists. - */ - class BookmarkDragStateDelegate implements DragStateDelegate { - private BookmarkDelegate mBookmarkDelegate; - private SelectionDelegate<BookmarkId> mSelectionDelegate; - private AccessibilityManager mA11yManager; - private AccessibilityManager.AccessibilityStateChangeListener mA11yChangeListener; - private boolean mA11yEnabled; - - void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { - mBookmarkDelegate = delegate; - - mSelectionDelegate = delegate.getSelectionDelegate(); - - mA11yManager = - (AccessibilityManager) getSelectableListLayout().getContext().getSystemService( - Context.ACCESSIBILITY_SERVICE); - mA11yEnabled = mA11yManager.isEnabled(); - mA11yChangeListener = enabled -> mA11yEnabled = enabled; - mA11yManager.addAccessibilityStateChangeListener(mA11yChangeListener); - } - - // DragStateDelegate implementation - @Override - public boolean getDragEnabled() { - return !mA11yEnabled - && mBookmarkDelegate.getCurrentState() == BookmarkUIState.STATE_FOLDER; - } - - @Override - public boolean getDragActive() { - return getDragEnabled() && mSelectionDelegate.isSelectionEnabled(); - } - - @VisibleForTesting - @Override - public void setA11yStateForTesting(boolean a11yEnabled) { - if (mA11yManager != null) { - mA11yManager.removeAccessibilityStateChangeListener(mA11yChangeListener); - } - mA11yChangeListener = null; - mA11yManager = null; - mA11yEnabled = a11yEnabled; - } - } + private final ViewGroup mMainView; + private final SelectableListLayout<BookmarkId> mSelectableListLayout; + private final RecyclerView mRecyclerView; + private final BookmarkActionBar mToolbar; + private final BookmarkOpener mBookmarkOpener; + private final BookmarkManagerCoordinator mBookmarkManagerCoordinator; + private final BookmarkManagerMediator mMediator; + private final BookmarkUndoController mUndoController; /** * Creates an instance of {@link BookmarkManager}. It also initializes resources, @@ -204,98 +61,58 @@ * @param isDialogUi Whether the main bookmarks UI will be shown in a dialog, not a NativePage. * @param isIncognito Whether the tab model loading the bookmark manager is for incognito mode. * @param snackbarManager The {@link SnackbarManager} used to display snackbars. + * @param profile The profile which the manager is running in. */ public BookmarkManager(Context context, ComponentName openBookmarkComponentName, - boolean isDialogUi, boolean isIncognito, SnackbarManager snackbarManager) { - mContext = context; - mIsDialogUi = isDialogUi; - mIsIncognito = isIncognito; + boolean isDialogUi, boolean isIncognito, SnackbarManager snackbarManager, + Profile profile) { + mMainView = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.bookmark_main, null); + BookmarkModel bookmarkModel = BookmarkModel.getForProfile(profile); + if (ShoppingFeatures.isShoppingListEligible()) { + ShoppingServiceFactory.getForProfile(profile).scheduleSavedProductUpdate(); + } - mSelectionDelegate = new SelectionDelegate<BookmarkId>() { + SelectionDelegate selectionDelegate = new SelectionDelegate<BookmarkId>() { @Override public boolean toggleSelectionForItem(BookmarkId bookmark) { - if (mBookmarkModel.getBookmarkById(bookmark) != null - && !mBookmarkModel.getBookmarkById(bookmark).isEditable()) { + if (bookmarkModel.getBookmarkById(bookmark) != null + && !bookmarkModel.getBookmarkById(bookmark).isEditable()) { return false; } return super.toggleSelectionForItem(bookmark); } }; - mDragStateDelegate = new BookmarkDragStateDelegate(); - - Profile profile = Profile.getLastUsedRegularProfile(); - mBookmarkModel = BookmarkModel.getForProfile(profile); - mMainView = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.bookmark_main, null); - - if (ShoppingFeatures.isShoppingListEligible()) { - ShoppingServiceFactory.getForProfile(profile).scheduleSavedProductUpdate(); - } - @SuppressWarnings("unchecked") SelectableListLayout<BookmarkId> selectableList = mMainView.findViewById(R.id.selectable_list); mSelectableListLayout = selectableList; mSelectableListLayout.initializeEmptyView(R.string.bookmarks_folder_empty); - mSelectableListLayout.getHandleBackPressChangedSupplier().addObserver( - (x) -> onBackPressStateChanged()); - mAdapter = new BookmarkItemsAdapter(mContext, profile); mBookmarkManagerCoordinator = new BookmarkManagerCoordinator(profile, snackbarManager); - mAdapterDataObserver = new AdapterDataObserver() { - @Override - public void onItemRangeRemoved(int positionStart, int itemCount) { - syncAdapterAndSelectionDelegate(); - } - - @Override - public void onChanged() { - syncAdapterAndSelectionDelegate(); - } - }; - mAdapter.registerAdapterDataObserver(mAdapterDataObserver); + BookmarkItemsAdapter bookmarkItemsAdapter = new BookmarkItemsAdapter(context, profile); mRecyclerView = mSelectableListLayout.initializeRecyclerView( - (RecyclerView.Adapter<RecyclerView.ViewHolder>) mAdapter); + (RecyclerView.Adapter<RecyclerView.ViewHolder>) bookmarkItemsAdapter); mToolbar = (BookmarkActionBar) mSelectableListLayout.initializeToolbar( - R.layout.bookmark_action_bar, mSelectionDelegate, 0, R.id.normal_menu_group, + R.layout.bookmark_action_bar, selectionDelegate, 0, R.id.normal_menu_group, R.id.selection_mode_menu_group, null, isDialogUi); mToolbar.initializeSearchView( this, R.string.bookmark_action_bar_search, R.id.search_menu_id); - mSelectableListLayout.configureWideDisplayStyle(); - mUndoController = new BookmarkUndoController(mContext, mBookmarkModel, snackbarManager); - mBookmarkModel.addObserver(mBookmarkModelObserver); - initializeToLoadingState(); - if (!sPreventLoadingForTesting) { - Runnable modelLoadedRunnable = () -> { - mDragStateDelegate.onBookmarkDelegateInitialized(BookmarkManager.this); - mAdapter.onBookmarkDelegateInitialized( - BookmarkManager.this, mBookmarkManagerCoordinator::createView); - mBookmarkManagerCoordinator.onBookmarkDelegateInitialized( - this, mAdapter.getPromoHeaderManager()); - mToolbar.onBookmarkDelegateInitialized(BookmarkManager.this); - mAdapter.addDragListener(mToolbar); + LargeIconBridge largeIconBridge = new LargeIconBridge(profile); + largeIconBridge.createCache(computeCacheMaxSize()); - if (!TextUtils.isEmpty(mInitialUrl)) { - setState(BookmarkUIState.createStateFromUrl(mInitialUrl, mBookmarkModel)); - } - PartnerBookmarksReader.addFaviconUpdateObserver(this); - }; - mBookmarkModel.finishLoadingBookmarkModel(modelLoadedRunnable); - } - - mLargeIconBridge = new LargeIconBridge(profile); - ActivityManager activityManager = ((ActivityManager) ContextUtils - .getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)); - int maxSize = - Math.min(activityManager.getMemoryClass() / 4 * ConversionUtils.BYTES_PER_MEGABYTE, - FAVICON_MAX_CACHE_SIZE_BYTES); - mLargeIconBridge.createCache(maxSize); - - mBookmarkOpener = new BookmarkOpener(mBookmarkModel, mContext, openBookmarkComponentName); + mUndoController = new BookmarkUndoController(context, bookmarkModel, snackbarManager); + mBookmarkOpener = new BookmarkOpener(bookmarkModel, context, openBookmarkComponentName); + mMediator = new BookmarkManagerMediator(context, bookmarkModel, mBookmarkOpener, + mSelectableListLayout, selectionDelegate, mRecyclerView, bookmarkItemsAdapter, + mToolbar, largeIconBridge, isDialogUi, isIncognito, mBackPressStateSupplier, + mBookmarkManagerCoordinator::createView); + mBookmarkManagerCoordinator.initialize( + mMediator, bookmarkItemsAdapter.getPromoHeaderManager()); RecordUserAction.record("MobileBookmarkManagerOpen"); if (!isDialogUi) { @@ -303,85 +120,15 @@ } } - @Override - public void onUpdateFavicon(String url) { - mLargeIconBridge.clearFavicon(new GURL(url)); - mFaviconsNeedRefresh = true; - } - - @Override - public void onCompletedFaviconLoading() { - if (mFaviconsNeedRefresh) { - mAdapter.refresh(); - mFaviconsNeedRefresh = false; - } - } + // Public API implementation. /** * Destroys and cleans up itself. This must be called after done using this class. */ public void onDestroyed() { - mAdapter.unregisterAdapterDataObserver(mAdapterDataObserver); - mIsDestroyed = true; RecordUserAction.record("MobileBookmarkManagerClose"); mSelectableListLayout.onDestroyed(); - - for (BookmarkUIObserver observer : mUIObservers) { - observer.onDestroy(); - } - assert mUIObservers.size() == 0; - - if (mUndoController != null) { - mUndoController.destroy(); - mUndoController = null; - } - mBookmarkModel.removeObserver(mBookmarkModelObserver); - mLargeIconBridge.destroy(); - mLargeIconBridge = null; - PartnerBookmarksReader.removeFaviconUpdateObserver(this); - } - - /** - * Called when the user presses the back key. This is only going to be called on Phone. - * @return True if manager handles this event, false if it decides to ignore. - */ - public boolean onBackPressed() { - if (mIsDestroyed) return false; - - // TODO(twellington): replicate this behavior for other list UIs during unification. - if (mSelectableListLayout.onBackPressed()) { - return true; - } - - if (!mStateStack.empty()) { - mStateStack.pop(); - if (!mStateStack.empty()) { - setState(mStateStack.pop()); - return true; - } - } - return false; - } - - private void onBackPressStateChanged() { - if (mIsDestroyed) { - mBackPressStateSupplier.set(false); - return; - } - mBackPressStateSupplier.set( - Boolean.TRUE.equals(mSelectableListLayout.getHandleBackPressChangedSupplier().get()) - || mStateStack.size() > 1); - } - - // BackPressHandler Overrides - @Override - public @BackPressResult int handleBackPress() { - return onBackPressed() ? BackPressResult.SUCCESS : BackPressResult.FAILURE; - } - - @Override - public ObservableSupplier<Boolean> getHandleBackPressChangedSupplier() { - return mBackPressStateSupplier; + mMediator.onDestroy(); } /** @@ -394,18 +141,9 @@ /** * Sets the listener that reacts upon the change of the UI state of bookmark manager. */ + // TODO(crbug.com/1418859): Create abstraction between BookmarkManager & BasicNativePage. public void setBasicNativePage(BasicNativePage nativePage) { - mNativePage = nativePage; - } - - /** - * @return Current URL representing the UI state of bookmark manager. If no state has been shown - * yet in this session, on phone return last used state stored in preference; on tablet - * return the url previously set by {@link #updateForUrl(String)}. - */ - public String getCurrentUrl() { - if (mStateStack.isEmpty()) return null; - return mStateStack.peek().mUrl; + mMediator.setBasicNativePage(nativePage); } /** @@ -416,241 +154,57 @@ * @param url The url to navigate to. */ public void updateForUrl(String url) { - // Bookmark model is null if the manager has been destroyed. - if (mBookmarkModel == null) return; - - if (mBookmarkModel.isBookmarkModelLoaded()) { - BookmarkUIState searchState = null; - if (!mStateStack.isEmpty() - && mStateStack.peek().mState == BookmarkUIState.STATE_SEARCHING) { - searchState = mStateStack.pop(); - } - - setState(BookmarkUIState.createStateFromUrl(url, mBookmarkModel)); - - if (searchState != null) setState(searchState); - } else { - mInitialUrl = url; - } + mMediator.updateForUrl(url); } /** - * Puts all UI elements to loading state. This state might be overridden synchronously by - * {@link #updateForUrl(String)}, if the bookmark model is already loaded. + * Called when the user presses the back key. This is only going to be called on Phone. + * @return True if manager handles this event, false if it decides to ignore. */ - private void initializeToLoadingState() { - mToolbar.showLoadingUi(); - assert mStateStack.isEmpty(); - setState(BookmarkUIState.createLoadingState()); + public boolean onBackPressed() { + return mMediator.onBackPressed(); } - /** - * This is the ultimate internal method that updates UI and controls backstack. And it is the - * only method that pushes states to {@link #mStateStack}. - * - * <p>If the given state is not valid, all_bookmark state will be shown. Afterwards, this method - * checks the current state: if currently in loading state, it pops it out and adds the new - * state to the back stack. It also notifies the {@link #mNativePage} (if any) that the - * url has changed. - * - * <p>Also note that even if we store states to {@link #mStateStack}, on tablet the back - * navigation and back button are not controlled by the manager: the tab handles back key and - * backstack navigation. - */ - private void setState(BookmarkUIState state) { - if (!state.isValid(mBookmarkModel)) { - state = BookmarkUIState.createFolderState( - mBookmarkModel.getDefaultFolderViewLocation(), mBookmarkModel); - } - - if (!mStateStack.isEmpty() && mStateStack.peek().equals(state)) return; - - // The loading state is not persisted in history stack and once we have a valid state it - // shall be removed. - if (!mStateStack.isEmpty() && mStateStack.peek().mState == BookmarkUIState.STATE_LOADING) { - mStateStack.pop(); - } - mStateStack.push(state); - notifyUI(state); + /** Opens the given BookmarkId. */ + public void openBookmark(BookmarkId bookmarkId) { + mMediator.openBookmark(bookmarkId); } - private void notifyUI(BookmarkUIState state) { - if (state.mState == BookmarkUIState.STATE_FOLDER) { - // Loading and searching states may be pushed to the stack but should never be stored in - // preferences. - BookmarkUtils.setLastUsedUrl(mContext, state.mUrl); - // If a loading state is replaced by another loading state, do not notify this change. - if (mNativePage != null) { - mNativePage.onStateChange(state.mUrl, false); - } - } + // BackPressHandler implementation. - for (BookmarkUIObserver observer : mUIObservers) { - notifyStateChange(observer); - } - } - - // TODO(lazzzis): This method can be moved to adapter after bookmark reordering launches. - /** - * Some bookmarks may be moved to another folder or removed in another devices. However, it may - * still be stored by {@link #mSelectionDelegate}, which causes incorrect selection counting. - */ - private void syncAdapterAndSelectionDelegate() { - for (BookmarkId node : mSelectionDelegate.getSelectedItemsAsList()) { - if (mSelectionDelegate.isItemSelected(node) - && mAdapter.getPositionForBookmark(node) == -1) { - mSelectionDelegate.toggleSelectionForItem(node); - } - } + @Override + public @BackPressResult int handleBackPress() { + return onBackPressed() ? BackPressResult.SUCCESS : BackPressResult.FAILURE; } @Override - public void moveDownOne(BookmarkId bookmarkId) { - mAdapter.moveDownOne(bookmarkId); + public ObservableSupplier<Boolean> getHandleBackPressChangedSupplier() { + return mBackPressStateSupplier; } - @Override - public void moveUpOne(BookmarkId bookmarkId) { - mAdapter.moveUpOne(bookmarkId); - } - - @Override - public void onBookmarkItemMenuOpened() { - mToolbar.hideKeyboard(); - } - - // BookmarkDelegate implementations. - - @Override - public boolean isDialogUi() { - return mIsDialogUi; - } - - @Override - public void openFolder(BookmarkId folder) { - RecordUserAction.record("MobileBookmarkManagerOpenFolder"); - if (mToolbar.isSearching()) mToolbar.hideSearchView(); - setState(BookmarkUIState.createFolderState(folder, mBookmarkModel)); - mRecyclerView.scrollToPosition(0); - } - - @Override - public SelectionDelegate<BookmarkId> getSelectionDelegate() { - return mSelectionDelegate; - } - - @Override - public SelectableListLayout<BookmarkId> getSelectableListLayout() { - return mSelectableListLayout; - } - - @Override - public void notifyStateChange(BookmarkUIObserver observer) { - int state = getCurrentState(); - switch (state) { - case BookmarkUIState.STATE_FOLDER: - observer.onFolderStateSet(mStateStack.peek().mFolder); - break; - case BookmarkUIState.STATE_LOADING: - // In loading state, onBookmarkDelegateInitialized() is not called for all - // UIObservers, which means that there will be no observers at the time. Do nothing. - assert mUIObservers.isEmpty(); - break; - case BookmarkUIState.STATE_SEARCHING: - observer.onSearchStateSet(); - break; - default: - assert false : "State not valid"; - break; - } - } - - @Override - public void openBookmark(BookmarkId bookmark) { - if (!mBookmarkOpener.openBookmarkInCurrentTab(bookmark, mIsIncognito)) return; - - // Close bookmark UI. Keep the reading list page open. - if (bookmark != null && bookmark.getType() != BookmarkType.READING_LIST) { - BookmarkUtils.finishActivityOnPhone(mContext); - } - } - - @Override - public void openBookmarksInNewTabs(List<BookmarkId> bookmarks, boolean incognito) { - if (mBookmarkOpener.openBookmarksInNewTabs(bookmarks, incognito)) { - BookmarkUtils.finishActivityOnPhone(mContext); - } - } - - @Override - public void openSearchUI() { - setState(BookmarkUIState.createSearchState()); - mSelectableListLayout.onStartSearch(R.string.bookmark_no_result); - mToolbar.showSearchView(true); - } - - @Override - public void closeSearchUI() { - mToolbar.hideSearchView(); - } - - @Override - public void addUIObserver(BookmarkUIObserver observer) { - mUIObservers.addObserver(observer); - } - - @Override - public void removeUIObserver(BookmarkUIObserver observer) { - mUIObservers.removeObserver(observer); - } - - @Override - public BookmarkModel getModel() { - return mBookmarkModel; - } - - @Override - public int getCurrentState() { - if (mStateStack.isEmpty()) return BookmarkUIState.STATE_LOADING; - return mStateStack.peek().mState; - } - - @Override - public LargeIconBridge getLargeIconBridge() { - return mLargeIconBridge; - } - - @Override - public DragStateDelegate getDragStateDelegate() { - return mDragStateDelegate; - } - - // SearchDelegate overrides + // SearchDelegate implementation. @Override public void onSearchTextChanged(String query) { - mAdapter.search(query); + mMediator.onSearchTextChanged(query); } @Override public void onEndSearch() { - mSelectableListLayout.onEndSearch(); - - // Pop the search state off the stack. - mStateStack.pop(); - - // Set the state back to the folder that was previously being viewed. Listeners, including - // the BookmarkItemsAdapter, will be notified of the change and the list of bookmarks will - // be updated. - setState(mStateStack.pop()); + mMediator.onEndSearch(); } - @Override - public void highlightBookmark(BookmarkId bookmarkId) { - mAdapter.highlightBookmark(bookmarkId); + // Private methods. + + private int computeCacheMaxSize() { + ActivityManager activityManager = + ((ActivityManager) ContextUtils.getApplicationContext().getSystemService( + Context.ACTIVITY_SERVICE)); + return Math.min(activityManager.getMemoryClass() / 4 * ConversionUtils.BYTES_PER_MEGABYTE, + FAVICON_MAX_CACHE_SIZE_BYTES); } - // Testing methods + // Testing methods. @VisibleForTesting public BookmarkActionBar getToolbarForTests() { @@ -667,15 +221,15 @@ return mRecyclerView; } - /** - * @param preventLoading Whether to prevent the bookmark model from fully loading for testing. - */ - @VisibleForTesting public static void preventLoadingForTesting(boolean preventLoading) { - sPreventLoadingForTesting = preventLoading; + BookmarkManagerMediator.preventLoadingForTesting(preventLoading); } public BookmarkOpener getBookmarkOpenerForTesting() { return mBookmarkOpener; } + + public BookmarkDelegate getBookmarkDelegateForTesting() { + return mMediator; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java index df8f710..481b180 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java
@@ -47,7 +47,7 @@ * @param delegate A {@link BookmarkDelegate} instance to handle all backend interaction. * @param bookmarkPromoHeader Used to show the signin promo header. */ - public void onBookmarkDelegateInitialized( + public void initialize( @NonNull BookmarkDelegate delegate, @NonNull BookmarkPromoHeader bookmarkPromoHeader) { mDelegate = delegate; mPromoHeaderManager = bookmarkPromoHeader;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java index be442f61..559902a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -4,5 +4,556 @@ package org.chromium.chrome.browser.bookmarks; +import android.content.Context; +import android.text.TextUtils; +import android.view.accessibility.AccessibilityManager; + +import androidx.annotation.VisibleForTesting; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver; + +import org.chromium.base.ObserverList; +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.base.supplier.ObservableSupplierImpl; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.bookmarks.BookmarkItemsAdapter.ViewFactory; +import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksReader; +import org.chromium.chrome.browser.ui.native_page.BasicNativePage; +import org.chromium.components.bookmarks.BookmarkId; +import org.chromium.components.bookmarks.BookmarkItem; +import org.chromium.components.bookmarks.BookmarkType; +import org.chromium.components.browser_ui.widget.dragreorder.DragStateDelegate; +import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout; +import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; +import org.chromium.components.favicon.LargeIconBridge; +import org.chromium.url.GURL; + +import java.util.List; +import java.util.Stack; + /** Respondible for BookmarkManager business logic. */ -class BookmarkManagerMediator {} +// TODO(crbug.com/1416611): Remove BookmarkDelegate if possible. +class BookmarkManagerMediator + implements BookmarkDelegate, PartnerBookmarksReader.FaviconUpdateObserver { + private static boolean sPreventLoadingForTesting; + + /** + * Keeps track of whether drag is enabled / active for bookmark lists. + */ + class BookmarkDragStateDelegate implements DragStateDelegate { + private BookmarkDelegate mBookmarkDelegate; + private SelectionDelegate<BookmarkId> mSelectionDelegate; + private AccessibilityManager mA11yManager; + private AccessibilityManager.AccessibilityStateChangeListener mA11yChangeListener; + private boolean mA11yEnabled; + + void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { + mBookmarkDelegate = delegate; + + mSelectionDelegate = delegate.getSelectionDelegate(); + + mA11yManager = + (AccessibilityManager) getSelectableListLayout().getContext().getSystemService( + Context.ACCESSIBILITY_SERVICE); + mA11yEnabled = mA11yManager.isEnabled(); + mA11yChangeListener = enabled -> mA11yEnabled = enabled; + mA11yManager.addAccessibilityStateChangeListener(mA11yChangeListener); + } + + // DragStateDelegate implementation + @Override + public boolean getDragEnabled() { + return !mA11yEnabled + && mBookmarkDelegate.getCurrentState() == BookmarkUIState.STATE_FOLDER; + } + + @Override + public boolean getDragActive() { + return getDragEnabled() && mSelectionDelegate.isSelectionEnabled(); + } + + @VisibleForTesting + @Override + public void setA11yStateForTesting(boolean a11yEnabled) { + if (mA11yManager != null) { + mA11yManager.removeAccessibilityStateChangeListener(mA11yChangeListener); + } + mA11yChangeListener = null; + mA11yManager = null; + mA11yEnabled = a11yEnabled; + } + } + + private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() { + @Override + public void bookmarkNodeChildrenReordered(BookmarkItem node) { + mBookmarkItemsAdapter.refresh(); + } + + @Override + @SuppressWarnings("NotifyDataSetChanged") + public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, + boolean isDoingExtensiveChanges) { + // If the folder is removed in folder mode, show the parent folder or falls back to all + // bookmarks mode. + if (getCurrentState() == BookmarkUIState.STATE_FOLDER + && node.getId().equals(mStateStack.peek().mFolder)) { + if (mBookmarkModel.getTopLevelFolderIDs(true, true).contains(node.getId())) { + openFolder(mBookmarkModel.getDefaultFolderViewLocation()); + } else { + openFolder(parent.getId()); + } + } + + // This is necessary as long as we rely on RecyclerView.ItemDecorations to apply padding + // at the bottom of the bookmarks list to avoid the bottom navigation menu. This ensures + // the item decorations are reapplied correctly when item indices change as the result + // of an item being deleted. + mBookmarkItemsAdapter.notifyDataSetChanged(); + } + + @Override + public void bookmarkNodeChanged(BookmarkItem node) { + if (getCurrentState() == BookmarkUIState.STATE_FOLDER && !mStateStack.isEmpty() + && node.getId().equals(mStateStack.peek().mFolder)) { + notifyUI(mStateStack.peek()); + return; + } + super.bookmarkNodeChanged(node); + } + + @Override + public void bookmarkModelChanged() { + // If the folder no longer exists in folder mode, we need to fall back. Relying on the + // default behavior by setting the folder mode again. + if (getCurrentState() == BookmarkUIState.STATE_FOLDER) { + setState(mStateStack.peek()); + } + } + }; + + private final Stack<BookmarkUIState> mStateStack = new Stack<>() { + @Override + public BookmarkUIState push(BookmarkUIState item) { + // The back press state depends on the size of stack. So push/pop item first in order + // to keep the size update-to-date. + var state = super.push(item); + onBackPressStateChanged(); + return state; + } + + @Override + public synchronized BookmarkUIState pop() { + var state = super.pop(); + onBackPressStateChanged(); + return state; + } + }; + + private final AdapterDataObserver mBookmarkItemsAdapterDataObserver = + new AdapterDataObserver() { + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + syncAdapterAndSelectionDelegate(); + } + + @Override + public void onChanged() { + syncAdapterAndSelectionDelegate(); + } + }; + + private final ObserverList<BookmarkUIObserver> mUIObservers = new ObserverList<>(); + private final BookmarkDragStateDelegate mDragStateDelegate = new BookmarkDragStateDelegate(); + private final Context mContext; + private final BookmarkModel mBookmarkModel; + private final BookmarkOpener mBookmarkOpener; + // TODO(crbug.com/1416611): Remove reference to SelectableListLayout. + // Owned by BookmarkManager(Coordinator). + private final SelectableListLayout<BookmarkId> mSelectableListLayout; + private final SelectionDelegate<BookmarkId> mSelectionDelegate; + // TODO(crbug.com/1416611): Remove reference to RecyclerView. + // Owned by BookmarkManager(Coordinator). + private final RecyclerView mRecyclerView; + // TODO(crbug.com/1416611): Remove reference to BookmarkItemsAdapter. + private final BookmarkItemsAdapter mBookmarkItemsAdapter; + // TODO(crbug.com/1416611): Remove reference to BookmarkActionBar. + // Owned by BookmarkManager(Coordinator). + private final BookmarkActionBar mBookmarkActionBar; + private final LargeIconBridge mLargeIconBridge; + /** Whether we're showing in a dialog UI which is only true for phones. */ + private final boolean mIsDialogUi; + private final boolean mIsIncognito; + private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier; + private final ViewFactory mViewFactory; + + /** Whether this instance has been destroyed. */ + private boolean mIsDestroyed; + private String mInitialUrl; + private boolean mFaviconsNeedRefresh; + private BasicNativePage mNativePage; + + BookmarkManagerMediator(Context context, BookmarkModel bookmarkModel, + BookmarkOpener bookmarkOpener, SelectableListLayout<BookmarkId> selectableListLayout, + SelectionDelegate<BookmarkId> selectionDelegate, RecyclerView recyclerView, + BookmarkItemsAdapter bookmarkItemsAdapter, BookmarkActionBar bookmarkActionBar, + LargeIconBridge largeIconBridge, boolean isDialogUi, boolean isIncognito, + ObservableSupplierImpl<Boolean> backPressStateSupplier, ViewFactory viewFactory) { + mContext = context; + mBookmarkModel = bookmarkModel; + mBookmarkModel.addObserver(mBookmarkModelObserver); + mBookmarkOpener = bookmarkOpener; + mSelectableListLayout = selectableListLayout; + mSelectableListLayout.getHandleBackPressChangedSupplier().addObserver( + (x) -> onBackPressStateChanged()); + mSelectionDelegate = selectionDelegate; + mRecyclerView = recyclerView; + mBookmarkItemsAdapter = bookmarkItemsAdapter; + mBookmarkItemsAdapter.registerAdapterDataObserver(mBookmarkItemsAdapterDataObserver); + mBookmarkActionBar = bookmarkActionBar; + mLargeIconBridge = largeIconBridge; + mIsDialogUi = isDialogUi; + mIsIncognito = isIncognito; + mBackPressStateSupplier = backPressStateSupplier; + mViewFactory = viewFactory; + + // Previously we were waiting for BookmarkModel to be loaded, but it's not necessary. + PartnerBookmarksReader.addFaviconUpdateObserver(this); + + initializeToLoadingState(); + if (!sPreventLoadingForTesting) { + mBookmarkModel.finishLoadingBookmarkModel(this::onBookmarkModelLoaded); + } + } + + void onBookmarkModelLoaded() { + mDragStateDelegate.onBookmarkDelegateInitialized(this); + mBookmarkItemsAdapter.onBookmarkDelegateInitialized(this, mViewFactory); + mBookmarkActionBar.onBookmarkDelegateInitialized(this); + mBookmarkItemsAdapter.addDragListener(mBookmarkActionBar); + + if (!TextUtils.isEmpty(mInitialUrl)) { + setState(BookmarkUIState.createStateFromUrl(mInitialUrl, mBookmarkModel)); + } + } + + void onDestroy() { + mIsDestroyed = true; + mBookmarkItemsAdapter.unregisterAdapterDataObserver(mBookmarkItemsAdapterDataObserver); + mBookmarkModel.removeObserver(mBookmarkModelObserver); + + mLargeIconBridge.destroy(); + PartnerBookmarksReader.removeFaviconUpdateObserver(this); + + for (BookmarkUIObserver observer : mUIObservers) { + observer.onDestroy(); + } + assert mUIObservers.size() == 0; + } + + /** See BookmarkManager(Coordinator)#onBackPressed. */ + boolean onBackPressed() { + if (mIsDestroyed) return false; + + // TODO(twellington): replicate this behavior for other list UIs during unification. + if (mSelectableListLayout.onBackPressed()) { + return true; + } + + if (!mStateStack.empty()) { + mStateStack.pop(); + if (!mStateStack.empty()) { + setState(mStateStack.pop()); + return true; + } + } + return false; + } + + /** See BookmarkManager(Coordinator)#setBasicNativePage. */ + void setBasicNativePage(BasicNativePage nativePage) { + mNativePage = nativePage; + } + + /** See BookmarkManager(Coordinator)#updateForUrl */ + void updateForUrl(String url) { + // Bookmark model is null if the manager has been destroyed. + if (mBookmarkModel == null) return; + + if (mBookmarkModel.isBookmarkModelLoaded()) { + BookmarkUIState searchState = null; + if (!mStateStack.isEmpty() + && mStateStack.peek().mState == BookmarkUIState.STATE_SEARCHING) { + searchState = mStateStack.pop(); + } + + setState(BookmarkUIState.createStateFromUrl(url, mBookmarkModel)); + + if (searchState != null) setState(searchState); + } else { + mInitialUrl = url; + } + } + + /** See BookmarkManager(Coordinator)#getCurrentUrl. */ + String getCurrentUrl() { + if (mStateStack.isEmpty()) return null; + return mStateStack.peek().mUrl; + } + + /** + * Puts all UI elements to loading state. This state might be overridden synchronously by + * {@link #updateForUrl(String)}, if the bookmark model is already loaded. + */ + private void initializeToLoadingState() { + mBookmarkActionBar.showLoadingUi(); + assert mStateStack.isEmpty(); + setState(BookmarkUIState.createLoadingState()); + } + + /** + * This is the ultimate internal method that updates UI and controls backstack. And it is the + * only method that pushes states to {@link #mStateStack}. + * + * <p>If the given state is not valid, all_bookmark state will be shown. Afterwards, this method + * checks the current state: if currently in loading state, it pops it out and adds the new + * state to the back stack. It also notifies the {@link #mNativePage} (if any) that the + * url has changed. + * + * <p>Also note that even if we store states to {@link #mStateStack}, on tablet the back + * navigation and back button are not controlled by the manager: the tab handles back key and + * backstack navigation. + */ + private void setState(BookmarkUIState state) { + if (!state.isValid(mBookmarkModel)) { + state = BookmarkUIState.createFolderState( + mBookmarkModel.getDefaultFolderViewLocation(), mBookmarkModel); + } + + if (!mStateStack.isEmpty() && mStateStack.peek().equals(state)) return; + + // The loading state is not persisted in history stack and once we have a valid state it + // shall be removed. + if (!mStateStack.isEmpty() && mStateStack.peek().mState == BookmarkUIState.STATE_LOADING) { + mStateStack.pop(); + } + mStateStack.push(state); + notifyUI(state); + } + + private void notifyUI(BookmarkUIState state) { + if (state.mState == BookmarkUIState.STATE_FOLDER) { + // Loading and searching states may be pushed to the stack but should never be stored in + // preferences. + BookmarkUtils.setLastUsedUrl(mContext, state.mUrl); + // If a loading state is replaced by another loading state, do not notify this change. + if (mNativePage != null) { + mNativePage.onStateChange(state.mUrl, false); + } + } + + for (BookmarkUIObserver observer : mUIObservers) { + notifyStateChange(observer); + } + } + + // TODO(lazzzis): This method can be moved to adapter after bookmark reordering launches. + /** + * Some bookmarks may be moved to another folder or removed in another devices. However, it may + * still be stored by {@link #mSelectionDelegate}, which causes incorrect selection counting. + */ + private void syncAdapterAndSelectionDelegate() { + for (BookmarkId node : mSelectionDelegate.getSelectedItemsAsList()) { + if (mSelectionDelegate.isItemSelected(node) + && mBookmarkItemsAdapter.getPositionForBookmark(node) == -1) { + mSelectionDelegate.toggleSelectionForItem(node); + } + } + } + + // BookmarkDelegate implementation + + @Override + public void moveDownOne(BookmarkId bookmarkId) { + mBookmarkItemsAdapter.moveDownOne(bookmarkId); + } + + @Override + public void moveUpOne(BookmarkId bookmarkId) { + mBookmarkItemsAdapter.moveUpOne(bookmarkId); + } + + @Override + public void onBookmarkItemMenuOpened() { + mBookmarkActionBar.hideKeyboard(); + } + + @Override + public boolean isDialogUi() { + return mIsDialogUi; + } + + @Override + public void openFolder(BookmarkId folder) { + RecordUserAction.record("MobileBookmarkManagerOpenFolder"); + if (mBookmarkActionBar.isSearching()) mBookmarkActionBar.hideSearchView(); + setState(BookmarkUIState.createFolderState(folder, mBookmarkModel)); + mRecyclerView.scrollToPosition(0); + } + + @Override + public SelectionDelegate<BookmarkId> getSelectionDelegate() { + return mSelectionDelegate; + } + + @Override + public SelectableListLayout<BookmarkId> getSelectableListLayout() { + return mSelectableListLayout; + } + + @Override + public void notifyStateChange(BookmarkUIObserver observer) { + int state = getCurrentState(); + switch (state) { + case BookmarkUIState.STATE_FOLDER: + observer.onFolderStateSet(mStateStack.peek().mFolder); + break; + case BookmarkUIState.STATE_LOADING: + // In loading state, onBookmarkDelegateInitialized() is not called for all + // UIObservers, which means that there will be no observers at the time. Do nothing. + assert mUIObservers.isEmpty(); + break; + case BookmarkUIState.STATE_SEARCHING: + observer.onSearchStateSet(); + break; + default: + assert false : "State not valid"; + break; + } + } + + @Override + public void openBookmark(BookmarkId bookmark) { + if (!mBookmarkOpener.openBookmarkInCurrentTab(bookmark, mIsIncognito)) return; + + // Close bookmark UI. Keep the reading list page open. + if (bookmark != null && bookmark.getType() != BookmarkType.READING_LIST) { + BookmarkUtils.finishActivityOnPhone(mContext); + } + } + + @Override + public void openBookmarksInNewTabs(List<BookmarkId> bookmarks, boolean incognito) { + if (mBookmarkOpener.openBookmarksInNewTabs(bookmarks, incognito)) { + BookmarkUtils.finishActivityOnPhone(mContext); + } + } + + @Override + public void openSearchUI() { + setState(BookmarkUIState.createSearchState()); + mSelectableListLayout.onStartSearch(R.string.bookmark_no_result); + mBookmarkActionBar.showSearchView(true); + } + + @Override + public void closeSearchUI() { + mBookmarkActionBar.hideSearchView(); + } + + @Override + public void addUIObserver(BookmarkUIObserver observer) { + mUIObservers.addObserver(observer); + } + + @Override + public void removeUIObserver(BookmarkUIObserver observer) { + mUIObservers.removeObserver(observer); + } + + @Override + public BookmarkModel getModel() { + return mBookmarkModel; + } + + @Override + public int getCurrentState() { + if (mStateStack.isEmpty()) return BookmarkUIState.STATE_LOADING; + return mStateStack.peek().mState; + } + + @Override + public LargeIconBridge getLargeIconBridge() { + return mLargeIconBridge; + } + + @Override + public DragStateDelegate getDragStateDelegate() { + return mDragStateDelegate; + } + + @Override + public void highlightBookmark(BookmarkId bookmarkId) { + mBookmarkItemsAdapter.highlightBookmark(bookmarkId); + } + + // SearchDelegate implementation. + // Actual interface implemented in BookmarkManager(Coordinator). + + void onSearchTextChanged(String query) { + mBookmarkItemsAdapter.search(query); + } + + void onEndSearch() { + mSelectableListLayout.onEndSearch(); + + // Pop the search state off the stack. + mStateStack.pop(); + + // Set the state back to the folder that was previously being viewed. Listeners, including + // the BookmarkItemsAdapter, will be notified of the change and the list of bookmarks will + // be updated. + setState(mStateStack.pop()); + } + + // PartnerBookmarksReader.FaviconUpdateObserver implementation. + + @Override + public void onUpdateFavicon(String url) { + assert mBookmarkModel.isBookmarkModelLoaded(); + mLargeIconBridge.clearFavicon(new GURL(url)); + mFaviconsNeedRefresh = true; + } + + @Override + public void onCompletedFaviconLoading() { + assert mBookmarkModel.isBookmarkModelLoaded(); + if (mFaviconsNeedRefresh) { + mBookmarkItemsAdapter.refresh(); + mFaviconsNeedRefresh = false; + } + } + + // Private methods. + + private void onBackPressStateChanged() { + if (mIsDestroyed) { + mBackPressStateSupplier.set(false); + return; + } + mBackPressStateSupplier.set( + Boolean.TRUE.equals(mSelectableListLayout.getHandleBackPressChangedSupplier().get()) + || mStateStack.size() > 1); + } + + // Testing methods. + + /** Whether to prevent the bookmark model from fully loading for testing. */ + static void preventLoadingForTesting(boolean preventLoading) { + sPreventLoadingForTesting = preventLoading; + } + + void clearStateStackForTesting() { + mStateStack.clear(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java index dc3b5fba..4bed28d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
@@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.native_page.BasicNativePage; import org.chromium.chrome.browser.ui.native_page.NativePageHost; @@ -32,8 +33,8 @@ boolean isIncognito, NativePageHost host) { super(host); - mManager = new BookmarkManager( - host.getContext(), componentName, false, isIncognito, snackbarManager); + mManager = new BookmarkManager(host.getContext(), componentName, false, isIncognito, + snackbarManager, Profile.getLastUsedRegularProfile()); mManager.setBasicNativePage(this); mTitle = host.getContext().getResources().getString(R.string.bookmarks);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java index b5826fb2..0ad13ad 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java
@@ -9,6 +9,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; @@ -173,7 +174,7 @@ if (isFullHeight()) { // We should update CCT position before Window#FLAG_LAYOUT_NO_LIMITS is set, // otherwise it is not possible to get the correct content height. - mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + configureLayoutBeyondScreen(false); // Clean up the state initiated by IME so the height can be restored when // rotating back to non-full-height mode later. @@ -353,12 +354,37 @@ if (mFinishRunnable != null) return; mFinishRunnable = finishRunnable; + configureLayoutBeyondScreen(true); + AnimatorUpdateListener updater = animator -> setWindowY((int) animator.getAnimatedValue()); + int start = mActivity.getWindow().getAttributes().y; + startAnimation(start, mHeight, updater, this::onCloseAnimationEnd); + } + protected void configureLayoutBeyondScreen(boolean enable) { Window window = mActivity.getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); - WindowManager.LayoutParams attrs = window.getAttributes(); + if (enable) { + window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + } + } - startAnimation(attrs.y, mHeight, (animator) -> {}, this::onCloseAnimationEnd); + protected void setWindowX(int x) { + var attrs = mActivity.getWindow().getAttributes(); + attrs.x = x; + mActivity.getWindow().setAttributes(attrs); + } + + protected void setWindowY(int y) { + var attrs = mActivity.getWindow().getAttributes(); + attrs.y = y; + mActivity.getWindow().setAttributes(attrs); + } + + protected void setWindowWidth(int width) { + var attrs = mActivity.getWindow().getAttributes(); + attrs.width = width; + mActivity.getWindow().setAttributes(attrs); } protected void onCloseAnimationEnd() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java index 9054c52..aec9d2c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
@@ -120,15 +120,6 @@ startAnimation(start, end, closeAnimation, this::onCloseAnimationEnd, true); } - private void configureLayoutBeyondScreen(boolean enable) { - Window window = mActivity.getWindow(); - if (enable) { - window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); - } else { - window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); - } - } - @Override public void onToolbarInitialized( View coordinatorView, CustomTabToolbar toolbar, @Px int toolbarCornerRadius) { @@ -175,24 +166,6 @@ return mIsMaximized; } - private void setWindowX(int x) { - var attrs = mActivity.getWindow().getAttributes(); - attrs.x = x; - mActivity.getWindow().setAttributes(attrs); - } - - private void setWindowY(int y) { - var attrs = mActivity.getWindow().getAttributes(); - attrs.y = y; - mActivity.getWindow().setAttributes(attrs); - } - - private void setWindowWidth(int width) { - var attrs = mActivity.getWindow().getAttributes(); - attrs.width = width; - mActivity.getWindow().setAttributes(attrs); - } - private void onMaximizeEnd(boolean animate) { if (isMaximized()) { if (mSheetOnRight) configureLayoutBeyondScreen(false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java index 6896ae6..6c1ba175 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java
@@ -15,7 +15,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.IntentUtils; -import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.content_public.browser.ContentFeatureList; @@ -80,7 +79,6 @@ intent = MultiWindowUtils.createNewWindowIntent(mContext.getApplicationContext(), MultiWindowUtils.getInstanceIdForViewIntent(), true, false); intent.setData(Uri.parse(urlString)); - intent.putExtra(IntentHandler.EXTRA_SOURCE_DRAG_DROP, true); // Remove the trusted application intent extra as the intent could pose a security risk // once it leaves Chrome's boundaries. intent.removeExtra(IntentUtils.TRUSTED_APPLICATION_CODE_EXTRA);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java index 875c7923..a0f5a58 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -7,8 +7,6 @@ import android.content.Context; import android.graphics.drawable.Drawable; -import androidx.annotation.DimenRes; -import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.appcompat.content.res.AppCompatResources; @@ -50,30 +48,12 @@ import org.chromium.components.signin.identitymanager.PrimaryAccountChangeEvent; import org.chromium.components.signin.metrics.SigninAccessPoint; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - /** * Handles displaying IdentityDisc on toolbar depending on several conditions * (user sign-in state, whether NTP is shown) */ public class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Observer, IdentityManager.Observer, ButtonDataProvider { - // Visual state of Identity Disc. - @Retention(RetentionPolicy.SOURCE) - @IntDef({IdentityDiscState.NONE, IdentityDiscState.SMALL, IdentityDiscState.LARGE}) - private @interface IdentityDiscState { - // Identity Disc is hidden. - int NONE = 0; - - // Small Identity Disc is shown. - int SMALL = 1; - - // Large Identity Disc is shown. - int LARGE = 2; - int MAX = 3; - } - // Context is used for fetching resources and launching preferences page. private final Context mContext; private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; @@ -83,15 +63,11 @@ // We observe IdentityManager to receive primary account state change notifications. private IdentityManager mIdentityManager; - // ProfileDataCache facilitates retrieving profile picture. Separate objects are maintained - // for different visual states to cache profile pictures of different size. - // mProfileDataCache[IdentityDiscState.NONE] should always be null since in this state - // Identity Disc is not visible. - private ProfileDataCache mProfileDataCache[] = new ProfileDataCache[IdentityDiscState.MAX]; + // ProfileDataCache facilitates retrieving profile picture. + private ProfileDataCache mProfileDataCache; - // Identity disc visibility state. - @IdentityDiscState - private int mState = IdentityDiscState.NONE; + // Whether the identity disc is visible. + private boolean mIsIdentityDiscShown; private ButtonDataImpl mButtonData; private ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); @@ -181,13 +157,13 @@ String email = CoreAccountInfo.getEmailFrom(getSignedInAccountInfo()); if (ChromeFeatureList.isEnabled(ChromeFeatureList.IDENTITY_STATUS_CONSISTENCY)) { - mState = IdentityDiscState.SMALL; + mIsIdentityDiscShown = true; } else { - mState = email == null ? IdentityDiscState.NONE : IdentityDiscState.SMALL; + mIsIdentityDiscShown = email != null; } - ensureProfileDataCache(mState); + ensureProfileDataCache(mIsIdentityDiscShown); - if (mState != IdentityDiscState.NONE) { + if (mIsIdentityDiscShown) { mButtonData.setButtonSpec( buttonSpecWithDrawableAndDescription(mButtonData.getButtonSpec(), email)); mButtonData.setCanShow(true); @@ -215,41 +191,34 @@ * Creates and initializes ProfileDataCache if it wasn't created previously. Subscribes * IdentityDiscController for profile data updates. */ - private void ensureProfileDataCache(@IdentityDiscState int state) { - if (state == IdentityDiscState.NONE || mProfileDataCache[state] != null) return; + private void ensureProfileDataCache(boolean isIdentityDiscShown) { + if (!isIdentityDiscShown || mProfileDataCache != null) return; - @DimenRes - int dimension_id = - (state == IdentityDiscState.SMALL) ? R.dimen.toolbar_identity_disc_size - : R.dimen.toolbar_identity_disc_size_duet; - ProfileDataCache profileDataCache = - ProfileDataCache.createWithoutBadge(mContext, dimension_id); - profileDataCache.addObserver(this); - mProfileDataCache[state] = profileDataCache; + mProfileDataCache = + ProfileDataCache.createWithoutBadge(mContext, R.dimen.toolbar_identity_disc_size); + mProfileDataCache.addObserver(this); } /** * Returns Profile picture Drawable. The size of the image corresponds to current visual state. */ private Drawable getProfileImage(@Nullable String email) { - assert mState != IdentityDiscState.NONE; + assert mIsIdentityDiscShown; if (shouldUseSignedOutAvatar(email)) { return AppCompatResources.getDrawable(mContext, R.drawable.account_circle_full); } - return mProfileDataCache[mState].getProfileDataOrDefault(email).getImage(); + return mProfileDataCache.getProfileDataOrDefault(email).getImage(); } /** - * Hides IdentityDisc and resets all ProfileDataCache objects. Used for flushing cached images + * Hides IdentityDisc and resets ProfileDataCache. Used for flushing cached image * when sign-in state changes. */ private void resetIdentityDiscCache() { - for (int i = 0; i < IdentityDiscState.MAX; i++) { - if (mProfileDataCache[i] != null) { - assert i != IdentityDiscState.NONE; - mProfileDataCache[i].removeObserver(this); - mProfileDataCache[i] = null; - } + if (mProfileDataCache != null) { + assert mIsIdentityDiscShown; + mProfileDataCache.removeObserver(this); + mProfileDataCache = null; } } @@ -264,8 +233,8 @@ */ @Override public void onProfileDataUpdated(String accountEmail) { - if (mState == IdentityDiscState.NONE) return; - assert mProfileDataCache[mState] != null; + if (!mIsIdentityDiscShown) return; + assert mProfileDataCache != null; if (accountEmail.equals(CoreAccountInfo.getEmailFrom(getSignedInAccountInfo()))) { /** @@ -310,11 +279,9 @@ mActivityLifecycleDispatcher = null; } - for (int i = 0; i < IdentityDiscState.MAX; i++) { - if (mProfileDataCache[i] != null) { - mProfileDataCache[i].removeObserver(this); - mProfileDataCache[i] = null; - } + if (mProfileDataCache != null) { + mProfileDataCache.removeObserver(this); + mProfileDataCache = null; } if (mIdentityManager != null) { @@ -376,8 +343,7 @@ return mContext.getString(R.string.accessibility_toolbar_btn_signed_out_identity_disc); } - DisplayableProfileData profileData = - mProfileDataCache[mState].getProfileDataOrDefault(email); + DisplayableProfileData profileData = mProfileDataCache.getProfileDataOrDefault(email); String userName = profileData.getFullName(); if (profileData.hasDisplayableEmailAddress()) { return mContext.getString(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LegacyIncognitoDescriptionView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LegacyIncognitoDescriptionView.java index 5c5ae20..517d820 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/LegacyIncognitoDescriptionView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/LegacyIncognitoDescriptionView.java
@@ -26,7 +26,6 @@ import androidx.appcompat.widget.SwitchCompat; import org.chromium.chrome.R; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.text.NoUnderlineClickableSpan; @@ -285,10 +284,8 @@ /** Adjust the "Learn More" link. */ private void adjustLearnMore() { - boolean readLaterEnabled = ChromeFeatureList.sReadLater.isEnabled(); - final String subtitleText = getContext().getResources().getString(readLaterEnabled - ? R.string.new_tab_otr_subtitle_with_reading_list - : R.string.new_tab_otr_subtitle); + final String subtitleText = getContext().getResources().getString( + R.string.new_tab_otr_subtitle_with_reading_list); boolean learnMoreInSubtitle = mWidthDp > WIDE_LAYOUT_THRESHOLD_DP; mLearnMore.setVisibility(learnMoreInSubtitle ? View.GONE : View.VISIBLE);
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 7648834..79229f3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -109,9 +109,6 @@ 'TabStateBrowserControlsVisibilityDelegate\.java': [ "+chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeAccessibilityUtil.java", ], - 'TabViewAndroidDelegate\.java': [ - "+chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.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/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java index 65e9ed6..8fcbcf5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -247,12 +247,12 @@ } TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.getDragStateDelegate().setA11yStateForTesting(false)); + () -> getBookmarkDelegate().getDragStateDelegate().setA11yStateForTesting(false)); } void openRootFolder() { TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); + () -> getBookmarkDelegate().openFolder(mBookmarkModel.getRootFolderId())); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); } @@ -421,7 +421,7 @@ openMobileBookmarks(); BookmarkTestUtil.waitForBookmarkModelLoaded(); - BookmarkDelegate delegate = getBookmarkManager(); + BookmarkDelegate delegate = getBookmarkDelegate(); Assert.assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); Assert.assertEquals("chrome-native://bookmarks/folder/3", @@ -434,8 +434,8 @@ public void testFolderNavigation_Phone() throws InterruptedException, ExecutionException { BookmarkId testFolder = addFolder(TEST_FOLDER_TITLE); openBookmarkManager(); - final BookmarkDelegate delegate = getBookmarkManager(); - final BookmarkActionBar toolbar = ((BookmarkManager) delegate).getToolbarForTests(); + final BookmarkDelegate delegate = getBookmarkDelegate(); + final BookmarkActionBar toolbar = mManager.getToolbarForTests(); // Open the "Mobile bookmarks" folder. TestThreadUtils.runOnUiThreadBlocking( @@ -494,7 +494,7 @@ openBookmarkManager(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkDelegate delegate = getBookmarkManager(); + final BookmarkDelegate delegate = getBookmarkDelegate(); // Open the new folder where these bookmarks were created. openFolder(folder); @@ -526,8 +526,7 @@ Assert.assertEquals("Wrong number of items after searching for non-existent item.", 0, mItemsContainer.getAdapter().getItemCount()); - TestThreadUtils.runOnUiThreadBlocking( - () -> ((BookmarkManager) delegate).getToolbarForTests().hideSearchView()); + TestThreadUtils.runOnUiThreadBlocking(() -> mManager.getToolbarForTests().hideSearchView()); Assert.assertEquals("Wrong number of items after closing search UI.", 3, mItemsContainer.getAdapter().getItemCount()); Assert.assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); @@ -544,13 +543,12 @@ openBookmarkManager(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkDelegate delegate = getBookmarkManager(); + final BookmarkDelegate delegate = getBookmarkDelegate(); // Open the new folder where these bookmarks were created. openFolder(folder); - Assert.assertEquals( - Boolean.TRUE, getBookmarkManager().getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(Boolean.TRUE, mManager.getHandleBackPressChangedSupplier().get()); TestThreadUtils.runOnUiThreadBlocking(delegate::openSearchUI); @@ -559,8 +557,7 @@ "Wrong number of items after showing search UI. The promo should be hidden.", 2, adapter.getItemCount()); - Assert.assertEquals( - Boolean.TRUE, getBookmarkManager().getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(Boolean.TRUE, mManager.getHandleBackPressChangedSupplier().get()); // Exit search UI. TestThreadUtils.runOnUiThreadBlocking( @@ -591,8 +588,7 @@ CriteriaHelper.pollUiThread( () -> !itemView.isChecked(), "Expected item \"test\" to become not selected"); Assert.assertEquals(BookmarkUIState.STATE_SEARCHING, delegate.getCurrentState()); - Assert.assertEquals( - Boolean.TRUE, getBookmarkManager().getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(Boolean.TRUE, mManager.getHandleBackPressChangedSupplier().get()); // Exit search UI. TestThreadUtils.runOnUiThreadBlocking( @@ -600,15 +596,13 @@ Assert.assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); // Exit folder. - Assert.assertEquals( - Boolean.TRUE, getBookmarkManager().getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(Boolean.TRUE, mManager.getHandleBackPressChangedSupplier().get()); TestThreadUtils.runOnUiThreadBlocking( mBookmarkActivity.getOnBackPressedDispatcher()::onBackPressed); Assert.assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); // Exit bookmark activity. - Assert.assertEquals( - Boolean.FALSE, getBookmarkManager().getHandleBackPressChangedSupplier().get()); + Assert.assertEquals(Boolean.FALSE, mManager.getHandleBackPressChangedSupplier().get()); TestThreadUtils.runOnUiThreadBlocking( mBookmarkActivity.getOnBackPressedDispatcher()::onBackPressed); ApplicationTestUtils.waitForActivityState(mBookmarkActivity, Stage.DESTROYED); @@ -625,41 +619,35 @@ openBookmarkManager(); RecyclerView.Adapter adapter = getAdapter(); - BookmarkManager manager = getBookmarkManager(); // Open the new folder where these bookmarks were created. openFolder(testFolder); Assert.assertEquals("Wrong state, should be in folder", BookmarkUIState.STATE_FOLDER, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); Assert.assertEquals( "Wrong number of items before starting search.", 3, adapter.getItemCount()); // Start searching without entering a query. - TestThreadUtils.runOnUiThreadBlocking(manager::openSearchUI); + TestThreadUtils.runOnUiThreadBlocking(getBookmarkDelegate()::openSearchUI); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); // Select testFolder2 and delete it. toggleSelectionAndEndAnimation(testFolder2, (BookmarkRow) mItemsContainer.findViewHolderForLayoutPosition(2).itemView); TestThreadUtils.runOnUiThreadBlocking( () - -> manager.getToolbarForTests().onMenuItemClick( - manager.getToolbarForTests().getMenu().findItem( + -> mManager.getToolbarForTests().onMenuItemClick( + mManager.getToolbarForTests().getMenu().findItem( R.id.selection_mode_delete_menu_id))); - // Search should be exited and the folder should be gone. - Assert.assertEquals("Wrong state, should be in folder", BookmarkUIState.STATE_FOLDER, - manager.getCurrentState()); + // Should still be searching with the folder gone. Assert.assertEquals( - "Wrong number of items before starting search.", 2, adapter.getItemCount()); + "Wrong number of items.", 0, mItemsContainer.getAdapter().getItemCount()); // Start searching, enter a query. - TestThreadUtils.runOnUiThreadBlocking(manager::openSearchUI); - Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); searchBookmarks("Google"); Assert.assertEquals("Wrong number of items after searching.", 1, mItemsContainer.getAdapter().getItemCount()); @@ -669,17 +657,17 @@ // The user should still be searching, and the bookmark should be gone. Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); Assert.assertEquals("Wrong number of items after searching.", 0, mItemsContainer.getAdapter().getItemCount()); // Undo the deletion. TestThreadUtils.runOnUiThreadBlocking( - () -> manager.getUndoControllerForTests().onAction(null)); + () -> mManager.getUndoControllerForTests().onAction(null)); // The user should still be searching, and the bookmark should reappear. Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); Assert.assertEquals("Wrong number of items after searching.", 1, mItemsContainer.getAdapter().getItemCount()); } @@ -694,12 +682,11 @@ openBookmarkManager(); RecyclerView.Adapter adapter = getAdapter(); - BookmarkManager manager = getBookmarkManager(); // Start searching, enter a query. - TestThreadUtils.runOnUiThreadBlocking(manager::openSearchUI); + TestThreadUtils.runOnUiThreadBlocking(getBookmarkDelegate()::openSearchUI); Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); searchBookmarks("test"); Assert.assertEquals("Wrong number of items after searching.", 2, mItemsContainer.getAdapter().getItemCount()); @@ -709,17 +696,17 @@ // The user should still be searching, and the bookmark should be gone. Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); Assert.assertEquals("Wrong number of items after searching.", 0, mItemsContainer.getAdapter().getItemCount()); // Undo the deletion. TestThreadUtils.runOnUiThreadBlocking( - () -> manager.getUndoControllerForTests().onAction(null)); + () -> mManager.getUndoControllerForTests().onAction(null)); // The user should still be searching, and the bookmark should reappear. Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - manager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); Assert.assertEquals("Wrong number of items after searching.", 2, mItemsContainer.getAdapter().getItemCount()); } @@ -735,11 +722,10 @@ openMobileBookmarks(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkManager manager = getBookmarkManager(); - mRenderTestRule.render(manager.getView(), "bookmark_manager_one_folder"); + mRenderTestRule.render(mManager.getView(), "bookmark_manager_one_folder"); - BookmarkRow itemView = (BookmarkRow) manager.getRecyclerViewForTests() + BookmarkRow itemView = (BookmarkRow) mManager.getRecyclerViewForTests() .findViewHolderForAdapterPosition(0) .itemView; @@ -749,7 +735,7 @@ CriteriaHelper.pollUiThread( itemView::isChecked, "Expected item \"test\" to become selected"); - mRenderTestRule.render(manager.getView(), "bookmark_manager_folder_selected"); + mRenderTestRule.render(mManager.getView(), "bookmark_manager_folder_selected"); } @Test @@ -1146,13 +1132,14 @@ BookmarkPromoHeader.forcePromoStateForTests(SyncPromoState.PROMO_FOR_SYNC_TURNED_OFF_STATE); openBookmarkManager(); + RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); View promo = mItemsContainer.findViewHolderForAdapterPosition(0).itemView; TouchCommon.longPressView(promo); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); Assert.assertFalse("Expected that we would not be in selection mode " + "after long pressing on promo view.", - mManager.getSelectionDelegate().isSelectionEnabled()); + getBookmarkDelegate().getSelectionDelegate().isSelectionEnabled()); } @Test @@ -1167,7 +1154,7 @@ RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); Assert.assertFalse("Expected that we would not be in selection mode " + "after long pressing on partner bookmark.", - mManager.getSelectionDelegate().isSelectionEnabled()); + getBookmarkDelegate().getSelectionDelegate().isSelectionEnabled()); } @Test @@ -1310,7 +1297,7 @@ // Open partner bookmarks folder. TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.openFolder(mBookmarkModel.getPartnerFolderId())); + () -> getBookmarkDelegate().openFolder(mBookmarkModel.getPartnerFolderId())); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); Assert.assertEquals("Wrong number of items in partner bookmark folder.", 2, @@ -1485,8 +1472,8 @@ // Open mobile bookmarks folder, then go back to the subfolder. TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.openFolder(mBookmarkModel.getMobileFolderId()); - mManager.openFolder(testId); + getBookmarkDelegate().openFolder(mBookmarkModel.getMobileFolderId()); + getBookmarkDelegate().openFolder(testId); }); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); @@ -1556,7 +1543,7 @@ toggleSelectionAndEndAnimation(googleId, row); CallbackHelper helper = new CallbackHelper(); TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.getSelectionDelegate().addObserver((x) -> helper.notifyCalled()); + getBookmarkDelegate().getSelectionDelegate().addObserver((x) -> helper.notifyCalled()); }); removeBookmark(googleId); @@ -1597,7 +1584,7 @@ CallbackHelper helper = new CallbackHelper(); TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.getSelectionDelegate().addObserver((x) -> helper.notifyCalled()); + getBookmarkDelegate().getSelectionDelegate().addObserver((x) -> helper.notifyCalled()); }); removeBookmark(googleId); @@ -1751,10 +1738,9 @@ openMobileBookmarks(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkManager manager = getBookmarkManager(); - mRenderTestRule.render(manager.getView(), "bookmarks_visual_refresh_folders"); - BookmarkRow itemView = (BookmarkRow) manager.getRecyclerViewForTests() + mRenderTestRule.render(mManager.getView(), "bookmarks_visual_refresh_folders"); + BookmarkRow itemView = (BookmarkRow) mManager.getRecyclerViewForTests() .findViewHolderForAdapterPosition(0) .itemView; @@ -1764,7 +1750,7 @@ CriteriaHelper.pollUiThread( itemView::isChecked, "Expected item \"test\" to become selected"); - mRenderTestRule.render(manager.getView(), "bookmarks_visual_refresh_folders_selected"); + mRenderTestRule.render(mManager.getView(), "bookmarks_visual_refresh_folders_selected"); } @Test @@ -1780,13 +1766,12 @@ openMobileBookmarks(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkManager manager = getBookmarkManager(); - mRenderTestRule.render(manager.getView(), "bookmarks_visual_refresh_bookmarksandfolders"); - BookmarkRow itemView1 = (BookmarkRow) manager.getRecyclerViewForTests() + mRenderTestRule.render(mManager.getView(), "bookmarks_visual_refresh_bookmarksandfolders"); + BookmarkRow itemView1 = (BookmarkRow) mManager.getRecyclerViewForTests() .findViewHolderForAdapterPosition(0) .itemView; - BookmarkRow itemView2 = (BookmarkRow) manager.getRecyclerViewForTests() + BookmarkRow itemView2 = (BookmarkRow) mManager.getRecyclerViewForTests() .findViewHolderForAdapterPosition(1) .itemView; @@ -1799,8 +1784,8 @@ CriteriaHelper.pollUiThread( itemView2::isChecked, "Expected item \"test\" to become selected"); - mRenderTestRule.render( - manager.getView(), "bookmarks_compact_visual_refresh_bookmarksandfolders_selected"); + mRenderTestRule.render(mManager.getView(), + "bookmarks_compact_visual_refresh_bookmarksandfolders_selected"); } @Test @@ -1812,11 +1797,11 @@ openBookmarkManager(); BookmarkTestUtil.waitForBookmarkModelLoaded(); TestThreadUtils.runOnUiThreadBlocking( - () -> { mManager.openFolder(mBookmarkModel.getRootFolderId()); }); + () -> { getBookmarkDelegate().openFolder(mBookmarkModel.getRootFolderId()); }); onView(withText("Tracked products")).perform(click()); - final BookmarkDelegate delegate = getBookmarkManager(); - final BookmarkActionBar toolbar = ((BookmarkManager) delegate).getToolbarForTests(); + final BookmarkDelegate delegate = getBookmarkDelegate(); + final BookmarkActionBar toolbar = mManager.getToolbarForTests(); // Check that we are in the mobile bookmarks folder. Assert.assertEquals("Tracked products", toolbar.getTitle()); @@ -1840,9 +1825,8 @@ BookmarkTestUtil.waitForBookmarkModelLoaded(); RecyclerView.Adapter adapter = getAdapter(); - final BookmarkManager manager = getBookmarkManager(); - BookmarkRow itemView = (BookmarkRow) manager.getRecyclerViewForTests() + BookmarkRow itemView = (BookmarkRow) mManager.getRecyclerViewForTests() .findViewHolderForAdapterPosition(0) .itemView; Assert.assertNotEquals(PowerBookmarkShoppingItemRow.class, itemView.getClass()); @@ -1924,7 +1908,7 @@ private void toggleSelectionAndEndAnimation(BookmarkId id, BookmarkRow view) { TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.getSelectionDelegate().toggleSelectionForItem(id); + getBookmarkDelegate().getSelectionDelegate().toggleSelectionForItem(id); view.endAnimationsForTests(); mManager.getToolbarForTests().endAnimationsForTesting(); }); @@ -1964,10 +1948,6 @@ return mItemsContainer.getAdapter(); } - private BookmarkManager getBookmarkManager() { - return (BookmarkManager) getReorderAdapter().getDelegateForTesting(); - } - private BookmarkId getIdByPosition(int pos) { return getReorderAdapter().getIdByPosition(pos); } @@ -1977,8 +1957,12 @@ } private void openFolder(BookmarkId folder) { - final BookmarkDelegate delegate = getBookmarkManager(); + final BookmarkDelegate delegate = getBookmarkDelegate(); TestThreadUtils.runOnUiThreadBlocking(() -> delegate.openFolder(folder)); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); } + + private BookmarkDelegate getBookmarkDelegate() { + return mManager.getBookmarkDelegateForTesting(); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java index 5865c33..cc4bb29 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/ReadingListTest.java
@@ -40,7 +40,6 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import org.chromium.base.FeatureList; import org.chromium.base.test.util.ApplicationTestUtils; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; @@ -61,7 +60,6 @@ import org.chromium.chrome.browser.bookmarks.BookmarkRow; import org.chromium.chrome.browser.bookmarks.BookmarkUIState; import org.chromium.chrome.browser.bookmarks.BookmarkUtils; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.sync.SyncService; import org.chromium.chrome.browser.tab.Tab; @@ -71,7 +69,6 @@ import org.chromium.chrome.test.util.ActivityTestUtils; import org.chromium.chrome.test.util.BookmarkTestUtil; import org.chromium.chrome.test.util.MenuUtils; -import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkType; import org.chromium.components.browser_ui.widget.RecyclerViewTestUtils; @@ -91,7 +88,6 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) @DoNotBatch(reason = "BookmarkTest has behaviours and thus can't be batched.") -@Features.EnableFeatures({ChromeFeatureList.READ_LATER}) public class ReadingListTest { @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); @@ -104,8 +100,6 @@ private static final String TEST_PAGE_URL_FOO = "/chrome/test/data/android/test.html"; private static final int TEST_PORT = 12345; - FeatureList.TestValues mTestValues; - private BookmarkManager mManager; private BookmarkModel mBookmarkModel; private RecyclerView mItemsContainer; @@ -122,12 +116,6 @@ @Before public void setUp() { - mTestValues = new FeatureList.TestValues(); - FeatureList.setTestValues(mTestValues); - mTestValues.addFeatureFlagOverride(ChromeFeatureList.READ_LATER, true); - mTestValues.addFeatureFlagOverride(ChromeFeatureList.SHOPPING_LIST, false); - setFieldTrialParamForReadLater("use_root_bookmark_as_default", "true"); - mActivityTestRule.startMainActivityOnBlankPage(); TestThreadUtils.runOnUiThreadBlocking(() -> { mBookmarkModel = mActivityTestRule.getActivity().getBookmarkModelForTesting(); @@ -150,10 +138,6 @@ if (mActionTester != null) mActionTester.tearDown(); } - private void setFieldTrialParamForReadLater(String name, String value) { - mTestValues.addFieldTrialParamOverride(ChromeFeatureList.READ_LATER, name, value); - } - private void openBookmarkManager() throws InterruptedException { BookmarkTestUtil.readPartnerBookmarks(mActivityTestRule); BookmarkTestUtil.waitForBookmarkModelLoaded(); @@ -179,13 +163,13 @@ } TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.getDragStateDelegate().setA11yStateForTesting(false)); + () -> getBookmarkDelegate().getDragStateDelegate().setA11yStateForTesting(false)); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); } void openRootFolder() { TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); + () -> getBookmarkDelegate().openFolder(mBookmarkModel.getRootFolderId())); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); } @@ -218,8 +202,8 @@ return getReorderAdapter().getIdByPosition(pos); } - private BookmarkManager getBookmarkManager() { - return (BookmarkManager) getReorderAdapter().getDelegateForTesting(); + private BookmarkDelegate getBookmarkDelegate() { + return mManager.getBookmarkDelegateForTesting(); } @Test @@ -227,11 +211,9 @@ @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) public void testOpenBookmarkManagerWhenDefaultToRootEnabled() throws InterruptedException, ExecutionException { - setFieldTrialParamForReadLater("use_root_bookmark_as_default", "true"); - openBookmarkManager(); - BookmarkDelegate delegate = getBookmarkManager(); - BookmarkActionBar toolbar = ((BookmarkManager) delegate).getToolbarForTests(); + BookmarkDelegate delegate = getBookmarkDelegate(); + BookmarkActionBar toolbar = mManager.getToolbarForTests(); // We should default to the root bookmark. Assert.assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); @@ -324,9 +306,9 @@ openReadingList(); // Enter search UI, but don't enter any search key word. - TestThreadUtils.runOnUiThreadBlocking(mManager::openSearchUI); + TestThreadUtils.runOnUiThreadBlocking(getBookmarkDelegate()::openSearchUI); Assert.assertEquals("Wrong state, should be searching", BookmarkUIState.STATE_SEARCHING, - mManager.getCurrentState()); + getBookmarkDelegate().getCurrentState()); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); // Delete the reading list page in search state. @@ -351,7 +333,7 @@ // Open other folders will show the default empty view text. TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.openFolder(mBookmarkModel.getMobileFolderId())); + () -> getBookmarkDelegate().openFolder(mBookmarkModel.getMobileFolderId())); onView(withText(R.string.bookmarks_folder_empty)).check(matches(isDisplayed())); } @@ -515,7 +497,7 @@ openRootFolder(); openReadingList(); - TestThreadUtils.runOnUiThreadBlocking(mManager::openSearchUI); + TestThreadUtils.runOnUiThreadBlocking(getBookmarkDelegate()::openSearchUI); BookmarkActionBar toolbar = mManager.getToolbarForTests(); Assert.assertFalse("Menu items shouldn't be visible in search.",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java index d740398e..b3120c7a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java
@@ -347,11 +347,8 @@ @SmallTest @UiThreadTest @RequiresRestart - @Features.EnableFeatures({ChromeFeatureList.READ_LATER}) @DisabledTest(message = "Broken on official bot, crbug.com/1165869") public void testAddToReadingList() { - Assert.assertTrue("Read later feature is not loaded properly.", - ChromeFeatureList.isEnabled(ChromeFeatureList.READ_LATER)); Assert.assertNull("Should return null for non http/https URLs.", mBookmarkBridge.addToReadingList("a", new GURL("chrome://flags"))); BookmarkId readingListId =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java index 3c7d2a8..1d4341b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkOpenerTest.java
@@ -104,14 +104,14 @@ } TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.getDragStateDelegate().setA11yStateForTesting(false); + getBookmarkDelegate().getDragStateDelegate().setA11yStateForTesting(false); mBookmarkOpener = mManager.getBookmarkOpenerForTesting(); }); } void openRootFolder() { TestThreadUtils.runOnUiThreadBlocking( - () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); + () -> getBookmarkDelegate().openFolder(mBookmarkModel.getRootFolderId())); RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); } @@ -129,6 +129,10 @@ InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } + private BookmarkDelegate getBookmarkDelegate() { + return mManager.getBookmarkDelegateForTesting(); + } + @Test @MediumTest public void testOpenBookmarkInCurrentTab() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java index 97043a2..3c3d9bc02 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
@@ -9,6 +9,7 @@ import androidx.test.filters.MediumTest; +import org.chromium.base.test.util.DisabledTest; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -82,6 +83,7 @@ @Test @MediumTest @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @DisabledTest(message = "https://crbug.com/1417126") public void testArPermissionPersistance() { mWebXrArTestFramework.loadFileAndAwaitInitialization( "test_ar_request_session_succeeds", PAGE_LOAD_TIMEOUT_S); @@ -108,6 +110,7 @@ @Test @MediumTest @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @DisabledTest(message = "https://crbug.com/1417126") public void testRepeatedArSessionsSucceed() { mWebXrArTestFramework.loadFileAndAwaitInitialization( "test_ar_request_session_succeeds", PAGE_LOAD_TIMEOUT_S);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java new file mode 100644 index 0000000..dc8714d --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -0,0 +1,168 @@ +// 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.bookmarks; + +import android.content.Context; +import android.view.accessibility.AccessibilityManager; + +import androidx.recyclerview.widget.RecyclerView; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.annotation.Config; + +import org.chromium.base.supplier.ObservableSupplierImpl; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.Batch; +import org.chromium.chrome.browser.bookmarks.BookmarkItemsAdapter.ViewFactory; +import org.chromium.components.bookmarks.BookmarkId; +import org.chromium.components.bookmarks.BookmarkType; +import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout; +import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; +import org.chromium.components.favicon.LargeIconBridge; + +import java.util.Arrays; + +/** Unit tests for {@link BookmarkManagerMediator}. */ +@Batch(Batch.UNIT_TESTS) +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class BookmarkManagerMediatorTest { + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Mock + Context mContext; + @Mock + BookmarkModel mBookmarkModel; + @Mock + BookmarkOpener mBookmarkOpener; + @Mock + SelectableListLayout<BookmarkId> mSelectableListLayout; + @Mock + SelectionDelegate<BookmarkId> mSelectionDelegate; + @Mock + RecyclerView mRecyclerView; + @Mock + BookmarkItemsAdapter mBookmarkItemsAdapter; + @Mock + BookmarkActionBar mBookmarkActionBar; + @Mock + LargeIconBridge mLargeIconBridge; + @Mock + ViewFactory mViewFactory; + @Mock + AccessibilityManager mAccessibilityManager; + @Mock + BookmarkUIObserver mBookmarkUIObserver; + + final ObservableSupplierImpl<Boolean> mBackPressStateSupplier = + new ObservableSupplierImpl<Boolean>(); + final ObservableSupplierImpl<Boolean> mSelectableListLayoutHandleBackPressChangedSupplier = + new ObservableSupplierImpl<Boolean>(); + final BookmarkId mFolderId = new BookmarkId(/*id=*/1, BookmarkType.NORMAL); + final BookmarkId mFolder2Id = new BookmarkId(/*id=*/2, BookmarkType.NORMAL); + + BookmarkManagerMediator mMediator; + + @Before + public void setUp() { + // Setup Context + Mockito.doReturn(mAccessibilityManager) + .when(mContext) + .getSystemService(Context.ACCESSIBILITY_SERVICE); + + // Setup BookmarkModel + Mockito.doReturn(true).when(mBookmarkModel).doesBookmarkExist(Mockito.any()); + Mockito.doReturn(Arrays.asList(mFolder2Id)).when(mBookmarkModel).getChildIDs(mFolderId); + + // Setup SelectableListLayout + Mockito.doReturn(mContext).when(mSelectableListLayout).getContext(); + Mockito.doReturn(mSelectableListLayoutHandleBackPressChangedSupplier) + .when(mSelectableListLayout) + .getHandleBackPressChangedSupplier(); + + // Setup BookmarkUIObserver + Mockito.doAnswer((invocation) -> { + mMediator.removeUIObserver(mBookmarkUIObserver); + return null; + }) + .when(mBookmarkUIObserver) + .onDestroy(); + + mMediator = new BookmarkManagerMediator(mContext, mBookmarkModel, mBookmarkOpener, + mSelectableListLayout, mSelectionDelegate, mRecyclerView, mBookmarkItemsAdapter, + mBookmarkActionBar, mLargeIconBridge, /*isDialogUi=*/true, /*isIncognito=*/false, + mBackPressStateSupplier, mViewFactory); + mMediator.addUIObserver(mBookmarkUIObserver); + } + + void finishLoading() { + mMediator.onBookmarkModelLoaded(); + } + + @Test + public void initAndLoadBookmarkModel() { + finishLoading(); + Assert.assertEquals(BookmarkUIState.STATE_LOADING, mMediator.getCurrentState()); + } + + @Test + public void setUrlBeforeModelLoaded() { + // Setting a URL prior to the model loading should set the state for when it loads. + mMediator.updateForUrl("chrome-native://bookmarks/folder/" + mFolderId.getId()); + + finishLoading(); + Assert.assertEquals(BookmarkUIState.STATE_FOLDER, mMediator.getCurrentState()); + } + + @Test + public void destroyUnregistersObservers() { + finishLoading(); + + mMediator.onDestroy(); + Mockito.verify(mBookmarkUIObserver).onDestroy(); + } + + @Test + public void onBackPressed_SelectableListLayoutIntercepts() { + finishLoading(); + + Mockito.doReturn(true).when(mSelectableListLayout).onBackPressed(); + + Assert.assertTrue(mMediator.onBackPressed()); + } + + @Test + public void onBackPressed_EmptyStateStack() { + finishLoading(); + + mMediator.clearStateStackForTesting(); + Assert.assertFalse(mMediator.onBackPressed()); + } + + @Test + public void onBackPressed_SingleStateStack() { + finishLoading(); + + Assert.assertFalse(mMediator.onBackPressed()); + } + + @Test + public void onBackPressed_MultipleStateStack() { + finishLoading(); + + mMediator.openFolder(mFolderId); + mMediator.openFolder(mFolder2Id); + Assert.assertTrue(mMediator.onBackPressed()); + } +} \ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java index 254ebb88..883c277 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java
@@ -22,11 +22,8 @@ import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; -import org.chromium.base.FeatureList; -import org.chromium.base.FeatureList.TestValues; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.bookmarks.BookmarkModel; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.bookmarks.BookmarkId; @@ -122,11 +119,7 @@ BookmarkId readingListId = new BookmarkId(1, BookmarkType.READING_LIST); BookmarkId regularId = new BookmarkId(1, BookmarkType.NORMAL); - // wrong type - setBookmarkTypeSwappingEnabled(true); Assert.assertFalse(ReadingListUtils.isSwappableReadingListItem(regularId)); - - setBookmarkTypeSwappingEnabled(true); Assert.assertTrue(ReadingListUtils.isSwappableReadingListItem(readingListId)); } @@ -136,21 +129,15 @@ BookmarkId bookmarkId = Mockito.mock(BookmarkId.class); doReturn(BookmarkType.NORMAL).when(bookmarkId).getType(); - // bookmarkId null - setBookmarkTypeSwappingEnabled(true); Assert.assertFalse(ReadingListUtils.maybeTypeSwapAndShowSaveFlow( Mockito.mock(Activity.class), Mockito.mock(BottomSheetController.class), Mockito.mock(BookmarkModel.class), /*bookmarkId=*/null, BookmarkType.READING_LIST)); - // bad original type - setBookmarkTypeSwappingEnabled(true); doReturn(BookmarkType.READING_LIST).when(bookmarkId).getType(); Assert.assertFalse(ReadingListUtils.maybeTypeSwapAndShowSaveFlow( Mockito.mock(Activity.class), Mockito.mock(BottomSheetController.class), Mockito.mock(BookmarkModel.class), bookmarkId, BookmarkType.READING_LIST)); - // bad desired type - setBookmarkTypeSwappingEnabled(true); doReturn(BookmarkType.NORMAL).when(bookmarkId).getType(); Assert.assertFalse(ReadingListUtils.maybeTypeSwapAndShowSaveFlow( Mockito.mock(Activity.class), Mockito.mock(BottomSheetController.class), @@ -160,8 +147,6 @@ @Test @SmallTest public void testTypeSwapBookmarksIfNecessary_ToReadingList() { - setBookmarkTypeSwappingEnabled(true); - BookmarkId parentId = new BookmarkId(0, BookmarkType.READING_LIST); BookmarkId existingBookmarkId = new BookmarkId(0, BookmarkType.NORMAL); BookmarkItem existingBookmark = new BookmarkItem(existingBookmarkId, "Test", @@ -189,8 +174,6 @@ @Test @SmallTest public void testTypeSwapBookmarksIfNecessary_ToBookmark() { - setBookmarkTypeSwappingEnabled(true); - BookmarkId parentId = new BookmarkId(0, BookmarkType.NORMAL); BookmarkId existingBookmarkId = new BookmarkId(0, BookmarkType.READING_LIST); BookmarkItem existingBookmark = new BookmarkItem(existingBookmarkId, "Test", @@ -218,8 +201,6 @@ @Test @SmallTest public void testTypeSwapBookmarksIfNecessary_ToBookmark_Multiple() { - setBookmarkTypeSwappingEnabled(true); - BookmarkId parentId = new BookmarkId(0, BookmarkType.NORMAL); BookmarkId existingBookmarkId1 = new BookmarkId(1, BookmarkType.READING_LIST); BookmarkItem existingBookmark1 = new BookmarkItem(existingBookmarkId1, "Test1", @@ -262,8 +243,6 @@ @Test @SmallTest public void testTypeSwapBookmarksIfNecessary_TypeMatches() { - setBookmarkTypeSwappingEnabled(true); - BookmarkId parentId = new BookmarkId(0, BookmarkType.NORMAL); BookmarkId existingBookmarkId = new BookmarkId(0, BookmarkType.NORMAL); BookmarkItem existingBookmark = new BookmarkItem(existingBookmarkId, "Test", @@ -280,12 +259,4 @@ Assert.assertEquals(0, typeSwappedBookmarks.size()); Assert.assertEquals(existingBookmarkId, bookmarks.get(0)); } - - private void setBookmarkTypeSwappingEnabled(boolean enabled) { - TestValues readLaterTypeSwapping = new TestValues(); - readLaterTypeSwapping.addFeatureFlagOverride(ChromeFeatureList.READ_LATER, true); - readLaterTypeSwapping.addFieldTrialParamOverride(ChromeFeatureList.READ_LATER, - "allow_bookmark_type_swapping", enabled ? "true" : "false"); - FeatureList.setTestValues(readLaterTypeSwapping); - } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java index 7030300..6c41093 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
@@ -85,8 +85,7 @@ * Unit tests for {@link TabbedAppMenuPropertiesDelegate}. */ @RunWith(BaseRobolectricTestRunner.class) -@Features.EnableFeatures({ChromeFeatureList.WEB_FEED, ChromeFeatureList.READ_LATER, - ChromeFeatureList.BOOKMARKS_REFRESH}) +@Features.EnableFeatures({ChromeFeatureList.WEB_FEED, ChromeFeatureList.BOOKMARKS_REFRESH}) @Features.DisableFeatures({ChromeFeatureList.SHOPPING_LIST, ChromeFeatureList.WEB_APK_UNIQUE_ID}) public class TabbedAppMenuPropertiesDelegateUnitTest { // Costants defining flags that determines multi-window menu items visibility.
diff --git a/chrome/android/modules/stack_unwinder/internal/stack_unwinder_module_contents_impl.cc b/chrome/android/modules/stack_unwinder/internal/stack_unwinder_module_contents_impl.cc index 7ee617fe..1d573241 100644 --- a/chrome/android/modules/stack_unwinder/internal/stack_unwinder_module_contents_impl.cc +++ b/chrome/android/modules/stack_unwinder/internal/stack_unwinder_module_contents_impl.cc
@@ -8,32 +8,13 @@ #include "base/profiler/libunwindstack_unwinder_android.h" #include "base/profiler/native_unwinder_android.h" +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "chrome/android/features/stack_unwinder/public/function_types.h" -#include "chrome/android/features/stack_unwinder/public/memory_regions_map.h" #include "chrome/android/modules/stack_unwinder/internal/jni_headers/StackUnwinderModuleContentsImpl_jni.h" -namespace { - -class MemoryRegionsMap : public stack_unwinder::MemoryRegionsMap { - public: - MemoryRegionsMap(std::unique_ptr<unwindstack::Maps> maps, - std::unique_ptr<unwindstack::Memory> memory) - : maps_(std::move(maps)), memory_(std::move(memory)) {} - - unwindstack::Maps* maps() { return maps_.get(); } - unwindstack::Memory* memory() { return memory_.get(); } - - private: - std::unique_ptr<unwindstack::Maps> maps_; - std::unique_ptr<unwindstack::Memory> memory_; -}; - -} // namespace - -std::unique_ptr<stack_unwinder::MemoryRegionsMap> CreateMemoryRegionsMap() { - return std::make_unique<MemoryRegionsMap>( - base::NativeUnwinderAndroid::CreateMaps(), - base::NativeUnwinderAndroid::CreateProcessMemory()); +std::unique_ptr<base::NativeUnwinderAndroidMemoryRegionsMap> +CreateMemoryRegionsMap() { + return base::NativeUnwinderAndroid::CreateMemoryRegionsMap(); } static_assert(std::is_same<stack_unwinder::CreateMemoryRegionsMapFunction, @@ -42,15 +23,10 @@ "function type"); std::unique_ptr<base::Unwinder> CreateNativeUnwinder( - stack_unwinder::MemoryRegionsMap* memory_regions_map, + base::NativeUnwinderAndroidMapDelegate* map_delegate, uintptr_t exclude_module_with_base_address) { - // The user is expected to only pass the subclass generated by - // CreateMemoryRegionsMap(). - MemoryRegionsMap* concrete_memory_regions_map = - static_cast<MemoryRegionsMap*>(memory_regions_map); return std::make_unique<base::NativeUnwinderAndroid>( - concrete_memory_regions_map->maps(), - concrete_memory_regions_map->memory(), exclude_module_with_base_address); + exclude_module_with_base_address, map_delegate); } static_assert(std::is_same<stack_unwinder::CreateNativeUnwinderFunction,
diff --git a/chrome/android/modules/stack_unwinder/public/module.cc b/chrome/android/modules/stack_unwinder/public/module.cc index f7872cc3..8d9c6f1 100644 --- a/chrome/android/modules/stack_unwinder/public/module.cc +++ b/chrome/android/modules/stack_unwinder/public/module.cc
@@ -6,7 +6,6 @@ #include "base/android/jni_android.h" #include "base/memory/ptr_util.h" -#include "chrome/android/features/stack_unwinder/public/memory_regions_map.h" #include "chrome/android/modules/stack_unwinder/provider/jni_headers/StackUnwinderModuleProvider_jni.h" namespace stack_unwinder { @@ -50,14 +49,15 @@ create_libunwindstack_unwinder)); } -std::unique_ptr<MemoryRegionsMap> Module::CreateMemoryRegionsMap() { +std::unique_ptr<base::NativeUnwinderAndroidMemoryRegionsMap> +Module::CreateMemoryRegionsMap() { return create_memory_regions_map_(); } std::unique_ptr<base::Unwinder> Module::CreateNativeUnwinder( - MemoryRegionsMap* memory_regions_map, + base::NativeUnwinderAndroidMapDelegate* map_delegate, uintptr_t exclude_module_with_base_address) { - return create_native_unwinder_(memory_regions_map, + return create_native_unwinder_(map_delegate, exclude_module_with_base_address); }
diff --git a/chrome/android/modules/stack_unwinder/public/module.h b/chrome/android/modules/stack_unwinder/public/module.h index ed9c4ea..b745c06 100644 --- a/chrome/android/modules/stack_unwinder/public/module.h +++ b/chrome/android/modules/stack_unwinder/public/module.h
@@ -7,9 +7,13 @@ #include <memory> +#include "base/profiler/native_unwinder_android_memory_regions_map.h" #include "base/profiler/unwinder.h" #include "chrome/android/features/stack_unwinder/public/function_types.h" -#include "chrome/android/features/stack_unwinder/public/memory_regions_map.h" + +namespace base { +class NativeUnwinderAndroidMapDelegate; +} // namespace base namespace stack_unwinder { @@ -31,11 +35,12 @@ // Returns a map representing the current memory regions (modules, stacks, // etc.). - std::unique_ptr<MemoryRegionsMap> CreateMemoryRegionsMap(); + std::unique_ptr<base::NativeUnwinderAndroidMemoryRegionsMap> + CreateMemoryRegionsMap(); // Creates a new native stack unwinder. std::unique_ptr<base::Unwinder> CreateNativeUnwinder( - MemoryRegionsMap* memory_regions_map, + base::NativeUnwinderAndroidMapDelegate* map_delegate, uintptr_t exclude_module_with_base_address); // Creates an unwinder that will use libunwindstack::Unwinder exclusively, it
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt index c3c05ed..767ce9d 100644 --- a/chrome/android/profiles/arm.newest.txt +++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@ -chromeos-chrome-arm-112.0.5599.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-arm-112.0.5614.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 5dbef977..8ce2119 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-112.0.5599.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-112.0.5614.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 18b59a70..441c319 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -685,6 +685,14 @@ UMA_HISTOGRAM_ENUMERATION("Chrome.ProcessSingleton.NotifyResult", notify_result, ProcessSingleton::kNumNotifyResults); + + // If |notify_result| is not PROCESS_NONE, this process will exit. To ensure + // that the histograms emitted in this process are reported, report the + // metrics accumulated this session with a future session's metrics. + if (notify_result != ProcessSingleton::PROCESS_NONE) { + DeferBrowserMetrics(user_data_dir); + } + switch (notify_result) { case ProcessSingleton::PROCESS_NONE: // No process already running, continue on to starting a new one.
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index bb3cda3..e5c488d 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -581,7 +581,7 @@ Installation failed due to unspecified error. Please download Chromium again. </message> <message name="IDS_INSTALL_OS_NOT_SUPPORTED" desc="Error displayed if OS is not supported"> - Chromium requires Windows 7 or higher. + Chromium requires Windows 10 or higher. </message> <message name="IDS_INSTALL_OS_ERROR" desc="Error displayed when any Windows API call fails and we do not have more specific information."> An operating system error occurred during installation. Please download Chromium again.
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 735da99..caeb360 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -570,7 +570,7 @@ <message name="IDS_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE" desc="The name of the Inspect Background Page command in the packaged app content area context menu"> Inspect &background page </message> - <message name="IDS_CONTENT_CONTEXT_READING_MODE" desc="Context menu menuitem to open page in reading mode view" translateable="false"> + <message name="IDS_CONTENT_CONTEXT_READING_MODE" desc="Context menu menuitem to open page in reading mode view"> Open in reading mode </message> <message name="IDS_CONTENT_CONTEXT_RELOAD" desc="The name of the Reload command in the content area context menu"> @@ -837,7 +837,7 @@ <message name="IDS_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE" desc="In Title Case: The name of the Inspect Background Page command in the packaged app content area context menu"> Inspect &Background Page </message> - <message name="IDS_CONTENT_CONTEXT_READING_MODE" desc="Context menu menuitem to open page in reading mode view" translateable="false"> + <message name="IDS_CONTENT_CONTEXT_READING_MODE" desc="Context menu menuitem to open page in reading mode view"> Open in Reading Mode </message> <message name="IDS_CONTENT_CONTEXT_RELOAD" desc="In Title Case: The name of the Reload command in the content area context menu"> @@ -7474,51 +7474,66 @@ <!-- Reading mode strings --> <!-- TODO(crbug.com/1266555): Add final strings and make them translateable. --> <if expr="use_titlecase"> - <message name="IDS_READING_MODE_TITLE" desc="Title of the reading mode feature, which gives users an accessible reading experience." translateable="false"> + <message name="IDS_READING_MODE_TITLE" desc="Title of the reading mode feature, which gives users an accessible reading experience."> Reading Mode </message> </if> <if expr="not use_titlecase"> - <message name="IDS_READING_MODE_TITLE" desc="Title of the reading mode feature, which gives users an accessible reading experience." translateable="false"> + <message name="IDS_READING_MODE_TITLE" desc="Title of the reading mode feature, which gives users an accessible reading experience."> Reading mode </message> </if> - <message name="IDS_READING_MODE_TOOLBAR_LABEL" desc="Accessibility label for the text formatting toolbar of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_TOOLBAR_LABEL" desc="Accessibility label for the text formatting toolbar of the reading mode feature. Spoken by screen readers."> Text formatting </message> - <message name="IDS_READING_MODE_FONT_NAME_COMBOBOX_LABEL" desc="Accessibility label for the font name combobox of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_FONT_NAME_COMBOBOX_LABEL" desc="Accessibility label for the font name combobox of the reading mode feature."> Font </message> - <message name="IDS_READING_MODE_DECREASE_FONT_SIZE_BUTTON_LABEL" desc="Accessibility label for the decrease font size button of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_DECREASE_FONT_SIZE_BUTTON_LABEL" desc="Accessibility label for the decrease font size button of the reading mode feature."> Decrease font-size </message> - <message name="IDS_READING_MODE_INCREASE_FONT_SIZE_BUTTON_LABEL" desc="Accessibility label for the increase font size button of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_INCREASE_FONT_SIZE_BUTTON_LABEL" desc="Accessibility label for the increase font size button of the reading mode feature."> Increase font-size </message> - <message name="IDS_READING_MODE_COLORS_COMBOBOX_LABEL" desc="Accessibility label for the colors combobox of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_COLORS_COMBOBOX_LABEL" desc="Accessibility label for the colors combobox of the reading mode feature."> Theme </message> - <message name="IDS_READING_MODE_LINE_SPACING_COMBOBOX_LABEL" desc="Accessibility label for the line height combobox of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_LINE_SPACING_COMBOBOX_LABEL" desc="Accessibility label for the line height combobox of the reading mode feature."> Line height </message> - <message name="IDS_READING_MODE_LETTER_SPACING_COMBOBOX_LABEL" desc="Accessibility label for the letter spacing combobox of the reading mode feature." translateable="false"> + <message name="IDS_READING_MODE_LETTER_SPACING_COMBOBOX_LABEL" desc="Accessibility label for the letter spacing combobox of the reading mode feature."> Letter spacing </message> - <message name="IDS_READING_MODE_SPACING_COMBOBOX_STANDARD" desc="Combobox option for setting letter and line spacing of text in the reading mode feature. Standard means that leters/lines are spaced in the browser's default manner." translateable="false"> + <message name="IDS_READING_MODE_SPACING_COMBOBOX_STANDARD" desc="Combobox option for setting letter and line spacing of text in the reading mode feature. Standard means that leters/lines are spaced in the browser's default manner."> Standard </message> - <message name="IDS_READING_MODE_SPACING_COMBOBOX_LOOSE" desc="Combobox option for setting line spacing of text in the reading mode feature. Loose means that lines are spaced far apart." translateable="false"> + <message name="IDS_READING_MODE_SPACING_COMBOBOX_LOOSE" desc="Combobox option for setting line spacing of text in the reading mode feature. Loose means that lines are spaced far apart."> Loose </message> - <message name="IDS_READING_MODE_SPACING_COMBOBOX_VERY_LOOSE" desc="Combobox option for setting line spacing of text in the reading mode feature. Very loose means that lines are spaced very far apart." translateable="false"> + <message name="IDS_READING_MODE_SPACING_COMBOBOX_VERY_LOOSE" desc="Combobox option for setting line spacing of text in the reading mode feature. Very loose means that lines are spaced very far apart."> Very loose </message> - <message name="IDS_READING_MODE_SPACING_COMBOBOX_WIDE" desc="Combobox option for setting letter spacing of text in the reading mode feature. Wide means that letters are spaced far apart." translateable="false"> + <message name="IDS_READING_MODE_SPACING_COMBOBOX_WIDE" desc="Combobox option for setting letter spacing of text in the reading mode feature. Wide means that letters are spaced far apart."> Wide </message> - <message name="IDS_READING_MODE_SPACING_COMBOBOX_VERY_WIDE" desc="Combobox option for setting letter spacing of text in the reading mode feature. Very wide means that letters are spaced very far apart." translateable="false"> + <message name="IDS_READING_MODE_SPACING_COMBOBOX_VERY_WIDE" desc="Combobox option for setting letter spacing of text in the reading mode feature. Very wide means that letters are spaced very far apart."> Very wide </message> + <message name="IDS_READING_MODE_DEFAULT_COLOR_LABEL" desc="Combobox option for setting the color theme for the reading mode feature. This option corresponds to either the light or dark theme depending on the user's operating system theme."> + Default + </message> + <message name="IDS_READING_MODE_LIGHT_COLOR_LABEL" desc="Combobox option for setting the color theme for the reading mode feature."> + Light + </message> + <message name="IDS_READING_MODE_DARK_COLOR_LABEL" desc="Combobox option for setting the color theme for the reading mode feature."> + Dark + </message> + <message name="IDS_READING_MODE_YELLOW_COLOR_LABEL" desc="Combobox option for setting the color theme for the reading mode feature."> + Yellow + </message> + <message name="IDS_READING_MODE_BLUE_COLOR_LABEL" desc="Combobox option for setting the color theme for the reading mode feature."> + Blue + </message> <!-- User note strings --> <message name="IDS_USER_NOTE_TITLE" desc="Title of the User note feature, which gives users access to private user notes."> @@ -8588,6 +8603,9 @@ <message name="IDS_FEEDBACK_SEND_REPORT" desc="Text for OK button of the send feedback dialog"> Send </message> + <message name="IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE" desc="The title of the autofill metadata preview page"> + Autofill Metadata Preview + </message> <message name="IDS_FEEDBACK_SYSINFO_PAGE_TITLE" desc="The title of the system information preview page"> System Information Preview </message> @@ -13619,7 +13637,16 @@ Submit Feedback </message> <message name="IDS_SIDE_SEARCH_PROMO" desc="Promo UI shown next to the side search button to encourage its use."> - See more search results in side panel + Compare search resuls faster from the new side panel + </message> + <message name="IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL" desc="Tutorial bubble shown next to the side search button to instruct users to open side panel"> + Click the "G" button to see more search results in a side panel + </message> + <message name="IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB" desc="Tutorial bubble shown next to the side panel to instruct users to open a link to main tab"> + Click on a result and the page will open in your current tab + </message> + <message name="IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL" desc="Tutorial bubble shown next to the side panel close button to instruct users to close side panel"> + Click the "X" button to close the side panel </message> <message name="IDS_SIDE_SEARCH_ENTRYPOINT_LABEL" desc="The label text that is animated-in when the omnibox entrypoint is first shown."> See more search results
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_READING_MODE.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_READING_MODE.png.sha1 new file mode 100644 index 0000000..846f2fae --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_READING_MODE.png.sha1
@@ -0,0 +1 @@ +90d590290b0175b7f60f9aa56de4448c6d96316c \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE.png.sha1 new file mode 100644 index 0000000..88f5cb7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@ +175764467f03821dceac64b84317246ebc1ad08b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_BLUE_COLOR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_BLUE_COLOR_LABEL.png.sha1 new file mode 100644 index 0000000..5582fb3 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_BLUE_COLOR_LABEL.png.sha1
@@ -0,0 +1 @@ +6ca319c0772661bff4548cc0a4703c85c239a8a5 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_COLORS_COMBOBOX_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_COLORS_COMBOBOX_LABEL.png.sha1 new file mode 100644 index 0000000..fa4d0c1 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_COLORS_COMBOBOX_LABEL.png.sha1
@@ -0,0 +1 @@ +a9b18b334436a8b7fab318e4ee285e3e861f77fb \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_DARK_COLOR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_DARK_COLOR_LABEL.png.sha1 new file mode 100644 index 0000000..510334f --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_DARK_COLOR_LABEL.png.sha1
@@ -0,0 +1 @@ +0136dc052f62aa6976642ec37f5b765a57524b33 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_DECREASE_FONT_SIZE_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_DECREASE_FONT_SIZE_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..053322f --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_DECREASE_FONT_SIZE_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +22ebb0dbc74c0528fbf93eace237f79a9429bc35 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_DEFAULT_COLOR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_DEFAULT_COLOR_LABEL.png.sha1 new file mode 100644 index 0000000..6f619cf --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_DEFAULT_COLOR_LABEL.png.sha1
@@ -0,0 +1 @@ +8b40563fbeb40e1df293d719ead1cecc159f9fc4 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_FONT_NAME_COMBOBOX_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_FONT_NAME_COMBOBOX_LABEL.png.sha1 new file mode 100644 index 0000000..df202d3 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_FONT_NAME_COMBOBOX_LABEL.png.sha1
@@ -0,0 +1 @@ +9f4e7287991bb70525497acaa89447facdf69e60 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_INCREASE_FONT_SIZE_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_INCREASE_FONT_SIZE_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..42bb2a3 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_INCREASE_FONT_SIZE_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +72ceb421fa850ff955d0654f54f0759d595cb15b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_LETTER_SPACING_COMBOBOX_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_LETTER_SPACING_COMBOBOX_LABEL.png.sha1 new file mode 100644 index 0000000..153c21c --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_LETTER_SPACING_COMBOBOX_LABEL.png.sha1
@@ -0,0 +1 @@ +b46d6a525b2ceb59d403fd7a185fe3db0d9b0011 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_LIGHT_COLOR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_LIGHT_COLOR_LABEL.png.sha1 new file mode 100644 index 0000000..adef8a7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_LIGHT_COLOR_LABEL.png.sha1
@@ -0,0 +1 @@ +bbc137a1e82e9a11e4ddfdbc2f3caa4cded67177 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_LINE_SPACING_COMBOBOX_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_LINE_SPACING_COMBOBOX_LABEL.png.sha1 new file mode 100644 index 0000000..a195b8a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_LINE_SPACING_COMBOBOX_LABEL.png.sha1
@@ -0,0 +1 @@ +7494eb1ccc07c537cf019a1ba773cd04d84af4e1 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_LOOSE.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_LOOSE.png.sha1 new file mode 100644 index 0000000..22fa223 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_LOOSE.png.sha1
@@ -0,0 +1 @@ +7fec50a7e27c662af55148a53c1c213195ee9008 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_STANDARD.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_STANDARD.png.sha1 new file mode 100644 index 0000000..6a4a30d1 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_STANDARD.png.sha1
@@ -0,0 +1 @@ +bdc7498e91be5c3e9eaac73344acf97786df3f30 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_LOOSE.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_LOOSE.png.sha1 new file mode 100644 index 0000000..14b05d5 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_LOOSE.png.sha1
@@ -0,0 +1 @@ +1246b88ba7742ed1c6509e80b095e93deb6c7928 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_WIDE.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_WIDE.png.sha1 new file mode 100644 index 0000000..ba2988c9 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_VERY_WIDE.png.sha1
@@ -0,0 +1 @@ +a156b90e4f95b81983e6818366d7c8183e3bd513 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_WIDE.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_WIDE.png.sha1 new file mode 100644 index 0000000..8ab75e2 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_SPACING_COMBOBOX_WIDE.png.sha1
@@ -0,0 +1 @@ +b9e18d0142821742d2e37ad6368ef7e0c7725d5d \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_TITLE.png.sha1 new file mode 100644 index 0000000..90bb93ca --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_TITLE.png.sha1
@@ -0,0 +1 @@ +9bd815f8c9d96c99880b8eb5556c8404c7c2c2c6 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_TOOLBAR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_TOOLBAR_LABEL.png.sha1 new file mode 100644 index 0000000..7b63e7b --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_TOOLBAR_LABEL.png.sha1
@@ -0,0 +1 @@ +2eb8bbf9f65e060b9a557aa49cddd0219928a5be \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READING_MODE_YELLOW_COLOR_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READING_MODE_YELLOW_COLOR_LABEL.png.sha1 new file mode 100644 index 0000000..4674aae --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READING_MODE_YELLOW_COLOR_LABEL.png.sha1
@@ -0,0 +1 @@ +d73c0f449e8c9ecbcd8a205cc54295867c52af44 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_PROMO.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_PROMO.png.sha1 index f811705..df024ca5 100644 --- a/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_PROMO.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_PROMO.png.sha1
@@ -1 +1 @@ -3136bda9e32356d96580d0d7b26c86711a86eb52 \ No newline at end of file +30dd7803c98748057cff951c64c1dd58ada67dd1 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL.png.sha1 new file mode 100644 index 0000000..75eb8e9 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL.png.sha1
@@ -0,0 +1 @@ +c2341a2a20c20093fde4505f846b4ff044ca0a93 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB.png.sha1 new file mode 100644 index 0000000..f56a576 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB.png.sha1
@@ -0,0 +1 @@ +ae0e3633b27b9fc29c2005ed5ad0995978abb48b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL.png.sha1 new file mode 100644 index 0000000..1ad0662 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL.png.sha1
@@ -0,0 +1 @@ +71d5a157e434c7d869c77a28ead1405726bd7b73 \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 82e865719..fe768666 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -616,7 +616,7 @@ Installation failed due to unspecified error. Please download Google Chrome again. </message> <message name="IDS_INSTALL_OS_NOT_SUPPORTED" desc="Error displayed if OS is not supported"> - Google Chrome requires Windows 7 or higher. + Google Chrome requires Windows 10 or higher. </message> <message name="IDS_INSTALL_OS_ERROR" desc="Error displayed when any Windows API call fails and we do not have more specific information."> An operating system error occurred during installation. Please download Google Chrome again.
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 4b3e9e79..04947dd1 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -342,6 +342,7 @@ <translation id="8266560134891435528">Chromium ne može provjeravati vaše lozinke jer niste prijavljeni</translation> <translation id="8276522524898344151">Chromium pokušava kopirati lozinke.</translation> <translation id="8290862415967981663">Ovaj fajl može biti opasan i zato ga je Chromium blokirao.</translation> +<translation id="8325404639443959713">Učinite više uz Chromium</translation> <translation id="8330519371938183845">Prijavite se da sinhronizirate i personalizirate Chrome na svim svojim uređajima</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> je prethodno koristio/la Chromium</translation> <translation id="8357820681460164151">Prijavite se, a zatim uključite sinhronizaciju da pristupite svojim stvarima s Chromium preglednika na svim svojim uređajima</translation> @@ -381,6 +382,7 @@ <translation id="9158494823179993217">Vaš administrator sistema je konfigurirao Chromium da otvori alternativni preglednik za pristup URL-u<ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Ponovo pokrenite da ažurirate &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Prilagodite Chromium sebi</translation> <translation id="93478295209880648">Chromium možda neće ispravno raditi jer više nije podržan na sistemima Windows XP ili Windows Vista</translation> <translation id="942598560705308788">Certifikati kojima upravlja Chromium</translation> <translation id="965162752251293939">Ko koristi Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index e15f4602..2474a79 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -340,6 +340,7 @@ <translation id="8266560134891435528">Chromium ne može provjeriti vaše zaporke jer niste prijavljeni</translation> <translation id="8276522524898344151">Chromium pokušava kopirati zaporke.</translation> <translation id="8290862415967981663">Datoteka je možda opasna i Chromium ju je blokirao.</translation> +<translation id="8325404639443959713">Iskoristite prednosti Chromiuma</translation> <translation id="8330519371938183845">Prijavite se da biste sinkronizirali i prilagodili Chromium na svim svojim uređajima</translation> <translation id="8340674089072921962">E-adresa <ph name="USER_EMAIL_ADDRESS" /> prethodno je upotrebljavala Chromium</translation> <translation id="8357820681460164151">Da biste mogli pristupiti svojim sadržajima u pregledniku Chromium na svim svojim uređajima, prijavite se i zatim uključite sinkronizaciju</translation> @@ -379,6 +380,7 @@ <translation id="9158494823179993217">Vaš administrator sustava konfigurirao je Chromium tako da otvara zamjenski preglednik radi pristupa URL-u<ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Ponovo pokrenite da biste ažurirali &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Prilagodite Chromium sebi</translation> <translation id="93478295209880648">Chromium možda neće ispravno raditi jer više nije podržan na sustavima Windows XP i Windows Vista</translation> <translation id="942598560705308788">Certifikati kojima upravlja Chromium</translation> <translation id="965162752251293939">Tko upotrebljava Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index 668603e3..46d6566 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -339,6 +339,7 @@ <translation id="8266560134891435528">Chromium non può controllare le tue password perché non hai effettuato l'accesso</translation> <translation id="8276522524898344151">Chromium sta cercando di copiare le password.</translation> <translation id="8290862415967981663">Questo file potrebbe essere pericoloso, pertanto è stato bloccato da Chromium.</translation> +<translation id="8325404639443959713">Fai di più con Chromium</translation> <translation id="8330519371938183845">Accedi per sincronizzare e personalizzare Chromium sui tuoi dispositivi</translation> <translation id="8340674089072921962">L'indirizzo <ph name="USER_EMAIL_ADDRESS" /> utilizzava in precedenza Chromium</translation> <translation id="8357820681460164151">Per accedere ai tuoi contenuti del browser Chromium su tutti i tuoi dispositivi, accedi e attiva la sincronizzazione</translation> @@ -378,6 +379,7 @@ <translation id="9158494823179993217">L'amministratore di sistema ha configurato Chromium per l'apertura di un browser alternativo per accedere a <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Riavvia per aggiornare &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Personalizza Chromium</translation> <translation id="93478295209880648">Chromium potrebbe non funzionare correttamente perché non è più supportato su Windows XP o Windows Vista</translation> <translation id="942598560705308788">Certificati gestiti da Chromium</translation> <translation id="965162752251293939">Chi usa Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index c54d300..7d70f349 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -338,6 +338,7 @@ <translation id="8266560134891435528">Chromium לא יכול לבדוק את הסיסמאות שלך כי לא נכנסת לחשבון</translation> <translation id="8276522524898344151">Chromium מנסה להעתיק את הסיסמאות.</translation> <translation id="8290862415967981663">Chromium חסם את הקובץ הזה כי הוא עלול להיות מסוכן.</translation> +<translation id="8325404639443959713">מפיקים את המירב מ-Chromium</translation> <translation id="8330519371938183845">כניסה לחשבון תסנכרן ותתאים אישית את Chromium בכל המכשירים שברשותך</translation> <translation id="8340674089072921962">בכתובת <ph name="USER_EMAIL_ADDRESS" /> השתמשו בעבר ב-Chromium</translation> <translation id="8357820681460164151">כדי לגשת אל פריטים שונים בדפדפן Chromium שלך מכל המכשירים, צריך להיכנס לחשבון ולהפעיל את הסנכרון</translation> @@ -377,6 +378,7 @@ <translation id="9158494823179993217">לפי הגדרת מנהל המערכת, Chromium יפתח דפדפן חלופי כדי לגשת אל <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">הפעלה מחדש לצורך עדכון &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">אפשר להתאים אישית את Chromium בדרך שנוחה לך</translation> <translation id="93478295209880648">ייתכן ש-Chromium לא יפעל כראוי כי הוא כבר לא נתמך ב-Windows XP וב-Windows Vista</translation> <translation id="942598560705308788">אישורים שמנוהלים על ידי Chromium</translation> <translation id="965162752251293939">מי משתמש/ת ב-Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index 4a10da1b..58847dce 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -341,6 +341,7 @@ <translation id="8266560134891435528">Chromium ვერ ახერხებს თქვენი პაროლების შემოწმებას, რადგან შესული არ ხართ</translation> <translation id="8276522524898344151">Chromium ცდილობს პაროლების კოპირებას.</translation> <translation id="8290862415967981663">Chromium-მა დაბლოკა ეს ფაილი, რადგან ის შეიძლება სახიფათო იყოს.</translation> +<translation id="8325404639443959713">შეძელით მეტი Chromium-ის მეშვეობით</translation> <translation id="8330519371938183845">შედით სისტემაში, რათა მოახდინოთ Chromium-ის სინქრონიზაცია და პერსონალიზება თქვენს ყველა მოწყობილობას შორის</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> ადრე იყენებდა Chromium-ს</translation> <translation id="8357820681460164151">Chromium ბრაუზერში თქვენს კონტენტზე თქვენი ნებისმიერი მოწყობილობიდან წვდომისთვის შედით სისტემაში, შემდეგ კი ჩართეთ სინქრონიზაცია</translation> @@ -380,6 +381,7 @@ <translation id="9158494823179993217">თქვენი სისტემის ადმინისტრატორმა მოახდინა Chromium-ის კონფიგურაცია იმგვარად, რომ <ph name="TARGET_URL_HOSTNAME" />-ზე წვდომისთვის საჭიროა ალტერნატიული ბრაუზერის გახსნა.</translation> <translation id="9185526690718004400">ხელახლა გაშვება &Chromium-ის გასაახლებლად</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">მოირგეთ Chromium</translation> <translation id="93478295209880648">Chromium-მა შეიძლება არასწორად იმუშაოს, რადგან ის აღარ არის მხარდაჭერილი Windows XP-სა და Windows Vista-ზე</translation> <translation id="942598560705308788">Chromium-ის მიერ მართული სერტიფიკატები</translation> <translation id="965162752251293939">ვინ იყენებს Chromium-ს?</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index e7d94422..036d75e 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -341,6 +341,7 @@ <translation id="8266560134891435528">Аккаунтқа кірмегендіктен, Chromium сіздің құпия сөздеріңізді тексере алмайды.</translation> <translation id="8276522524898344151">Chromium құпия сөздерді көшіргісі келеді.</translation> <translation id="8290862415967981663">Бұл файл қауіпті болуы мүмкін болғандықтан, Chromium оны бөгеді.</translation> +<translation id="8325404639443959713">Chromium-мен көбірек іс тындырыңыз</translation> <translation id="8330519371938183845">Chromium браузерін барлық құрылғыларда синхрондап, параметрлерін жекелендіру үшін аккаунтыңызға кіріңіз</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> бұрын Chromium браузерін пайдаланған</translation> <translation id="8357820681460164151">Chromium браузерінің материалдарын барлық құрылғыда пайдалану үшін аккаунтқа кіріп, синхрондау параметрін қосыңыз.</translation> @@ -380,6 +381,7 @@ <translation id="9158494823179993217">Жүйе әкімшісі Chromium браузерін <ph name="TARGET_URL_HOSTNAME" /> сілтемесіне қосымша браузер арқылы кіре алатындай етіп конфигурациялады.</translation> <translation id="9185526690718004400">&Chromium-ді жаңарту үшін қайта іске қосу</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Chromium браузерін өз талғамыңызға сай реттеңіз</translation> <translation id="93478295209880648">Chromium дұрыс жұмыс істемеуі мүмкін, себебі оған Windows XP не Windows Vista жүйелерінде қолдау көрсетілмейді</translation> <translation id="942598560705308788">Chromium басқаратын сертификаттар</translation> <translation id="965162752251293939">Chromium-ді кім пайдаланып жатыр?</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index 06b3eb71..3bf9d61 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -333,6 +333,7 @@ <translation id="8266560134891435528">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರದ ಕಾರಣ, Chromium ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation> <translation id="8276522524898344151">Chromium, ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಕಲಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation> <translation id="8290862415967981663">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಹೀಗಾಗಿ Chromium ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation> +<translation id="8325404639443959713">Chromium ಮೂಲಕ ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಿ</translation> <translation id="8330519371938183845">ನಿಮ್ಮ ಸಾಧನಗಳಲ್ಲಿ Chromium ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> ಅವರು ಮೊದಲಿನಿಂದಲೆ Chromium ಬಳಸುತ್ತಿದ್ದರು</translation> <translation id="8357820681460164151">ನಿಮ್ಮ Chromium ಬ್ರೌಸರ್ನ ವಿಷಯಗಳನ್ನು ಎಲ್ಲಾ ಸಾಧನಗಳಾದ್ಯಂತ ಪ್ರವೇಶಿಸಲು, ಸೈನ್ ಇನ್ ಮಾಡಿ, ನಂತರ ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> @@ -372,6 +373,7 @@ <translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಪ್ರವೇಶಿಸಲು ಒಂದು ಪರ್ಯಾಯ ಬ್ರೌಸರ್ ತೆರೆಯುವಂತೆ ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Chromium ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation> <translation id="9185526690718004400">&Chromium ಅಪ್ಡೇಟ್ ಮಾಡಲು ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">ನಿಮ್ಮ ಸ್ವಂತ Chromium ಅನ್ನು ರಚಿಸಿ</translation> <translation id="93478295209880648">Windows XP ಅಥವಾ Windows Vista ದಲ್ಲಿ Chromium ಗೆ ಈಗ ಬೆಂಬಲವಿಲ್ಲದೇ ಇರುವುದರಿಂದ ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು</translation> <translation id="942598560705308788">Chromium ನಿರ್ವಹಿತ ಮಾಣೀಕರಣಗಳು</translation> <translation id="965162752251293939">Chromium ಅನ್ನು ಯಾರು ಬಳಸುತ್ತಿದ್ದಾರೆ?</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 69a272a..81e1a138 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -342,6 +342,7 @@ <translation id="8266560134891435528">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിട്ടില്ലാത്തതിനാൽ Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവില്ല</translation> <translation id="8276522524898344151">പാസ്വേഡുകൾ പകർത്താൻ Chromium ശ്രമിക്കുന്നു.</translation> <translation id="8290862415967981663">ഈ ഫയൽ അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ Chromium ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> +<translation id="8325404639443959713">Chromium ഉപയോഗിച്ച് കൂടുതൽ കാര്യങ്ങൾ ചെയ്യൂ</translation> <translation id="8330519371938183845">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chromium സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കാൻ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> മുമ്പ് Chromium ഉപയോഗിച്ചിട്ടുണ്ട്</translation> <translation id="8357820681460164151">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും Chromium ബ്രൗസർ ഉള്ളടക്കം ആക്സസ് ചെയ്യാൻ, സൈൻ ഇൻ ചെയ്ത ശേഷം സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> @@ -381,6 +382,7 @@ <translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" /> ആക്സസ് ചെയ്യാൻ ഇതര ബ്രൗസർ തുറക്കുന്നതിനായി നിങ്ങളുടെ സിസ്റ്റം അഡ്മിൻ Chromium കോൺഫിഗർ ചെയ്തു.</translation> <translation id="9185526690718004400">&Chromium അപ്ഡേറ്റ് ചെയ്യാൻ വീണ്ടും ആരംഭിക്കുക</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Chromium നിങ്ങൾക്ക് അനുയോജ്യമാക്കൂ</translation> <translation id="93478295209880648">ഇനിയങ്ങോട്ട് Windows XP-യും Windows Vista-യും പിന്തുണയ്ക്കാത്തതിനാൽ Chromium ശരിയായി പ്രവർത്തിച്ചേക്കില്ല</translation> <translation id="942598560705308788">Chromium മാനേജ് ചെയ്യുന്ന സർട്ടിഫിക്കറ്റുകൾ</translation> <translation id="965162752251293939">ആരൊക്കെയാണ് Chromium ഉപയോഗിക്കുന്നത്?</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb index 2d05fde..f8f77f3c 100644 --- a/chrome/app/resources/chromium_strings_or.xtb +++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -47,7 +47,7 @@ <translation id="2049376729098081731">Google ସେବାଗୁଡ଼ିକରେ ପର୍ସନାଲାଇଜ କରାଯାଇଥିବା ଅଧିକ ଅନୁଭୂତି ପାଇଁ Chromium ଇତିହାସକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିବେ ନା ନାହିଁ ବାଛନ୍ତୁ</translation> <translation id="2088953378266246249">Chromium ଏହାର ରୁଟ ସାର୍ଟିଫିକେଟଗୁଡ଼ିକୁ କିପରି ପରିଚାଳନା କରେ ସେ ବିଷୟରେ ସୂଚନା</translation> <translation id="2174178932569897599">Chromiumକୁ କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ</translation> -<translation id="2174917724755363426">ଇନଷ୍ଟଲେସନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନାହିଁ। ଆପଣ ବାତିଲ୍ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ?</translation> +<translation id="2174917724755363426">ଇନଷ୍ଟଲେସନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନାହିଁ। ଆପଣ ବାତିଲ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ?</translation> <translation id="2185166961232948079">Chromium - ନେଟୱାର୍କ ସାଇନ୍-ଇନ୍ - <ph name="PAGE_TITLE" /></translation> <translation id="2241627712206172106">ଯଦି ଆପଣ ଗୋଟିଏ କମ୍ପ୍ୟୁଟର୍କୁ ସେୟାର୍ କରିବେ, ବନ୍ଧୁମାନେ ଓ ପରିବାର ଲୋକେ ଅଲଗା ଭାବେ ବ୍ରାଉଜ୍ କରିପାରିବେ ଏବଂ ସେମାନଙ୍କ ପସନ୍ଦ ଅନୁସରେ Chromiumକୁ ସେଟ୍-ଅପ୍ କରନ୍ତୁ।</translation> <translation id="2313870531055795960">Chromiumରେ ଷ୍ଟୋର କରାଯାଇଥିବା ଅସୁରକ୍ଷିତ ସାଇଟଗୁଡ଼ିକର ଏକ ତାଲିକା ସହିତ URLଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରେ। ଯଦି କୌଣସି ସାଇଟ ଆପଣଙ୍କ ପାସୱାର୍ଡ ଚୋରି କରିବାକୁ ଚେଷ୍ଟା କରେ କିମ୍ବା ଆପଣ ଏକ କ୍ଷତିକାରକ ଫାଇଲ ଡାଉନଲୋଡ କଲେ, ପୃଷ୍ଠାର କିଛି ବିଷୟବସ୍ତୁ ସହିତ URLଗୁଡ଼ିକୁ ମଧ୍ୟ Chromium ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂକୁ ପଠାଇପାରେ।</translation> @@ -165,7 +165,7 @@ <translation id="4665829708273112819">ଚେତାବନୀ: ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିହାସକୁ ରେକର୍ଡ କରିବାରୁ Chromium ଏକ୍ସଟେନସନଗୁଡ଼ିକୁ ପ୍ରତିରୋଧ କରିପାରିବ ନାହିଁ। ଇନକଗ୍ନିଟୋ ମୋଡରେ ଏହି ଏକ୍ସଟେନସନକୁ ଅକ୍ଷମ କରିବା ପାଇଁ, ଏହି ବିକଳ୍ପକୁ ଅଚୟନ କରନ୍ତୁ।</translation> <translation id="4673151026126227699">ଯଦି ଆପଣ Chromiumର ବ୍ୟବହାର ରିପୋର୍ଟଗୁଡ଼ିକ ମଧ୍ୟ ସେୟାର କରନ୍ତି, ତେବେ ସେହି ରିପୋର୍ଟଗୁଡ଼ିକ ଆପଣ ଭିଜିଟ କରିଥିବା URLଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିଥାଏ</translation> <translation id="4677944499843243528">ଏହି ପ୍ରୋଫାଇଲ୍ଟି ଅନ୍ୟ ଏକ କମ୍ପ୍ୟୁଟର୍ (<ph name="HOST_NAME" />)ରେ ଭିନ୍ନ Google Chromium ପ୍ରକ୍ରିୟା (<ph name="PROCESS_ID" />) ଦ୍ୱାରା ବ୍ୟବହାର ହେଉଥିବାର ଜଣାପଡୁଛି। Chromium ପ୍ରୋଫାଇଲ୍କୁ ଲକ୍ କରିଦେଇଛି ଯାହାଦ୍ୱାରା ଏହା ଖରାପ ହେବ ନାହିଁ। ଯଦି ଆପଣ ସୁନିଶ୍ଚିତ ଯେ, ଅନ୍ୟ ପ୍ରକ୍ରିୟାଗୁଡ଼ିକ ଏହି ପ୍ରୋଫାଇଲ୍କୁ ବ୍ୟବହାର କରୁନାହାନ୍ତି, ତେବେ ଆପଣ ପ୍ରୋଫାଇଲ୍କୁ ଅନ୍ଲକ୍ କରି Chromiumକୁ ପୁଣି ଲଞ୍ଚ କରିପାରିବେ।</translation> -<translation id="4680828127924988555">ଇନଷ୍ଟଲେସନ ବାତିଲ୍ କରନ୍ତୁ</translation> +<translation id="4680828127924988555">ଇନଷ୍ଟଲେସନ ବାତିଲ କରନ୍ତୁ</translation> <translation id="4708774505295300557">ଏହି କମ୍ପ୍ୟୁଟରରେ କେହି ଜଣେ ପୂର୍ବରୁ Chromiumରେ <ph name="ACCOUNT_EMAIL_LAST" /> ଭାବରେ ସାଇନ ଇନ କରିଛନ୍ତି। ଦୟାକରି ଆପଣଙ୍କ ସୂଚନାକୁ ଅଲଗା ରଖିବା ପାଇଁ ଏକ ନୂଆ Chromium ୟୁଜର ତିଆରି କରନ୍ତୁ।</translation> <translation id="4746050847053251315">ଯେକୌଣସିମତେ Chromium ଛାଡିବେ?</translation> <translation id="4748217263233248895">Chromium ପାଇଁ ଏକ ବିଶେଷ ସୁରକ୍ଷା ଅପ୍ଡେଟ୍ ଏବେ ଲାଗୁ କରାଯାଇଛି। ବର୍ତ୍ତମାନ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ ଏବଂ ଆମେ ଆପଣଙ୍କର ଟାବ୍ଗୁଡ଼ିକ ପୁନଃସ୍ଥାପନ କରିବୁ।</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index aa90978..c693abc 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -337,6 +337,7 @@ <translation id="8266560134891435528">Chromium nie może sprawdzić haseł, jeśli się nie zalogujesz</translation> <translation id="8276522524898344151">Chromium próbuje skopiować hasła.</translation> <translation id="8290862415967981663">Ten plik może być niebezpieczny, dlatego został zablokowany przez Chromium.</translation> +<translation id="8325404639443959713">Chromium pozwala na więcej</translation> <translation id="8330519371938183845">Zaloguj się, by synchronizować dane Chromium i korzystać z własnych ustawień przeglądarki na wielu urządzeniach</translation> <translation id="8340674089072921962">Użytkownik <ph name="USER_EMAIL_ADDRESS" /> wcześniej używał Chromium</translation> <translation id="8357820681460164151">Aby mieć dostęp do danych z Chromium na wszystkich swoich urządzeniach, zaloguj się i włącz synchronizację</translation> @@ -376,6 +377,7 @@ <translation id="9158494823179993217">Administrator systemu skonfigurował Chromium w taki sposób, by strona <ph name="TARGET_URL_HOSTNAME" /> otwierała się w alternatywnej przeglądarce.</translation> <translation id="9185526690718004400">Uruchom ponownie, aby zaktualizować &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Dostosuj Chromium do swoich potrzeb</translation> <translation id="93478295209880648">Chromium może działać nieprawidłowo, bo nie jest już zgodny z Windows XP ani Windows Vista</translation> <translation id="942598560705308788">Certyfikaty zarządzane przez Chromium</translation> <translation id="965162752251293939">Kto używa Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index 9e096d0..6b479dd 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -340,6 +340,7 @@ <translation id="8266560134891435528">O Chromium não consegue verificar as suas palavras-passe porque não tem sessão iniciada.</translation> <translation id="8276522524898344151">O Chromium está a tentar copiar palavras-passe.</translation> <translation id="8290862415967981663">Este ficheiro pode ser perigoso. Como tal, o Chromium bloqueou-o.</translation> +<translation id="8325404639443959713">Faça mais com o Chromium</translation> <translation id="8330519371938183845">Inicie sessão para sincronizar e personalizar o Chromium em todos os dispositivos.</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> estava a utilizar o Chromium</translation> <translation id="8357820681460164151">Para aceder aos seus itens do navegador Chromium em todos os seus dispositivos, inicie sessão e, em seguida, ative a sincronização.</translation> @@ -379,6 +380,7 @@ <translation id="9158494823179993217">O administrador do sistema configurou o Chromium para abrir um navegador alternativo, de modo a aceder a <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Reiniciar para atualizar o &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Personalize o Chromium</translation> <translation id="93478295209880648">O Chromium pode não funcionar corretamente, uma vez que já não é suportado no Windows XP ou no Windows Vista.</translation> <translation id="942598560705308788">Certificados geridos pelo Chromium</translation> <translation id="965162752251293939">Quem está a utilizar o Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index d205c3e..352d0d59c 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -339,6 +339,7 @@ <translation id="8266560134891435528">Chromium nu îți poate verifica parolele, deoarece nu te-ai conectat</translation> <translation id="8276522524898344151">Chromium încearcă să copieze parolele.</translation> <translation id="8290862415967981663">Este posibil ca fișierul să fie periculos, așadar Chromium l-a blocat.</translation> +<translation id="8325404639443959713">Fă mai multe cu Chromium</translation> <translation id="8330519371938183845">Conectează-te pentru a sincroniza și a personaliza Chromium pe toate dispozitivele</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> a folosit Chromium anterior</translation> <translation id="8357820681460164151">Pentru a accesa informațiile din Chromium pe toate dispozitivele, conectează-te, apoi activează sincronizarea.</translation> @@ -378,6 +379,7 @@ <translation id="9158494823179993217">Administratorul de sistem a configurat Chromium să deschidă un browser secundar pentru a accesa <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Relansează pentru a actualiza &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Personalizează Chromium</translation> <translation id="93478295209880648">Este posibil ca Chromium să nu funcționeze corespunzător, deoarece nu mai este acceptat pe Windows XP sau Windows Vista</translation> <translation id="942598560705308788">Certificate gestionate de Chromium</translation> <translation id="965162752251293939">Cine folosește Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 5875101a..3f44e44d 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -335,6 +335,7 @@ <translation id="8266560134891435528">Не удается запустить проверку паролей в Chromium, поскольку вы не вошли в аккаунт.</translation> <translation id="8276522524898344151">Chromium пытается скопировать пароли</translation> <translation id="8290862415967981663">Chromium заблокировал этот файл как потенциально опасный.</translation> +<translation id="8325404639443959713">Больше возможностей в Chromium</translation> <translation id="8330519371938183845">Войдите, чтобы синхронизировать данные Chromium на всех устройствах</translation> <translation id="8340674089072921962">Адрес <ph name="USER_EMAIL_ADDRESS" /> уже использовался в Chromium</translation> <translation id="8357820681460164151">Чтобы получить доступ к данным в браузере Chromium на всех своих устройствах, войдите в аккаунт и включите синхронизацию.</translation> @@ -374,6 +375,7 @@ <translation id="9158494823179993217">Ваш системный администратор задал настройки, согласно которым Chromium должен запускать альтернативный браузер для доступа к сайту <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Перезапустить для обновления &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Настройте Chromium для себя</translation> <translation id="93478295209880648">В работе Chromium могут возникать сбои, так как браузер больше не поддерживает Windows XP и Windows Vista.</translation> <translation id="942598560705308788">Сертификаты, которыми управляет Chromium</translation> <translation id="965162752251293939">Кто использует Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 96fafb8..ac68fbf 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -342,6 +342,7 @@ <translation id="8266560134891435528">Chromium ne more preveriti gesel, ker niste prijavljeni</translation> <translation id="8276522524898344151">Chromium poskuša kopirati gesla.</translation> <translation id="8290862415967981663">Ta datoteka je morda nevarna, zato jo je Chromium blokiral.</translation> +<translation id="8325404639443959713">Opravite več s Chromiumom</translation> <translation id="8330519371938183845">Prijavite se, da boste lahko Chromium sinhronizirali in prilagodili v vseh svojih napravah</translation> <translation id="8340674089072921962">Uporabnik <ph name="USER_EMAIL_ADDRESS" /> je prej uporabljal Chromium</translation> <translation id="8357820681460164151">Če želite do stvari v brskalniku Chromium dostopati v vseh svojih napravah, se prijavite in nato vklopite sinhronizacijo.</translation> @@ -381,6 +382,7 @@ <translation id="9158494823179993217">Skrbnik sistema je Chromium nastavil tako, da za dostop do <ph name="TARGET_URL_HOSTNAME" /> odpre drug brskalnik.</translation> <translation id="9185526690718004400">Znova zaženite, če želite posodobiti &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Prilagodite si Chromium</translation> <translation id="93478295209880648">Chromium morda ne bo deloval pravilno, ker ni več podprt v sistemu Windows XP ali Windows Vista</translation> <translation id="942598560705308788">Potrdila, ki jih upravlja Chromium</translation> <translation id="965162752251293939">Kdo uporablja Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index c1fc735..b85ccd0 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -341,6 +341,7 @@ <translation id="8266560134891435528">Chromium آپ کے پاس ورڈز چیک نہیں کر سکتا کیونکہ آپ سائن ان نہیں ہیں</translation> <translation id="8276522524898344151">Chromium پاس ورڈز کاپی کرنے کی کوشش کر رہا ہے۔</translation> <translation id="8290862415967981663">یہ فائل خطرناک ہو سکتی ہے، اس لیے Chromium نے اسے مسدود کر دیا ہے۔</translation> +<translation id="8325404639443959713">Chromium کے ساتھ مزید بہت کچھ کریں</translation> <translation id="8330519371938183845">اپنے آلات پر Chromium کو مطابقت پذیر اور ذاتی نوعیت کا بنانے کے لیے سائن ان کریں</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> پہلے Chromium کا استعمال کر رہا تھا</translation> <translation id="8357820681460164151">اپنے تمام آلات پر اپنے Chromium براؤزر کی چیزوں تک رسائی حاصل کرنے کیلئے، سائن ان کریں اور پھر مطابقت پذیری کو آن کریں</translation> @@ -380,6 +381,7 @@ <translation id="9158494823179993217">آپ کے سسٹم کے منتظم نے <ph name="TARGET_URL_HOSTNAME" /> تک رسائی حاصل کرنے کے لیے Chromium کو ایک متبادل براؤزر کھولنے کے لیے کنفیگر کیا ہے۔</translation> <translation id="9185526690718004400">Chromium& کو اپ ڈیٹ کرنے کیلئے بند کر کے دوبارہ چلائیں</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Chromium میں سائن ان کریں</translation> <translation id="93478295209880648">ممکن ہے کہ Chromium ٹھیک طریقے سے کام نہ کرے کیونکہ یہ اب Windows XP یا Windows Vista پر تعاون یافتہ نہیں ہے</translation> <translation id="942598560705308788">Chromium کے زیر انتظام سرٹیفکیٹس</translation> <translation id="965162752251293939">Chromium کون استعمال کر رہا ہے؟</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index 60fe8d2..773c766 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -338,6 +338,7 @@ <translation id="8266560134891435528">Chromium parollaringizni faqat hisobingizga kirganingizdan keyin tekshira oladi</translation> <translation id="8276522524898344151">Chromium parollarni nusxalashga urinmoqda.</translation> <translation id="8290862415967981663">Bu fayl xavfli bo‘lishi mumkin, shuning uchun u Chromium tomonidan bloklandi.</translation> +<translation id="8325404639443959713">Chromium imkoniyatlaridan maksimal foydalaning</translation> <translation id="8330519371938183845">Chromiumni barcha qurilmalaringizda sinxronlash va o‘zingizga moslash uchun hisobingizga kiring</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> hisobi avvallari Chromium’da ishlatilgan</translation> <translation id="8357820681460164151">Chromium brauzeridagi axborotlardan barcha qurilmalaringizda foydalanish uchun hisobingizga kiring va sinxronizatsiyani yoqing</translation> @@ -377,6 +378,7 @@ <translation id="9158494823179993217">Tizim administratori <ph name="TARGET_URL_HOSTNAME" /> havolasini muqobil brauzerda ochiladigan qilib sozlagan.</translation> <translation id="9185526690718004400">&Chromium brauzerini yangilash uchun qayta ishga tushiring</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">Chromium brauzerini oʻzingizga moslashtiring</translation> <translation id="93478295209880648">Chromium brauzeri Windows XP yoki Windows Vista tizimlarida ishlamay qolishi mumkin, chunki uning yangi versiyalarida bu tizimlar ta’minoti to‘xtatiladi</translation> <translation id="942598560705308788">Chromium boshqaradigan sertifikatlar</translation> <translation id="965162752251293939">Chromiumni kim ochdi?</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 75e79ba..b952a82 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -339,6 +339,7 @@ <translation id="8266560134891435528">Chromium 无法检查您的密码,因为您未登录</translation> <translation id="8276522524898344151">Chromium 正在尝试复制密码。</translation> <translation id="8290862415967981663">此文件可能存在危险,因此 Chromium 已将其拦截。</translation> +<translation id="8325404639443959713">Chromium 功能多,任您探索</translation> <translation id="8330519371938183845">登录即可在您的所有设备上同步并个性化设置 Chromium</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> 之前使用的是 Chromium</translation> <translation id="8357820681460164151">如需在您的所有设备上访问自己的 Chromium 浏览器信息,请登录您的帐号,然后开启同步功能</translation> @@ -378,6 +379,7 @@ <translation id="9158494823179993217">您的系统管理员已将 Chromium 配置为使用备用浏览器访问 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="9185526690718004400">重新启动以更新 Chromium(&C)</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">定制您的专属 Chromium</translation> <translation id="93478295209880648">Chromium 可能无法正常运行,因为它不再支持 Windows XP 和 Windows Vista</translation> <translation id="942598560705308788">由 Chromium 管理的证书</translation> <translation id="965162752251293939">谁在使用 Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index 38100378..fc93b3d6 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -341,6 +341,7 @@ <translation id="8266560134891435528">由於您尚未登入帳戶,因此 Chromium 無法檢查密碼</translation> <translation id="8276522524898344151">Chromium 正在嘗試複製密碼。</translation> <translation id="8290862415967981663">此檔案可能不安全,因此 Chromium 已封鎖此檔案。</translation> +<translation id="8325404639443959713">Chromium 讓你事半功倍</translation> <translation id="8330519371938183845">登入即可在不同裝置上同步和設定個人化的 Chromium</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> 以往曾使用 Chromium</translation> <translation id="8357820681460164151">如要透過所有裝置存取 Chromium 瀏覽器資料,請登入並開啟同步處理功能</translation> @@ -380,6 +381,7 @@ <translation id="9158494823179993217">系統管理員已設定 Chromium 開啟替代瀏覽器來存取 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="9185526690718004400">重新啟動以更新 &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">享有個人化的 Chromium 體驗</translation> <translation id="93478295209880648">由於 Chromium 將不再支援 Windows XP 或 Windows Vista,因此可能無法正常運作</translation> <translation id="942598560705308788">由 Chromium 管理的憑證</translation> <translation id="965162752251293939">誰在使用 Chromium?</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 2969bd29..7281cd0 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -340,6 +340,7 @@ <translation id="8266560134891435528">你尚未登入帳戶,因此 Chromium 無法檢查你的密碼</translation> <translation id="8276522524898344151">Chromium 正在嘗試複製密碼。</translation> <translation id="8290862415967981663">這個檔案可能不安全,因此遭到 Chromium 封鎖。</translation> +<translation id="8325404639443959713">Chromium 讓你事半功倍</translation> <translation id="8330519371938183845">登入即可進行同步處理,讓你在所有裝置上享有個人化的 Chromium 體驗</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> 先前使用的是 Chromium</translation> <translation id="8357820681460164151">如要透過所有裝置存取你的 Chromium 瀏覽器資料,請登入並開啟同步功能</translation> @@ -379,6 +380,7 @@ <translation id="9158494823179993217">系統管理員已設定 Chromium 開啟替代瀏覽器來存取 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="9185526690718004400">重新啟動以更新 &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> +<translation id="924957577793602335">享有個人化的 Chromium 體驗</translation> <translation id="93478295209880648">Chromium 已不適用於 Windows XP 或 Windows Vista,因此可能無法正常運作</translation> <translation id="942598560705308788">由 Chromium 管理的憑證</translation> <translation id="965162752251293939">誰在使用 Chromium?</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 4705e5ae..0b6bb43e9 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Herbegin Linux?</translation> <translation id="1047431265488717055">Kopieer skakelteks</translation> <translation id="1048286738600630630">Skerms</translation> -<translation id="1048770690598418849">Jy kan dit vir eers oorslaan, en ons sal outomaties weer probeer nadat jy die opstelling voltooi het</translation> <translation id="1048986595386481879">Dinamies toegeken</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Ontvang tans <ph name="ATTACHMENTS" /> van <ph name="DEVICE_NAME" /> af}other{Ontvang tans <ph name="ATTACHMENTS" /> van <ph name="DEVICE_NAME" /> af}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Gekopieer na jou knipbord</translation> <translation id="2183570493397356669">Gaan Voort-knoppie is gedeaktiveer</translation> <translation id="2184515124301515068">Laat Chrome kies wanneer webwerwe klank kan speel (aanbeveel)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Bladsy van 'n ander toestel af gedeel</translation> <translation id="2187675480456493911">Is met ander toestelle in jou rekening gesinkroniseer. Instellings wat deur ander gebruikers gewysig is, sal nie gesinkroniseer word nie. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Bedienersertifikaat-invoerfout</translation> @@ -1936,7 +1936,6 @@ <translation id="2673135533890720193">Lees jou blaaigeskiedenis</translation> <translation id="2674764818721168631">Af</translation> <translation id="2675570801872027281">Kon nie Bruschetta verwyder nie. Probeer weer.</translation> -<translation id="2676492189600898281">Verskaf outovulterugvoer</translation> <translation id="2678063897982469759">Heraktiveer</translation> <translation id="2678100101831051676">Kan nie uitsaai nie.</translation> <translation id="268053382412112343">Geskiedenis</translation> @@ -7232,7 +7231,6 @@ <translation id="7550830279652415241">boekmerke_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Kon nie <ph name="FILE_NAME" /> aflaai nie</translation> <translation id="7551643184018910560">Speld aan rak vas</translation> -<translation id="7552658769580484674">Verskaf outovulterugvoer</translation> <translation id="7552846755917812628">Probeer die volgende wenke:</translation> <translation id="7553012839257224005">Gaan tans die Linux-houer na</translation> <translation id="7553242001898162573">Voer jou wagwoord in</translation> @@ -8791,7 +8789,6 @@ <translation id="8952831374766033534">Opstellingopsie word nie gesteun nie: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Terwyl dit laai</translation> <translation id="895347679606913382">Begin tans …</translation> -<translation id="8956230710625245889">Maak in Leser oop</translation> <translation id="8957757410289731985">Pasmaak profiel</translation> <translation id="895944840846194039">JavaScript-geheue</translation> <translation id="8960208913905765425">Eenheidomskakeling vir Vinnige Antwoorde</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 05aed7b2..0974022b 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ዳግም ይነሳ?</translation> <translation id="1047431265488717055">የአገናኝ ጽሁፍ &ቅዳ</translation> <translation id="1048286738600630630">ማሳያዎች</translation> -<translation id="1048770690598418849">ለአሁን ማሳለፍ ይችላሉ እና ውቅረቱን ከጨረሱ በኋላ በራስ ሰር በድጋሚ እንሞክራለን</translation> <translation id="1048986595386481879">በተለዋዋጭነት የሚመደብ</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" />ን ከ<ph name="DEVICE_NAME" /> በመቀበል ላይ}one{<ph name="ATTACHMENTS" />ን ከ<ph name="DEVICE_NAME" /> በመቀበል ላይ}other{<ph name="ATTACHMENTS" />ን ከ<ph name="DEVICE_NAME" /> በመቀበል ላይ}}</translation> <translation id="1049743911850919806">ማንነት የማያሳውቅ</translation> @@ -1365,6 +1364,7 @@ <translation id="2182058453334755893">ወደ የእርስዎ ቅንጥብ ሰሌዳ ላይ ተቀድቷል</translation> <translation id="2183570493397356669">የቀጥል አዝራር ተሰናክሏል</translation> <translation id="2184515124301515068">Chrome ጣቢያዎች መቼ ድምጽን ማጫወት እንደሚችሉ እንዲመርጥ ይፍቀዱ (የሚመከር)</translation> +<translation id="2186206192313702726">Google ሌንስ</translation> <translation id="2186711480981247270">ከሌላ መሣሪያ የተጋራ ገጽ</translation> <translation id="2187675480456493911">በመለያዎ ላይ ካሉ ሌሎች መሣሪያዎች ጋር ሰምሯል። በሌሎች ተጠቃሚዎች የተቀየሩ ቅንብሮች አይሰምሩም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="2187895286714876935">የአገልጋይ ዕውቅና ማረጋገጫ ስህተት</translation> @@ -1633,6 +1633,7 @@ <translation id="2408018932941436077">ካርድን በማስቀመጥ ላይ</translation> <translation id="2408955596600435184">የእርስዎን ፒን ያስገቡ</translation> <translation id="2409268599591722235">እንሂድ</translation> +<translation id="2409709393952490731">ስልክ ወይም ጡባዊ ተጠቀም</translation> <translation id="2410079346590497630">የግንብ ዝርዝሮች</translation> <translation id="2410298923485357543">መሣሪያው መስመር ላይ በሚሆንበት ጊዜ የተፈጥሮ ድምፅን ይጠቀሙ</translation> <translation id="2410754283952462441">አንድ መለያ ይምረጡ</translation> @@ -1929,7 +1930,6 @@ <translation id="2673135533890720193">የአሰሳ ታሪክዎን ያነብባል</translation> <translation id="2674764818721168631">አጥፋ</translation> <translation id="2675570801872027281">Bruschettaን በማስወገድ ላይ ስህተት። እባክዎ እንደገና ይሞክሩ።</translation> -<translation id="2676492189600898281">የራስ-ሙላ ግብረመልስን አቅርብ</translation> <translation id="2678063897982469759">እንደገና አንቃ</translation> <translation id="2678100101831051676">cast ማድረግ አልተቻለም።</translation> <translation id="268053382412112343">&ታሪክ</translation> @@ -3779,6 +3779,7 @@ <translation id="4369215744064167350">የድር ጣቢያ ጥያቄ ጸድቋል</translation> <translation id="4369735607080757018">እንደ አንድ ማስታወቂያ ለእርስዎ የታየበት የቀኑ ሰዓት ያለ የማስታወቂያዎቻቸውን አፈጻጸም ለመለካት የተገደቡ የውሂብ ዓይነቶች በጣቢያዎች መካከል ይጋራሉ</translation> <translation id="4370975561335139969">ያስገቧቸው ኢሜይል እና የይለፍ ቃል አይዛመዱም።</translation> +<translation id="4374805630006466253">የተለየ ስልክ ወይም ጡባዊ ተጠቀም</translation> <translation id="4374831787438678295">Linux ጫኚ</translation> <translation id="4375035964737468845">የወረዱ ፋይሎችን ክፈት</translation> <translation id="4376226992615520204">አካባቢ ጠፍቷል</translation> @@ -7222,7 +7223,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ማውረድ አልተሳካም</translation> <translation id="7551643184018910560">መደርደሪያ ላይ ሰካ</translation> -<translation id="7552658769580484674">የራስ-ሙላ ግብረመልስን አቅርብ</translation> <translation id="7552846755917812628">የሚከተሉትን ጠቃሚ ምክሮች ይሞክሩ፦</translation> <translation id="7553012839257224005">የLinux መያዣውን በመፈተሽ ላይ</translation> <translation id="7553242001898162573">ይለፍ ቃልዎን ያስገቡ</translation> @@ -8788,7 +8788,6 @@ <translation id="8952831374766033534">የውቅረት አማራጭ አይደገፍም፦ <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ባትሪ በመሙላት ላይ ሳለ</translation> <translation id="895347679606913382">በመጀመር ላይ…</translation> -<translation id="8956230710625245889">በአንባቢ ውስጥ ክፈት</translation> <translation id="8957757410289731985">መገለጫን አብጅ</translation> <translation id="895944840846194039">የJavaScript ማህደረ ትውስታ</translation> <translation id="8960208913905765425">የፈጣን መልሶች አሃድ ልወጣ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index b9a6448..30da947c 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">هل تريد إعادة تشغيل نظام التشغيل Linux؟</translation> <translation id="1047431265488717055">نسخ ن&ص الرابط</translation> <translation id="1048286738600630630">إعدادات العرض</translation> -<translation id="1048770690598418849">يمكنك تخطِّي ذلك الآن وسنعيد المحاولة تلقائيًا بعد إكمال عملية الإعداد.</translation> <translation id="1048986595386481879">مخصّص ديناميكيًا</translation> <translation id="1049324577536766607">{COUNT,plural, =1{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}zero{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}two{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}few{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}many{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}other{جارٍ استلام <ph name="ATTACHMENTS" /> من جهاز <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">التصفح المتخفي</translation> @@ -1361,6 +1360,7 @@ <translation id="2182058453334755893">تم النسخ إلى الحافظة.</translation> <translation id="2183570493397356669">تم إيقاف زر "متابعة".</translation> <translation id="2184515124301515068">السماح لمتصفِّح Chrome باختيار الوقت الذي يمكن للمواقع الإلكترونية تشغيل الصوت فيه (مُوصى به)</translation> +<translation id="2186206192313702726">عدسة Google</translation> <translation id="2186711480981247270">صفحة تمت مشاركتها من جهاز آخر</translation> <translation id="2187675480456493911">تمت مزامنة الشبكة مع الأجهزة الأخرى المرتبطة بحسابك. ولن تتم مزامنة الإعدادات التي عدَّلها المستخدمون. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="2187895286714876935">خط استيراد شهادة الخادم</translation> @@ -1926,7 +1926,6 @@ <translation id="2673135533890720193">قراءة سجل التصفح التابع لك</translation> <translation id="2674764818721168631">غير مفعَّل</translation> <translation id="2675570801872027281">حدث خطأ أثناء إزالة الجهاز الافتراضي Bruschetta. يُرجى إعادة المحاولة.</translation> -<translation id="2676492189600898281">تقديم الملاحظات بشأن ميزة "الملء التلقائي"</translation> <translation id="2678063897982469759">إعادة تفعيل</translation> <translation id="2678100101831051676">تعذَّر البث</translation> <translation id="268053382412112343">ال&سجل</translation> @@ -4278,6 +4277,7 @@ <translation id="4824037980212326045">النسخ الاحتياطي واستعادة البيانات من نظام التشغيل Linux</translation> <translation id="4824958205181053313">هل تريد إلغاء المزامنة؟</translation> <translation id="4825532258163983651">تعذُّر حذف مفتاح المرور</translation> +<translation id="4827283332383516812">حذف البطاقة</translation> <translation id="4827675678516992122">تعذّر الاتصال</translation> <translation id="4827784381479890589">التدقيق الإملائي المُحسَّن في متصفِّح Chrome (يتم إرسال النص إلى Google للاقتراحات الإملائية)</translation> <translation id="4827904420700932487">إنشاء رمز استجابة سريعة لهذه الصورة</translation> @@ -5301,6 +5301,7 @@ <translation id="5792295754950501287">مزيد من الإجراءات للبطاقة <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">يُرجى النقر على زر التشغيل.</translation> <translation id="5792874008054171483">مزيد من الإجراءات للموقع الإلكتروني <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">سيتم حذف طريقة الدفع هذه من هذا الجهاز.</translation> <translation id="5793339252089865437">قد يؤدي تنزيل التحديث عبر شبكة الجوّال إلى تحصيل رسوم زائدة منك.</translation> <translation id="5793420564274426163">تأكيد الإقران</translation> <translation id="5793430094159150686">تم تغيير كلمة المرور. لاستعادة بياناتك المُخزّنة على الجهاز، عليك إدخال كلمة المرور القديمة.</translation> @@ -7226,7 +7227,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">لم يتم تحميل <ph name="FILE_NAME" /> بنجاح</translation> <translation id="7551643184018910560">تثبيت في الرف</translation> -<translation id="7552658769580484674">تقديم الملاحظات بشأن ميزة "الملء التلقائي"</translation> <translation id="7552846755917812628">جرّب النصائح التالية:</translation> <translation id="7553012839257224005">جارٍ التحقُّق من حاوية نظام التشغيل Linux</translation> <translation id="7553242001898162573">إدخال كلمة المرور</translation> @@ -7288,6 +7288,7 @@ <translation id="7609148976235050828">يُرجى الاتصال بالإنترنت وإعادة المحاولة.</translation> <translation id="7612401678989660900">السماح بوصول التطبيقات والمواقع الإلكترونية إلى الميكروفون من خلال منحها إذن استخدام الميكروفون</translation> <translation id="7612655942094160088">تفعيل ميزات الهاتف المرتبطة</translation> +<translation id="7612989789287281429">جارٍ تسجيل الدخول…</translation> <translation id="7614260613810441905">طلب الإذن عند محاولة موقع إلكتروني تعديل الملفات والمجلدات على أجهزتك (مقترَح)</translation> <translation id="761530003705945209">يمكنك الاحتفاظ بنسخة احتياطية في Google Drive. ويمكنك استعادة بياناتك أو تبديل جهازك بسهولة وفي أي وقت. تتضمّن نسختك الاحتياطية بيانات التطبيق، حيث يتمّ تحميل النُسخ الاحتياطية إلى Google ويتم ترميزها باستخدام كلمة مرور حسابك على Google.</translation> <translation id="7615365294369022248">حدث خطأ أثناء إضافة حساب</translation> @@ -8790,7 +8791,6 @@ <translation id="8952831374766033534">خيار الضبط غير متاح: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">أثناء الشحن</translation> <translation id="895347679606913382">بدء التحميل...</translation> -<translation id="8956230710625245889">فتح الصفحة في "قارئ الشاشة"</translation> <translation id="8957757410289731985">تخصيص الملف الشخصي</translation> <translation id="895944840846194039">ذاكرة JavaScript</translation> <translation id="8960208913905765425">تحويل الوحدات باستخدام ميزة "معلومات سريعة"</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index a854c7850ca..c57188a 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ৰিষ্টাৰ্ট কৰিবনে?</translation> <translation id="1047431265488717055">লিংক আৰু পা&ঠ প্ৰতিলিপি কৰক</translation> <translation id="1048286738600630630">দেখুৱায়</translation> -<translation id="1048770690598418849">আপুনি সদ্যহতে এৰি যাব পাৰে আৰু আপুনি ছেটআপটো সম্পূৰ্ণ কৰাৰ পাছত আমি স্বয়ংক্ৰিয়ভাৱে পুনৰ চেষ্টা কৰিম</translation> <translation id="1048986595386481879">পৰিৱৰ্তনশীলভাৱে আৱণ্টন কৰা</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" />ৰ পৰা <ph name="ATTACHMENTS" /> লাভ কৰি থকা হৈছে}one{<ph name="DEVICE_NAME" />ৰ পৰা <ph name="ATTACHMENTS" /> লাভ কৰি থকা হৈছে}other{<ph name="DEVICE_NAME" />ৰ পৰা <ph name="ATTACHMENTS" /> লাভ কৰি থকা হৈছে}}</translation> <translation id="1049743911850919806">ইনক’গনিট’</translation> @@ -1367,6 +1366,7 @@ <translation id="2182058453334755893">আপোনাৰ ক্লিপব’ৰ্ডলৈ প্ৰতিলিপি কৰা হৈছে</translation> <translation id="2183570493397356669">অব্যাহত ৰাখক বুটামটো অক্ষম কৰা আছে</translation> <translation id="2184515124301515068">ছাইটসমূহে কেতিয়া ধ্বনি বজাব পাৰিব সেয়া Chromeক বাছনি কৰিবলৈ দিয়ক (আমি চুপাৰিছ কৰোঁ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">অন্য এটা ডিভাইচৰ পৰা শ্বেয়াৰ কৰা পৃষ্ঠা</translation> <translation id="2187675480456493911">আপোনাৰ একাউণ্টত থকা অন্য ডিভাইচসমূহৰ সৈতে ছিংক কৰা হৈছে। অন্য ব্যৱহাৰকাৰীসকলে সংশোধন কৰা ছেটিংসমূহ ছিংক কৰা নহ’ব। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ছাৰ্ভাৰৰ প্ৰমাণপত্ৰ আমদানি কৰাত আসোঁৱাহ</translation> @@ -1637,6 +1637,7 @@ <translation id="2408018932941436077">কাৰ্ডখন ছেভ কৰি থকা হৈছে</translation> <translation id="2408955596600435184">আপোনাৰ পিন দিয়ক</translation> <translation id="2409268599591722235">আৰম্ভ কৰোঁ আহক</translation> +<translation id="2409709393952490731">এটা ফ’ন অথবা টেবলেট ব্যৱহাৰ কৰক</translation> <translation id="2410079346590497630">বিল্ডৰ সবিশেষ</translation> <translation id="2410298923485357543">ডিভাইচটো অনলাইন হৈ থাকিলে স্বাভাৱিক কণ্ঠধ্বনি ব্যৱহাৰ কৰক</translation> <translation id="2410754283952462441">কোনো একাউণ্ট বাছনি কৰক</translation> @@ -1933,7 +1934,6 @@ <translation id="2673135533890720193">আপোনাৰ ব্ৰাউজিংৰ ইতিহাস পঢ়ক</translation> <translation id="2674764818721168631">অফ আছে</translation> <translation id="2675570801872027281">Bruschetta আঁতৰাওঁতে আসোঁৱাহ হৈছে। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।</translation> -<translation id="2676492189600898281">স্বয়ংক্ৰিয়ভাৱে পূৰ হোৱাৰ সুবিধাটোৰ বিষয়ে মতামত প্ৰদান কৰক</translation> <translation id="2678063897982469759">পুনঃসক্ষম কৰক</translation> <translation id="2678100101831051676">কাষ্ট কৰিব পৰা নগ’ল।</translation> <translation id="268053382412112343">ইতি&হাস</translation> @@ -3784,6 +3784,7 @@ <translation id="4369215744064167350">ৱেবছাইটৰ অনুৰোধত অনুমোদন জনোৱা হৈছে</translation> <translation id="4369735607080757018">ছাইটসমূহৰ মাজত সেইবিলাকে দেখুওৱা বিজ্ঞাপনৰ পাৰদৰ্শিতা জোখ-মাখ কৰিবলৈ সীমিত ধৰণৰ ডেটা শ্বেয়াৰ কৰা হয়, যেনে- আপোনাক কোনো বিজ্ঞাপন দিনটোৰ কি সময়ত দেখুওৱা হৈছিল</translation> <translation id="4370975561335139969">আপুনি দিয়া ইমেইল আৰু পাছৱৰ্ড মিলা নাই</translation> +<translation id="4374805630006466253">এটা বেলেগ ফ’ন অথবা টেবলেট ব্যৱহাৰ কৰক</translation> <translation id="4374831787438678295">Linux ইনষ্টলাৰ</translation> <translation id="4375035964737468845">ডাউনল'ড হোৱা ফাইলসমূহ খোলক</translation> <translation id="4376226992615520204">অৱস্থান অফ কৰা আছে</translation> @@ -7228,7 +7229,6 @@ <translation id="7550830279652415241">বুকমাৰ্ক_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ডাউনল’ড কৰিব পৰা নগ’ল৷</translation> <translation id="7551643184018910560">শ্বেল্ফত পিন কৰক</translation> -<translation id="7552658769580484674">স্বয়ংক্ৰিয়ভাৱে পূৰ হোৱাৰ সুবিধাটোৰ বিষয়ে মতামত প্ৰদান কৰক</translation> <translation id="7552846755917812628">এই পৰামর্শসমূহ অনুসৰণ কৰি চাওক:</translation> <translation id="7553012839257224005">Linux কণ্টেইনাৰটো পৰীক্ষা কৰি থকা হৈছে</translation> <translation id="7553242001898162573">আপোনাৰ পাছৱৰ্ড দিয়ক</translation> @@ -8788,7 +8788,6 @@ <translation id="8952831374766033534">কনফিগাৰেশ্বনৰ বিকল্পটো সমর্থিত নহয়: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">চার্জ কৰি থকাৰ সময়ত</translation> <translation id="895347679606913382">আৰম্ভ কৰি থকা হৈছে...</translation> -<translation id="8956230710625245889">ৰীডাৰত খোলক</translation> <translation id="8957757410289731985">প্ৰ’ফাইল কাষ্টমাইজ কৰক</translation> <translation id="895944840846194039">JavaScript মেম’ৰী</translation> <translation id="8960208913905765425">দ্ৰুত উত্তৰৰ একক ৰূপান্তৰণ</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index fe8ad5c..9ce226c 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux yenidən başladılsın?</translation> <translation id="1047431265488717055">Link Mətnini Kopyalayın</translation> <translation id="1048286738600630630">Ekran</translation> -<translation id="1048770690598418849">İndilik ötürə bilərsiniz, siz ayarlamanı yekunlaşdırdıqdan sonra avtomatik olaraq təkrar cəhd edəcəyik</translation> <translation id="1048986595386481879">Dinamik bölünüb</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> cihazından <ph name="ATTACHMENTS" /> alınır}other{<ph name="DEVICE_NAME" /> cihazından <ph name="ATTACHMENTS" /> alınır}}</translation> <translation id="1049743911850919806">Gizli Rejim</translation> @@ -1353,6 +1352,7 @@ <translation id="2182058453334755893">Buferə kopyalandı</translation> <translation id="2183570493397356669">"Davam edin" düyməsi deaktivdir</translation> <translation id="2184515124301515068">Saytların avtomatik oxutma vaxtını Chrome'un seçməsinə icazə verin (məsləhətlidir)</translation> +<translation id="2186206192313702726">Google Linza</translation> <translation id="2186711480981247270">Səhifə başqa cihazdan paylaşılıb</translation> <translation id="2187675480456493911">Hesabınızdakı digər cihazlarla sinxronlaşdırılıb. Digər istifadəçilər tərəfindən dəyişdirilən ayarlar sinxronlaşdırılmayacaq. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Server Sertifikatını İmport Xətası</translation> @@ -1623,6 +1623,7 @@ <translation id="2408018932941436077">Kart yadda saxlanılır</translation> <translation id="2408955596600435184">PİN kodunuzu daxil edin</translation> <translation id="2409268599591722235">Gedək</translation> +<translation id="2409709393952490731">Telefon və ya planşet istifadə edin</translation> <translation id="2410079346590497630">Versiya detalları</translation> <translation id="2410298923485357543">Cihazınız onlayn olduqda təbii səsdən istifadə edin</translation> <translation id="2410754283952462441">Hesab seçin</translation> @@ -1919,7 +1920,6 @@ <translation id="2673135533890720193">Brauzer tarixçənizi oxuyun</translation> <translation id="2674764818721168631">Deaktiv</translation> <translation id="2675570801872027281">Bruschetta-nı silərkən xəta oldu. Yenidən cəhd edin.</translation> -<translation id="2676492189600898281">Avto doldurma rəyi təmin edin</translation> <translation id="2678063897982469759">Yenidən aktivləşdirin</translation> <translation id="2678100101831051676">Yayımlamaq alınmadı.</translation> <translation id="268053382412112343">Tarixçə</translation> @@ -3769,6 +3769,7 @@ <translation id="4369215744064167350">Veb sayt sorğusu təsdiq edildi</translation> <translation id="4369735607080757018">Reklamın sizə göstərildiyi vaxt kimi reklamlarının performansını ölçmək üçün saytlar arasında məhdud data növləri paylaşılır.</translation> <translation id="4370975561335139969">Daxil etdiyiniz e-poçt və parol uyğun gəlmir</translation> +<translation id="4374805630006466253">Başqa telefon və ya planşet istifadə edin</translation> <translation id="4374831787438678295">Linux quraşdırıcısı</translation> <translation id="4375035964737468845">Endirilmiş faylları açın</translation> <translation id="4376226992615520204">Məkan deaktiv edildi</translation> @@ -7208,7 +7209,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> endirmə uğursuz oldu</translation> <translation id="7551643184018910560">Rəfə sancaqlayın</translation> -<translation id="7552658769580484674">Avto Doldurma Rəyi Təmin Edin</translation> <translation id="7552846755917812628">Aşağıdakı məsləhətləri sınayın:</translation> <translation id="7553012839257224005">Linux konteyneri yoxlanılır</translation> <translation id="7553242001898162573">Şifrənizi daxil edin</translation> @@ -8765,7 +8765,6 @@ <translation id="8952831374766033534">Konfiqurasiya seçimi dəstəklənmir: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Şarj edilən zaman</translation> <translation id="895347679606913382">Başlayır...</translation> -<translation id="8956230710625245889">Oxucuda açın</translation> <translation id="8957757410289731985">Profili fərdiləşdirin</translation> <translation id="895944840846194039">JavaScript yaddaşı</translation> <translation id="8960208913905765425">Cəld Cavablar üzrə vahidin çevrilməsi</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 0fc45ed9c..465ecc3b3 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Перазапусціць Linux?</translation> <translation id="1047431265488717055">Скапіраваць &тэкст спасылкі</translation> <translation id="1048286738600630630">Дысплэі</translation> -<translation id="1048770690598418849">Зараз вы можаце прапусціць гэты працэс. Ён будзе аўтаматычна запушчаны пасля завяршэння наладжвання.</translation> <translation id="1048986595386481879">Дынамічнае размеркаванне</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Ідзе атрыманне даных (<ph name="ATTACHMENTS" />) з прылады "<ph name="DEVICE_NAME" />"}one{Ідзе атрыманне даных (<ph name="ATTACHMENTS" />) з прылады "<ph name="DEVICE_NAME" />"}few{Ідзе атрыманне даных (<ph name="ATTACHMENTS" />) з прылады "<ph name="DEVICE_NAME" />"}many{Ідзе атрыманне даных (<ph name="ATTACHMENTS" />) з прылады "<ph name="DEVICE_NAME" />"}other{Ідзе атрыманне даных (<ph name="ATTACHMENTS" />) з прылады "<ph name="DEVICE_NAME" />"}}</translation> <translation id="1049743911850919806">Інкогніта</translation> @@ -1360,6 +1359,7 @@ <translation id="2182058453334755893">Скапіравана ў буфер абмену</translation> <translation id="2183570493397356669">Кнопка "Працягнуць" адключана</translation> <translation id="2184515124301515068">Дазволіць браўзеру Chrome вызначаць, калі сайты могуць прайграваць гук (рэкамендуецца)</translation> +<translation id="2186206192313702726">Google Аб'ектыў</translation> <translation id="2186711480981247270">Старонка абагулена з іншай прылады</translation> <translation id="2187675480456493911">Сінхранізавана з іншымі прыладамі ў вашым уліковым запісе. Налады, змененыя іншымі карыстальнікамі, не будуць сінхранізавацца. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Памылка імпарту сертыфіката сервера</translation> @@ -1923,7 +1923,6 @@ <translation id="2673135533890720193">Чытанне вашай гісторыі прагляду сайтаў</translation> <translation id="2674764818721168631">Выключана</translation> <translation id="2675570801872027281">Пры выдаленні Bruschetta адбылася памылка. Паўтарыце спробу.</translation> -<translation id="2676492189600898281">Пакінуць водгук пра функцыю аўтазапаўнення</translation> <translation id="2678063897982469759">Паўторна ўключыць</translation> <translation id="2678100101831051676">Не ўдалося запусціць трансляцыю.</translation> <translation id="268053382412112343">Гі&сторыя</translation> @@ -3948,6 +3947,7 @@ <translation id="4522890784888918985">Даччыныя ўліковыя запісы не падтрымліваюцца</translation> <translation id="4523876148417776526">Спісы сайтаў у фармаце XML яшчэ не загружаны.</translation> <translation id="4524832533047962394">Указаны рэжым рэгістрацыі не падтрымліваецца ў гэтай версіі аперацыйнай сістэмы. Праверце, ці актуальная версія ў вас.</translation> +<translation id="4526051299161934899">Схаваныя групы ўкладак (захаваныя)</translation> <translation id="4526853756266614740">Выберыце відарыс – і тэма імгненна прыменіцца</translation> <translation id="452750746583162491">Праверыць сінхранізаваныя даныя</translation> <translation id="4527929807707405172">Уключыць адваротную прагортку. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> @@ -4272,6 +4272,7 @@ <translation id="4824037980212326045">Рэзервовае капіраванне і аднаўленне Linux</translation> <translation id="4824958205181053313">Скасаваць сінхранізацыю?</translation> <translation id="4825532258163983651">Не ўдалося выдаліць ключ доступу</translation> +<translation id="4827283332383516812">Выдаленне карткі</translation> <translation id="4827675678516992122">Не ўдалося падключыцца</translation> <translation id="4827784381479890589">Палепшаная праверка правапісу ў браўзеры Chrome (тэкст адпраўляецца ў Google для прапаноў правапісных варыянтаў)</translation> <translation id="4827904420700932487">Стварыць QR-код для гэтага відарыса</translation> @@ -5295,6 +5296,7 @@ <translation id="5792295754950501287">Іншыя дзеянні для карткі "<ph name="CARD_DESCRIPTION" />"</translation> <translation id="5792728279623964091">Націсніце кнопку сілкавання</translation> <translation id="5792874008054171483">Іншыя дзеянні з сайтам <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Гэты спосаб аплаты будзе выдалены з прылады</translation> <translation id="5793339252089865437">Калі спампоўваць абнаўленне праз мабільную сетку, гэта можа прывесці да празмерных выдаткаў.</translation> <translation id="5793420564274426163">Пацвярджэнне спалучэння</translation> <translation id="5793430094159150686">Пароль быў зменены. Каб аднавіць лакальныя даныя, трэба ўвесці стары пароль.</translation> @@ -7217,7 +7219,6 @@ <translation id="7550830279652415241">закладкі_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Не ўдалося спампаваць файл "<ph name="FILE_NAME" />"</translation> <translation id="7551643184018910560">Замацаваць на паліцы</translation> -<translation id="7552658769580484674">Пакінуць водгук пра функцыю аўтазапаўнення</translation> <translation id="7552846755917812628">Паспрабуйце наступнае:</translation> <translation id="7553012839257224005">Ідзе праверка наяўнасці кантэйнера Linux</translation> <translation id="7553242001898162573">Увядзіце пароль</translation> @@ -7279,6 +7280,7 @@ <translation id="7609148976235050828">Падключыцеся да інтэрнэту і паўтарыце спробу.</translation> <translation id="7612401678989660900">Даць доступ праграмам і сайтам, якія маюць дазвол выкарыстоўваць мікрафон</translation> <translation id="7612655942094160088">Уключэнне функцый падключанага тэлефона.</translation> +<translation id="7612989789287281429">Выконваецца ўваход…</translation> <translation id="7614260613810441905">Запытваць дазвол на змяненне сайтамі файлаў ці папак на прыладзе (рэкамендуецца)</translation> <translation id="761530003705945209">Рэзервовае капіраванне на Google Дыск. Лёгка аднаўляйце даныя і пераносьце іх на іншыя прылады. У рэзервовую копію ўваходзяць даныя праграм. Рэзервовыя копіі запампоўваюцца ў Google і шыфруюцца пад паролем ад вашага Уліковага запісу Google.</translation> <translation id="7615365294369022248">Пры дадаванні ўліковага запісу ўзнікла памылка.</translation> @@ -8494,6 +8496,7 @@ <translation id="869884720829132584">Меню праграм</translation> <translation id="869891660844655955">Тэрмін дзеяння</translation> <translation id="8699188901396699995">PPD для прынтара "<ph name="PRINTER_NAME" />"</translation> +<translation id="8702278591052316269">Меню са схаванымі групамі ўкладак (захаванымі)</translation> <translation id="8702825062053163569">Ваша прылада <ph name="DEVICE_TYPE" /> была заблакіравана.</translation> <translation id="8703346390800944767">Прапусціць рэкламу</translation> <translation id="8705331520020532516">Серыйны нумар</translation> @@ -8777,7 +8780,6 @@ <translation id="8952831374766033534">Параметр канфігурацыі не падтрымліваецца: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Падчас зарадкі</translation> <translation id="895347679606913382">Пачынаецца...</translation> -<translation id="8956230710625245889">Адкрыць у Reader</translation> <translation id="8957757410289731985">Наладзіць профіль</translation> <translation id="895944840846194039">Памяць JavaScript</translation> <translation id="8960208913905765425">Перавод адзінак вымярэння з дапамогай Хуткіх адказаў</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 12be69ef..a082b0a 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Искате ли да рестартирате Linux?</translation> <translation id="1047431265488717055">Копиране на тек&ста на връзката</translation> <translation id="1048286738600630630">Дисплеи</translation> -<translation id="1048770690598418849">Можете да пропуснете засега и ще опитаме отново автоматично, след като завършите настройването</translation> <translation id="1048986595386481879">Динамично заделен</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Получавате <ph name="ATTACHMENTS" /> от <ph name="DEVICE_NAME" />}other{Получавате <ph name="ATTACHMENTS" /> от <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">„Инкогнито“</translation> @@ -1365,6 +1364,7 @@ <translation id="2182058453334755893">Копирано в буферната памет</translation> <translation id="2183570493397356669">Бутонът „Напред“ е деактивиран</translation> <translation id="2184515124301515068">Нека Chrome избира кога сайтовете да могат да възпроизвеждат звук (препоръчително)</translation> +<translation id="2186206192313702726">Google Обектив</translation> <translation id="2186711480981247270">Страницата е споделена от друго устройство</translation> <translation id="2187675480456493911">Мрежата е синхронизирана с другите устройства в профила ви. Настройките, променени от други потребители, няма да се синхронизират. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Грешка при импортирането на сертификат на сървър</translation> @@ -1931,7 +1931,6 @@ <translation id="2673135533890720193">Да чете историята на сърфирането ви</translation> <translation id="2674764818721168631">Изключено</translation> <translation id="2675570801872027281">При премахването на Bruschetta възникна грешка. Моля, опитайте отново.</translation> -<translation id="2676492189600898281">Предоставяне на отзиви за автоматичното попълване</translation> <translation id="2678063897982469759">Повторно активиране</translation> <translation id="2678100101831051676">Предаването не е възможно.</translation> <translation id="268053382412112343">&Хронология</translation> @@ -4285,6 +4284,7 @@ <translation id="4824037980212326045">Резервни копия и възстановяване на Linux</translation> <translation id="4824958205181053313">Да се анулира ли синхронизирането?</translation> <translation id="4825532258163983651">Кодът за достъп не може да бъде изтрит</translation> +<translation id="4827283332383516812">Изтриване на картата</translation> <translation id="4827675678516992122">Не можа да се установи връзка</translation> <translation id="4827784381479890589">Подобрена проверка на правописа в браузъра Chrome (текстът се изпраща до Google за получаване на предложения за правопис)</translation> <translation id="4827904420700932487">Създаване на QR код за това изображение</translation> @@ -5309,6 +5309,7 @@ <translation id="5792295754950501287">Още действия за „<ph name="CARD_DESCRIPTION" />“</translation> <translation id="5792728279623964091">Моля, докоснете бутона за захранване</translation> <translation id="5792874008054171483">Още действия за <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Този начин на плащане ще бъде изтрит от това устройство</translation> <translation id="5793339252089865437">Ако изтеглите актуализацията през мобилната си мрежа, може да бъдете таксувани допълнително.</translation> <translation id="5793420564274426163">Потвърждение за сдвояване</translation> <translation id="5793430094159150686">Паролата ви е променена. За да възстановите локалните си данни, трябва да въведете старата.</translation> @@ -7225,7 +7226,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">„<ph name="FILE_NAME" />“ се изтегли успешно</translation> <translation id="7551643184018910560">Фиксиране в лавицата</translation> -<translation id="7552658769580484674">Предоставяне на отзиви за автоматичното попълване</translation> <translation id="7552846755917812628">Изпробвайте следните съвети:</translation> <translation id="7553012839257224005">Контейнерът за Linux се проверява</translation> <translation id="7553242001898162573">Въведете паролата си</translation> @@ -7287,6 +7287,7 @@ <translation id="7609148976235050828">Моля, свържете се с интернет и опитайте отново.</translation> <translation id="7612401678989660900">Разрешаване на достъп за приложенията и уебсайтовете, които имат разрешение за микрофона</translation> <translation id="7612655942094160088">Активиране на функциите за свързания телефон.</translation> +<translation id="7612989789287281429">Влизате в профила си…</translation> <translation id="7614260613810441905">Извеждане на запитване, когато сайт иска да редактира файлове или папки на устройството ви (препоръчително)</translation> <translation id="761530003705945209">Създаване на резервно копие в Google Диск. По всяко време можете лесно да възстановите данните на устройството си или да го замените с друго. Резервното ви копие включва данните от приложенията. Резервните ви копия се качват в Google и се шифроват посредством паролата за профила ви в Google.</translation> <translation id="7615365294369022248">При добавянето на профила възникна грешка</translation> @@ -8784,7 +8785,6 @@ <translation id="8952831374766033534">Конфигурационната опция не се поддържа: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">При зареждане</translation> <translation id="895347679606913382">Стартира...</translation> -<translation id="8956230710625245889">Отваряне в Reader</translation> <translation id="8957757410289731985">Персонализиране на потребителския профил</translation> <translation id="895944840846194039">Памет за JavaScript</translation> <translation id="8960208913905765425">Преобразуване на мерни единици посредством функцията „Бързи отговори“</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index b9cde30..d2aa6d3c 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux রিস্টার্ট করবেন?</translation> <translation id="1047431265488717055">লিঙ্ক ও টেক্সট কপি করুন</translation> <translation id="1048286738600630630">প্রদর্শনগুলি</translation> -<translation id="1048770690598418849">এখন এড়িয়ে যেতে পারেন এবং আপনি সেট-আপ সম্পূর্ণ করার পর আমরা অটোমেটিক আবার চেষ্টা করব</translation> <translation id="1048986595386481879">ডায়নামিকভাবে সাইজ বরাদ্দ করা হয়েছে</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> থেকে <ph name="ATTACHMENTS" /> গ্রহণ করা হচ্ছে}one{<ph name="DEVICE_NAME" /> থেকে <ph name="ATTACHMENTS" /> গ্রহণ করা হচ্ছে}other{<ph name="DEVICE_NAME" /> থেকে <ph name="ATTACHMENTS" /> গ্রহণ করা হচ্ছে}}</translation> <translation id="1049743911850919806">ছদ্মবেশী</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">আপনার ক্লিপবোর্ডে কপি করা হয়েছে</translation> <translation id="2183570493397356669">'এগিয়ে যান' বোতাম বন্ধ করা হয়েছে</translation> <translation id="2184515124301515068">সাইটটি কখন সাউন্ড চালাতে পারবে তা Chrome-কে বেছে নিতে দিন (প্রস্তাবিত)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">অন্য ডিভাইস থেকে পৃষ্ঠাটি শেয়ার করা হয়েছে</translation> <translation id="2187675480456493911">আপনার অ্যাকাউন্টের অন্যান্য ডিভাইসের সাথে সিঙ্ক করা হয়েছে। অন্য ব্যবহারকারীদের পরিবর্তন করা সেটিংস সিঙ্ক করা হবে না। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="2187895286714876935">সার্ভার সার্টিফিকেট আমদানি করতে সমস্যা</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">কার্ড সেভ করা হচ্ছে</translation> <translation id="2408955596600435184">আপনার পিন লিখুন</translation> <translation id="2409268599591722235">শুরু করা যাক</translation> +<translation id="2409709393952490731">একটি ফোন বা ট্যাবলেট ব্যবহার করুন</translation> <translation id="2410079346590497630">বিল্ড বিবরণ</translation> <translation id="2410298923485357543">ডিভাইস অনলাইন থাকার সময় খুব ভাল কোয়ালিটির ভয়েস ব্যবহার করুন</translation> <translation id="2410754283952462441">একটি অ্যাকাউন্ট বেছে নিন</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">আপনার ব্রাউজিং ইতিহাস পড়ুন</translation> <translation id="2674764818721168631">বন্ধ করা আছে</translation> <translation id="2675570801872027281">Bruschetta সরানোর সময় সমস্যা হয়েছে। আবার চেষ্টা করুন।</translation> -<translation id="2676492189600898281">আপনা-আপনি পূরণ হওয়ার বিষয়ে মতামত প্রদান করুন</translation> <translation id="2678063897982469759">পুনঃ সক্ষম</translation> <translation id="2678100101831051676">কাস্ট করা যায়নি।</translation> <translation id="268053382412112343">Hi&story</translation> @@ -3788,6 +3788,7 @@ <translation id="4369215744064167350">ওয়েবসাইট অ্যাক্সেস করার অনুমতি দেওয়া হয়েছে</translation> <translation id="4369735607080757018">সাইটের বিজ্ঞাপনের পারফর্ম্যান্স পরিমাপ করার জন্য সীমিত ধরনের ডেটা শেয়ার করা হয়, যেমন দিনের সময় আপনাকে বিজ্ঞাপন দেখানো হয়েছিল</translation> <translation id="4370975561335139969">আপনার লেখা ইমেল আইডি এবং পাসওয়ার্ড মিলছে না</translation> +<translation id="4374805630006466253">অন্য একটি ফোন বা ট্যাবলেট ব্যবহার করুন</translation> <translation id="4374831787438678295">Linux ইনস্টলার</translation> <translation id="4375035964737468845">ডাউনলোড করা ফাইলগুলি খুলুন</translation> <translation id="4376226992615520204">লোকেশন ব্যবহার করার সুবিধা বন্ধ করা আছে</translation> @@ -7235,7 +7236,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ডাউনলোড করা যায়নি</translation> <translation id="7551643184018910560">শেল্ফে পিন করুন</translation> -<translation id="7552658769580484674">আপনা-আপনি পূরণ হওয়ার বিষয়ে মতামত প্রদান করুন</translation> <translation id="7552846755917812628">নিম্নোল্লিখিত টিপ্স ব্যবহার করে দেখুন:</translation> <translation id="7553012839257224005">Linux কন্টেনার চেক করে দেখা হচ্ছে</translation> <translation id="7553242001898162573">আপনার পাসওয়ার্ডটি লিখুন</translation> @@ -8795,7 +8795,6 @@ <translation id="8952831374766033534">কনফিগারেশনের এই বিকল্প ব্যবহার করা যাবে না: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">চার্জ করার সময়</translation> <translation id="895347679606913382">শুরু হচ্ছে...</translation> -<translation id="8956230710625245889">রিডারে খুলুন</translation> <translation id="8957757410289731985">প্রোফাইল কাস্টমাইজ করুন</translation> <translation id="895944840846194039">জাভাস্ক্রিপ্ট মেমোরি</translation> <translation id="8960208913905765425">কুইক আন্সারের ইউনিট কনভার্সন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 0154bbb..f1d01a6 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Ponovno pokrenuti Linux?</translation> <translation id="1047431265488717055">Kopiraj tekst linka</translation> <translation id="1048286738600630630">Ekrani</translation> -<translation id="1048770690598418849">Možete preskočiti za sada, a mi ćemo automatski ponovo pokušati nakon što završite postavljanje</translation> <translation id="1048986595386481879">Dinamički dodijeljeno</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Primanje <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}one{Primanje <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}few{Primanje <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}other{Primanje <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Anonimno</translation> @@ -1368,6 +1367,7 @@ <translation id="2182058453334755893">Kopirano u međumemoriju</translation> <translation id="2183570493397356669">Dugme za nastavak je onemogućeno</translation> <translation id="2184515124301515068">Dozvolite da Chrome odabere kada web lokacije mogu reproducirati zvuk (preporučeno)</translation> +<translation id="2186206192313702726">Google Objektiv</translation> <translation id="2186711480981247270">Stranica je podijeljena s drugog uređaja</translation> <translation id="2187675480456493911">Mreža je sinhronizirana s drugim uređajima na vašem računu. Postavke koje drugi korisnici mijenjaju se neće sinhronizirati. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Greška pri uvozu potvrde za server</translation> @@ -1638,7 +1638,7 @@ <translation id="2408018932941436077">Pohranjivanje kartice</translation> <translation id="2408955596600435184">Unesite svoj PIN</translation> <translation id="2409268599591722235">Započnimo</translation> -<translation id="2409709393952490731">Upotrijebite telefon ili tablet</translation> +<translation id="2409709393952490731">Koristite telefon ili tablet</translation> <translation id="2410079346590497630">Detalji verzije</translation> <translation id="2410298923485357543">Koristi prirodni glas kada je uređaj online</translation> <translation id="2410754283952462441">Odaberite račun</translation> @@ -1675,6 +1675,7 @@ <translation id="2442916515643169563">Sjenka teksta</translation> <translation id="2443487764245141020">Web lokacijama također može biti potrebno da prepoznaju vaš uređaj pomoću identifikatora</translation> <translation id="244475495405467108">Zatvorite kartice s lijeve strane</translation> +<translation id="2444874983932528148">Jednostavno nastavite tamo gdje ste stali</translation> <translation id="2445081178310039857">Potreban je korijenski direktorij ekstenzije.</translation> <translation id="2445484935443597917">Izradi novi profil</translation> <translation id="2445726032315793326">Djelomično povećalo</translation> @@ -1935,7 +1936,6 @@ <translation id="2673135533890720193">Čitati vašu historiju pregledanja</translation> <translation id="2674764818721168631">Isključeno</translation> <translation id="2675570801872027281">Greška prilikom uklanjanja Bruschette. Pokušajte ponovo.</translation> -<translation id="2676492189600898281">Slanje povratnih informacija za automatsko popunjavanje</translation> <translation id="2678063897982469759">Ponovo omogući</translation> <translation id="2678100101831051676">Nije moguće emitirati.</translation> <translation id="268053382412112343">Historija</translation> @@ -2493,6 +2493,7 @@ <translation id="3177909033752230686">Jezik stranice:</translation> <translation id="3177914167275935955">Uređaj uključuje nadogradnju na obrazovnu verziju Chromea, ali vaše korisničko ime nije povezano s Google for Education računom. Kreirajte Google for Education račun odlaskom na g.co/workspace/edusignup na drugom uređaju.</translation> <translation id="3179982752812949580">Font teksta</translation> +<translation id="3180284704187420717">Sačuvajte oznake, lozinke i još mnogo toga uz sinhronizaciju</translation> <translation id="3181954750937456830">Sigurno pregledanje (štiti vas i vaš uređaj od opasnih web lokacija)</translation> <translation id="3182749001423093222">Provjera pravopisa</translation> <translation id="3183139917765991655">Proces za uvoz profila</translation> @@ -2984,6 +2985,7 @@ <translation id="3637203148990213388">Dodatni računi</translation> <translation id="3639220004740062347">Izađi iz načina rada za čitanje</translation> <translation id="3640214691812501263">Dodati ekstenziju "<ph name="EXTENSION_NAME" />" za korisnika<ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Zaštitite lozinke od krađe identiteta</translation> <translation id="3640613767643722554">Naučite Asistenta da prepoznaje vaš glas</translation> <translation id="3641456520301071208">Web lokacije mogu tražiti vašu lokaciju</translation> <translation id="3642070413432681490">Zaokruži kursor</translation> @@ -3408,6 +3410,7 @@ <translation id="3988996860813292272">Izbor vremenske zone</translation> <translation id="399179161741278232">Uvezeno</translation> <translation id="3992008114154328194">Preuzimanje fajla <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Napravite sigurnosnu kopiju podataka</translation> <translation id="3993887353483242788">Sinhronizirajte uređaj <ph name="DEVICE_TYPE" /> da vaše postavke budu spremne na svakom uređaju kada se prijavite pomoću Google računa. Preference uključuju aplikacije, postavke, lozinke za WiFi, jezike, pozadinske slike, prečice tastature i još mnogo toga.</translation> <translation id="3994318741694670028">Nažalost, računar je konfiguriran s neispravnim ID-om hardvera. Ovim se sprečava da se ChromeOS Flex ažurira najnovijim sigurnosnim ispravkama i vaš računar <ph name="BEGIN_BOLD" />može biti izložen zlonamjernim napadima<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Otključajte telefon i primaknite ga da otključate svoj <ph name="DEVICE_TYPE" />.</translation> @@ -3787,7 +3790,7 @@ <translation id="4369215744064167350">Zahtjev za web lokaciju je odobren</translation> <translation id="4369735607080757018">Ograničene vrste podataka se dijele među web lokacijama da izmjere performanse svojih oglasa, npr. doba dana kada vam je oglas prikazan</translation> <translation id="4370975561335139969">Adresa e-pošte i lozinka koje ste unijeli se ne podudaraju</translation> -<translation id="4374805630006466253">Upotrijebite drugi telefon ili tablet</translation> +<translation id="4374805630006466253">Koristite drugi telefon ili tablet</translation> <translation id="4374831787438678295">Paket za instalaciju Linuxa</translation> <translation id="4375035964737468845">Otvori preuzete fajlove</translation> <translation id="4376226992615520204">Lokacija je isključena</translation> @@ -3969,6 +3972,7 @@ <translation id="452750746583162491">Pregledajte sinhronizirane podatke</translation> <translation id="4527929807707405172">Omogući klizanje unazad. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Prijedlog prijevoda</translation> +<translation id="4528638190900283934">Prijavite se za dodatne funkcije</translation> <translation id="4529455689802245339">Chromeovi automatski titlovi možda neće funkcionirati</translation> <translation id="4530494379350999373">Porijeklo</translation> <translation id="4531924570968473143">Koga želite dodati na ovaj uređaj <ph name="DEVICE_TYPE" />?</translation> @@ -6382,6 +6386,7 @@ <translation id="6774710250118040929">Dodajte novu lozinku</translation> <translation id="6775163072363532304">Ovdje će se prikazati dostupni uređaji.</translation> <translation id="677646486571529447">Dodaj napomenu</translation> +<translation id="6776589734354015877">Nabavite dodatne funkcije</translation> <translation id="6776729248872343918">Omogući Brzo uparivanje</translation> <translation id="6777817260680419853">Preusmjeravanje je blokirano</translation> <translation id="6779092717724412415">Da kreirate istaknuti tekst poput ovog, odaberite bilo koji tekst i kliknite desnim klikom.</translation> @@ -7234,7 +7239,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Preuzimanje fajla <ph name="FILE_NAME" /> nije uspjelo</translation> <translation id="7551643184018910560">Zakači za policu</translation> -<translation id="7552658769580484674">Slanje povratnih informacija za automatsko popunjavanje</translation> <translation id="7552846755917812628">Isprobajte sljedeće savjete:</translation> <translation id="7553012839257224005">Provjeravanje Linux spremnika</translation> <translation id="7553242001898162573">Unesite lozinku</translation> @@ -7778,6 +7782,7 @@ <translation id="8023801379949507775">Ažuriraj ekstenzije sada</translation> <translation id="8025151549289123443">Zaključavanje ekrana i prijava</translation> <translation id="8026334261755873520">Obrišite podatke pregledanja</translation> +<translation id="8026471514777758216">Svi vaši uređaji</translation> <translation id="8028060951694135607">Oporavak Microsoft ključa</translation> <translation id="8028803902702117856">Preuzimanje <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Veličina</translation> @@ -8796,7 +8801,6 @@ <translation id="8952831374766033534">Opcija za konfiguraciju nije podržana: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Tokom punjenja</translation> <translation id="895347679606913382">Pokretanje…</translation> -<translation id="8956230710625245889">Otvori u čitaču</translation> <translation id="8957757410289731985">Prilagodite profil</translation> <translation id="895944840846194039">JavaScript memorija</translation> <translation id="8960208913905765425">Pretvaranje jedinica Brzih odgovora</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index bf73431..01e0253c 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Vols reiniciar Linux?</translation> <translation id="1047431265488717055">Copia el te&xt de l'enllaç</translation> <translation id="1048286738600630630">Pantalles</translation> -<translation id="1048770690598418849">De moment, pots ometre aquest pas, i ho tornarem a provar automàticament quan hagis finalitzat la configuració</translation> <translation id="1048986595386481879">Assignada de manera dinàmica</translation> <translation id="1049324577536766607">{COUNT,plural, =1{S'estan rebent <ph name="ATTACHMENTS" /> del dispositiu <ph name="DEVICE_NAME" />}other{S'estan rebent <ph name="ATTACHMENTS" /> del dispositiu <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incògnit</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">S'ha copiat al porta-retalls</translation> <translation id="2183570493397356669">Botó Continua desactivat</translation> <translation id="2184515124301515068">Deixa que Chrome triï quan poden reproduir so els llocs web (opció recomanada)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Pàgina compartida des d'un altre dispositiu</translation> <translation id="2187675480456493911">Està sincronitzada amb altres dispositius del teu compte. Les opcions de configuració que modifiquin altres usuaris no se sincronitzaran. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Error d'importació del certificat del servidor</translation> @@ -1920,7 +1920,6 @@ <translation id="2673135533890720193">Llegir l'historial de navegació</translation> <translation id="2674764818721168631">Desactivat</translation> <translation id="2675570801872027281">S'ha produït un error en suprimir Bruschetta. Torna-ho a provar.</translation> -<translation id="2676492189600898281">Proporciona comentaris sobre Emplenament automàtic</translation> <translation id="2678063897982469759">Torna a activar</translation> <translation id="2678100101831051676">No es pot emetre.</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -3946,6 +3945,7 @@ <translation id="4522890784888918985">Els comptes secundaris no s'admeten</translation> <translation id="4523876148417776526">Llistes de llocs web XML que no s'han recollit encara.</translation> <translation id="4524832533047962394">El mode d'inscripció proporcionat no és compatible amb aquesta versió del sistema operatiu. Assegura't que tens la versió més recent.</translation> +<translation id="4526051299161934899">Grups de pestanyes desats que s'han amagat</translation> <translation id="4526853756266614740">Tria una imatge per aplicar el tema a l'instant</translation> <translation id="452750746583162491">Revisa les teves dades sincronitzades</translation> <translation id="4527929807707405172">Activa el desplaçament invers. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> @@ -4270,6 +4270,7 @@ <translation id="4824037980212326045">Còpia de seguretat i restauració de Linux</translation> <translation id="4824958205181053313">Vols cancel·lar la sincronització?</translation> <translation id="4825532258163983651">La clau d'accés no es pot suprimir</translation> +<translation id="4827283332383516812">Suprimeix la targeta</translation> <translation id="4827675678516992122">No s'ha pogut connectar</translation> <translation id="4827784381479890589">Millora el corrector ortogràfic del navegador Chrome (el text s'envia a Google per obtenir suggeriments ortogràfics)</translation> <translation id="4827904420700932487">Crea un codi QR d'aquesta imatge</translation> @@ -5293,6 +5294,7 @@ <translation id="5792295754950501287">Més accions per a <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Toca el botó d'engegada</translation> <translation id="5792874008054171483">Més accions per a <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Aquesta forma de pagament se suprimirà del dispositiu</translation> <translation id="5793339252089865437">Si baixes l'actualització a través de la xarxa mòbil, se't podrien cobrar càrrecs per excés d'ús.</translation> <translation id="5793420564274426163">Confirmació de la vinculació</translation> <translation id="5793430094159150686">La teva contrasenya ha canviat. Per restaurar les dades locals, has d'introduir la contrasenya antiga.</translation> @@ -7208,7 +7210,6 @@ <translation id="7550830279652415241">marcadors_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">No s'ha pogut baixar <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Fixa al prestatge</translation> -<translation id="7552658769580484674">Proporciona comentaris sobre Emplenament automàtic</translation> <translation id="7552846755917812628">Prova els consells següents:</translation> <translation id="7553012839257224005">S'està comprovant el contenidor de Linux</translation> <translation id="7553242001898162573">Introduïu la contrasenya</translation> @@ -7270,6 +7271,7 @@ <translation id="7609148976235050828">Connecta't a Internet i torna-ho a provar.</translation> <translation id="7612401678989660900">Permet l'accés a aplicacions i llocs web amb el permís d'accés al micròfon</translation> <translation id="7612655942094160088">Activa la funció de telèfon connectat.</translation> +<translation id="7612989789287281429">S'està iniciant la sessió…</translation> <translation id="7614260613810441905">Pregunta'm quan un lloc web vulgui editar els fitxers o les carpetes del dispositiu (opció recomanada)</translation> <translation id="761530003705945209">Crea còpies de seguretat a Google Drive. Canvia de dispositiu o restaura'n les dades fàcilment en qualsevol moment. La còpia de seguretat inclou dades d'aplicacions. Les còpies de seguretat es pengen a Google i s'encripten amb la contrasenya del teu Compte de Google.</translation> <translation id="7615365294369022248">S'ha produït un error en afegir un compte</translation> @@ -8487,6 +8489,7 @@ <translation id="869884720829132584">Menú d'aplicacions</translation> <translation id="869891660844655955">Data de caducitat</translation> <translation id="8699188901396699995">PPD per a <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menú que conté grups de pestanyes desats que s'han amagat</translation> <translation id="8702825062053163569">El dispositiu <ph name="DEVICE_TYPE" /> s'ha bloquejat</translation> <translation id="8703346390800944767">Omet l'anunci</translation> <translation id="8705331520020532516">Número de sèrie</translation> @@ -8767,7 +8770,6 @@ <translation id="8952831374766033534">Opció de configuració no admesa: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Mentre es carrega</translation> <translation id="895347679606913382">S'està iniciant...</translation> -<translation id="8956230710625245889">Obre a Reader</translation> <translation id="8957757410289731985">Personalitza el perfil</translation> <translation id="895944840846194039">Memòria de JavaScript</translation> <translation id="8960208913905765425">Conversió d'unitats de Respostes ràpides</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 70a5fbc..dd2f3450 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Restartovat Linux?</translation> <translation id="1047431265488717055">Kopírovat te&xt odkazu</translation> <translation id="1048286738600630630">Obrazovky</translation> -<translation id="1048770690598418849">Prozatím tento krok můžete přeskočit. Po dokončení nastavení to automaticky zkusíme znovu.</translation> <translation id="1048986595386481879">Alokováno dynamicky</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Přijímání dat (<ph name="ATTACHMENTS" />) ze zařízení <ph name="DEVICE_NAME" />}few{Přijímání dat (<ph name="ATTACHMENTS" />) ze zařízení <ph name="DEVICE_NAME" />}many{Přijímání dat (<ph name="ATTACHMENTS" />) ze zařízení <ph name="DEVICE_NAME" />}other{Přijímání dat (<ph name="ATTACHMENTS" />) ze zařízení <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Anonymní režim</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Zkopírováno do schránky</translation> <translation id="2183570493397356669">Tlačítko Pokračovat je deaktivováno</translation> <translation id="2184515124301515068">Nechat Chrome zvolit, kdy weby mohou přehrávat zvuk (doporučeno)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Stránka byla sdílena z jiného zařízení</translation> <translation id="2187675480456493911">Synchronizuje se s jinými zařízeními v účtu. Změny nastavení provedené jinými uživateli se nesynchronizují. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Chyba při importu certifikátu serveru</translation> @@ -1923,7 +1923,6 @@ <translation id="2673135533890720193">Čtení vaší historie procházení</translation> <translation id="2674764818721168631">Vypnuto</translation> <translation id="2675570801872027281">Při odstraňování prostředí Bruschetta došlo k chybě. Zkuste to znovu.</translation> -<translation id="2676492189600898281">Poskytnout zpětnou vazbu k automatickému vyplňování</translation> <translation id="2678063897982469759">Znovu aktivovat</translation> <translation id="2678100101831051676">Odeslání nelze provést.</translation> <translation id="268053382412112343">&Historie</translation> @@ -7217,7 +7216,6 @@ <translation id="7550830279652415241">záložky_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Stažení souboru <ph name="FILE_NAME" /> bylo úspěšné</translation> <translation id="7551643184018910560">Připnout k poličce</translation> -<translation id="7552658769580484674">Poskytnout zpětnou vazbu k automatickému vyplňování</translation> <translation id="7552846755917812628">Vyzkoušejte následující tipy:</translation> <translation id="7553012839257224005">Kontrola kontejneru systému Linux</translation> <translation id="7553242001898162573">Zadejte heslo.</translation> @@ -8779,7 +8777,6 @@ <translation id="8952831374766033534">Konfigurační možnost není podporována: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Při nabíjení</translation> <translation id="895347679606913382">Spouštění...</translation> -<translation id="8956230710625245889">Otevřít ve čtečce</translation> <translation id="8957757410289731985">Upravit profil</translation> <translation id="895944840846194039">Paměť JavaScriptu</translation> <translation id="8960208913905765425">Rychlé odpovědi – převod jednotek</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index d00c51ae..27de4fff 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Ailgychwyn Linux?</translation> <translation id="1047431265488717055">Copïo Testun y Ddol&en</translation> <translation id="1048286738600630630">Sgriniau</translation> -<translation id="1048770690598418849">Gallwch hepgor am y tro a byddwn yn rhoi cynnig arall arni yn awtomatig ar ôl i chi orffen y gosodiad</translation> <translation id="1048986595386481879">Dyrannwyd yn ddeinamig</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}zero{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}two{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}few{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}many{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}other{Wrthi'n cael <ph name="ATTACHMENTS" /> o <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Anhysbys</translation> @@ -1372,6 +1371,7 @@ <translation id="2182058453334755893">Wedi'i Gopïo i'ch Clipfwrdd</translation> <translation id="2183570493397356669">Analluogwyd botwm parhau</translation> <translation id="2184515124301515068">Gadewch i Chrome ddewis pryd y gall gwefannau wneud sŵn (argymhellir)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Tudalen sydd wedi'i rhannu o ddyfais arall</translation> <translation id="2187675480456493911">Wedi'i gysoni â dyfeisiau eraill yn eich cyfrif. Ni fydd gosodiadau a addaswyd gan ddefnyddwyr eraill yn cael eu cysoni. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Gwall wrth Fewnforio Tystysgrif y Gweinydd</translation> @@ -1938,7 +1938,6 @@ <translation id="2673135533890720193">Darllen eich hanes pori</translation> <translation id="2674764818721168631">Diffodd</translation> <translation id="2675570801872027281">Bu gwall wrth dynnu Bruschetta. Rhowch gynnig arall arni.</translation> -<translation id="2676492189600898281">Darparu adborth Awtolenwi</translation> <translation id="2678063897982469759">Ail-alluogi</translation> <translation id="2678100101831051676">Methu â chastio.</translation> <translation id="268053382412112343">Ha&nes</translation> @@ -7240,7 +7239,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Wedi methu â lawrlwytho <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Pinio i'r silff</translation> -<translation id="7552658769580484674">Darparu Adborth Awtolenwi</translation> <translation id="7552846755917812628">Rhowch gynnig ar y cyngor canlynol:</translation> <translation id="7553012839257224005">Wrthi'n gwirio'r cynhwysydd Linux</translation> <translation id="7553242001898162573">Rhowch eich cyfrinair</translation> @@ -8803,7 +8801,6 @@ <translation id="8952831374766033534">Ni chefnogir yr opsiwn ffurfweddu: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Wrth wefru</translation> <translation id="895347679606913382">Wrthi'n dechrau…</translation> -<translation id="8956230710625245889">Agor yn y Darllenydd</translation> <translation id="8957757410289731985">Personoleiddio'r proffil</translation> <translation id="895944840846194039">Cof JavaScript</translation> <translation id="8960208913905765425">Trosi uned Atebion Cyflym</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 99aceb80..f0a1bcc 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Vil du genstarte Linux?</translation> <translation id="1047431265488717055">Kopiér linkte&kst</translation> <translation id="1048286738600630630">Skærme</translation> -<translation id="1048770690598418849">Du kan springe dette over indtil videre, så forsøger vi automatisk igen, når konfigurationen er gennemført</translation> <translation id="1048986595386481879">Dynamisk fordelt</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Modtager <ph name="ATTACHMENTS" /> fra <ph name="DEVICE_NAME" />}one{Receiving <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}other{Modtager <ph name="ATTACHMENTS" /> fra <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">Kopieret til din udklipsholder</translation> <translation id="2183570493397356669">Knappen Fortsæt er deaktiveret</translation> <translation id="2184515124301515068">Lad Chrome bestemme, hvornår websites må afspille lyd (anbefales)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Side delt fra en anden enhed</translation> <translation id="2187675480456493911">Synkroniseret med andre enheder på din konto. De indstillinger, der ændres af andre brugere, synkroniseres ikke. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Fejl ved import af servercertifikat</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">Gemmer kort</translation> <translation id="2408955596600435184">Angiv din pinkode</translation> <translation id="2409268599591722235">Start</translation> +<translation id="2409709393952490731">Brug en telefon eller tablet</translation> <translation id="2410079346590497630">Buildoplysninger</translation> <translation id="2410298923485357543">Brug en naturlig stemme, når enheden er online</translation> <translation id="2410754283952462441">Vælg en konto</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">Læse din browserhistorik</translation> <translation id="2674764818721168631">Fra</translation> <translation id="2675570801872027281">Der opstod en fejl under fjernelse af Bruschetta. Prøv igen.</translation> -<translation id="2676492189600898281">Giv feedback om Autofyld</translation> <translation id="2678063897982469759">Genaktiver</translation> <translation id="2678100101831051676">Det var ikke muligt at caste.</translation> <translation id="268053382412112343">Over&sigt</translation> @@ -3788,6 +3788,7 @@ <translation id="4369215744064167350">Websiteanmodningen blev godkendt</translation> <translation id="4369735607080757018">Begrænsede typer af data deles mellem websites for at måle effektiviteten af deres annoncer, f.eks. hvilket tidspunkt på dagen du fik vist en annonce</translation> <translation id="4370975561335139969">Den mail og adgangskode, du indtastede, stemmer ikke overens</translation> +<translation id="4374805630006466253">Brug en anden telefon eller tablet</translation> <translation id="4374831787438678295">Linux-installationsprogram</translation> <translation id="4375035964737468845">Åbne downloadede filer</translation> <translation id="4376226992615520204">Lokation er slået fra</translation> @@ -7232,7 +7233,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> blev ikke downloadet</translation> <translation id="7551643184018910560">Fastgør til hylde</translation> -<translation id="7552658769580484674">Giv feedback om Autofyld</translation> <translation id="7552846755917812628">Prøv de følgende tips:</translation> <translation id="7553012839257224005">Tjekker Linux-containeren</translation> <translation id="7553242001898162573">Angiv din adgangskode</translation> @@ -8793,7 +8793,6 @@ <translation id="8952831374766033534">Konfigurationsmuligheden understøttes ikke: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Under opladning</translation> <translation id="895347679606913382">Begynder...</translation> -<translation id="8956230710625245889">Åbn i Læser</translation> <translation id="8957757410289731985">Tilpas profil</translation> <translation id="895944840846194039">JavaScript-hukommelse</translation> <translation id="8960208913905765425">Enhedsomregning i Hurtig info</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 29e8cce..0052429 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux neu starten?</translation> <translation id="1047431265488717055">Linkte&xt kopieren</translation> <translation id="1048286738600630630">Displays</translation> -<translation id="1048770690598418849">Du kannst diesen Schritt vorerst überspringen – ein weiterer Versuch erfolgt automatisch nach Abschluss der Einrichtung</translation> <translation id="1048986595386481879">Dynamisch zugeordnet</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> wird von <ph name="DEVICE_NAME" /> empfangen}other{<ph name="ATTACHMENTS" /> werden von <ph name="DEVICE_NAME" /> empfangen}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">In die Zwischenablage kopiert</translation> <translation id="2183570493397356669">Schaltfläche „Weiter“ deaktiviert</translation> <translation id="2184515124301515068">Chrome die Entscheidung überlassen, wann Audioinhalte auf Websites abgespielt werden (empfohlen)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Von einem anderen Gerät geteilte Seite</translation> <translation id="2187675480456493911">Mit anderen Geräten in deinem Konto synchronisiert. Von anderen Nutzern geänderte Einstellungen werden nicht synchronisiert. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Fehler beim Importieren des Serverzertifikats</translation> @@ -1917,7 +1917,6 @@ <translation id="2673135533890720193">Browserverlauf lesen</translation> <translation id="2674764818721168631">Aus</translation> <translation id="2675570801872027281">Fehler beim Entfernen von Bruschetta. Bitte versuch es noch einmal.</translation> -<translation id="2676492189600898281">Feedback zu Autofill geben</translation> <translation id="2678063897982469759">Wieder aktivieren</translation> <translation id="2678100101831051676">Streamen nicht möglich.</translation> <translation id="268053382412112343">Ve&rlauf</translation> @@ -7205,7 +7204,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Fehler beim Download von <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">An Ablage anpinnen</translation> -<translation id="7552658769580484674">Feedback zu Autofill geben</translation> <translation id="7552846755917812628">Probiere folgende Tipps aus:</translation> <translation id="7553012839257224005">Linux-Container wird geprüft</translation> <translation id="7553242001898162573">Passwort eingeben</translation> @@ -8764,7 +8762,6 @@ <translation id="8952831374766033534">Konfigurationsoption wird nicht unterstützt: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Beim Aufladen</translation> <translation id="895347679606913382">Wird gestartet...</translation> -<translation id="8956230710625245889">In Leseanwendung öffnen</translation> <translation id="8957757410289731985">Profil anpassen</translation> <translation id="895944840846194039">JavaScript-Speicher</translation> <translation id="8960208913905765425">Schnellinfo – Umrechnung von Einheiten</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 254b65f9..e90309b 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Επανεκκίνηση του Linux;</translation> <translation id="1047431265488717055">Αντιγραφή κε&ιμένου συνδέσμου</translation> <translation id="1048286738600630630">Οθόνες</translation> -<translation id="1048770690598418849">Μπορείτε να κάνετε παράβλεψη προς το παρόν και θα δοκιμάσουμε ξανά αυτόματα αφού ολοκληρώσετε τη ρύθμιση</translation> <translation id="1048986595386481879">Δυναμική κατανομή</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Λαμβάνεται <ph name="ATTACHMENTS" /> από τη συσκευή <ph name="DEVICE_NAME" />}other{Λαμβάνονται <ph name="ATTACHMENTS" /> από τη συσκευή <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Ανώνυμη περιήγηση</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Αντιγράφηκε στο πρόχειρό σας</translation> <translation id="2183570493397356669">Το κουμπί "συνέχεια" απενεργοποιήθηκε</translation> <translation id="2184515124301515068">Επιτρέψτε στο Chrome να επιλέξει πότε οι ιστότοποι μπορούν να αναπαράγουν ήχο (συνιστάται)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Η σελίδα κοινοποιήθηκε από άλλη συσκευή</translation> <translation id="2187675480456493911">Έγινε συγχρονισμός με άλλες συσκευές στον λογαριασμό σας. Οι ρυθμίσεις που τροποποιούνται από άλλους χρήστες δεν θα συγχρονίζονται. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Σφάλμα εισαγωγής του πιστοποιητικού διακομιστή </translation> @@ -1936,7 +1936,6 @@ <translation id="2673135533890720193">Ανάγνωση του ιστορικού περιήγησής σας</translation> <translation id="2674764818721168631">Ανενεργό</translation> <translation id="2675570801872027281">Σφάλμα κατά την κατάργηση του Bruschetta. Δοκιμάστε ξανά.</translation> -<translation id="2676492189600898281">Υποβολή σχολίων αυτόματης συμπλήρωσης</translation> <translation id="2678063897982469759">Εκ νέου ενεργοποίηση</translation> <translation id="2678100101831051676">Δεν είναι δυνατή η μετάδοση.</translation> <translation id="268053382412112343">Ιστορικό</translation> @@ -7232,7 +7231,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Επιτυχής λήψη του αρχείου <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Καρφίτσωμα στο ράφι</translation> -<translation id="7552658769580484674">Υποβολή σχολίων αυτόματης συμπλήρωσης</translation> <translation id="7552846755917812628">Δοκιμάστε τις παρακάτω συμβουλές:</translation> <translation id="7553012839257224005">Έλεγχος του κοντέινερ Linux</translation> <translation id="7553242001898162573">Εισαγάγετε τον κωδικό πρόσβασής σας</translation> @@ -8790,7 +8788,6 @@ <translation id="8952831374766033534">Δεν υποστηρίζεται η επιλογή διαμόρφωσης: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Κατά τη φόρτιση</translation> <translation id="895347679606913382">Έναρξη...</translation> -<translation id="8956230710625245889">Άνοιγμα στο εργαλείο ανάγνωσης</translation> <translation id="8957757410289731985">Εξατομίκευση προφίλ</translation> <translation id="895944840846194039">Μνήμη JavaScript</translation> <translation id="8960208913905765425">Μετατροπή μονάδας Γρήγορων απαντήσεων</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 35b69ef..e060db88 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Restart Linux?</translation> <translation id="1047431265488717055">Copy Link Te&xt</translation> <translation id="1048286738600630630">Displays</translation> -<translation id="1048770690598418849">You can skip for now and we will retry automatically after you finish the setup</translation> <translation id="1048986595386481879">Dynamically allocated</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Receiving <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}other{Receiving <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -206,6 +205,7 @@ <translation id="1174073918202301297">Shortcut added</translation> <translation id="1174366174291287894">Your connection is always secure unless Chrome tells you otherwise</translation> <translation id="117445914942805388">To clear browsing data from all of your synced devices and your Google Account, <ph name="BEGIN_LINK" />visit sync settings<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Your administrator has disabled this feature.</translation> <translation id="1175364870820465910">&Print...</translation> <translation id="1176471985365269981">Not allowed to edit files or folders on your device</translation> <translation id="1177863135347784049">Customised</translation> @@ -1369,6 +1369,7 @@ <translation id="2182058453334755893">Copied to your Clipboard</translation> <translation id="2183570493397356669">Continue button disabled</translation> <translation id="2184515124301515068">Let Chrome choose when sites can play sound (recommended)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Page shared from another device</translation> <translation id="2187675480456493911">Synced with other devices on your account. Settings modified by other users will not be synced. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Server Certificate Import Error</translation> @@ -1937,7 +1938,6 @@ <translation id="2673135533890720193">Read your browsing history</translation> <translation id="2674764818721168631">Off</translation> <translation id="2675570801872027281">Error removing Bruschetta. Please try again.</translation> -<translation id="2676492189600898281">Provide auto-fill feedback</translation> <translation id="2678063897982469759">Re-enable</translation> <translation id="2678100101831051676">Unable to cast.</translation> <translation id="268053382412112343">Hi&story</translation> @@ -2455,6 +2455,7 @@ <translation id="3129215702932019810">Error launching application</translation> <translation id="3130528281680948470">Your device will be reset and all user accounts and local data will be removed. This cannot be undone.</translation> <translation id="3130863904455712965">History and more</translation> +<translation id="3130966412954727147">Sites you visit can validate that you're a real user and not a bot.</translation> <translation id="313205617302240621">Forgot password?</translation> <translation id="3132277757485842847">We were unable to maintain a connection with your phone. Make sure that your phone is nearby, unlocked and has Bluetooth and Wi-Fi turned on.</translation> <translation id="3132896062549112541">Rule</translation> @@ -2998,6 +2999,7 @@ <translation id="3647654707956482440">Can't use this link. Check for typos or use another link to try again.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> received from <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> received from <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> detected</translation> +<translation id="3649190289964910441">A site that you visit can save info with Chrome that validates that you're a real user. As you keep browsing, sites can check with Chrome and verify from the first site that you're likely a trusted user.</translation> <translation id="3650753875413052677">Enrolment error</translation> <translation id="3650845953328929506">Log upload pending.</translation> <translation id="3650952250015018111">Allow '<ph name="APP_NAME" />' to access:</translation> @@ -4246,6 +4248,7 @@ <translation id="477647109558161443">Create a desktop shortcut</translation> <translation id="4776594120007763294">To add a page to read later, click the button</translation> <translation id="4777458362738635055">Other users of this device can use this network</translation> +<translation id="477781522763920796">This setting works without identifying you or allowing sites to see your browsing history.</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4777943778632837590">Configure network name servers</translation> <translation id="4779083564647765204">Zoom</translation> @@ -6209,6 +6212,7 @@ <translation id="6597331566371766302">The following extensions were blocked by your administrator:</translation> <translation id="6601262427770154296">Manage user dictionaries</translation> <translation id="6601612474695404578">Some sites use third-party cookies to load their pages. If a site isn't working, you can try allowing cookies.</translation> +<translation id="6602581642873576447">Spam and fraud reduction is off</translation> <translation id="6602937173026466876">Access your printers</translation> <translation id="6602956230557165253">Use left and right arrow keys to navigate.</translation> <translation id="6603185457265641428">Choose whether to sync history</translation> @@ -6726,6 +6730,7 @@ <translation id="7047059339731138197">Pick a background</translation> <translation id="7049293980323620022">Keep file?</translation> <translation id="7050037487872780845">Invalid hotspot configuration</translation> +<translation id="7050519587566342213">Browsing is smoother, as you're more likely trusted from one site to the next.</translation> <translation id="7051551856857948729">Hide IBAN value</translation> <translation id="7052237160939977163">Send performance trace data</translation> <translation id="7053983685419859001">Block</translation> @@ -6943,6 +6948,7 @@ <translation id="7269736181983384521">Nearby Share data usage</translation> <translation id="7272674038937250585">No description provided</translation> <translation id="7273110280511444812">last attached on <ph name="DATE" /></translation> +<translation id="7273921429569738933">Spam and fraud reduction is on</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% - <ph name="TIME" /> until full</translation> <translation id="727952162645687754">Download error</translation> <translation id="7280041992884344566">An error occurred while Chrome was searching for harmful software</translation> @@ -7237,7 +7243,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> download unsuccessful</translation> <translation id="7551643184018910560">Pin to shelf</translation> -<translation id="7552658769580484674">Provide auto-fill feedback</translation> <translation id="7552846755917812628">Try the following tips:</translation> <translation id="7553012839257224005">Checking the Linux container</translation> <translation id="7553242001898162573">Enter your password</translation> @@ -8798,7 +8803,6 @@ <translation id="8952831374766033534">Configuration option not supported: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">While charging</translation> <translation id="895347679606913382">Starting...</translation> -<translation id="8956230710625245889">Open in Reader</translation> <translation id="8957757410289731985">Customise profile</translation> <translation id="895944840846194039">JavaScript Memory</translation> <translation id="8960208913905765425">Quick Answers unit conversion</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 138cf34..5cfbbbb 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">¿Quieres reiniciar Linux?</translation> <translation id="1047431265488717055">Copiar texto del vínculo</translation> <translation id="1048286738600630630">Pantallas</translation> -<translation id="1048770690598418849">Puedes omitir este paso por ahora; volveremos a intentarlo automáticamente cuando finalices la configuración</translation> <translation id="1048986595386481879">Asignación dinámica</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Recibiendo <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}other{Recibiendo <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incógnito</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">Se copió en tu portapapeles</translation> <translation id="2183570493397356669">Se inhabilitó el botón Continuar</translation> <translation id="2184515124301515068">Permitir que Chrome elija cuándo los sitios pueden reproducir sonido (recomendado)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Página compartida desde otro dispositivo</translation> <translation id="2187675480456493911">La red está sincronizada con otros dispositivos de tu cuenta. No se sincronizarán las opciones de configuración que modifiquen otros usuarios. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Error en el servidor de importación de certificado</translation> @@ -1621,6 +1621,7 @@ <translation id="2408018932941436077">Guardando la tarjeta</translation> <translation id="2408955596600435184">Ingresa tu PIN</translation> <translation id="2409268599591722235">Comenzar</translation> +<translation id="2409709393952490731">Usar un teléfono o una tablet</translation> <translation id="2410079346590497630">Detalles de la versión</translation> <translation id="2410298923485357543">Utiliza una voz natural cuando el dispositivo esté en línea</translation> <translation id="2410754283952462441">Elegir una cuenta</translation> @@ -1917,7 +1918,6 @@ <translation id="2673135533890720193">Leer el historial de navegación</translation> <translation id="2674764818721168631">No</translation> <translation id="2675570801872027281">Se produjo un error al quitar Bruschetta. Vuelve a intentarlo.</translation> -<translation id="2676492189600898281">Enviar comentarios sobre Autocompletar</translation> <translation id="2678063897982469759">Permitir nuevamente</translation> <translation id="2678100101831051676">No se puede transmitir.</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -3769,6 +3769,7 @@ <translation id="4369215744064167350">Se aprobó la solicitud de acceso al sitio web</translation> <translation id="4369735607080757018">Se comparten tipos limitados de datos entre sitios para medir el rendimiento de sus anuncios, como la hora del día en que se mostró un anuncio.</translation> <translation id="4370975561335139969">El correo electrónico y la contraseña que ingresaste no coinciden.</translation> +<translation id="4374805630006466253">Usar otro teléfono o tablet</translation> <translation id="4374831787438678295">Instalador de Linux</translation> <translation id="4375035964737468845">Abrir archivos descargados</translation> <translation id="4376226992615520204">Ubicación desactivada</translation> @@ -4269,6 +4270,7 @@ <translation id="4824037980212326045">Copia de seguridad y restablecimiento de Linux</translation> <translation id="4824958205181053313">¿Quieres cancelar la sincronización?</translation> <translation id="4825532258163983651">No se puede borrar la clave de acceso</translation> +<translation id="4827283332383516812">Borrar tarjeta</translation> <translation id="4827675678516992122">No se pudo establecer conexión</translation> <translation id="4827784381479890589">Corrector ortográfico mejorado en el navegador Chrome (se envía el texto a Google para obtener sugerencias ortográficas)</translation> <translation id="4827904420700932487">Crear un código QR para esta imagen</translation> @@ -5292,6 +5294,7 @@ <translation id="5792295754950501287">Más acciones para <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Presiona el botón de encendido</translation> <translation id="5792874008054171483">Más acciones para <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Se borrará esta forma de pago de este dispositivo.</translation> <translation id="5793339252089865437">Si descargas la actualización mediante tu red móvil, es posible que se apliquen cargos por exceso de datos.</translation> <translation id="5793420564274426163">Confirmación de vinculación</translation> <translation id="5793430094159150686">Se cambió tu contraseña. Para restablecer los datos locales, debes ingresar la contraseña anterior.</translation> @@ -7208,7 +7211,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Se descargó <ph name="FILE_NAME" /> correctamente.</translation> <translation id="7551643184018910560">Fijar en la barra</translation> -<translation id="7552658769580484674">Enviar comentarios sobre Autocompletar</translation> <translation id="7552846755917812628">Intenta las siguientes sugerencias:</translation> <translation id="7553012839257224005">Revisando el contenedor de Linux</translation> <translation id="7553242001898162573">Ingresar contraseña</translation> @@ -7270,6 +7272,7 @@ <translation id="7609148976235050828">Conéctate a Internet y vuelve a intentarlo.</translation> <translation id="7612401678989660900">Permitir el acceso al micrófono para apps y sitios web con el permiso</translation> <translation id="7612655942094160088">Habilita las funciones del teléfono conectado.</translation> +<translation id="7612989789287281429">Accediendo…</translation> <translation id="7614260613810441905">Preguntar cuando un sitio quiera editar archivos o carpetas de tu dispositivo (recomendado)</translation> <translation id="761530003705945209">Crea una copia de seguridad en Google Drive. Restaura tus datos o cambia de dispositivo en cualquier momento con facilidad. Se incluyen datos de apps. Se suben las copias de seguridad a Google y se encriptan con la contraseña de tu Cuenta de Google.</translation> <translation id="7615365294369022248">Se produjo un error al agregar una cuenta</translation> @@ -8767,7 +8770,6 @@ <translation id="8952831374766033534">No se admite la opción de configuración: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Mientras se carga</translation> <translation id="895347679606913382">Iniciando...</translation> -<translation id="8956230710625245889">Abrir en Reader</translation> <translation id="8957757410289731985">Personalizar el perfil</translation> <translation id="895944840846194039">Memoria de JavaScript</translation> <translation id="8960208913905765425">Conversión de unidades de Respuestas rápidas</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 393f1095..230e618 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">¿Quieres reiniciar Linux?</translation> <translation id="1047431265488717055">Copiar te&xto de enlace</translation> <translation id="1048286738600630630">Pantallas</translation> -<translation id="1048770690598418849">Puedes saltarte este paso de momento y se volverá a intentar automáticamente al terminar el proceso de configuración</translation> <translation id="1048986595386481879">Asignado dinámicamente</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Recibiendo <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}other{Recibiendo <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incógnito</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">Se ha copiado en tu portapapeles</translation> <translation id="2183570493397356669">Botón Continuar inhabilitado</translation> <translation id="2184515124301515068">Permitir que Chrome elija cuándo los sitios pueden reproducir sonidos (recomendado)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Página compartida desde otro dispositivo</translation> <translation id="2187675480456493911">La red está sincronizada con otros dispositivos de tu cuenta. Los ajustes modificados por otros usuarios no se sincronizarán. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Error de importación del certificado de servidor</translation> @@ -1921,7 +1921,6 @@ <translation id="2673135533890720193">Leer tu historial de navegación</translation> <translation id="2674764818721168631">Desactivado</translation> <translation id="2675570801872027281">Error al eliminar Bruschettas. Inténtalo de nuevo.</translation> -<translation id="2676492189600898281">Enviar comentarios sobre Autocompletar</translation> <translation id="2678063897982469759">Volver a habilitar</translation> <translation id="2678100101831051676">No se ha podido enviar.</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -4272,6 +4271,7 @@ <translation id="4824037980212326045">Copia de seguridad y restauración de Linux</translation> <translation id="4824958205181053313">¿Quieres cancelar la sincronización?</translation> <translation id="4825532258163983651">No se puede eliminar la llave de acceso</translation> +<translation id="4827283332383516812">Eliminar tarjeta</translation> <translation id="4827675678516992122">No se ha podido conectar</translation> <translation id="4827784381479890589">Revisión ortográfica mejorada en el navegador Chrome (el texto se envía a Google para que muestre sugerencias ortográficas)</translation> <translation id="4827904420700932487">Crear código QR para esta imagen</translation> @@ -5295,6 +5295,7 @@ <translation id="5792295754950501287">Más acciones de <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Toca el botón de encendido</translation> <translation id="5792874008054171483">Más acciones de <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Este método de pago se eliminará de este dispositivo</translation> <translation id="5793339252089865437">Descargar la actualización a través de la red móvil podría generar cargos adicionales.</translation> <translation id="5793420564274426163">Confirmación de emparejamiento</translation> <translation id="5793430094159150686">Tu contraseña ha cambiado. Para restaurar tus datos locales, debes introducir la contraseña anterior.</translation> @@ -7211,7 +7212,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> descargado correctamente</translation> <translation id="7551643184018910560">Fijar en la estantería</translation> -<translation id="7552658769580484674">Enviar comentarios sobre Autocompletar</translation> <translation id="7552846755917812628">Prueba los siguientes consejos:</translation> <translation id="7553012839257224005">Comprobando el contenedor de Linux</translation> <translation id="7553242001898162573">Introduce tu contraseña</translation> @@ -7273,6 +7273,7 @@ <translation id="7609148976235050828">Conéctate a Internet y vuelve a intentarlo.</translation> <translation id="7612401678989660900">Permite que accedan los sitios web y aplicaciones con el permiso de micrófono</translation> <translation id="7612655942094160088">Habilitar funciones de teléfono conectado.</translation> +<translation id="7612989789287281429">Iniciando sesión…</translation> <translation id="7614260613810441905">Preguntar cuando un sitio web quiera editar archivos o carpetas de tu dispositivo (recomendado)</translation> <translation id="761530003705945209">Crea copias de seguridad en Google Drive. Recupera tus datos de forma sencilla o cambia de dispositivo en cualquier momento. La copia de seguridad también incluye datos de las aplicaciones. Tus copias de seguridad se suben a Google y se cifran con la contraseña de tu cuenta de Google.</translation> <translation id="7615365294369022248">No se ha podido añadir una cuenta</translation> @@ -8770,7 +8771,6 @@ <translation id="8952831374766033534">Opción de configuración no admitida: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Durante la carga</translation> <translation id="895347679606913382">Iniciando...</translation> -<translation id="8956230710625245889">Abrir en Reader</translation> <translation id="8957757410289731985">Personalizar perfil</translation> <translation id="895944840846194039">Memoria de JavaScript</translation> <translation id="8960208913905765425">Conversiones de unidades de Respuestas rápidas</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 5ad8f2d..181018ed 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Kas taaskäivitada Linux?</translation> <translation id="1047431265488717055">Kopeeri lingi te&kst</translation> <translation id="1048286738600630630">Ekraanid</translation> -<translation id="1048770690598418849">Võite selle praegu vahele jätta ja proovime pärast seadistamise lõpuleviimist automaatselt uuesti</translation> <translation id="1048986595386481879">Dünaamiliselt jaotatud</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> võetakse seadmest <ph name="DEVICE_NAME" /> vastu}other{<ph name="ATTACHMENTS" /> võetakse seadmest <ph name="DEVICE_NAME" /> vastu}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1360,6 +1359,7 @@ <translation id="2182058453334755893">Kopeeritud lõikelauale</translation> <translation id="2183570493397356669">Nupp Jätka on keelatud</translation> <translation id="2184515124301515068">Luba Chrome'il valida, millal saidid võivad heli esitada (soovitatav)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Muust seadmest jagatud leht</translation> <translation id="2187675480456493911">Sünkroonitud muude teie kontol olevate seadmetega. Teiste kasutajate muudetud seadeid ei sünkroonita. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Serveri sertifikaadi impordi viga</translation> @@ -1630,6 +1630,7 @@ <translation id="2408018932941436077">Kaardi salvestamine</translation> <translation id="2408955596600435184">Sisestage PIN-kood</translation> <translation id="2409268599591722235">Alusta</translation> +<translation id="2409709393952490731">Kasutage telefoni või tahvelarvutit</translation> <translation id="2410079346590497630">Järgu üksikasjad</translation> <translation id="2410298923485357543">Kasuta loomulikku häält, kui seade on võrguga ühendatud</translation> <translation id="2410754283952462441">Konto valimine</translation> @@ -1926,7 +1927,6 @@ <translation id="2673135533890720193">Sirvimisajaloo lugemine</translation> <translation id="2674764818721168631">Väljas</translation> <translation id="2675570801872027281">Bruschetta eemaldamisel ilmnes viga. Proovige uuesti.</translation> -<translation id="2676492189600898281">Automaattäite kohta tagasiside saatmine</translation> <translation id="2678063897982469759">Luba uuesti</translation> <translation id="2678100101831051676">Ei saa üle kanda.</translation> <translation id="268053382412112343">&Ajalugu</translation> @@ -3778,6 +3778,7 @@ <translation id="4369215744064167350">Veebisaidi taotlus kinnitati</translation> <translation id="4369735607080757018">Saitide vahel jagatakse teatud tüüpi andmeid, et mõõta nende reklaamide toimivust (nt millal päeva jooksul teile reklaami näidati)</translation> <translation id="4370975561335139969">Sisestatud e-posti aadress ja parool ei ühildu</translation> +<translation id="4374805630006466253">Kasutage teist telefoni või tahvelarvutit</translation> <translation id="4374831787438678295">Linuxi installiprogramm</translation> <translation id="4375035964737468845">Ava allalaaditud failid</translation> <translation id="4376226992615520204">Asukoht on välja lülitatud</translation> @@ -7219,7 +7220,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Faili <ph name="FILE_NAME" /> allalaadimine ebaõnnestus</translation> <translation id="7551643184018910560">Riiulile kinnitamine</translation> -<translation id="7552658769580484674">Automaattäite kohta tagasiside saatmine</translation> <translation id="7552846755917812628">Proovige järgmiseid nõuandeid.</translation> <translation id="7553012839257224005">Linuxi konteineri kontrollimine</translation> <translation id="7553242001898162573">Sisestage parool</translation> @@ -8779,7 +8779,6 @@ <translation id="8952831374766033534">Seadistamisvalikut ei toetata: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Laadimise ajal</translation> <translation id="895347679606913382">Alustamine...</translation> -<translation id="8956230710625245889">Ava Readeris</translation> <translation id="8957757410289731985">Profiili kohandamine</translation> <translation id="895944840846194039">JavaScripti mälu</translation> <translation id="8960208913905765425">Ühikute teisendamine kiirvastustes</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index dff3dd3..df6646a 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux berrabiarazi nahi duzu?</translation> <translation id="1047431265488717055">Kopiatu estekaren te&stua</translation> <translation id="1048286738600630630">Pantaila</translation> -<translation id="1048770690598418849">Momentuz, salta dezakezu. Konfiguratzen amaitu ondoren, automatikoki saiatuko gara berriro.</translation> <translation id="1048986595386481879">Dinamikoki esleituta</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> jasotzen <ph name="DEVICE_NAME" /> gailutik}other{<ph name="ATTACHMENTS" /> jasotzen <ph name="DEVICE_NAME" /> gailutik}}</translation> <translation id="1049743911850919806">Ezkutuko modua</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">Arbelean kopiatu da</translation> <translation id="2183570493397356669">Aurrera egiteko botoia desgaituta</translation> <translation id="2184515124301515068">Utzi Chrome-k erabaki dezan zer webguneri baimenduko dion soinua erreproduzitzea (gomendatua)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Beste gailu batetik partekatutako orria</translation> <translation id="2187675480456493911">Kontuko beste gailu batzuekin sinkronizatuta dago. Ez dira sinkronizatuko beste erabiltzaileek aldatutako ezarpenak. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Errore bat gertatu da zerbitzariaren ziurtagiria inportatzean</translation> @@ -1624,6 +1624,7 @@ <translation id="2408018932941436077">Txartela gordetzen</translation> <translation id="2408955596600435184">Idatzi PINa</translation> <translation id="2409268599591722235">Has gaitezen</translation> +<translation id="2409709393952490731">Erabili telefono edo tableta bat</translation> <translation id="2410079346590497630">Konpilazioaren xehetasunak</translation> <translation id="2410298923485357543">Erabili ahots naturala gailua sarera konektatuta dagoenean</translation> <translation id="2410754283952462441">Aukeratu kontu bat</translation> @@ -1920,7 +1921,6 @@ <translation id="2673135533890720193">Irakurri arakatze-historia</translation> <translation id="2674764818721168631">Desaktibatuta</translation> <translation id="2675570801872027281">Errore bat gertatu da Bruschetta kentzean. Saiatu berriro.</translation> -<translation id="2676492189600898281">Bidali betetze automatikoari buruzko oharrak</translation> <translation id="2678063897982469759">Gaitu berriro</translation> <translation id="2678100101831051676">Ezin da igorri.</translation> <translation id="268053382412112343">Hi&storia</translation> @@ -3772,6 +3772,7 @@ <translation id="4369215744064167350">Onartu egin da webgunea atzitzeko eskaera</translation> <translation id="4369735607080757018">Iragarkien errendimendua neurtzeko, datu mota jakin batzuk soilik partekatzen dituzte webguneek elkarrekin; adibidez, zer ordutan erakutsi dizuten iragarki bat.</translation> <translation id="4370975561335139969">Idatzitako helbide elektronikoa eta pasahitza ez datoz bat</translation> +<translation id="4374805630006466253">Erabili beste telefono edo tableta bat</translation> <translation id="4374831787438678295">Linux-en instalatzailea</translation> <translation id="4375035964737468845">Ireki deskargatutako fitxategiak</translation> <translation id="4376226992615520204">Kokapena erabiltzeko baimena desaktibatuta dago</translation> @@ -3947,6 +3948,7 @@ <translation id="4522890784888918985">Ez dira onartzen bigarren mailako kontuak</translation> <translation id="4523876148417776526">Oraindik ez dira eskuratu XML darabilten webguneen zerrendak.</translation> <translation id="4524832533047962394">Sistema eragilearen bertsio honek ez du onartzen erregistratzeko adierazitako modua. Ziurtatu bertsiorik berriena erabiltzen ari zarela.</translation> +<translation id="4526051299161934899">Gordetako fitxa talde ezkutuak</translation> <translation id="4526853756266614740">Aukeratu irudi bat gaia berehala aplikatzeko</translation> <translation id="452750746583162491">Berrikusi sinkronizatutako datuak</translation> <translation id="4527929807707405172">Gaitu gora eta behera alderantziz egiteko aukera. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> @@ -4271,6 +4273,7 @@ <translation id="4824037980212326045">Linux-en babeskopiak eta leheneratzea</translation> <translation id="4824958205181053313">Sinkronizazioa bertan behera utzi nahi duzu?</translation> <translation id="4825532258163983651">Ezin da ezabatu sarbide-gakoa</translation> +<translation id="4827283332383516812">Ezabatu txartela</translation> <translation id="4827675678516992122">Ezin izan da konektatu</translation> <translation id="4827784381479890589">Ortografia-zuzentzaile hobetua Chrome arakatzailean (testua Google-ri bidaltzen zaio ortografia-iradokizunak jasotzeko)</translation> <translation id="4827904420700932487">Sortu irudi honen QR kodea</translation> @@ -5292,6 +5295,7 @@ <translation id="5792295754950501287"><ph name="CARD_DESCRIPTION" /> txartelarekin erlazionatuta egin daitezkeen ekintza gehiago</translation> <translation id="5792728279623964091">Sakatu etengailua</translation> <translation id="5792874008054171483"><ph name="SITE_NAME" /> webguneko ekintza gehiago</translation> +<translation id="5793317771769868848">Ordainketa-metodoa gailutik ezabatuko da</translation> <translation id="5793339252089865437">Eguneratzea sare mugikorraren bitartez deskargatzen baduzu, baliteke kostu gehigarriak izatea.</translation> <translation id="5793420564274426163">Parekatze-berrespena</translation> <translation id="5793430094159150686">Pasahitza aldatu da. Gailuko datuak leheneratzeko, aurreko pasahitza idatzi behar duzu.</translation> @@ -7207,7 +7211,6 @@ <translation id="7550830279652415241">laster-markak_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Ezin izan da deskargatu <ph name="FILE_NAME" /> fitxategia</translation> <translation id="7551643184018910560">Ainguratu apalean</translation> -<translation id="7552658769580484674">Bidali betetze automatikoari buruzko oharrak</translation> <translation id="7552846755917812628">Saiatu hauek egiten:</translation> <translation id="7553012839257224005">Linux-en edukiontzia egiaztatzen</translation> <translation id="7553242001898162573">Idatzi pasahitza</translation> @@ -7269,6 +7272,7 @@ <translation id="7609148976235050828">Konektatu Internetera eta saiatu berriro.</translation> <translation id="7612401678989660900">Aktibatu mikrofonoa erabiltzeko baimena halakorik baduten aplikazio eta webguneetan</translation> <translation id="7612655942094160088">Gaitu konektatutako telefonoaren eginbideak.</translation> +<translation id="7612989789287281429">Saioa hasten…</translation> <translation id="7614260613810441905">Galdetu webgune batek gailuko fitxategiak edo karpetak editatu nahi dituenean (gomendatua)</translation> <translation id="761530003705945209">Egin babeskopiak Google Drive-n. Leheneratu gailuaren datuak edo aldatu gailua edonoiz. Aplikazioetako datuak sartzen dira babeskopietan. Babeskopiak Google-ra kargatzen dira, eta Google-ko kontuko pasahitza erabilita enkriptatzen.</translation> <translation id="7615365294369022248">Errore bat gertatu da kontu bat gehitzean</translation> @@ -8484,6 +8488,7 @@ <translation id="869884720829132584">Aplikazioen menua</translation> <translation id="869891660844655955">Iraungitze-data</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> inprimagailuaren PPDa</translation> +<translation id="8702278591052316269">Gordetako fitxa talde ezkutuak dauzkan menua</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> blokeatu egin da.</translation> <translation id="8703346390800944767">Saltatu iragarkia</translation> <translation id="8705331520020532516">Serie-zenbakia</translation> @@ -8764,7 +8769,6 @@ <translation id="8952831374766033534">Konfigurazio-aukera ez da onartzen: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Kargatzen ari denean</translation> <translation id="895347679606913382">Hasten…</translation> -<translation id="8956230710625245889">Ireki ezazu irakurgailuan</translation> <translation id="8957757410289731985">Pertsonalizatu profila</translation> <translation id="895944840846194039">JavaScript memoria</translation> <translation id="8960208913905765425">Erantzun bizkorrak, unitate-bihurketa</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 87b0752..e0b90e0 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux بازراهاندازی شود؟</translation> <translation id="1047431265488717055">کپی کردن متن &پیوند</translation> <translation id="1048286738600630630">نمایشگرها</translation> -<translation id="1048770690598418849">میتوانید فعلاً این مرحله را رد کنید. وقتی راهاندازی را بهپایان رساندید، بهطور خودکار دوباره امتحان میکنیم.</translation> <translation id="1048986595386481879">اختصاصیافته بهصورت پویا</translation> <translation id="1049324577536766607">{COUNT,plural, =1{درحال دریافت <ph name="ATTACHMENTS" /> از <ph name="DEVICE_NAME" />}one{درحال دریافت <ph name="ATTACHMENTS" /> از <ph name="DEVICE_NAME" />}other{درحال دریافت <ph name="ATTACHMENTS" /> از <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">ناشناس</translation> @@ -379,7 +378,7 @@ <translation id="1338802252451106843"><ph name="ORIGIN" /> میخواهد این برنامه را باز کند.</translation> <translation id="1338950911836659113">در حال حذف...</translation> <translation id="1339009753652684748">با گفتن «OK Google» به «دستیار» دسترسی یابید. برای صرفهجویی در مصرف باتری، «روشن (توصیه میشود)» را انتخاب کنید. «دستیار» تنها زمانی پاسخ میدهد که دستگاه شما به برق متصل باشد یا درحال شارژ شدن باشد.</translation> -<translation id="13392265090583506">A11y</translation> +<translation id="13392265090583506">دسترسپذیری</translation> <translation id="1340527397989195812">با استفاده از برنامه Files از رسانه دستگاه پشتیبان بگیرید.</translation> <translation id="1341701348342335220">بسیار عالی!</translation> <translation id="1341871421050612057">نمیتوان با <ph name="USERNAME" /> همگامسازی کرد</translation> @@ -1366,6 +1365,7 @@ <translation id="2182058453334755893">در بریدهدان کپی شد</translation> <translation id="2183570493397356669">دکمه ادامه غیرفعال شد</translation> <translation id="2184515124301515068">Chrome انتخاب کند سایتها چه موقع صدا پخش کنند (توصیه میشود)</translation> +<translation id="2186206192313702726">لنز Google</translation> <translation id="2186711480981247270">صفحه از دستگاه دیگری همرسانی شد</translation> <translation id="2187675480456493911">با دستگاههای دیگر در حسابتان همگامسازی شده است. تنظیماتی که دیگر کاربران تغییر دادهاند همگامسازی نخواهد شد. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="2187895286714876935">خطای وارد کردن مجوز سرور</translation> @@ -1636,6 +1636,7 @@ <translation id="2408018932941436077">درحال ذخیره کارت</translation> <translation id="2408955596600435184">پین را وارد کنید</translation> <translation id="2409268599591722235">بیایید شروع کنیم</translation> +<translation id="2409709393952490731">استفاده از رایانه لوحی یا تلفن</translation> <translation id="2410079346590497630">جزئیات ساخت</translation> <translation id="2410298923485357543">وقتی دستگاه آنلاین است، از صدای طبیعی استفاده شود</translation> <translation id="2410754283952462441">انتخاب حساب</translation> @@ -1932,7 +1933,6 @@ <translation id="2673135533890720193">خواندن سابقه مرور شما</translation> <translation id="2674764818721168631">خاموش</translation> <translation id="2675570801872027281">خطایی هنگام برداشتن Bruschetta روی داد. لطفاً دوباره امتحان کنید.</translation> -<translation id="2676492189600898281">ارائه بازخورد درباره «تکمیل خودکار»</translation> <translation id="2678063897982469759">فعال کردن مجدد</translation> <translation id="2678100101831051676">پخش محتوا امکانپذیر نیست.</translation> <translation id="268053382412112343">&سابقه</translation> @@ -3784,6 +3784,7 @@ <translation id="4369215744064167350">درخواست وبسایت تأیید شد</translation> <translation id="4369735607080757018">انواع محدودی از دادهها بین سایتها همرسانی میشود تا سایتها بتوانند عملکرد آگهیهایشان را بسنجند، برای مثال زمانی از روز که آگهی به شما نشان داده شده است</translation> <translation id="4370975561335139969">ایمیل و گذرواژهای که وارد کردهاید، مطابقت ندارند</translation> +<translation id="4374805630006466253">استفاده از رایانه لوحی یا تلفنی دیگر</translation> <translation id="4374831787438678295">نصبکننده Linux</translation> <translation id="4375035964737468845">باز کردن فایلهای بارگیریشده</translation> <translation id="4376226992615520204">مکان خاموش است</translation> @@ -7228,7 +7229,6 @@ <translation id="7550830279652415241">bookmarks<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> بارگیری نشد</translation> <translation id="7551643184018910560">سنجاق کردن به فقسه</translation> -<translation id="7552658769580484674">ارائه بازخورد درباره «تکمیل خودکار»</translation> <translation id="7552846755917812628">نکتههای زیر را امتحان کنید:</translation> <translation id="7553012839257224005">درحال بررسی محتوی Linux</translation> <translation id="7553242001898162573">گذرواژهتان را وارد کنید</translation> @@ -8788,7 +8788,6 @@ <translation id="8952831374766033534">گزینه پیکربندی پشتیبانی نمیشود: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">هنگام شارژ شدن</translation> <translation id="895347679606913382">در حال شروع...</translation> -<translation id="8956230710625245889">باز کردن در «صفحهخوان»</translation> <translation id="8957757410289731985">سفارشی کردن نمایه</translation> <translation id="895944840846194039">حافطه جاوا اسکریپت</translation> <translation id="8960208913905765425">تبدیل واحد «پاسخهای سریع»</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 1b00e4b..a1727f4d 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Käynnistetäänkö Linux uudelleen?</translation> <translation id="1047431265488717055">Kopioi linkin te&ksti</translation> <translation id="1048286738600630630">Näytöt</translation> -<translation id="1048770690598418849">Voit ohittaa tämän vaiheen, niin yritämme automaattisesti uudelleen käyttöönoton jälkeen</translation> <translation id="1048986595386481879">Dynaamisesti jaettu</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Laitteelta (<ph name="DEVICE_NAME" />) vastaanotetaan <ph name="ATTACHMENTS" />}other{Laitteelta (<ph name="DEVICE_NAME" />) vastaanotetaan <ph name="ATTACHMENTS" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -1368,6 +1367,7 @@ <translation id="2182058453334755893">Kopioitu leikepöydälle</translation> <translation id="2183570493397356669">Jatka-painike ei ole käytössä</translation> <translation id="2184515124301515068">Anna Chromen valita, milloin sivustot voivat toistaa ääniä (suositus)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Sivu jaettu toisesta laitteesta</translation> <translation id="2187675480456493911">Synkronoitu muiden tililläsi olevien laitteiden kanssa. Muiden käyttäjien muuttamia asetuksia ei synkronoida. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Palvelimen varmenteen tuontivirhe</translation> @@ -1638,6 +1638,7 @@ <translation id="2408018932941436077">Tallennetaan korttia</translation> <translation id="2408955596600435184">Lisää PIN-koodi</translation> <translation id="2409268599591722235">Aloitetaan</translation> +<translation id="2409709393952490731">Käytä puhelinta tai tablettia</translation> <translation id="2410079346590497630">Koontiversion tiedot</translation> <translation id="2410298923485357543">Käytä luonnollista ääntä laitteen ollessa yhteydessä verkkoon</translation> <translation id="2410754283952462441">Valitse tili</translation> @@ -1934,7 +1935,6 @@ <translation id="2673135533890720193">Tarkastella selaushistoriaasi</translation> <translation id="2674764818721168631">Pois päältä</translation> <translation id="2675570801872027281">Virhe Bruschettan poistamisessa. Yritä uudelleen.</translation> -<translation id="2676492189600898281">Anna palautetta automaattisesta täytöstä</translation> <translation id="2678063897982469759">Ota uudelleen käyttöön</translation> <translation id="2678100101831051676">Striimaus ei onnistu.</translation> <translation id="268053382412112343">Hi&storia</translation> @@ -3783,6 +3783,7 @@ <translation id="4369215744064167350">Sivustopyyntö hyväksytty</translation> <translation id="4369735607080757018">Rajoitettuja datatyyppejä (esimerkiksi mainoksen näyttämisen kellonaika) jaetaan sivustojen välillä mainosten suoriutumisen mittaamista varten.</translation> <translation id="4370975561335139969">Antamasi sähköpostiosoite ja salasana eivät vastaa toisiaan.</translation> +<translation id="4374805630006466253">Käytä toista puhelinta tai tablettia</translation> <translation id="4374831787438678295">Linux-asennusohjelma</translation> <translation id="4375035964737468845">avata ladatut tiedostot</translation> <translation id="4376226992615520204">Sijainti poissa päältä</translation> @@ -3959,6 +3960,7 @@ <translation id="4522890784888918985">Alatason tilejä ei tueta</translation> <translation id="4523876148417776526">XML-sivustoluetteloita ei ole vielä haettu.</translation> <translation id="4524832533047962394">Käyttöjärjestelmän tämä versio ei tue annettua käyttöönottotilaa. Varmista, että käytössä on uusin versio.</translation> +<translation id="4526051299161934899">Piilotetut tallennetut välilehtiryhmät</translation> <translation id="4526853756266614740">Valitse kuva, niin teema otetaan käyttöön heti</translation> <translation id="452750746583162491">Tarkista synkronoitu datasi</translation> <translation id="4527929807707405172">Ota käänteinen vieritys käyttöön. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> @@ -7224,7 +7226,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> lataus epäonnistui.</translation> <translation id="7551643184018910560">Kiinnitä hyllyyn</translation> -<translation id="7552658769580484674">Anna palautetta automaattisesta täytöstä</translation> <translation id="7552846755917812628">Kokeile seuraavia keinoja:</translation> <translation id="7553012839257224005">Tarkistetaan Linux-säilöä</translation> <translation id="7553242001898162573">Lisää salasana</translation> @@ -8502,6 +8503,7 @@ <translation id="869884720829132584">Sovellusvalikko</translation> <translation id="869891660844655955">Vanhenemispäivämäärä</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" />: PPD</translation> +<translation id="8702278591052316269">Valikko, joka sisältää piilotetut välilehtiryhmät</translation> <translation id="8702825062053163569">Laitteesi (<ph name="DEVICE_TYPE" />) on lukittu.</translation> <translation id="8703346390800944767">Ohita mainos</translation> <translation id="8705331520020532516">Sarjanumero</translation> @@ -8782,7 +8784,6 @@ <translation id="8952831374766033534">Määritysvaihtoehtoa ei tueta: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Latauksessa</translation> <translation id="895347679606913382">Käynnistää...</translation> -<translation id="8956230710625245889">Avaa lukijassa</translation> <translation id="8957757410289731985">Muokkaa profiilia</translation> <translation id="895944840846194039">JavaScriptin käyttämä muisti</translation> <translation id="8960208913905765425">Pikavastaukset: yksikkömuunnos</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 6db487db..c60c7d6 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">I-restart ang Linux?</translation> <translation id="1047431265488717055">Kopyahin ang Text ng Link</translation> <translation id="1048286738600630630">Mga Display</translation> -<translation id="1048770690598418849">Puwede mong laktawan sa ngayon at awtomatiko naming susubukan ulit kapag natapos mo na ang pag-set up</translation> <translation id="1048986595386481879">Dynamic na na-allocate</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Tumatanggap ng <ph name="ATTACHMENTS" /> mula sa <ph name="DEVICE_NAME" />}one{Tumatanggap ng <ph name="ATTACHMENTS" /> mula sa <ph name="DEVICE_NAME" />}other{Tumatanggap ng <ph name="ATTACHMENTS" /> mula sa <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">Kinopya sa Iyong Clipboard</translation> <translation id="2183570493397356669">Na-disable ang button na Magpatuloy</translation> <translation id="2184515124301515068">Hayaan ang Chrome na pumili kung kailan makakapag-play ng tunog ang mga site (inirerekomenda)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Ibinahaging page mula sa ibang device</translation> <translation id="2187675480456493911">Naka-sync sa iba pang device sa iyong account. Hindi masi-sync ang mga setting na binago ng iba pang user. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Error sa Pag-import ng Certificate ng Server</translation> @@ -1937,7 +1937,6 @@ <translation id="2673135533890720193">Basahin ang iyong history ng pag-browse</translation> <translation id="2674764818721168631">Naka-off</translation> <translation id="2675570801872027281">Nagka-error sa pag-aalis ng Bruschetta. Subukan ulit.</translation> -<translation id="2676492189600898281">Magbigay ng feedback sa Autofill</translation> <translation id="2678063897982469759">Muling paganahin</translation> <translation id="2678100101831051676">Hindi ma-cast.</translation> <translation id="268053382412112343">Ka&saysayan</translation> @@ -7234,7 +7233,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Hindi matagumpay ang pag-download ng <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">I-pin sa shelf</translation> -<translation id="7552658769580484674">Magbigay ng Feedback sa Autofill</translation> <translation id="7552846755917812628">Subukan ang mga sumusunod na tip:</translation> <translation id="7553012839257224005">Sinusuri ang Linux container</translation> <translation id="7553242001898162573">Ilagay ang iyong password</translation> @@ -8797,7 +8795,6 @@ <translation id="8952831374766033534">Hindi sinusuportahan ang opsyon sa configuration: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Habang nagcha-charge</translation> <translation id="895347679606913382">Nagsisimula...</translation> -<translation id="8956230710625245889">Buksan sa Reader</translation> <translation id="8957757410289731985">I-customize ang profile</translation> <translation id="895944840846194039">Memory ng JavaScript</translation> <translation id="8960208913905765425">Pag-convert ng unit ng Instant na Impormasyon</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 508b9db..0239d48 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Redémarrer Linux?</translation> <translation id="1047431265488717055">Copier le texte du lien</translation> <translation id="1048286738600630630">Écrans</translation> -<translation id="1048770690598418849">Vous pouvez ignorer pour l'instant et nous réessayerons automatiquement quand vous aurez terminé la configuration</translation> <translation id="1048986595386481879">Allocation dynamique</translation> <translation id="1049324577536766607">{COUNT,plural, =1{En cours de réception de <ph name="ATTACHMENTS" /> de l'appareil <ph name="DEVICE_NAME" />…}one{En cours de réception de <ph name="ATTACHMENTS" /> de l'appareil <ph name="DEVICE_NAME" />…}other{En cours de réception de <ph name="ATTACHMENTS" /> de l'appareil <ph name="DEVICE_NAME" />…}}</translation> <translation id="1049743911850919806">Navigation privée</translation> @@ -1358,6 +1357,7 @@ <translation id="2182058453334755893">Copié dans votre presse-papiers</translation> <translation id="2183570493397356669">Bouton Continuer désactivé</translation> <translation id="2184515124301515068">Autoriser Chrome à choisir lorsque des sites peuvent faire jouer du son (recommandé)</translation> +<translation id="2186206192313702726">Lentille Google</translation> <translation id="2186711480981247270">Page partagée à partir d'un autre appareil</translation> <translation id="2187675480456493911">Synchronisé avec d'autres appareils associés à votre compte. Les modifications apportées par d'autres utilisateurs ne seront pas synchronisées. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Erreur d'importation du certificat serveur</translation> @@ -1625,6 +1625,7 @@ <translation id="2408018932941436077">Enregistrement de la carte en cours…</translation> <translation id="2408955596600435184">Entrez votre NIP</translation> <translation id="2409268599591722235">Allons-y</translation> +<translation id="2409709393952490731">Utiliser un téléphone ou une tablette</translation> <translation id="2410079346590497630">Détails de la version</translation> <translation id="2410298923485357543">Utiliser la voix naturelle lorsque l'appareil est connecté à Internet</translation> <translation id="2410754283952462441">Choisir un compte</translation> @@ -1922,7 +1923,6 @@ <translation id="2673135533890720193">Consulter votre historique de navigation</translation> <translation id="2674764818721168631">Désactivé</translation> <translation id="2675570801872027281">Erreur lors de la suppression de Bruschetta. Veuillez réessayer.</translation> -<translation id="2676492189600898281">Fournir des commentaires sur le remplissage automatique</translation> <translation id="2678063897982469759">Réactiver</translation> <translation id="2678100101831051676">Diffusion impossible.</translation> <translation id="268053382412112343">Hi&storique</translation> @@ -3774,6 +3774,7 @@ <translation id="4369215744064167350">Demande de site Web approuvée</translation> <translation id="4369735607080757018">Les sites n’échangent entre eux qu’un type de données limité pour mesurer la performance de leurs annonces, comme l’heure de la journée à laquelle une annonce vous a été présentée</translation> <translation id="4370975561335139969">L’adresse de courriel et le mot de passe que vous avez entrés ne correspondent pas</translation> +<translation id="4374805630006466253">Utiliser un autre téléphone ou une autre tablette</translation> <translation id="4374831787438678295">Installateur Linux</translation> <translation id="4375035964737468845">Ouvrir les fichiers téléchargés</translation> <translation id="4376226992615520204">La localisation est désactivée</translation> @@ -7217,7 +7218,6 @@ <translation id="7550830279652415241">favoris_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Échec du téléchargement de <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Épingler sur l'étagère</translation> -<translation id="7552658769580484674">Fournir des commentaires sur le remplissage automatique</translation> <translation id="7552846755917812628">Essayez les conseils suivants :</translation> <translation id="7553012839257224005">Vérification du conteneur Linux en cours…</translation> <translation id="7553242001898162573">Entrez votre mot de passe</translation> @@ -8777,7 +8777,6 @@ <translation id="8952831374766033534">Cette option de configuration n'est pas prise en charge : <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Pendant la charge</translation> <translation id="895347679606913382">Début du téléchargement...</translation> -<translation id="8956230710625245889">Ouvrir dans le lecteur</translation> <translation id="8957757410289731985">Personnaliser le profil</translation> <translation id="895944840846194039">Mémoire pour JavaScript</translation> <translation id="8960208913905765425">Conversion d'unités pour les réponses rapides</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 30d9a18..8abb46ff 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Redémarrer Linux ?</translation> <translation id="1047431265488717055">Copier le te&xte du lien</translation> <translation id="1048286738600630630">Affichage</translation> -<translation id="1048770690598418849">Vous pouvez ignorer cette étape pour le moment, nous réessayerons automatiquement une fois la configuration terminée</translation> <translation id="1048986595386481879">Allouée dynamiquement</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Réception de <ph name="ATTACHMENTS" /> de l'appareil "<ph name="DEVICE_NAME" />"}one{Réception de <ph name="ATTACHMENTS" /> de l'appareil "<ph name="DEVICE_NAME" />"}other{Réception de <ph name="ATTACHMENTS" /> de l'appareil "<ph name="DEVICE_NAME" />"}}</translation> <translation id="1049743911850919806">Navigation privée</translation> @@ -1358,6 +1357,7 @@ <translation id="2182058453334755893">Copié dans le presse-papiers</translation> <translation id="2183570493397356669">Bouton "Continuer" désactivé</translation> <translation id="2184515124301515068">Chrome détermine quand activer le son des sites (recommandé)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Page partagée depuis un autre appareil</translation> <translation id="2187675480456493911">Ce réseau est synchronisé avec d'autres appareils associés à votre compte. En revanche, les modifications apportées par ces utilisateurs ne seront pas synchronisées. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Erreur d'importation du certificat serveur</translation> @@ -1921,7 +1921,6 @@ <translation id="2673135533890720193">Consulter votre historique de navigation</translation> <translation id="2674764818721168631">Désactivé</translation> <translation id="2675570801872027281">Erreur lors de la suppression de Bruschetta. Veuillez réessayer.</translation> -<translation id="2676492189600898281">Envoyer des commentaires sur la saisie automatique</translation> <translation id="2678063897982469759">Réactiver</translation> <translation id="2678100101831051676">Impossible de caster.</translation> <translation id="268053382412112343">&Historique</translation> @@ -3948,6 +3947,7 @@ <translation id="4522890784888918985">Comptes enfant non acceptés</translation> <translation id="4523876148417776526">Les listes de sites au format XML n'ont pas encore été récupérées.</translation> <translation id="4524832533047962394">Le mode d'enregistrement proposé n'est pas compatible avec cette version du système d'exploitation. Vérifiez que vous utilisez bien la version la plus récente.</translation> +<translation id="4526051299161934899">Groupes d'onglets enregistrés masqués</translation> <translation id="4526853756266614740">Choisissez une image pour appliquer le thème instantanément</translation> <translation id="452750746583162491">Examiner vos données synchronisées</translation> <translation id="4527929807707405172">Activer le défilement inversé. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> @@ -7216,7 +7216,6 @@ <translation id="7550830279652415241">favoris_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Échec du téléchargement de "<ph name="FILE_NAME" />".</translation> <translation id="7551643184018910560">Épingler sur l'étagère</translation> -<translation id="7552658769580484674">Envoyer des commentaires sur la saisie automatique</translation> <translation id="7552846755917812628">Essayez les astuces suivantes :</translation> <translation id="7553012839257224005">Vérification du conteneur Linux…</translation> <translation id="7553242001898162573">Saisissez votre mot de passe</translation> @@ -8495,6 +8494,7 @@ <translation id="869884720829132584">Menu Applications</translation> <translation id="869891660844655955">Date d'expiration</translation> <translation id="8699188901396699995">Fichier PPD pour <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menu contenant des groupes d'onglets enregistrés masqués</translation> <translation id="8702825062053163569">Votre <ph name="DEVICE_TYPE" /> a été verrouillé.</translation> <translation id="8703346390800944767">Ignorer l'annonce</translation> <translation id="8705331520020532516">Numéro de série</translation> @@ -8776,7 +8776,6 @@ <translation id="8952831374766033534">Option de configuration non disponible : <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Lorsque l'appareil est en charge</translation> <translation id="895347679606913382">Démarrage...</translation> -<translation id="8956230710625245889">Ouvrir dans le lecteur</translation> <translation id="8957757410289731985">Personnaliser le profil</translation> <translation id="895944840846194039">Mémoire JavaScript</translation> <translation id="8960208913905765425">Conversion d'unité pour Réponses rapides</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 200deac..0f187a1b 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Queres reiniciar Linux?</translation> <translation id="1047431265488717055">Copiar te&xto da ligazón</translation> <translation id="1048286738600630630">Pantallas</translation> -<translation id="1048770690598418849">Podes omitir este paso por agora. Tentarémolo automaticamente cando remates a configuración</translation> <translation id="1048986595386481879">Asignado dinamicamente</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Recibindo <ph name="ATTACHMENTS" /> do dispositivo (<ph name="DEVICE_NAME" />)}other{Recibindo <ph name="ATTACHMENTS" /> do dispositivo (<ph name="DEVICE_NAME" />)}}</translation> <translation id="1049743911850919806">Modo de incógnito</translation> @@ -1356,6 +1355,7 @@ <translation id="2182058453334755893">Copiouse o contido no teu portapapeis</translation> <translation id="2183570493397356669">O botón Continuar está desactivado</translation> <translation id="2184515124301515068">Permite que Chrome decida cando poden reproducir son os sitios (opción recomendada)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Páxina compartida desde outro dispositivo</translation> <translation id="2187675480456493911">A rede está sincronizada con outros dispositivos da túa conta. Non se sincronizarán as opcións de configuración modificadas por outros usuarios. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Erro de importación do certificado do servidor</translation> @@ -1623,6 +1623,7 @@ <translation id="2408018932941436077">Gardando tarxeta</translation> <translation id="2408955596600435184">Introduce o PIN</translation> <translation id="2409268599591722235">Vamos aló</translation> +<translation id="2409709393952490731">Usar un teléfono ou unha tableta</translation> <translation id="2410079346590497630">Detalles da compilación</translation> <translation id="2410298923485357543">Usar a voz natural cando o dispositivo estea en liña</translation> <translation id="2410754283952462441">Escolle unha conta</translation> @@ -1919,7 +1920,6 @@ <translation id="2673135533890720193">Ler o teu historial de navegación</translation> <translation id="2674764818721168631">Non</translation> <translation id="2675570801872027281">Produciuse un erro ao quitar Bruschetta. Téntao de novo.</translation> -<translation id="2676492189600898281">Enviar comentarios sobre autocompletar</translation> <translation id="2678063897982469759">Reactivar</translation> <translation id="2678100101831051676">Non se puido emitir contido.</translation> <translation id="268053382412112343">Hi&storial</translation> @@ -3771,6 +3771,7 @@ <translation id="4369215744064167350">Aprobouse a solicitude de sitios web</translation> <translation id="4369735607080757018">Compártense tipos de datos limitados entre os sitios para medir o rendemento dos seus anuncios (por exemplo, a hora do día na que se che mostrou un anuncio)</translation> <translation id="4370975561335139969">O correo electrónico e o contrasinal inseridos non coinciden</translation> +<translation id="4374805630006466253">Usar un teléfono ou unha tableta diferente</translation> <translation id="4374831787438678295">Instalador de Linux</translation> <translation id="4375035964737468845">Abrir ficheiros descargados</translation> <translation id="4376226992615520204">A localización está desactivada</translation> @@ -3946,6 +3947,7 @@ <translation id="4522890784888918985">As contas infantís non son compatibles</translation> <translation id="4523876148417776526">Aínda non se obtiveron as listas de sitios XML.</translation> <translation id="4524832533047962394">O modo de inscrición indicado non é compatible con esta versión do sistema operativo. Asegúrate de dispoñer da versión máis recente.</translation> +<translation id="4526051299161934899">Grupos de pestanas gardados ocultos</translation> <translation id="4526853756266614740">Escolle unha imaxe para aplicar o tema ao instante</translation> <translation id="452750746583162491">Revisar os datos sincronizados</translation> <translation id="4527929807707405172">Activar desprazamento inverso. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> @@ -7208,7 +7210,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Non se puido descargar <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Fixar no estante</translation> -<translation id="7552658769580484674">Enviar comentarios sobre autocompletar</translation> <translation id="7552846755917812628">Proba os seguintes consellos:</translation> <translation id="7553012839257224005">Comprobando contedor de Linux</translation> <translation id="7553242001898162573">Introduce o teu contrasinal</translation> @@ -8486,6 +8487,7 @@ <translation id="869884720829132584">Menú de aplicacións</translation> <translation id="869891660844655955">Data de vencemento</translation> <translation id="8699188901396699995">PPD para <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menú que contén os grupos de pestanas gardados ocultos</translation> <translation id="8702825062053163569">Bloqueouse o teu dispositivo (<ph name="DEVICE_TYPE" />).</translation> <translation id="8703346390800944767">Omitir anuncio</translation> <translation id="8705331520020532516">Número de serie</translation> @@ -8766,7 +8768,6 @@ <translation id="8952831374766033534">Non se admite a opción de configuración: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Durante a carga</translation> <translation id="895347679606913382">Iniciando...</translation> -<translation id="8956230710625245889">Abrir en Reader</translation> <translation id="8957757410289731985">Personalizar perfil</translation> <translation id="895944840846194039">Memoria JavaScript</translation> <translation id="8960208913905765425">Conversión de unidades de Respostas rápidas</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index ae80bede..4d257ee 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ફરી ચાલુ કરીએ?</translation> <translation id="1047431265488717055">લિંક ટે&ક્સ્ટને કૉપિ કરો</translation> <translation id="1048286738600630630">પ્રદર્શન</translation> -<translation id="1048770690598418849">તમે હાલ પૂરતું છોડી શકો છો અને તમે સેટઅપ પૂર્ણ કરી લો પછી અમે ઑટોમૅટિક રીતે ફરીથી પ્રયાસ કરીશું</translation> <translation id="1048986595386481879">ગતિશીલ રીતે ફાળવેલી</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> પરથી <ph name="ATTACHMENTS" /> મેળવી રહ્યાં છીએ}one{<ph name="DEVICE_NAME" /> પરથી <ph name="ATTACHMENTS" /> મેળવી રહ્યાં છીએ}other{<ph name="DEVICE_NAME" /> પરથી <ph name="ATTACHMENTS" /> મેળવી રહ્યાં છીએ}}</translation> <translation id="1049743911850919806">છૂપી</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">તમારા ક્લિપબોર્ડ પર કૉપિ કરવામાં આવ્યું</translation> <translation id="2183570493397356669">ચાલુ રાખો બટન બંધ છે</translation> <translation id="2184515124301515068">સાઇટ સાઉન્ડ ક્યારે ચલાવી શકે તે Chromeને પસંદ કરવા દો (સુઝાવ આપીએ છીએ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">કોઈ અન્ય ડિવાઇસ પરથી પેજ શેર કરવામાં આવ્યું છે</translation> <translation id="2187675480456493911">તમારા એકાઉન્ટ પરના અન્ય ડિવાઇસ સાથે સિંક કરેલું. અન્ય વપરાશકર્તાઓ દ્વારા બદલવામાં આવેલા સેટિંગ સિંક કરવામાં આવશે નહીં. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="2187895286714876935">સર્વર પ્રમાણપત્ર આયાત કરવામાં ભૂલ</translation> @@ -1622,6 +1622,7 @@ <translation id="2408018932941436077">કાર્ડ સાચવી રહ્યાં છીએ</translation> <translation id="2408955596600435184">તમારો PIN દાખલ કરો</translation> <translation id="2409268599591722235">ચાલો જઈએ</translation> +<translation id="2409709393952490731">કોઈ ફોન કે ટૅબ્લેટનો ઉપયોગ કરો</translation> <translation id="2410079346590497630">બિલ્ડની વિગતો</translation> <translation id="2410298923485357543">જ્યારે ડિવાઇસ ઑનલાઇન હોય, ત્યારે સાહજિક અવાજનો ઉપયોગ કરો</translation> <translation id="2410754283952462441">એકાઉન્ટ પસંદ કરો</translation> @@ -1918,7 +1919,6 @@ <translation id="2673135533890720193">તમારો બ્રાઉઝિંગ ઇતિહાસ વાંચો</translation> <translation id="2674764818721168631">બંધ</translation> <translation id="2675570801872027281">Bruschetta કાઢી નાખવામાં ભૂલ આવી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation> -<translation id="2676492189600898281">ઑટોમૅટિક રીતે ભરવાની સુવિધા માટે પ્રતિસાદ આપો</translation> <translation id="2678063897982469759">ફરી ચાલુ કરો</translation> <translation id="2678100101831051676">કાસ્ટ કરી શકતા નથી.</translation> <translation id="268053382412112343">Hi&story</translation> @@ -3770,6 +3770,7 @@ <translation id="4369215744064167350">વેબસાઇટ ઍક્સેસ કરવાની વિનંતી મંજૂર કરી</translation> <translation id="4369735607080757018">સાઇટની જાહેરાતોના પ્રદર્શનની માપણી કરવા માટે તેમની વચ્ચે મર્યાદિત પ્રકારના ડેટા શેર કરવામાં આવે છે, જેમ કે તમને જે દિવસે જાહેરાત બતાવવામાં આવી હતી તેનો સમય</translation> <translation id="4370975561335139969">તમે દાખલ કરેલ ઇમેઇલ અને પાસવર્ડ મેળ ખાતા નથી</translation> +<translation id="4374805630006466253">કોઈ અલગ ફોન કે ટૅબ્લેટનો ઉપયોગ કરો</translation> <translation id="4374831787438678295">Linux ઇન્સ્ટૉલર</translation> <translation id="4375035964737468845">ડાઉનલોડ કરેલી ફાઇલોને ખોલો</translation> <translation id="4376226992615520204">સ્થાન બંધ કર્યું</translation> @@ -3945,6 +3946,7 @@ <translation id="4522890784888918985">પેટા એકાઉન્ટને સપોર્ટ આપવામાં આવતો નથી</translation> <translation id="4523876148417776526">XML સાઇટની સૂચિઓ હજી સુધી મેળવવામાં આવી નથી.</translation> <translation id="4524832533047962394">પૂરો પાડેલો નોંધણી મોડ ઑપરેટિંગ સિસ્ટમનાં આ વર્ઝન દ્વારા સમર્થિત નથી. કૃપા કરીને ખાતરી કરો કે તમે એકદમ નવું વર્ઝન ચલાવી રહ્યાં છો અને ફરી પ્રયાસ કરો.</translation> +<translation id="4526051299161934899">છુપાવેલા સાચવેલા ટૅબના ગ્રૂપ</translation> <translation id="4526853756266614740">થીમને ઝટપટ લાગુ કરવા માટે કોઈ છબી પસંદ કરો</translation> <translation id="452750746583162491">તમારા સિંક કરેલા ડેટાનો રિવ્યૂ કરો</translation> <translation id="4527929807707405172">રિવર્સ સ્ક્રોલિંગ ચાલુ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> @@ -4269,6 +4271,7 @@ <translation id="4824037980212326045">Linux બૅકઅપ લો અને રિસ્ટોર કરો</translation> <translation id="4824958205181053313">સિંક કરવાનું રદ કરીએ?</translation> <translation id="4825532258163983651">પાસકી ડિલીટ કરી શકાતી નથી</translation> +<translation id="4827283332383516812">કાર્ડ ડિલીટ કરો</translation> <translation id="4827675678516992122">કનેક્ટ કરી શકાયું નથી</translation> <translation id="4827784381479890589">Chrome બ્રાઉઝરમાં જોડણીની તપાસની વધારેલી સુવિધા (જોડણીના સૂચનો માટે ટેક્સ્ટ Googleને મોકલાય છે)</translation> <translation id="4827904420700932487">આ છબી માટે QR કોડ બનાવો</translation> @@ -5293,6 +5296,7 @@ <translation id="5792295754950501287"><ph name="CARD_DESCRIPTION" /> માટે વધુ ક્રિયાઓ</translation> <translation id="5792728279623964091">કૃપા કરીને તમારા પાવર બટન પર ટૅપ કરો</translation> <translation id="5792874008054171483"><ph name="SITE_NAME" /> માટે વધુ ક્રિયાઓ</translation> +<translation id="5793317771769868848">આ ડિવાઇસમાંથી આ ચુકવણી પદ્ધતિ ડિલીટ કરવામાં આવશે</translation> <translation id="5793339252089865437">જો તમે તમારા મોબાઇલ નેટવર્ક પરથી અપડેટ ડાઉનલોડ કરો છો, તો આના કારણે વધારાનો શુલ્ક વસૂલવામાં આવી શકે છે.</translation> <translation id="5793420564274426163">જોડાણનું કન્ફર્મેશન</translation> <translation id="5793430094159150686">તમારો પાસવર્ડ બદલાઈ ગયો છે. તમારા સ્થાનિક ડેટાને રિસ્ટોર કરવા માટે, તમારે તમારો જૂનો પાસવર્ડ દાખલ કરવો જરૂરી છે.</translation> @@ -7212,7 +7216,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ડાઉનલોડ અસફળ થયું</translation> <translation id="7551643184018910560">શેલ્ફ પર પિન કરો</translation> -<translation id="7552658769580484674">ઑટોમૅટિક રીતે ભરવાની સુવિધા માટે પ્રતિસાદ આપો</translation> <translation id="7552846755917812628">નીચેની ટિપને અજમાવો:</translation> <translation id="7553012839257224005">Linux કન્ટેનર ચેક કરી રહ્યાં છીએ</translation> <translation id="7553242001898162573">તમારો પાસવર્ડ દાખલ કરો</translation> @@ -7274,6 +7277,7 @@ <translation id="7609148976235050828">કૃપા કરીને ઇન્ટરનેટથી કનેક્ટ થાઓ અને ફરી પ્રયાસ કરો.</translation> <translation id="7612401678989660900">માઇક્રોફોનની પરવાનગી ધરાવતી બધી ઍપ અને વેબસાઇટ માટે, ઍક્સેસની મંજૂરી આપો</translation> <translation id="7612655942094160088">કનેક્ટ કરેલી ફોન સુવિધાઓ ચાલુ છે.</translation> +<translation id="7612989789287281429">તમને સાઇન ઇન કરી રહ્યાં છીએ…</translation> <translation id="7614260613810441905">કોઈ સાઇટ તમારા ડિવાઇસમાંની ફાઇલો કે ફોલ્ડરોમાં ફેરફાર કરવા માગે ત્યારે પૂછવામાં આવે (સુઝાવ આપેલો છે)</translation> <translation id="761530003705945209">Google ડ્રાઇવ પર બૅકઅપ લો. તમારો ડેટા સરળતાથી પાછો મેળવો અથવા ડિવાઇસને કોઈપણ સમયે સ્વિચ કરો. તમારા બૅકઅપમાં ઍપનો ડેટા શામેલ છે. તમારું બૅકઅપ Google પર અપલોડ કરવામાં આવે છે અને તમારા Google એકાઉન્ટ પાસવર્ડનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરવામાં આવે છે.</translation> <translation id="7615365294369022248">તમારું એકાઉન્ટ ઉમેરતી વખતે ભૂલ આવી હતી</translation> @@ -8484,6 +8488,7 @@ <translation id="869884720829132584">ઍપ્લિકેશનો મેનૂ</translation> <translation id="869891660844655955">સમાપ્તિ તારીખ</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> માટે PPD</translation> +<translation id="8702278591052316269">મેનૂ જેમાં છુપાવેલા સાચવેલા ટૅબના ગ્રૂપ શામેલ છે</translation> <translation id="8702825062053163569">તમારું <ph name="DEVICE_TYPE" /> લૉક હતું.</translation> <translation id="8703346390800944767">જાહેરાત છોડો</translation> <translation id="8705331520020532516">અનુક્રમ નંબર</translation> @@ -8765,7 +8770,6 @@ <translation id="8952831374766033534">ગોઠવણીના વિકલ્પની સુવિધા નથી: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ચાર્જિંગ થતી વખતે</translation> <translation id="895347679606913382">પ્રારંભ કરે છે...</translation> -<translation id="8956230710625245889">Readerમાં ખોલો</translation> <translation id="8957757410289731985">પ્રોફાઇલ કસ્ટમાઇઝ કરો</translation> <translation id="895944840846194039">JavaScript મેમરી</translation> <translation id="8960208913905765425">ઝડપી જવાબોનું એકમ રૂપાંતરણ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 9f47cad..05146ff3 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">क्या आप Linux को रीस्टार्ट करना चाहते हैं?</translation> <translation id="1047431265488717055">लिंक ले&ख को कॉपी करें</translation> <translation id="1048286738600630630">डिसप्ले</translation> -<translation id="1048770690598418849">'अभी नहीं' विकल्प चुनें. सेटअप पूरा होने के बाद, हम अपने-आप फिर से कोशिश करेंगे</translation> <translation id="1048986595386481879">डाइनैमिक रूप से दिया गया साइज़</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> से <ph name="ATTACHMENTS" /> मिल रहा है}one{<ph name="DEVICE_NAME" /> से <ph name="ATTACHMENTS" /> मिल रहा है}other{<ph name="DEVICE_NAME" /> से <ph name="ATTACHMENTS" /> मिल रहे हैं}}</translation> <translation id="1049743911850919806">गुप्त</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">आपके क्लिपबोर्ड पर कॉपी किया गया</translation> <translation id="2183570493397356669">'जारी रखें' बटन को बंद किया गया</translation> <translation id="2184515124301515068">Chrome को चुनने दें कि साइटें कब आवाज़ चला सकती हैं (सुझाव)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">पेज को किसी दूसरे डिवाइस से शेयर किया गया</translation> <translation id="2187675480456493911">आपके खाते पर अन्य डिवाइस से सिंक किया गया. अन्य उपयोगकर्ताओं के सेटिंग में किए गए बदलाव सिंक नहीं होंगे. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="2187895286714876935">सर्वर प्रमाणपत्र आयात गड़बड़ी</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">कार्ड को सेव किया जा रहा है</translation> <translation id="2408955596600435184">अपना पिन डालें</translation> <translation id="2409268599591722235">आइए शुरू करें</translation> +<translation id="2409709393952490731">फ़ोन या टैबलेट का इस्तेमाल करें</translation> <translation id="2410079346590497630">बिल्ड की जानकारी</translation> <translation id="2410298923485357543">डिवाइस इंटरनेट से कनेक्ट होने पर, अच्छी क्वालिटी वाली आवाज़ का इस्तेमाल करें</translation> <translation id="2410754283952462441">कोई खाता चुनें</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">अपना ब्राउज़िंग इतिहास पढ़ें</translation> <translation id="2674764818721168631">बंद है</translation> <translation id="2675570801872027281">Bruschetta को हटाने में गड़बड़ी हुई. कृपया फिर से कोशिश करें.</translation> -<translation id="2676492189600898281">ऑटोमैटिक भरने की सुविधा के बारे में सुझाव/राय भेजें या शिकायत करें</translation> <translation id="2678063897982469759">फिर से चालू करें</translation> <translation id="2678100101831051676">कास्ट नहीं हो पा रहा है.</translation> <translation id="268053382412112343">इति&हास</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">वेबसाइट ऐक्सेस करने के लिए किए गए अनुरोध को मंज़ूरी मिल गई है</translation> <translation id="4369735607080757018">विज्ञापनों की परफ़ॉर्मेंस मापने के लिए साइटों के बीच सीमित डेटा शेयर किया जाता है. जैसे, किसी दिन के किस समय आपको विज्ञापन दिखाया गया</translation> <translation id="4370975561335139969"> डाले गए ईमेल और पासवर्ड का मिलान नहीं हो रहा</translation> +<translation id="4374805630006466253">किसी दूसरे फ़ोन या टैबलेट का इस्तेमाल करें</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> <translation id="4375035964737468845">डाउनलोड की गई फ़ाइलें खोलें</translation> <translation id="4376226992615520204">जगह की जानकारी इस्तेमाल करने की सुविधा बंद है</translation> @@ -7231,7 +7232,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> डाउनलोड असफल</translation> <translation id="7551643184018910560">अलमारी से पिन करें</translation> -<translation id="7552658769580484674">ऑटोमैटिक भरने की सुविधा के बारे में सुझाव/राय भेजें या शिकायत करें</translation> <translation id="7552846755917812628">ये टिप्स आज़माएं:</translation> <translation id="7553012839257224005">Linux कंटेनर की जांच हो रही है</translation> <translation id="7553242001898162573">अपना पासवर्ड डालें</translation> @@ -8791,7 +8791,6 @@ <translation id="8952831374766033534">कॉन्फ़िगर करने का विकल्प काम नहीं करता: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">चार्ज करते समय</translation> <translation id="895347679606913382">प्रारंभ कर रहा है...</translation> -<translation id="8956230710625245889">रीडर में खोलें</translation> <translation id="8957757410289731985">प्रोफ़ाइल को पसंद के मुताबिक बनाएं</translation> <translation id="895944840846194039">JavaScript मेमोरी</translation> <translation id="8960208913905765425">'हाज़िर जवाब' का यूनिट कन्वर्ज़न</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index c794342..8b379d7 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Ponovno pokrenuti Linux?</translation> <translation id="1047431265488717055">Kopiraj te&kst veze</translation> <translation id="1048286738600630630">Zasloni</translation> -<translation id="1048770690598418849">Zasad možete preskočiti, pa ćemo pokušati ponovo automatski kad dovršite postavljanje</translation> <translation id="1048986595386481879">Dinamički dodijeljeno</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Primate <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}one{Primate <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}few{Primate <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}other{Primate <ph name="ATTACHMENTS" /> s uređaja <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Anonimno</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Kopirano u međuspremnik</translation> <translation id="2183570493397356669">Onemogućen je gumb Nastavi</translation> <translation id="2184515124301515068">Neka Chrome odluči kada web-lokacije mogu reproducirati zvuk (preporučeno)</translation> +<translation id="2186206192313702726">Google objektiv</translation> <translation id="2186711480981247270">Stranica je podijeljena s drugog uređaja</translation> <translation id="2187675480456493911">Sinkronizirano s drugim uređajima na vašem računu. Postavke koje izmijene drugi korisnici neće se sinkronizirati. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Pogreška pri uvozu Certifikata poslužitelja</translation> @@ -1664,6 +1664,7 @@ <translation id="2442916515643169563">Sjenčanje teksta</translation> <translation id="2443487764245141020">Web-lokacije će možda također trebati prepoznati vaš uređaj pomoću identifikatora</translation> <translation id="244475495405467108">Zatvori kartice s lijeve strane</translation> +<translation id="2444874983932528148">Jednostavno nastavite tamo gdje ste stali</translation> <translation id="2445081178310039857">Obavezan je korijenski direktorij proširenja.</translation> <translation id="2445484935443597917">Izradi novi profil</translation> <translation id="2445726032315793326">Djelomično povećalo</translation> @@ -1924,7 +1925,6 @@ <translation id="2673135533890720193">čitati vašu povijest pregledavanja</translation> <translation id="2674764818721168631">Isključeno</translation> <translation id="2675570801872027281">Pogreška pri uklanjanju Bruschette. Pokušajte opet.</translation> -<translation id="2676492189600898281">Slanje povratnih informacija za automatsko popunjavanje</translation> <translation id="2678063897982469759">Ponovo omogući</translation> <translation id="2678100101831051676">Emitiranje nije uspjelo.</translation> <translation id="268053382412112343">Hi&story (Povijest)</translation> @@ -2482,6 +2482,7 @@ <translation id="3177909033752230686">Jezik stranice:</translation> <translation id="3177914167275935955">Vaš uređaj uključuje Nadogradnju za Chrome za obrazovanje, no vaše korisničko ime nije povezano s računom za Google for Education. Izradite račun za Google for Education na sekundarnom uređaju na stranici g.co/workspace/edusignup.</translation> <translation id="3179982752812949580">Font teksta</translation> +<translation id="3180284704187420717">Spremanje oznaka, zaporki i drugih podataka uz sinkronizaciju</translation> <translation id="3181954750937456830">Sigurno pregledavanje (štiti vas i vaš uređaj od opasnih web-lokacija)</translation> <translation id="3182749001423093222">Provjera pravopisa</translation> <translation id="3183139917765991655">Uvoz profila</translation> @@ -2973,6 +2974,7 @@ <translation id="3637203148990213388">Dodatni računi</translation> <translation id="3639220004740062347">Zatvori način čitača</translation> <translation id="3640214691812501263">Želite li dodati proširenje "<ph name="EXTENSION_NAME" />" za korisnika <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Zaštita zaporki od krađe identiteta</translation> <translation id="3640613767643722554">Naučite Asistent da prepoznaje vaš glas</translation> <translation id="3641456520301071208">Web-lokacije mogu zatražiti vašu lokaciju</translation> <translation id="3642070413432681490">Kružni pokazivač</translation> @@ -3397,6 +3399,7 @@ <translation id="3988996860813292272">Odaberite vremensku zonu</translation> <translation id="399179161741278232">Uvezeno</translation> <translation id="3992008114154328194">Preuzimanje <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Stvaranje sigurnosne kopije</translation> <translation id="3993887353483242788">Sinkronizirajte uređaj <ph name="DEVICE_TYPE" /> kako bi vaše preferencije bile spremne na svim uređajima kad se prijavite Google računom. Preferencije uključuju aplikacije, postavke, zaporke Wi-Fi mreže, jezike, pozadinu, tipkovne prečace i više.</translation> <translation id="3994318741694670028">Nažalost, vaše je računalo konfigurirano pogrešno oblikovanim ID-jem hardvera. To sprječava ažuriranje ChromeOS Flexa najnovijim sigurnosnim popravcima pa bi vaše računalo <ph name="BEGIN_BOLD" />moglo biti ranjivo na zlonamjerne napade<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Otključajte telefon i približite ga da biste otključali svoj <ph name="DEVICE_TYPE" />.</translation> @@ -3957,6 +3960,7 @@ <translation id="452750746583162491">Pregledajte svoje sinkronizirane podatke</translation> <translation id="4527929807707405172">Omogući obrnuto pomicanje. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Prijedlog prijevoda</translation> +<translation id="4528638190900283934">Prijavite se za dodatne značajke</translation> <translation id="4529455689802245339">Chromeovi automatski titlovi možda neće funkcionirati</translation> <translation id="4530494379350999373">Podrijetlo</translation> <translation id="4531924570968473143">Koga želite dodati na ovaj uređaj <ph name="DEVICE_TYPE" />?</translation> @@ -6367,6 +6371,7 @@ <translation id="6774710250118040929">Dodavanje nove zaporke</translation> <translation id="6775163072363532304">Ovdje će se pojaviti dostupni uređaji.</translation> <translation id="677646486571529447">Dodaj napomenu</translation> +<translation id="6776589734354015877">Preuzmite dodatne značajke</translation> <translation id="6776729248872343918">Omogući Brzo uparivanje</translation> <translation id="6777817260680419853">Preusmjeravanje je blokirano</translation> <translation id="6779092717724412415">Da biste izradili isticanje poput ovog, odaberite bilo koji tekst i kliknite desnom tipkom.</translation> @@ -7219,7 +7224,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Datoteka <ph name="FILE_NAME" /> nije preuzeta</translation> <translation id="7551643184018910560">Prikvači na policu</translation> -<translation id="7552658769580484674">Slanje povratnih informacija za automatsko popunjavanje</translation> <translation id="7552846755917812628">Pokušajte učiniti sljedeće:</translation> <translation id="7553012839257224005">Provjera Linuxovog spremnika</translation> <translation id="7553242001898162573">Unesite zaporku</translation> @@ -7763,6 +7767,7 @@ <translation id="8023801379949507775">Ažuriraj proširenja sada</translation> <translation id="8025151549289123443">Zaključan zaslon i prijava</translation> <translation id="8026334261755873520">Brisanje podataka o pregledavanju</translation> +<translation id="8026471514777758216">Svi vaši uređaji</translation> <translation id="8028060951694135607">Oporavak Microsoftovog ključa</translation> <translation id="8028803902702117856">Preuzimanje <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Veličina</translation> @@ -8781,7 +8786,6 @@ <translation id="8952831374766033534">Opcija konfiguracije nije podržana: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Tijekom punjenja</translation> <translation id="895347679606913382">Početak...</translation> -<translation id="8956230710625245889">Otvori u Readeru</translation> <translation id="8957757410289731985">Prilagodite profil</translation> <translation id="895944840846194039">Memorija JavaScripta</translation> <translation id="8960208913905765425">Pretvorba jedinica za brze odgovore</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 612d1bc..6800120 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Újraindítja a Linuxot?</translation> <translation id="1047431265488717055">Link szövegének má&solása</translation> <translation id="1048286738600630630">Megjelenítés</translation> -<translation id="1048770690598418849">Egyelőre kihagyhatja, és a beállítás befejezése után automatikusan újrapróbálkozunk</translation> <translation id="1048986595386481879">Dinamikusan kiosztva</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> fogadása innen: <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> fogadása innen: <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognitó mód</translation> @@ -1368,6 +1367,7 @@ <translation id="2182058453334755893">Vágólapra másolva</translation> <translation id="2183570493397356669">Folytatás gomb letiltva</translation> <translation id="2184515124301515068">A Chrome dönthet arról, hogy a webhelyek lejátszhatnak-e hangot (ajánlott)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Másik eszközről megosztott oldal</translation> <translation id="2187675480456493911">Szinkronizálva van a fiókjában lévő egyéb eszközökkel. A más felhasználók által módosított beállításokat a rendszer nem szinkronizálja majd. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="2187895286714876935">Hiba a szervertanúsítvány importálásánál</translation> @@ -1935,7 +1935,6 @@ <translation id="2673135533890720193">A böngészési előzmények olvasása</translation> <translation id="2674764818721168631">Ki</translation> <translation id="2675570801872027281">Hiba történt a Bruschetta eltávolításakor. Próbálkozzon újra.</translation> -<translation id="2676492189600898281">Visszajelzés az automatikus kitöltésről</translation> <translation id="2678063897982469759">Újraengedélyezés</translation> <translation id="2678100101831051676">Átküldés sikertelen.</translation> <translation id="268053382412112343">Elő&zmények</translation> @@ -7231,7 +7230,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">A(z) <ph name="FILE_NAME" /> letöltése nem sikerült</translation> <translation id="7551643184018910560">Rögzítés a polcra</translation> -<translation id="7552658769580484674">Visszajelzés az automatikus kitöltésről</translation> <translation id="7552846755917812628">Próbálja ki az alábbi tippeket:</translation> <translation id="7553012839257224005">Linux-tároló ellenőrzése</translation> <translation id="7553242001898162573">Adja meg a jelszavát</translation> @@ -8791,7 +8789,6 @@ <translation id="8952831374766033534">Nem támogatott konfigurációs beállítás: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Töltés közben</translation> <translation id="895347679606913382">Kezdés...</translation> -<translation id="8956230710625245889">Megnyitás az olvasóban</translation> <translation id="8957757410289731985">Profil személyre szabása</translation> <translation id="895944840846194039">JavaScript-memória</translation> <translation id="8960208913905765425">Gyors válaszok – mértékegységváltás</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 47e84295..d5ce7be 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Վերագործարկե՞լ Լինուքսը</translation> <translation id="1047431265488717055">Պատճենել հղման տեքստը</translation> <translation id="1048286738600630630">Էկրաններ</translation> -<translation id="1048770690598418849">Կարող եք բաց թողնել այս քայլը, և երբ ավարտեք կարգավորումը, մենք ավտոմատ նորից կփորձենք</translation> <translation id="1048986595386481879">Դինամիկ կերպով հատկացված</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" />ի ստացում <ph name="DEVICE_NAME" /> սարքից}one{<ph name="ATTACHMENTS" />ի ստացում <ph name="DEVICE_NAME" /> սարքից}other{<ph name="ATTACHMENTS" />ի ստացում <ph name="DEVICE_NAME" /> սարքից}}</translation> <translation id="1049743911850919806">Ինկոգնիտո</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Պատճենվեց սեղմատախտակին</translation> <translation id="2183570493397356669">«Շարունակել» կոճակն անջատված է</translation> <translation id="2184515124301515068">Թույլ տալ Chrome-ին ընտրել՝ որ կայքերում ձայն նվագարկվի (խորհուրդ է տրվում)</translation> +<translation id="2186206192313702726">Google Տեսապակի</translation> <translation id="2186711480981247270">Էջն ուղարկվել է այլ սարքից</translation> <translation id="2187675480456493911">Համաժամացված է ձեր հաշվին կցված այլ սարքերի հետ։ Այլ օգտատերերի կողմից փոփոխված կարգավորումները չեն համաժամացվի։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Սերվերի վկայագրի ներմուծման սխալ</translation> @@ -1626,6 +1626,7 @@ <translation id="2408018932941436077">Քարտը պահվում է</translation> <translation id="2408955596600435184">Մուտքագրեք ձեր PIN կոդը</translation> <translation id="2409268599591722235">Սկսել</translation> +<translation id="2409709393952490731">Օգտագործել հեռախոս կամ պլանշետ</translation> <translation id="2410079346590497630">կառուցման մասին</translation> <translation id="2410298923485357543">Օգտագործել բնական ձայնը, երբ սարքը միացած է ինտերնետին</translation> <translation id="2410754283952462441">Ընտրեք հաշիվ</translation> @@ -1922,7 +1923,6 @@ <translation id="2673135533890720193">Կարդալ ձեր զննարկման պատմությունը</translation> <translation id="2674764818721168631">Անջատված է</translation> <translation id="2675570801872027281">Չհաջողվեց հեռացնել Bruschetta-ն։ Նորից փորձեք։</translation> -<translation id="2676492189600898281">Ինքնալրացման մասին կարծիքի հայտնում</translation> <translation id="2678063897982469759">Նորից միացնել</translation> <translation id="2678100101831051676">Չհաջողվեց հեռարձակել։</translation> <translation id="268053382412112343">Պատ&մություն</translation> @@ -3774,6 +3774,7 @@ <translation id="4369215744064167350">Կայքի հարցումը հաստատվել է</translation> <translation id="4369735607080757018">Գովազդի արդյունավետությունը գնահատելու համար կայքերը փոխանակվում են որոշակի տվյալներով, օրինակ՝ տեղեկություններով, թե երբ է գովազդը ձեզ ցուցադրվել</translation> <translation id="4370975561335139969">Մուտքագրված էլփոստը և գաղտնաբառը չեն համընկնում</translation> +<translation id="4374805630006466253">Օգտագործել մեկ այլ հեռախոս կամ պլանշետ</translation> <translation id="4374831787438678295">Լինուքսի տեղադրիչ</translation> <translation id="4375035964737468845">Բացել ներբեռնված ֆայլերը</translation> <translation id="4376226992615520204">Տեղորոշումն անջատված է</translation> @@ -7217,7 +7218,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ֆայլի ներբեռնումը ձախողվեց</translation> <translation id="7551643184018910560">Ամրացնել դարակում</translation> -<translation id="7552658769580484674">Ինքնալրացման մասին կարծիքի հայտնում</translation> <translation id="7552846755917812628">Փորձեք անել հետևյալը՝</translation> <translation id="7553012839257224005">Լինուքսի կոնտեյները ստուգվում է</translation> <translation id="7553242001898162573">Մուտքագրեք ձեր գաղտնաբառը</translation> @@ -8776,7 +8776,6 @@ <translation id="8952831374766033534">Կազմաձևումը չի աջակցվում՝ <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Լիցքավորման ընթացքում</translation> <translation id="895347679606913382">Մեկնարկ…</translation> -<translation id="8956230710625245889">Բացել Reader-ում</translation> <translation id="8957757410289731985">Կարգավորել պրոֆիլը</translation> <translation id="895944840846194039">JavaScript հիշողություն</translation> <translation id="8960208913905765425">Արագ պատասխաններ․ չափման միավորների փոխարկում</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 8f584ac..764755e3 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Mulai ulang Linux?</translation> <translation id="1047431265488717055">Salin Te&ks Tautan</translation> <translation id="1048286738600630630">Tampilan</translation> -<translation id="1048770690598418849">Anda dapat melewatinya untuk saat ini dan kami akan mencobanya lagi secara otomatis setelah Anda menyelesaikan penyiapan</translation> <translation id="1048986595386481879">Dialokasikan secara dinamis</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Menerima <ph name="ATTACHMENTS" /> dari <ph name="DEVICE_NAME" />}other{Menerima <ph name="ATTACHMENTS" /> dari <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Samaran</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Disalin ke Papan Klip Anda</translation> <translation id="2183570493397356669">Tombol Lanjutkan dinonaktifkan</translation> <translation id="2184515124301515068">Izinkan Chrome memilih kapan situs dapat memutar suara (direkomendasikan)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Halaman yang dibagikan dari perangkat lain</translation> <translation id="2187675480456493911">Disinkronkan dengan perangkat lain di akun Anda. Setelan yang diubah oleh pengguna lain tidak akan disinkronkan. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Kesalahan Impor Sertifikat Server</translation> @@ -1639,6 +1639,7 @@ <translation id="2408018932941436077">Menyimpan kartu</translation> <translation id="2408955596600435184">Masukkan PIN</translation> <translation id="2409268599591722235">Ayo mulai!</translation> +<translation id="2409709393952490731">Gunakan ponsel atau tablet</translation> <translation id="2410079346590497630">Detail build</translation> <translation id="2410298923485357543">Gunakan suara alami saat perangkat online</translation> <translation id="2410754283952462441">Pilih akun</translation> @@ -1935,7 +1936,6 @@ <translation id="2673135533890720193">Membaca histori penjelajahan Anda</translation> <translation id="2674764818721168631">Nonaktif</translation> <translation id="2675570801872027281">Terjadi error saat menghapus Bruschetta. Coba lagi.</translation> -<translation id="2676492189600898281">Berikan masukan Isi Otomatis</translation> <translation id="2678063897982469759">Aktifkan ulang</translation> <translation id="2678100101831051676">Tidak dapat mentransmisikan.</translation> <translation id="268053382412112343">Ri&wayat</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">Permintaan situs disetujui</translation> <translation id="4369735607080757018">Jenis data tertentu akan dibagikan antar-situs untuk mengukur performa iklan situs tersebut, seperti waktu iklan ditampilkan kepada Anda</translation> <translation id="4370975561335139969">Email dan sandi yang Anda masukkan tidak cocok</translation> +<translation id="4374805630006466253">Gunakan ponsel atau tablet lain</translation> <translation id="4374831787438678295">Installer Linux</translation> <translation id="4375035964737468845">Membuka file yang didownload</translation> <translation id="4376226992615520204">Lokasi dinonaktifkan</translation> @@ -3963,6 +3964,7 @@ <translation id="4522890784888918985">Akun turunan tidak didukung</translation> <translation id="4523876148417776526">Sitelist XML yang belum diambil.</translation> <translation id="4524832533047962394">Mode pendaftaran yang disediakan tidak didukung oleh versi sistem operasi ini. Pastikan Anda menjalankan versi terbaru.</translation> +<translation id="4526051299161934899">Grup tab tersimpan tersembunyi</translation> <translation id="4526853756266614740">Pilih gambar untuk langsung menerapkan tema</translation> <translation id="452750746583162491">Tinjau data Anda yang disinkronkan</translation> <translation id="4527929807707405172">Aktifkan scroll terbalik. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> @@ -7228,7 +7230,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Gagal mendownload <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Sematkan ke rak</translation> -<translation id="7552658769580484674">Berikan Masukan Isi Otomatis</translation> <translation id="7552846755917812628">Coba tips berikut:</translation> <translation id="7553012839257224005">Memeriksa container Linux</translation> <translation id="7553242001898162573">Masukkan sandi Anda</translation> @@ -8507,6 +8508,7 @@ <translation id="869884720829132584">Menu aplikasi</translation> <translation id="869891660844655955">Masa berlaku</translation> <translation id="8699188901396699995">PPD untuk <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menu yang berisi grup tab tersimpan tersembunyi</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> Anda dikunci.</translation> <translation id="8703346390800944767">Lewati Iklan</translation> <translation id="8705331520020532516">Nomor Seri</translation> @@ -8787,7 +8789,6 @@ <translation id="8952831374766033534">Opsi konfigurasi tidak didukung: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Saat mengisi daya</translation> <translation id="895347679606913382">Memulai...</translation> -<translation id="8956230710625245889">Buka di Reader</translation> <translation id="8957757410289731985">Sesuaikan profil</translation> <translation id="895944840846194039">Memori JavaScript</translation> <translation id="8960208913905765425">Konversi unit Jawaban Instan</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 671b587f..b789c65 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Viltu endurræsa Linux?</translation> <translation id="1047431265488717055">Afrita tenglate&xta</translation> <translation id="1048286738600630630">Skjáir</translation> -<translation id="1048770690598418849">Þú getur sleppt þessu núna og við reynum sjálfkrafa aftur þegar uppsetningu lýkur</translation> <translation id="1048986595386481879">Kvik úthlutun</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Móttekur <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}one{Móttekur <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}other{Móttekur <ph name="ATTACHMENTS" /> frá <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Fara huldu höfðu</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">Afritað á klippiborðið</translation> <translation id="2183570493397356669">Slökkt á hnappi til að halda áfram</translation> <translation id="2184515124301515068">Leyfa Chrome að velja hvenær vefsvæði geta spilað hljóð (ráðlagt)</translation> +<translation id="2186206192313702726">Google linsa</translation> <translation id="2186711480981247270">Síðu deilt úr öðru tæki</translation> <translation id="2187675480456493911">Samstillt við önnur tæki á reikningnum. Breytingar annarra notenda á stillingum verða ekki samstilltar. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Villa við innflutning á vottorði þjóns</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">Vistar kort</translation> <translation id="2408955596600435184">Sláðu inn PIN-númerið þitt</translation> <translation id="2409268599591722235">Byrjum ballið</translation> +<translation id="2409709393952490731">Nota síma eða spjaldtölvu</translation> <translation id="2410079346590497630">Upplýsingar um smíð</translation> <translation id="2410298923485357543">Nota eðlilega rödd þegar tækið er nettengt</translation> <translation id="2410754283952462441">Veldu reikning</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">Lesa vafraferilinn þinn</translation> <translation id="2674764818721168631">Slökkt</translation> <translation id="2675570801872027281">Villa við að fjarlægja Bruschetta. Reyndu aftur.</translation> -<translation id="2676492189600898281">Senda ábendingu um sjálfvirka útfyllingu</translation> <translation id="2678063897982469759">Virkja aftur</translation> <translation id="2678100101831051676">Ekki er hægt að senda út.</translation> <translation id="268053382412112343">Ferill</translation> @@ -3788,6 +3788,7 @@ <translation id="4369215744064167350">Beiðni um vefsvæði samþykkt</translation> <translation id="4369735607080757018">Aðeins tilteknum gerðum gagna er deilt á milli vefsvæða til að mæla árangur auglýsinga þeirra, t.d. tími dags sem auglýsing var birt</translation> <translation id="4370975561335139969">Netfangið og aðgangsorðið sem þú slóst inn passa ekki saman</translation> +<translation id="4374805630006466253">Nota annan síma eða spjaldtölvu</translation> <translation id="4374831787438678295">Linux-uppsetningarforrit</translation> <translation id="4375035964737468845">Opna sóttar skrár</translation> <translation id="4376226992615520204">Slökkt á staðsetningu</translation> @@ -3964,6 +3965,7 @@ <translation id="4522890784888918985">Reikningar barna eru ekki studdir</translation> <translation id="4523876148417776526">Ekki er búið að sækja XML-vefslóðalista enn.</translation> <translation id="4524832533047962394">Tilgreind skráningaraðferð er ekki studd í þessari útgáfu stýrikerfisins. Gakktu úr skugga um að þú sért að nota nýjustu útgáfuna.</translation> +<translation id="4526051299161934899">Vistaðir flipahópar sem eru faldir</translation> <translation id="4526853756266614740">Veldu mynd til að nota þemað strax</translation> <translation id="452750746583162491">Fara yfir samstillt gögn</translation> <translation id="4527929807707405172">Kveikja á öfugri flettingu <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> @@ -4288,6 +4290,7 @@ <translation id="4824037980212326045">Afritun og endurheimt í Linux</translation> <translation id="4824958205181053313">Hætta við samstillingu?</translation> <translation id="4825532258163983651">Ekki tókst að eyða aðgangslykli</translation> +<translation id="4827283332383516812">Eyða korti</translation> <translation id="4827675678516992122">Tenging mistókst</translation> <translation id="4827784381479890589">Bætt villuleit í Chrome vafra (texti er sendur til Google til að fá tillögur að stafsetningu)</translation> <translation id="4827904420700932487">Búa til QR-kóða fyrir þessa mynd</translation> @@ -5311,6 +5314,7 @@ <translation id="5792295754950501287">Fleiri aðgerðir fyrir <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Ýttu á aflrofann</translation> <translation id="5792874008054171483">Fleiri aðgerðir fyrir <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Greiðslumátanum verður eytt úr tækinu</translation> <translation id="5793339252089865437">Ef þú sækir uppfærsluna í gegnum farsímakerfi gætirðu þurft að greiða fyrir umframnotkun.</translation> <translation id="5793420564274426163">Pörunarstaðfesting</translation> <translation id="5793430094159150686">Aðgangsorðið þitt hefur breyst. Þú þarft að slá inn gamla aðgangsorðið þitt til að endurheimta staðbundin gögn.</translation> @@ -7229,7 +7233,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Mistókst að sækja <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Festa á hillu</translation> -<translation id="7552658769580484674">Senda ábendingu um sjálfvirka útfyllingu</translation> <translation id="7552846755917812628">Prófaðu eftirfarandi:</translation> <translation id="7553012839257224005">Athugar Linux-geyminn</translation> <translation id="7553242001898162573">Sláðu inn aðgangsorðið þitt</translation> @@ -7291,6 +7294,7 @@ <translation id="7609148976235050828">Tengstu internetinu og reyndu aftur.</translation> <translation id="7612401678989660900">Veita forritum og vefsvæðum með hljóðnemaheimild aðgang</translation> <translation id="7612655942094160088">Kveikja á tengdum eiginleikum í síma</translation> +<translation id="7612989789287281429">Skráir þig inn…</translation> <translation id="7614260613810441905">Spyrja þegar vefsvæði vill breyta skrám eða möppum í tækinu (ráðlagt)</translation> <translation id="761530003705945209">Vista öryggisafrit á Google Drive. Endurheimtu gögnin þín eða skiptu um tæki hvenær sem er. Öryggisafritið inniheldur forritsgögn. Öryggisafritunum þínum er hlaðið inn á Google og þau dulkóðuð með aðgangsorði Google reikningsins.</translation> <translation id="7615365294369022248">Villa kom upp við að bæta við reikningi</translation> @@ -8506,6 +8510,7 @@ <translation id="869884720829132584">Forritavalmynd</translation> <translation id="869891660844655955">Lokadagsetning</translation> <translation id="8699188901396699995">PPD fyrir <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Valmynd með vistuðum flipahópum sem eru faldir</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> var læst.</translation> <translation id="8703346390800944767">Sleppa auglýsingu</translation> <translation id="8705331520020532516">Raðnúmer</translation> @@ -8787,7 +8792,6 @@ <translation id="8952831374766033534">Stillingarvalkostur ekki studdur: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Í hleðslu</translation> <translation id="895347679606913382">Ræsir...</translation> -<translation id="8956230710625245889">Opna í Lesara</translation> <translation id="8957757410289731985">Sérsníða prófíl</translation> <translation id="895944840846194039">JavaScript-minni</translation> <translation id="8960208913905765425">Umreikningur mæligilda skjótra svara</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 87b4fd2..31fe266 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Riavviare Linux?</translation> <translation id="1047431265488717055">Copia testo del lin&k</translation> <translation id="1048286738600630630">Display</translation> -<translation id="1048770690598418849">Puoi saltare per ora e riproveremo automaticamente al termine della configurazione</translation> <translation id="1048986595386481879">Allocazione dinamica</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Ricezione di <ph name="ATTACHMENTS" /> dal dispositivo <ph name="DEVICE_NAME" />}other{Ricezione di <ph name="ATTACHMENTS" /> dal dispositivo <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">In incognito</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">Copia negli appunti eseguita</translation> <translation id="2183570493397356669">Pulsante Continua non attivo</translation> <translation id="2184515124301515068">Consenti a Chrome di scegliere quando i siti possono riprodurre audio (opzione consigliata)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Pagina condivisa da un altro dispositivo</translation> <translation id="2187675480456493911">Sincronizzata con altri dispositivi sul tuo account. Le impostazioni modificate da altri utenti non verranno sincronizzate. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Errore di importazione del certificato del server</translation> @@ -1661,6 +1661,7 @@ <translation id="2442916515643169563">Ombreggiatura testo</translation> <translation id="2443487764245141020">I siti potrebbero anche dover riconoscere il tuo dispositivo tramite un identificatore</translation> <translation id="244475495405467108">Chiudi schede a sinistra</translation> +<translation id="2444874983932528148">Riprendi facilmente da dove avevi interrotto</translation> <translation id="2445081178310039857">La directory principale dell'estensione è obbligatoria.</translation> <translation id="2445484935443597917">Crea un nuovo profilo</translation> <translation id="2445726032315793326">Ingrandimento parziale</translation> @@ -1921,7 +1922,6 @@ <translation id="2673135533890720193">Leggere la cronologia di navigazione</translation> <translation id="2674764818721168631">Off</translation> <translation id="2675570801872027281">Errore durante la rimozione di Bruschetta. Riprova.</translation> -<translation id="2676492189600898281">Invia feedback su compilazione automatica</translation> <translation id="2678063897982469759">Riattiva</translation> <translation id="2678100101831051676">Impossibile trasmettere.</translation> <translation id="268053382412112343">Cr&onologia</translation> @@ -2479,6 +2479,7 @@ <translation id="3177909033752230686">Lingua della pagina:</translation> <translation id="3177914167275935955">Il tuo dispositivo include una licenza Chrome Education Upgrade, ma il tuo nome utente non è associato a un account Google for Education. Crea un account Google for Education visitando la pagina g.co/workspace/edusignup su un dispositivo secondario.</translation> <translation id="3179982752812949580">Carattere testo</translation> +<translation id="3180284704187420717">Salva i tuoi preferiti, le tue password e altro ancora attivando la sincronizzazione</translation> <translation id="3181954750937456830">Navigazione sicura (protegge te e il tuo dispositivo da siti pericolosi)</translation> <translation id="3182749001423093222">Controllo ortografico</translation> <translation id="3183139917765991655">Profile Importer</translation> @@ -2970,6 +2971,7 @@ <translation id="3637203148990213388">Account aggiuntivi</translation> <translation id="3639220004740062347">Esci dalla modalità Reader</translation> <translation id="3640214691812501263">Aggiungere "<ph name="EXTENSION_NAME" />" per <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Proteggi le tue password dal phishing</translation> <translation id="3640613767643722554">Insegna all'assistente a riconoscere la tua voce</translation> <translation id="3641456520301071208">I siti possono chiederti la posizione</translation> <translation id="3642070413432681490">Cerchia il puntatore</translation> @@ -3394,6 +3396,7 @@ <translation id="3988996860813292272">Seleziona il fuso orario</translation> <translation id="399179161741278232">Importati</translation> <translation id="3992008114154328194">È in corso il download del file <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Esegui il backup dei dati</translation> <translation id="3993887353483242788">Sincronizza il tuo <ph name="DEVICE_TYPE" /> in modo che le tue preferenze siano salvate su qualsiasi dispositivo quando accedi con il tuo Account Google. Le preferenze includono app, impostazioni, password del Wi-Fi, lingue, sfondi, scorciatoie da tastiera e altro ancora.</translation> <translation id="3994318741694670028">Purtroppo il tuo computer è configurato con un ID hardware non valido. Questo impedisce l'aggiornamento di ChromeOS Flex con le ultime correzioni relative alla sicurezza e il tuo computer <ph name="BEGIN_BOLD" />potrebbe essere vulnerabile ad attacchi dannosi<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Sblocca il telefono e avvicinalo al dispositivo <ph name="DEVICE_TYPE" /> per sbloccarlo.</translation> @@ -3949,10 +3952,12 @@ <translation id="4522890784888918985">Gli account di minori non sono supportati</translation> <translation id="4523876148417776526">Gli elenchi di siti XML non sono stati ancora recuperati.</translation> <translation id="4524832533047962394">La modalità di registrazione specificata non è supportata da questa versione del sistema operativo. Assicurati che sia installata l'ultima versione.</translation> +<translation id="4526051299161934899">Gruppi di schede salvati nascosti</translation> <translation id="4526853756266614740">Scegli un'immagine per applicare subito il tema</translation> <translation id="452750746583162491">Verifica i tuoi dati sincronizzati</translation> <translation id="4527929807707405172">Attiva lo scorrimento invertito. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Traduzione suggerita</translation> +<translation id="4528638190900283934">Accedi per usufruire di funzionalità aggiuntive</translation> <translation id="4529455689802245339">Sottotitoli in tempo reale di Chrome potrebbe non funzionare</translation> <translation id="4530494379350999373">Origine</translation> <translation id="4531924570968473143">Chi vorresti aggiungere a questo <ph name="DEVICE_TYPE" />?</translation> @@ -4273,6 +4278,7 @@ <translation id="4824037980212326045">Backup e ripristino Linux</translation> <translation id="4824958205181053313">Vuoi annullare la sincronizzazione?</translation> <translation id="4825532258163983651">Impossibile eliminare la passkey</translation> +<translation id="4827283332383516812">Elimina tessera</translation> <translation id="4827675678516992122">Impossibile collegarsi</translation> <translation id="4827784381479890589">Controllo ortografico avanzato nel browser Chrome (testo inviato a Google per suggerimenti ortografici)</translation> <translation id="4827904420700932487">Crea codice QR per questa immagine</translation> @@ -5294,6 +5300,7 @@ <translation id="5792295754950501287">Altre azioni per <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Tocca il tasto di accensione</translation> <translation id="5792874008054171483">Altre azioni per <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Questo metodo di pagamento verrà eliminato dal dispositivo</translation> <translation id="5793339252089865437">Se scarichi l'aggiornamento tramite la rete mobile, potresti incorrere in costi aggiuntivi.</translation> <translation id="5793420564274426163">Conferma accoppiamento</translation> <translation id="5793430094159150686">La tua password è cambiata. Per ripristinare i dati locali, devi inserire la password precedente.</translation> @@ -6357,6 +6364,7 @@ <translation id="6774710250118040929">Aggiungi nuova password</translation> <translation id="6775163072363532304">I dispositivi disponibili verranno mostrati qui.</translation> <translation id="677646486571529447">Aggiungi una nota</translation> +<translation id="6776589734354015877">Usufruisci di funzionalità aggiuntive</translation> <translation id="6776729248872343918">Abilita l'Accoppiamento rapido</translation> <translation id="6777817260680419853">Reindirizzamento bloccato</translation> <translation id="6779092717724412415">Per creare un'evidenziazione come questa, seleziona del testo e fai clic con il tasto destro del mouse.</translation> @@ -7209,7 +7217,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Download di <ph name="FILE_NAME" /> non riuscito</translation> <translation id="7551643184018910560">Blocca sulla barra delle app</translation> -<translation id="7552658769580484674">Invia Feedback su compilazione automatica</translation> <translation id="7552846755917812628">Prova i seguenti suggerimenti:</translation> <translation id="7553012839257224005">Controllo del container Linux</translation> <translation id="7553242001898162573">Inserisci la password</translation> @@ -7271,6 +7278,7 @@ <translation id="7609148976235050828">Connettiti a Internet e riprova.</translation> <translation id="7612401678989660900">Consenti l'accesso per siti web e app che hanno l'autorizzazione di accesso al microfono</translation> <translation id="7612655942094160088">Attiva le funzionalità collegate al telefono.</translation> +<translation id="7612989789287281429">Accesso in corso…</translation> <translation id="7614260613810441905">Chiedi conferma quando un sito vuole modificare file o cartelle sul dispositivo (opzione consigliata)</translation> <translation id="761530003705945209">Effettua il backup su Google Drive. Ripristina facilmente i tuoi dati o cambia dispositivo in qualsiasi momento. La copia di backup include i dati delle app. Le copie di backup vengono caricate su Google e criptate usando la password del tuo Account Google.</translation> <translation id="7615365294369022248">Si è verificato un errore durante l'aggiunta di un account</translation> @@ -7752,6 +7760,7 @@ <translation id="8023801379949507775">Aggiorna estensioni adesso</translation> <translation id="8025151549289123443">Schermata di blocco e accesso</translation> <translation id="8026334261755873520">Cancella dati di navigazione</translation> +<translation id="8026471514777758216">Tutti i tuoi dispositivi</translation> <translation id="8028060951694135607">Recupero chiavi Microsoft</translation> <translation id="8028803902702117856">Download in corso di <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Dimensioni</translation> @@ -8487,6 +8496,7 @@ <translation id="869884720829132584">Menu Applicazioni</translation> <translation id="869891660844655955">Data di scadenza</translation> <translation id="8699188901396699995">PPD per <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menu contenente i gruppi di schede salvati nascosti</translation> <translation id="8702825062053163569">Il tuo dispositivo <ph name="DEVICE_TYPE" /> è stato bloccato.</translation> <translation id="8703346390800944767">Salta annuncio</translation> <translation id="8705331520020532516">Numero di serie</translation> @@ -8767,7 +8777,6 @@ <translation id="8952831374766033534">Opzione di configurazione non supportata: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Durante la ricarica</translation> <translation id="895347679606913382">Avvio download in corso...</translation> -<translation id="8956230710625245889">Apri in Reader</translation> <translation id="8957757410289731985">Personalizza il profilo</translation> <translation id="895944840846194039">Memoria JavaScript</translation> <translation id="8960208913905765425">Conversione di unità Risposte rapide</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index aec9c25..168cffe 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">האם להפעיל מחדש את Linux?</translation> <translation id="1047431265488717055">העתקת ט&קסט קישור</translation> <translation id="1048286738600630630">תצוגות</translation> -<translation id="1048770690598418849">אפשר לדלג על השלב הזה בינתיים, ובסיום ההגדרה ננסה שוב באופן אוטומטי</translation> <translation id="1048986595386481879">הקצאה דינמית</translation> <translation id="1049324577536766607">{COUNT,plural, =1{מתקבל <ph name="ATTACHMENTS" /> מ-<ph name="DEVICE_NAME" />}one{מתקבלים <ph name="ATTACHMENTS" /> מ-<ph name="DEVICE_NAME" />}two{מתקבלים <ph name="ATTACHMENTS" /> מ-<ph name="DEVICE_NAME" />}other{מתקבלים <ph name="ATTACHMENTS" /> מ-<ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">גלישה פרטית</translation> @@ -1368,6 +1367,7 @@ <translation id="2182058453334755893">הועתק אל הלוח</translation> <translation id="2183570493397356669">הלחצן 'המשך' מושבת</translation> <translation id="2184515124301515068">Chrome יקבע מתי אתרים יכולים להפעיל צלילים (מומלץ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">הדף שותף ממכשיר אחר</translation> <translation id="2187675480456493911">בוצע סנכרון עם מכשירים אחרים בחשבון שלך. הגדרות ששונו על-ידי משתמשים אחרים לא יסונכרנו. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="2187895286714876935">שגיאת ייבוא של אישור שרת</translation> @@ -1638,6 +1638,7 @@ <translation id="2408018932941436077">שמירת הכרטיס מתבצעת</translation> <translation id="2408955596600435184">יש להזין את קוד האימות</translation> <translation id="2409268599591722235">התחל להשתמש</translation> +<translation id="2409709393952490731">שימוש בטלפון או בטאבלט</translation> <translation id="2410079346590497630">פרטי גרסת ה-Build</translation> <translation id="2410298923485357543">שימוש בקול טבעי כשהמכשיר מחובר לאינטרנט</translation> <translation id="2410754283952462441">בחירת חשבון</translation> @@ -1674,6 +1675,7 @@ <translation id="2442916515643169563">צללית טקסט</translation> <translation id="2443487764245141020">ייתכן שגם באתרים יהיה צורך לזהות את המכשיר שלך באמצעות מזהה</translation> <translation id="244475495405467108">סגירת הכרטיסיות משמאל</translation> +<translation id="2444874983932528148">קל להמשיך מהנקודה שבה הפסקת</translation> <translation id="2445081178310039857">ספריית הבסיס של ההרחבה נחוצה.</translation> <translation id="2445484935443597917">יצירת פרופיל חדש</translation> <translation id="2445726032315793326">זכוכית מגדלת חלקית</translation> @@ -1934,7 +1936,6 @@ <translation id="2673135533890720193">לקרוא את היסטוריית הגלישה שלך</translation> <translation id="2674764818721168631">כבוי</translation> <translation id="2675570801872027281">אירעה שגיאה בהסרת Bruschetta. אפשר לנסות שוב.</translation> -<translation id="2676492189600898281">שליחת משוב על המילוי האוטומטי</translation> <translation id="2678063897982469759">הפעלה מחדש</translation> <translation id="2678100101831051676">לא ניתן להעביר (cast).</translation> <translation id="268053382412112343">הי&סטוריה</translation> @@ -2493,6 +2494,7 @@ <translation id="3177909033752230686">שפת הדף:</translation> <translation id="3177914167275935955">המכשיר כולל אפשרות שדרוג ל-Chrome Education, אבל שם המשתמש שלך לא משויך לחשבון Google for Education. יש ליצור חשבון Google for Education בכתובת g.co/workspace/edusignup במכשיר אחר.</translation> <translation id="3179982752812949580">גופן הטקסט</translation> +<translation id="3180284704187420717">בעזרת הסנכרון אפשר לשמור את הסימניות, הסיסמאות ועוד</translation> <translation id="3181954750937456830">גלישה בטוחה (מגנה עליך ועל המכשיר מפני אתרים מסוכנים)</translation> <translation id="3182749001423093222">בדיקת איות</translation> <translation id="3183139917765991655">מייבא פרופילים</translation> @@ -2984,6 +2986,7 @@ <translation id="3637203148990213388">חשבונות נוספים</translation> <translation id="3639220004740062347">יציאה ממצב קורא</translation> <translation id="3640214691812501263">האם להוסיף את "<ph name="EXTENSION_NAME" />" בשביל <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">הגנה על הסיסמאות מפני פישינג</translation> <translation id="3640613767643722554">ה-Assistant יכולה ללמוד לזהות את הקול שלך</translation> <translation id="3641456520301071208">אתרים יכולים לבקש הרשאת גישה למיקומך</translation> <translation id="3642070413432681490">סמן בצורת עיגול</translation> @@ -3408,6 +3411,7 @@ <translation id="3988996860813292272">בחירת אזור זמן</translation> <translation id="399179161741278232">מיובאות</translation> <translation id="3992008114154328194">מתבצעת הורדה לקובץ <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">גיבוי הנתונים</translation> <translation id="3993887353483242788">צריך לסנכרן את <ph name="DEVICE_TYPE" /> כדי שההעדפות שלך יהיו מוכנות בכל המכשירים בעת הכניסה לחשבון Google. ההעדפות מתייחסות לאפליקציות, להגדרות, לסיסמאות ל-Wi-Fi, לשפות, לטפט, למקשי קיצור ועוד.</translation> <translation id="3994318741694670028">לצערנו, המחשב שלך מוגדר באמצעות מזהה חומרה פגום. המצב הזה מונע מ-ChromeOS Flex להתקין את עדכוני האבטחה האחרונים, <ph name="BEGIN_BOLD" />ויכול להיות שהמחשב שלך יהיה חשוף להתקפות זדוניות<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">עליך לבטל את נעילת הטלפון ולקרב אותו ל-<ph name="DEVICE_TYPE" /> כדי לבטל את הנעילה שלו.</translation> @@ -3787,6 +3791,7 @@ <translation id="4369215744064167350">הבקשה לגבי האתר אושרה</translation> <translation id="4369735607080757018">רק סוגים מסוימים של נתונים ישותפו בין אתרים כדי למדוד את ביצועי המודעות שלהם. למשל, השעה ביום שבה הוצגה לך מודעה מסוימת.</translation> <translation id="4370975561335139969">כתובת האימייל והסיסמה שהזנת אינן תואמות</translation> +<translation id="4374805630006466253">שימוש בטלפון או בטאבלט אחר</translation> <translation id="4374831787438678295">מנהל ההתקנה של Linux</translation> <translation id="4375035964737468845">פתיחה של קבצים שהורדו</translation> <translation id="4376226992615520204">שירות המיקום כבוי</translation> @@ -3963,10 +3968,12 @@ <translation id="4522890784888918985">אין תמיכה בחשבונות של ילדים</translation> <translation id="4523876148417776526">הרשימות של אתרי ה-XML עדיין לא אוחזרו.</translation> <translation id="4524832533047962394">מצב ההרשמה שסופק לא נתמך על ידי הגרסה הזו של מערכת ההפעלה. כדאי לוודא שמשתמשים בגרסה החדשה ביותר.</translation> +<translation id="4526051299161934899">קבוצות של כרטיסיות שמורות שהוסתרו</translation> <translation id="4526853756266614740">בוחרים תמונה כדי להחיל את העיצוב באופן מיידי</translation> <translation id="452750746583162491">סקירת הנתונים המסונכרנים</translation> <translation id="4527929807707405172">הפעלת גלילה הפוכה. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="4528494169189661126">הצעה לתרגום</translation> +<translation id="4528638190900283934">כדאי להיכנס לחשבון כדי ליהנות מתכונות נוספות</translation> <translation id="4529455689802245339">יכול להיות שהכתוביות המיידיות ב-Chrome לא יפעלו</translation> <translation id="4530494379350999373">מקור</translation> <translation id="4531924570968473143">את מי ברצונך להוסיף אל <ph name="DEVICE_TYPE" /> זה?</translation> @@ -4287,6 +4294,7 @@ <translation id="4824037980212326045">גיבוי ושחזור ב-Linux</translation> <translation id="4824958205181053313">לבטל את הסנכרון?</translation> <translation id="4825532258163983651">אי אפשר למחוק את מפתח הגישה</translation> +<translation id="4827283332383516812">מחיקת הכרטיס</translation> <translation id="4827675678516992122">לא ניתן להתחבר</translation> <translation id="4827784381479890589">בדיקת איות משופרת בדפדפן Chrome (הטקסט נשלח ל-Google לקבלת הצעות איות)</translation> <translation id="4827904420700932487">יצירת קוד QR לתמונה הזו</translation> @@ -5310,6 +5318,7 @@ <translation id="5792295754950501287">עוד פעולות לגבי <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">יש להקיש על לחצן ההפעלה</translation> <translation id="5792874008054171483">עוד פעולות לאתר <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">אמצעי התשלום הזה יימחק מהמכשיר הזה</translation> <translation id="5793339252089865437">אם הורדת העדכון מתבצעת ברשת סלולרית, ייתכן שהיא תהיה כרוכה בתשלום על חריגה.</translation> <translation id="5793420564274426163">אישור ההתאמה</translation> <translation id="5793430094159150686">הסיסמה שלך השתנתה. כדי לשחזר את הנתונים המקומיים, עליך להזין את הסיסמה הישנה שלך.</translation> @@ -6378,6 +6387,7 @@ <translation id="6774710250118040929">הוספת סיסמה חדשה</translation> <translation id="6775163072363532304">כאן יופיעו מכשירים זמינים.</translation> <translation id="677646486571529447">הוספת הערה</translation> +<translation id="6776589734354015877">נהנים מתכונות נוספות</translation> <translation id="6776729248872343918">הפעלת ההתאמה המהירה</translation> <translation id="6777817260680419853">הפניה לכתובת אתר אחרת נחסמה</translation> <translation id="6779092717724412415">כדי ליצור הדגשה דומה, בוחרים טקסט כלשהו ולוחצים לחיצה ימנית.</translation> @@ -7230,7 +7240,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">ההורדה של <ph name="FILE_NAME" /> הצליחה</translation> <translation id="7551643184018910560">הצמדה למדף</translation> -<translation id="7552658769580484674">שליחת משוב על המילוי האוטומטי</translation> <translation id="7552846755917812628">אולי הטיפים האלו יעזרו לך:</translation> <translation id="7553012839257224005">המערכת בודקת את הקונטיינר של Linux</translation> <translation id="7553242001898162573">הזנת הסיסמה</translation> @@ -7292,6 +7301,7 @@ <translation id="7609148976235050828">צריך להתחבר לאינטרנט ולנסות שוב.</translation> <translation id="7612401678989660900">מתן גישה לאפליקציות ולאתרים עם הרשאת גישה למיקרופון</translation> <translation id="7612655942094160088">הפעלת תכונות הטלפון המקושר.</translation> +<translation id="7612989789287281429">מתבצעת כניסה לחשבון…</translation> <translation id="7614260613810441905">תוצג שאלה כשאתר ירצה לערוך קבצים או תיקיות במכשיר שלך (מומלץ)</translation> <translation id="761530003705945209">גיבוי ב-Google Drive. ההגדרה הזו מאפשרת לאחזר נתונים בקלות או לעבור למכשיר אחר בכל שלב. הגיבוי כולל נתוני אפליקציות. הגיבויים נשמרים ב-Google ומוצפנים באמצעות הסיסמה של חשבון Google שלך.</translation> <translation id="7615365294369022248">אירעה שגיאה בהוספת חשבון</translation> @@ -7772,6 +7782,7 @@ <translation id="8023801379949507775">עדכון תוספים</translation> <translation id="8025151549289123443">מסך הנעילה וכניסה לחשבון</translation> <translation id="8026334261755873520">ניקוי נתוני גלישה</translation> +<translation id="8026471514777758216">כל המכשירים שלך</translation> <translation id="8028060951694135607">שחזור מפתח של Microsoft</translation> <translation id="8028803902702117856">הקובץ <ph name="FILE_NAME" /> בהורדה, <ph name="SIZE" /></translation> <translation id="8028993641010258682">גודל</translation> @@ -8509,6 +8520,7 @@ <translation id="869884720829132584">תפריט יישומים</translation> <translation id="869891660844655955">תאריך תפוגה</translation> <translation id="8699188901396699995">PPD עבור <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">התפריט מכיל קבוצות של כרטיסיות שמורות שהוסתרו</translation> <translation id="8702825062053163569">ה-<ph name="DEVICE_TYPE" /> היה נעול.</translation> <translation id="8703346390800944767">דילוג על המודעה</translation> <translation id="8705331520020532516">מספר סידורי</translation> @@ -8791,7 +8803,6 @@ <translation id="8952831374766033534">אפשרות ההגדרה לא נתמכת: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">בזמן טעינה</translation> <translation id="895347679606913382">הפעולה מתחילה...</translation> -<translation id="8956230710625245889">פתיחה בקורא</translation> <translation id="8957757410289731985">התאמה אישית של הפרופיל</translation> <translation id="895944840846194039">זיכרון JavaScript</translation> <translation id="8960208913905765425">המרת יחידות של תשובות מהירות</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 0cea42c..6cdd74a 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux を再起動しますか?</translation> <translation id="1047431265488717055">リンクテキストをコピー(&X)</translation> <translation id="1048286738600630630">ディスプレイ</translation> -<translation id="1048770690598418849">今はスキップすることもできます。その場合はセットアップの終了後に自動的に再試行されます。</translation> <translation id="1048986595386481879">動的に割り当て</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> から <ph name="ATTACHMENTS" />を受信しています}other{<ph name="DEVICE_NAME" /> から <ph name="ATTACHMENTS" />を受信しています}}</translation> <translation id="1049743911850919806">シークレット モード</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">クリップボードにコピーされました</translation> <translation id="2183570493397356669">続行ボタンは無効です</translation> <translation id="2184515124301515068">サイトで音声が再生される可能性がある場合、Chrome で自動的に許可またはブロックする(推奨)</translation> +<translation id="2186206192313702726">Google レンズ</translation> <translation id="2186711480981247270">別のデバイスから共有されたページ</translation> <translation id="2187675480456493911">アカウントの他のデバイスと同期しています。他のユーザーが変更した設定は同期されません。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="2187895286714876935">サーバー証明書インポート エラー</translation> @@ -1914,7 +1914,6 @@ <translation id="2673135533890720193">閲覧履歴の読み取り</translation> <translation id="2674764818721168631">オフ</translation> <translation id="2675570801872027281">Bruschetta の削除中にエラーが発生しました。もう一度お試しください。</translation> -<translation id="2676492189600898281">自動入力に関するフィードバックを送信</translation> <translation id="2678063897982469759">再度有効にする</translation> <translation id="2678100101831051676">キャストできません。</translation> <translation id="268053382412112343">履歴(&S)</translation> @@ -7197,7 +7196,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> をダウンロードできませんでした</translation> <translation id="7551643184018910560">シェルフに固定</translation> -<translation id="7552658769580484674">自動入力に関するフィードバックを送信</translation> <translation id="7552846755917812628">次のことをお試しください。</translation> <translation id="7553012839257224005">Linux コンテナを確認しています</translation> <translation id="7553242001898162573">パスワードを入力してください</translation> @@ -8754,7 +8752,6 @@ <translation id="8952831374766033534">設定オプションがサポートされていません: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">充電時</translation> <translation id="895347679606913382">開始しています...</translation> -<translation id="8956230710625245889">リーダーで開く</translation> <translation id="8957757410289731985">プロフィールをカスタマイズ</translation> <translation id="895944840846194039">JavaScript メモリ</translation> <translation id="8960208913905765425">クイック アンサーの単位変換</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 00ab62b..b11cd23 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">გსურთ Linux-ის გადატვირთვა?</translation> <translation id="1047431265488717055">ბმულის ტე&ქსტის კოპირება</translation> <translation id="1048286738600630630">ეკრანები</translation> -<translation id="1048770690598418849">ახლა შეგიძლიათ გამოტოვოთ და ავტომატურად ვცდით ხელახლა, როცა დაყენებას დაასრულებთ</translation> <translation id="1048986595386481879">გამოყოფა დინამიკურად</translation> <translation id="1049324577536766607">{COUNT,plural, =1{მიმდინარეობს მიღება (<ph name="ATTACHMENTS" />) <ph name="DEVICE_NAME" />-დან}other{მიმდინარეობს მიღება (<ph name="ATTACHMENTS" />) <ph name="DEVICE_NAME" />-დან}}</translation> <translation id="1049743911850919806">ინკოგნიტო</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">დაკოპირდა თქვენს გაცვლის ბუფერში</translation> <translation id="2183570493397356669">გაგრძელების ღილაკი არ არის გააქტიურებული</translation> <translation id="2184515124301515068">საიტებისთვის ხმის დაკვრის დაშვების Chrome-ისთვის მინდობა (რეკომენდებული)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">სხვა მოწყობილობიდან გაზიარებული გვერდი</translation> <translation id="2187675480456493911">სინქრონიზებულია თქვენს ანგარიშთან დაკავშირებულ სხვა მოწყობილობებს შორის. სხვა მომხმარებლების მიერ შეცვლილი პარამეტრები არ იქნება სინქრონიზებული. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="2187895286714876935">სერვერის სერტიფიკატის იმპორტის შეცდომა</translation> @@ -1624,6 +1624,7 @@ <translation id="2408018932941436077">მიმდინარეობს ბარათის შენახვა</translation> <translation id="2408955596600435184">შეიყვანეთ თქვენი PIN-კოდი</translation> <translation id="2409268599591722235">დავიწყოთ</translation> +<translation id="2409709393952490731">ტელეფონის ან ტაბლეტის გამოყენება</translation> <translation id="2410079346590497630">ანაწყობის დეტალები</translation> <translation id="2410298923485357543">ბუნებრივი ხმის გამოყენება, როცა მოწყობილობა ონლაინ რეჟიმშია</translation> <translation id="2410754283952462441">აირჩიეთ ანგარიში</translation> @@ -1660,6 +1661,7 @@ <translation id="2442916515643169563">ტექსტის ჩრდილი</translation> <translation id="2443487764245141020">ვებსაიტებს ასევე შეიძლება დასჭირდეთ თქვენი მოწყობილობის ამოცნობა შესაბამისი იდენტიფიკატორის მეშვეობით</translation> <translation id="244475495405467108">ჩანართების დახურვა მარცხნივ</translation> +<translation id="2444874983932528148">მარტივად გააგრძელეთ იქიდან, სადაც შეჩერდით</translation> <translation id="2445081178310039857">საჭიროა გაფართოების ძირეული დირექტორია.</translation> <translation id="2445484935443597917">ახალი პროფილის შექმნა</translation> <translation id="2445726032315793326">ნაწილობრივი ლუპა</translation> @@ -1920,7 +1922,6 @@ <translation id="2673135533890720193">დათვალიერების ისტორიის წაკითხვა</translation> <translation id="2674764818721168631">გამორთული</translation> <translation id="2675570801872027281">Bruschetta-ს ამოშლისას მოხდა შეცდომა. ცადეთ ხელახლა.</translation> -<translation id="2676492189600898281">ავტომატურ შევსებასთან დაკავშირებით გამოხმაურება</translation> <translation id="2678063897982469759">ხელახლა ჩართვა</translation> <translation id="2678100101831051676">ტრანსლირება ვერ ხერხდება.</translation> <translation id="268053382412112343">ი&სტორია</translation> @@ -2478,6 +2479,7 @@ <translation id="3177909033752230686">გვერდის ენა:</translation> <translation id="3177914167275935955">თქვენს მოწყობილობას მოჰყვება Chrome Education Upgrade, თუმცა თქვენი მომხმარებლის სახელი არ არის დაკავშირებული Google for Education ანგარიშთან. შექმენით Google for Education ანგარიში — ამისთვის გადადით მისამართზე g.co/workspace/edusignup მეორეული მოწყობილობიდან.</translation> <translation id="3179982752812949580">ტექსტის შრიფტი</translation> +<translation id="3180284704187420717">შეინახეთ თქვენი სანიშნეები, პაროლები და სხვა კონტენტი სინქრონიზაციის მეშვეობით</translation> <translation id="3181954750937456830">Safe Browsing (თქვენ და თქვენს მოწყობილობებს გიცავთ სახიფათო საიტებისგან)</translation> <translation id="3182749001423093222">მართლწერის შემოწმება</translation> <translation id="3183139917765991655">პროფილის იმპორტიორი</translation> @@ -2969,6 +2971,7 @@ <translation id="3637203148990213388">დამატებითი ანგარიშები</translation> <translation id="3639220004740062347">წამკითხველის რეჟიმიდან გასვლა</translation> <translation id="3640214691812501263">გსურთ, დაამატოთ „<ph name="EXTENSION_NAME" />“ <ph name="USER_NAME" />-სთვის?</translation> +<translation id="3640347231390550691">დაიცავით თქვენი პაროლები ფიშინგისგან</translation> <translation id="3640613767643722554">ასწავლეთ ასისტენტს თქვენი ხმის ამოცნობა</translation> <translation id="3641456520301071208">საიტებს შეუძლია თქვენი მდებარეობის გამოყენების თხოვნა</translation> <translation id="3642070413432681490">წრის შემოხაზვა კურსორზე</translation> @@ -3393,6 +3396,7 @@ <translation id="3988996860813292272">აირჩიეთ დროის სარტყელი</translation> <translation id="399179161741278232">იმპორტირებული</translation> <translation id="3992008114154328194">მიმდინარეობს <ph name="FILE_NAME" />-ის ჩამოტვირთვა, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">მონაცემთა სარეზერვო კოპირება</translation> <translation id="3993887353483242788">შეასრულეთ თქვენი <ph name="DEVICE_TYPE" />-ის სინქრონიზაცია, რათა თქვენი შენახული პარამეტრები გამოსაყენებლად მზად იყოს ნებისმიერ მოწყობილობაზე, რომელშიც თქვენი Google ანგარიშით შეხვალთ. აღნიშნული მოიცავს აპებს, პარამეტრებს, Wi-Fi პაროლებს, ენებს, ფონს, კლავიატურის მალსახმობებსა და სხვას.</translation> <translation id="3994318741694670028">სამწუხაროდ, თქვენი კომპიუტერი კონფიგურირებულია აპარატურის არასწორად ფორმირებული ID-თი. ეს ხელს უშლის ChromeOS Flex-ში უსაფრთხოების უახლესი შესწორებების დაყენებას, რის გამოც თქვენი კომპიუტერი <ph name="BEGIN_BOLD" />შეიძლება გახდეს მავნე პროგრამების მხრიდან შეტევების ობიექტი<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300"><ph name="DEVICE_TYPE" />-ის განსაბლოკად მოაახლოვეთ და განბლოკეთ თქვენი ტელეფონი.</translation> @@ -3772,6 +3776,7 @@ <translation id="4369215744064167350">ვებსაიტის მოთხოვნა დაკმაყოფილდა</translation> <translation id="4369735607080757018">საკუთარი რეკლამის ეფექტურობის გაზომვის მიზნით, საიტებს შორის შეზღუდული ტიპის მონაცემები ზიარდება — მაგალითად, ის, თუ დღის რომელ მონაკვეთში იყო რეკლამა ნაჩვენები თქვენთვის</translation> <translation id="4370975561335139969">თქვენ მიერ შეყვანილი ელფოსტა და პაროლი არ ემთხვევა</translation> +<translation id="4374805630006466253">სხვა ტელეფონის ან ტაბლეტის გამოყენება</translation> <translation id="4374831787438678295">Linux ინსტალატორი</translation> <translation id="4375035964737468845">გახსენით გადმოწერილი ფაილი</translation> <translation id="4376226992615520204">მდებარეობა გამორთულია</translation> @@ -3952,6 +3957,7 @@ <translation id="452750746583162491">სინქრონიზებული მონაცემების გადახედვა</translation> <translation id="4527929807707405172">უკუგადაადგილების ჩართვა. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="4528494169189661126">თარგმნის შემოთავაზება</translation> +<translation id="4528638190900283934">შედით სისტემაში, დამატებითი ფუნქციებით რომ ისარგებლოთ</translation> <translation id="4529455689802245339">Chrome-ის ავტოსუბტიტრებმა შეიძლება არ იმუშაოს</translation> <translation id="4530494379350999373">ორიგინალური</translation> <translation id="4531924570968473143">ვინ გსურთ, დაამატოთ ამ <ph name="DEVICE_TYPE" />-ს?</translation> @@ -6361,6 +6367,7 @@ <translation id="6774710250118040929">დაამატეთ ახალი პაროლი</translation> <translation id="6775163072363532304">აქ გამოჩნდება ხელმისაწვდომი მოწყობილობები.</translation> <translation id="677646486571529447">ჩანიშვნის დამატება</translation> +<translation id="6776589734354015877">ისარგებლეთ დამატებითი ფუნქციებით</translation> <translation id="6776729248872343918">სწრაფი დაწყვილების ჩართვა</translation> <translation id="6777817260680419853">გადამისამართება დაიბლოკა</translation> <translation id="6779092717724412415">ამის მსგავსი გამოყოფის შესაქმნელად, აირჩიეთ ნებისმიერი ტექსტი და დააწკაპუნეთ მარჯვენა ღილაკზე</translation> @@ -7213,7 +7220,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" />-ის ჩამოტვირთვა ვერ მოხერხდა</translation> <translation id="7551643184018910560">თაროზე ჩამაგრება</translation> -<translation id="7552658769580484674">ავტომატურ შევსებასთან დაკავშირებით გამოხმაურება</translation> <translation id="7552846755917812628">ცადეთ შემდეგი:</translation> <translation id="7553012839257224005">მიმდინარეობს Linux-ის კონტეინერის შემოწმება</translation> <translation id="7553242001898162573">შეიყვანეთ თქვენი პაროლი</translation> @@ -7756,6 +7762,7 @@ <translation id="8023801379949507775">გაანახლეთ გაფართოებები ეხლა</translation> <translation id="8025151549289123443">ჩაკეტილი ეკრანი და შესვლა</translation> <translation id="8026334261755873520">დათვალიერების მონაცემების გასუფთავება</translation> +<translation id="8026471514777758216">თქვენი ყველა მოწყობილობა</translation> <translation id="8028060951694135607">Microsoft-ის გასაღების აღდგენა</translation> <translation id="8028803902702117856">მიმდინარეობს <ph name="SIZE" />-ის ჩამოტვირთვა, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">ზომა</translation> @@ -8772,7 +8779,6 @@ <translation id="8952831374766033534">კონფიგურაციის ვარიანტი მხარდაუჭერელია: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">დატენისას</translation> <translation id="895347679606913382">იწყება…</translation> -<translation id="8956230710625245889">წამკითხველში გახსნა</translation> <translation id="8957757410289731985">პროფილის მორგება</translation> <translation id="895944840846194039">JavaScript მეხსიერება</translation> <translation id="8960208913905765425">სწრაფი პასუხები — საზომი ერთეულების გადაყვანა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index eac1faf..ead6c80 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux жүйесі қайта қосылсын ба?</translation> <translation id="1047431265488717055">Сілтеме мә&тінін көшіру</translation> <translation id="1048286738600630630">Дисплейлер</translation> -<translation id="1048770690598418849">Әзірге өткізіп жіберуге болады, орнатуды аяқтағаннан кейін автоматты түрде қайталаймыз</translation> <translation id="1048986595386481879">Динамикалық түрде бөлінген</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынуда.}other{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынуда.}}</translation> <translation id="1049743911850919806">Инкогнито</translation> @@ -204,6 +203,7 @@ <translation id="1174073918202301297">Таңбаша енгізілді</translation> <translation id="1174366174291287894">Байланыс қауіпсіз болмаса, Chrome сізге бұл туралы хабарлайды.</translation> <translation id="117445914942805388">Барлық синхрондалған құрылғылардан және Google аккаунтынан браузерді пайдалану деректерін өшіру үшін <ph name="BEGIN_LINK" />синхрондау параметрлеріне кіріңіз<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Әкімшіңіз бұл мүмкіндікті өшірді.</translation> <translation id="1175364870820465910">&Басып шығару…</translation> <translation id="1176471985365269981">Құрылғыңыздағы файлдарды немесе қалталарды өзгертуге рұқсаты жоқтар</translation> <translation id="1177863135347784049">Реттелетін</translation> @@ -1354,6 +1354,7 @@ <translation id="2182058453334755893">Буферге көшірілді</translation> <translation id="2183570493397356669">Жалғастыру түймесі өшірілді.</translation> <translation id="2184515124301515068">Chrome браузерінде сайттардың дыбысты автоматты ойнатуына тыйым салу (ұсынылады)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Басқа құрылғыдан бөлісілген бет</translation> <translation id="2187675480456493911">Аккаунтыңыздағы басқа құрылғылармен синхрондалған. Басқа пайдаланушылар өзгерткен параметрлер синхрондалмайды. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Сервер сертификатын импорттау қатесі</translation> @@ -1621,6 +1622,7 @@ <translation id="2408018932941436077">Карта сақталуда</translation> <translation id="2408955596600435184">PIN кодын енгізіңіз</translation> <translation id="2409268599591722235">Алға!</translation> +<translation id="2409709393952490731">Телефонды немесе планшетті пайдалану</translation> <translation id="2410079346590497630">Құрама туралы мәліметтер</translation> <translation id="2410298923485357543">Құрылғы желіде болғанда табиғи дауысты пайдалану</translation> <translation id="2410754283952462441">Аккаунт таңдау</translation> @@ -1657,6 +1659,7 @@ <translation id="2442916515643169563">Мәтін көлеңкесі</translation> <translation id="2443487764245141020">Сайттарға құрылғыңызды идентификатор арқылы тану да қажет болуы мүмкін.</translation> <translation id="244475495405467108">Сол жақтағы қойындыларды жабу</translation> +<translation id="2444874983932528148">Тоқтаған жерден әрі қарай оңай жалғастырыңыз</translation> <translation id="2445081178310039857">Кеңейтімнің түпкі каталогі қажет.</translation> <translation id="2445484935443597917">Жаңа профиль жасау</translation> <translation id="2445726032315793326">Экранды жартылай ұлғайтқыш</translation> @@ -1917,7 +1920,6 @@ <translation id="2673135533890720193">Шолу журналыңызды оқу</translation> <translation id="2674764818721168631">Өшірулі</translation> <translation id="2675570801872027281">Bruschetta-ны өшіру кезінде қате шықты. Қайталап көріңіз.</translation> -<translation id="2676492189600898281">Автотолтыру туралы пікір қалдыру</translation> <translation id="2678063897982469759">Қайта қосу</translation> <translation id="2678100101831051676">Трансляциялау мүмкін емес.</translation> <translation id="268053382412112343">Жу&рнал</translation> @@ -2435,6 +2437,7 @@ <translation id="3129215702932019810">Қолданбаны іске қосу кезінде қате шықты</translation> <translation id="3130528281680948470">Құрылғыңыз қалпына келтіріледі және барлық пайдаланушы аккаунттары мен жергілікті деректер жойылады. Бұл әрекетті кері қайтару мүмкін емес.</translation> <translation id="3130863904455712965">Тарих және тағы басқа деректер</translation> +<translation id="3130966412954727147">Сіз кірген сайттар сіздің бот емес, нақты пайдаланушы екеніңізді тексере алады.</translation> <translation id="313205617302240621">Құпия сөзді ұмытып қалдыңыз ба?</translation> <translation id="3132277757485842847">Телефоныңызбен байланыс орнату мүмкін болмады. Телефоныңыз жаныңызда, құлпы ашық және Bluetooth бен Wi-Fi қосылып тұруы керек.</translation> <translation id="3132896062549112541">Ереже</translation> @@ -2475,6 +2478,7 @@ <translation id="3177909033752230686">Бет тілі:</translation> <translation id="3177914167275935955">Құрылғыда Chrome Education Upgrade қамтылған, бірақ пайдаланушы атыңыз Google for Education аккаунтымен байланыстырылмаған. Қосымша құрылғыда g.co/workspace/edusignup сайтына кіру арқылы Google for Education аккаунтын жасаңыз.</translation> <translation id="3179982752812949580">Мәтін қарпі</translation> +<translation id="3180284704187420717">Бетбелгілерді, құпия сөздерді және т.б. ақпаратты синхрондап сақтаңыз</translation> <translation id="3181954750937456830">Safe Browsing қызметі (сізді және құрылғыңызды қауіпті сайттардан қорғайды)</translation> <translation id="3182749001423093222">Емле тексеру</translation> <translation id="3183139917765991655">Profile Importer</translation> @@ -2966,6 +2970,7 @@ <translation id="3637203148990213388">Қосымша аккаунттар</translation> <translation id="3639220004740062347">Оқу құралы режимінен шығу</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> үшін "<ph name="EXTENSION_NAME" />" қосу қажет пе?</translation> +<translation id="3640347231390550691">Құпия сөздеріңізді фишингтен қорғаңыз</translation> <translation id="3640613767643722554">Assistant қолданбасын дауысыңызды тануға үйретіңіз</translation> <translation id="3641456520301071208">Сайттар локацияңызды сұрай алады.</translation> <translation id="3642070413432681490">Курсорды айналдыру</translation> @@ -2976,6 +2981,7 @@ <translation id="3647654707956482440">Бұл сілтемені пайдалану мүмкін емес. Емле қателері бар-жоғын тексеріңіз немесе әрекетті қайталау үшін басқа сілтемені пайдаланыңыз.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынды.}other{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынды.}}</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> анықталды</translation> +<translation id="3649190289964910441">Сіз кірген сайт нақты пайдаланушы екеніңізді растайтын ақпаратты Chrome-мен сақтай алады. Шолуды жалғастырсаңыз, сайттар Chrome-мен тексеріп, бірінші сайттан сенімді пайдаланушы екеніңізді растай алады.</translation> <translation id="3650753875413052677">Тіркеу кезінде қате шықты</translation> <translation id="3650845953328929506">Журналды жүктеп салу кезекте.</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" қолданбасына кіруге рұқсат беру:</translation> @@ -3390,6 +3396,7 @@ <translation id="3988996860813292272">Уақыт белдеуін таңдау</translation> <translation id="399179161741278232">Импортталған</translation> <translation id="3992008114154328194"><ph name="STATUS" /> (<ph name="FILE_NAME" />) жүктеп алынуда</translation> +<translation id="3993259701827857030">Деректердің сақтық көшірмесін жасау</translation> <translation id="3993887353483242788"><ph name="DEVICE_TYPE" /> құрылғыңызды синхрондасаңыз, Google аккаунтыңызбен кірген кезде, параметрлеріңіз кез келген құрылғыда дайын тұрады. Ол параметрлерге қолданбалар, Wi-Fi құпия сөздері, тілдер, тұсқағаздар, перне тіркесімдері және т.б. кіреді.</translation> <translation id="3994318741694670028">Өкінішке орай, компьютеріңіз бұзылған жабдық идентификаторымен конфигурацияланған. Бұл жайт ChromeOS Flex операциялық жүйесінің соңғы қауіпсіздік түзетулерімен жаңартылуына кедергі жасайды және компьютеріңіз <ph name="BEGIN_BOLD" />зиянды шабуылдардан қорғана алмауы мүмкін<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300"><ph name="DEVICE_TYPE" /> құрылғысының құлпын ашу үшін телефонның құлпын ашып, оны жақындатыңыз.</translation> @@ -3769,6 +3776,7 @@ <translation id="4369215744064167350">Веб-сайтқа кіру сұрауы мақұлданды</translation> <translation id="4369735607080757018">Сайттар арасында жарнамалардың өнімділігін өлшеу үшін деректердің шектеулі түрлері (мысалы, сізге жарнама көрсетілген күн уақыты) бөлісіледі</translation> <translation id="4370975561335139969">Сіз енгізген электрондық пошта және құпия сөз сәйкес емес</translation> +<translation id="4374805630006466253">Басқа телефонды немесе планшетті пайдалану</translation> <translation id="4374831787438678295">Linux орнату құралы</translation> <translation id="4375035964737468845">Жүктелген файлдарды ашу</translation> <translation id="4376226992615520204">Локация өшірулі.</translation> @@ -3944,10 +3952,12 @@ <translation id="4522890784888918985">Туынды аккаунттарға қолдау көрсетілмейді.</translation> <translation id="4523876148417776526">XML сайт тізімдері әлі алынбады.</translation> <translation id="4524832533047962394">Берілген тіркеу режимі операциялық жүйенің бұл нұсқасында істемейді. Ең соңғы нұсқасын қолдануыңыз керек.</translation> +<translation id="4526051299161934899">Жасырын сақталған қойындылар топтары</translation> <translation id="4526853756266614740">Тақырыпты лезде қолдану үшін суретті таңдаңыз</translation> <translation id="452750746583162491">Синхрондалған деректерді қарау</translation> <translation id="4527929807707405172">Кері айналдыруды қосу. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Аударма ұсынысы</translation> +<translation id="4528638190900283934">Қосымша мүмкіндіктер үшін аккаунтқа кіру</translation> <translation id="4529455689802245339">Chrome Live Caption жұмыс істемеуі мүмкін.</translation> <translation id="4530494379350999373">Түпнұсқа</translation> <translation id="4531924570968473143"><ph name="DEVICE_TYPE" /> құрылғысына кімді қосқыңыз келеді?</translation> @@ -4219,6 +4229,7 @@ <translation id="477647109558161443">Жұмыс үстеліндегі таңбаша жасау</translation> <translation id="4776594120007763294">Бетті кейінірек оқылатын беттер тізіміне қосу үшін осы түймені басыңыз.</translation> <translation id="4777458362738635055">Бұл құрылғының басқа пайдаланушылары осы желіні пайдалана алады</translation> +<translation id="477781522763920796">Бұл параметр жеке басыңызды көрсетпей немесе сайттардың браузерді қолдану тарихын көруіне рұқсат етпей жұмыс істейді.</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4777943778632837590">Желілік атаулар серверлерін конфигурациялау</translation> <translation id="4779083564647765204">Масштабтау</translation> @@ -4268,6 +4279,7 @@ <translation id="4824037980212326045">Linux қолданбалары мен файлдарының сақтық көшірмесін жасау және оларды қалпына келтіру</translation> <translation id="4824958205181053313">Синхрондауды тоқтату қажет пе?</translation> <translation id="4825532258163983651">Кіру кілтін жою мүмкін емес</translation> +<translation id="4827283332383516812">Картаны жою</translation> <translation id="4827675678516992122">Жалғанбады</translation> <translation id="4827784381479890589">Chrome браузеріндегі емле тексерісі жақсартылған (жазылу ұсыныстары үшін тексеру үшін мәтін Google-ға жіберіледі).</translation> <translation id="4827904420700932487">Осы суретке QR кодын жасау</translation> @@ -5289,6 +5301,7 @@ <translation id="5792295754950501287">"<ph name="CARD_DESCRIPTION" />" бойынша қосымша әрекеттер</translation> <translation id="5792728279623964091">Қуат түймесін түртіңіз.</translation> <translation id="5792874008054171483">"<ph name="SITE_NAME" />" бойынша қосымша әрекеттер</translation> +<translation id="5793317771769868848">Бұл төлеу әдісі осы құрылғыдан жойылады</translation> <translation id="5793339252089865437">Жаңартылған нұсқаны мобильді желі арқылы жүктеп алатын болсаңыз, қосымша ақы алынуы мүмкін.</translation> <translation id="5793420564274426163">Жұптауды растау</translation> <translation id="5793430094159150686">Құпия сөзіңіз өзгертілді. Жергілікті деректерді қалпына келтіру үшін ескі құпия сөзіңізді енгізуіңіз қажет.</translation> @@ -6177,6 +6190,7 @@ <translation id="6597331566371766302">Әкімші келесі кеңейтімдерді бөгеген:</translation> <translation id="6601262427770154296">Пайдаланушы сөздіктерін басқару</translation> <translation id="6601612474695404578">Кейбір сайттар беттерін жүктеу үшін үшінші тараптың cookie файлдарын пайдаланады. Сайт жұмыс істемесе, cookie файлдарына рұқсат берсеңіз болады.</translation> +<translation id="6602581642873576447">"Спам мен алаяқтықты азайту" функциясы өшірулі</translation> <translation id="6602937173026466876">Принтерлерді пайдалану</translation> <translation id="6602956230557165253">Шарлау үшін сол жақ және оң жақ көрсеткі пернелерін пайдаланыңыз.</translation> <translation id="6603185457265641428">Тарихты синхрондау мүмкіндігін таңдаңыз</translation> @@ -6352,6 +6366,7 @@ <translation id="6774710250118040929">Жаңа құпия сөз қосу</translation> <translation id="6775163072363532304">Қолжетімді құрылғылар осы жерде пайда болады.</translation> <translation id="677646486571529447">Ескертпе қосу</translation> +<translation id="6776589734354015877">Қосымша мүмкіндіктер алу</translation> <translation id="6776729248872343918">Fast Pair функциясын қосу</translation> <translation id="6777817260680419853">Бағыттауға тыйым салынған</translation> <translation id="6779092717724412415">Осылай ерекшелеу үшін мәтінді таңдап, тінтуірдің оң жақ түймесін басыңыз.</translation> @@ -6693,6 +6708,7 @@ <translation id="7047059339731138197">Фонды таңдау</translation> <translation id="7049293980323620022">Файл сақталсын ба?</translation> <translation id="7050037487872780845">Хотспот конфигурациясы жарамсыз</translation> +<translation id="7050519587566342213">Шолу бірқалыптырақ, себебі бір сайттан екіншісіне өткенде сенімдірек бола аласыз.</translation> <translation id="7051551856857948729">IBAN мәнін жасыру</translation> <translation id="7052237160939977163">Өнімділікті бақылау деректерін жіберу</translation> <translation id="7053983685419859001">Бөгеу</translation> @@ -6910,6 +6926,7 @@ <translation id="7269736181983384521">Nearby Share дерек трафигі</translation> <translation id="7272674038937250585">Сипаттама жазылмады</translation> <translation id="7273110280511444812">соңғы рет <ph name="DATE" /> күні жалғанған</translation> +<translation id="7273921429569738933">"Спам мен алаяқтықты азайту" функциясы қосулы</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% – толуына <ph name="TIME" /> қалды</translation> <translation id="727952162645687754">Жүктеу қатесі</translation> <translation id="7280041992884344566">Chrome браузері зиянды бағдарламалық құралды іздеп жатқанда, қате кетті</translation> @@ -7204,7 +7221,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> жүктеу сәтсіз аяқталды</translation> <translation id="7551643184018910560">Сөреге бекіту</translation> -<translation id="7552658769580484674">Автотолтыру туралы пікір қалдыру</translation> <translation id="7552846755917812628">Келесі кеңестерді орындап көріңіз:</translation> <translation id="7553012839257224005">Linux контейнері тексерілуде</translation> <translation id="7553242001898162573">Құпия сөзіңізді енгізіңіз</translation> @@ -7266,6 +7282,7 @@ <translation id="7609148976235050828">Интернетке қосылып, әрекетті қайталап көріңіз.</translation> <translation id="7612401678989660900">Қолданбалар мен веб-сайттарға микрофонды пайдалануға мүмкіндік беру</translation> <translation id="7612655942094160088">Жалғанған телефон функцияларын қосу.</translation> +<translation id="7612989789287281429">Аккаунтқа кіруде…</translation> <translation id="7614260613810441905">Сайт құрылғыдағы файлдарды немесе қалталарды өзгерткісі келгенде сұрау (ұсынылады)</translation> <translation id="761530003705945209">Google Drive жадына сақтық көшірме жасау. Деректерді қалпына келтіруге немесе құрылғыны кез келген уақытта ауыстыруға болады. Сақтық көшірмеге қолданба туралы дерек кіреді. Сақтық көшірмелер Google-ға жүктеп салынады және Google аккаунтыңыздың құпия сөзі арқылы шифрланады.</translation> <translation id="7615365294369022248">Аккаунтты енгізу кезінде қате шықты</translation> @@ -7746,6 +7763,7 @@ <translation id="8023801379949507775">Кеңейтімдерді қазір жаңарту</translation> <translation id="8025151549289123443">Құлыптаулы экран және кіру</translation> <translation id="8026334261755873520">Шолу деректерін өшіру</translation> +<translation id="8026471514777758216">Барлық құрылғыңыз</translation> <translation id="8028060951694135607">Microsoft Key Recovery</translation> <translation id="8028803902702117856"><ph name="FILE_NAME" /> (<ph name="SIZE" />) жүктеп алынуда</translation> <translation id="8028993641010258682">Көлемі</translation> @@ -8481,6 +8499,7 @@ <translation id="869884720829132584">Қолданбалар мәзірі</translation> <translation id="869891660844655955">Аяқталу мерзімі</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> бойынша PPD</translation> +<translation id="8702278591052316269">Жасырын сақталған қойындылар топтарын қамтитын мәзір</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> құрылғыңыз құлыпталды.</translation> <translation id="8703346390800944767">Жарнаманы өткізіп жіберу</translation> <translation id="8705331520020532516">Сериялық нөмір</translation> @@ -8761,7 +8780,6 @@ <translation id="8952831374766033534">Конфигурация опциясына қолдау көрсетілмейді: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Зарядтау кезінде</translation> <translation id="895347679606913382">Басталуда…</translation> -<translation id="8956230710625245889">Reader арқылы ашу</translation> <translation id="8957757410289731985">Профильді реттеу</translation> <translation id="895944840846194039">JavaScript жады</translation> <translation id="8960208913905765425">Жылдам жауаптар ұсынған өлшем бірліктерін ауыстыру</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index fbd6d92..4daeed4 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">ចាប់ផ្ដើម Linux ឡើងវិញឬ?</translation> <translation id="1047431265488717055">ចម្លងអត្ថបទតំណ</translation> <translation id="1048286738600630630">ការបង្ហាញ</translation> -<translation id="1048770690598418849">អ្នកអាចរំលងនៅពេលនេះ ហើយយើងនឹងព្យាយាមម្ដងទៀតដោយស្វ័យប្រវត្តិ បន្ទាប់ពីអ្នកបញ្ចប់ការរៀបចំ</translation> <translation id="1048986595386481879">បែងចែកជានិច្ច</translation> <translation id="1049324577536766607">{COUNT,plural, =1{កំពុងទទួល <ph name="ATTACHMENTS" /> ពី <ph name="DEVICE_NAME" />}other{កំពុងទទួល <ph name="ATTACHMENTS" /> ពី <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">អនាមិក</translation> @@ -206,6 +205,7 @@ <translation id="1174073918202301297">បានបញ្ចូលផ្លូវកាត់</translation> <translation id="1174366174291287894">ការតភ្ជាប់របស់អ្នកមានសុវត្ថិភាពជានិច្ច ប្រសិនបើ Chrome មិនប្រាប់អ្នកផ្សេងពីនេះទេ</translation> <translation id="117445914942805388">ដើម្បីសម្អាតទិន្នន័យរុករកចេញពីឧបករណ៍ដែលបានធ្វើសមកាលកម្មទាំងអស់របស់អ្នក និងគណនី Google របស់អ្នក <ph name="BEGIN_LINK" />សូមចូលទៅកាន់ការកំណត់សមកាលកម្ម<ph name="END_LINK" />។</translation> +<translation id="1175131936083782305">អ្នកគ្រប់គ្រងរបស់អ្នកបានបិទមុខងារនេះ។</translation> <translation id="1175364870820465910">បោះពុម្ព...</translation> <translation id="1176471985365269981">មិនអនុញ្ញាតឱ្យកែឯកសារ ឬថតនៅក្នុងឧបករណ៍របស់អ្នកទេ</translation> <translation id="1177863135347784049">ផ្ទាល់ខ្លួន</translation> @@ -1369,6 +1369,7 @@ <translation id="2182058453334755893">បានចម្លងទៅក្នុងឃ្លីបបតរបស់អ្នក</translation> <translation id="2183570493397356669">បានបិទប៊ូតុង "បន្ត"</translation> <translation id="2184515124301515068">អនុញ្ញាតឱ្យ Chrome ជ្រើសរើសថាតើពេលណាដែលគេហទំព័រអាចចាក់សំឡេងបាន (បានណែនាំ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">ទំព័រដែលត្រូវបានចែករំលែកពីឧបករណ៍ផ្សេងទៀត</translation> <translation id="2187675480456493911">បានធ្វើសមកាលកម្មជាមួយឧបករណ៍ផ្សេងទៀតនៅលើគណនីរបស់អ្នក។ ការកំណត់ដែលបានកែប្រែដោយអ្នកប្រើប្រាស់ផ្សេងទៀតនឹងមិនត្រូវបានធ្វើសមកាលកម្មទេ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="2187895286714876935">កំហុសឆ្គងការនាំចូលវិញ្ញាបនប័ត្រម៉ាស៊ីនមេ</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">អានប្រវត្តិរុករករបស់អ្នក</translation> <translation id="2674764818721168631">បិទ</translation> <translation id="2675570801872027281">មានបញ្ហាក្នុងការលុប Bruschetta ចេញ។ សូមព្យាយាមម្ដងទៀត។</translation> -<translation id="2676492189600898281">ផ្ដល់មតិកែលម្អមុខងារបំពេញស្វ័យប្រវត្តិ</translation> <translation id="2678063897982469759">បើកដំណើរការឡើងវិញ</translation> <translation id="2678100101831051676">មិនអាចភ្ជាប់បានទេ។</translation> <translation id="268053382412112343">ប្រវតិ្ត</translation> @@ -2454,6 +2454,7 @@ <translation id="3129215702932019810">មានបញ្ហាក្នុងការចាប់ផ្ដើមកម្មវិធី</translation> <translation id="3130528281680948470">ឧបករណ៍របស់អ្នកនឹងត្រូវបានកំណត់ឡើងវិញ ហើយគណនីអ្នកប្រើ និងទិន្នន័យមូលដ្ឋានទាំងអស់នឹងត្រូវបានយកចេញ។ វាមិនអាចបកក្រោយបានវិញទេ។</translation> <translation id="3130863904455712965">ប្រវត្តិ និងអ្វីៗជាច្រើនទៀត</translation> +<translation id="3130966412954727147">គេហទំព័រដែលអ្នកចូលមើលអាចបញ្ជាក់ភាពត្រឹមត្រូវថា អ្នកជាអ្នកប្រើប្រាស់ពិតប្រាកដ និងមិនមែនជាបូតទេ។</translation> <translation id="313205617302240621">អ្នកបានភ្លេចពាក្យសម្ងាត់មែនឬទេ?</translation> <translation id="3132277757485842847">យើងមិនអាចរក្សាការតភ្ជាប់ជាមួយទូរសព្ទរបស់អ្នកបានទេ។ សូមប្រាកដថា ទូរសព្ទរបស់អ្នកនៅជិត បានដោះសោ និងបានបើកប៊្លូធូស និង Wi-Fi។</translation> <translation id="3132896062549112541">វិធាន</translation> @@ -2995,6 +2996,7 @@ <translation id="3647654707956482440">មិនអាចប្រើតំណនេះបានទេ។ សូមពិនិត្យមើលកំហុសវាយបញ្ចូល ឬប្រើតំណផ្សេង ដើម្បីព្យាយាមម្ដងទៀត។</translation> <translation id="3647998456578545569">{COUNT,plural, =1{បានទទួល <ph name="ATTACHMENTS" /> ពី <ph name="DEVICE_NAME" />}other{បានទទួល <ph name="ATTACHMENTS" /> ពី <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750">បានរកឃើញ <ph name="USB_DEVICE_NAME" /></translation> +<translation id="3649190289964910441">គេហទំព័រដែលអ្នកចូលមើលអាចរក្សាទុកព័ត៌មានជាមួយ Chrome ដែលបញ្ជាក់ភាពត្រឹមត្រូវថា អ្នកជាអ្នកប្រើប្រាស់ពិតប្រាកដ។ នៅពេលអ្នកបន្តរុករក គេហទំព័រអាចសាកសួរ Chrome និងផ្ទៀងផ្ទាត់តាំងពីគេហទំព័រដំបូងថា អ្នកទំនងជាអ្នកប្រើប្រាស់ដែលទុកចិត្តបាន។</translation> <translation id="3650753875413052677">មានបញ្ហាក្នុងការចុះឈ្មោះ</translation> <translation id="3650845953328929506">ការបង្ហោះកំណត់ហេតុកំពុងរង់ចាំ។</translation> <translation id="3650952250015018111">អនុញ្ញាតឱ្យ "<ph name="APP_NAME" />" ចូលប្រើ៖</translation> @@ -3965,6 +3967,7 @@ <translation id="4522890784888918985">មិនអាចប្រើគណនីកុមារបានទេ</translation> <translation id="4523876148417776526">មិនទាន់ទាញយកបញ្ជីគេហទំព័រ XML នៅឡើយទេ។</translation> <translation id="4524832533047962394">មុខងារចុះឈ្មោះដែលបានផ្ដល់មិនអាចប្រើនៅក្នុងកំណែប្រព័ន្ធប្រតិបត្តិការនេះបានទេ។ សូមប្រាកដថា អ្នកកំពុងដំណើរការកំណែថ្មីបំផុត។</translation> +<translation id="4526051299161934899">ក្រុមផ្ទាំងដែលបានរក្សាទុកដែលបានលាក់</translation> <translation id="4526853756266614740">ជ្រើសរើសរូបភាព ដើម្បីប្រើទម្រង់រចនាភ្លាមៗ</translation> <translation id="452750746583162491">ពិនិត្យមើលទិន្នន័យដែលបានធ្វើសមកាលកម្មរបស់អ្នក</translation> <translation id="4527929807707405172">បើកការរំកិលបញ្ច្រាស។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> @@ -4240,6 +4243,7 @@ <translation id="477647109558161443">បង្កើតផ្លូវកាត់អេក្រង់ដើម</translation> <translation id="4776594120007763294">ដើម្បីបញ្ចូលទំព័រសម្រាប់អាននៅពេលក្រោយ សូមចុចប៊ូតុង</translation> <translation id="4777458362738635055">អ្នកផ្សេងទៀតដែលប្រើប្រាស់ឧបករណ៍នេះអាចប្រើបណ្ដាញនេះបាន</translation> +<translation id="477781522763920796">ការកំណត់នេះដំណើរការដោយមិនកំណត់អត្តសញ្ញាណអ្នក ឬអនុញ្ញាតឱ្យគេហទំព័រមើលឃើញប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នក។</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4777943778632837590">កំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនមេឈ្មោះបណ្ដាញ</translation> <translation id="4779083564647765204">ពង្រីក</translation> @@ -6204,6 +6208,7 @@ <translation id="6597331566371766302">កម្មវិធីបន្ថែមខាងក្រោមត្រូវបានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងរបស់អ្នក៖</translation> <translation id="6601262427770154296">គ្រប់គ្រងវចនានុក្រមអ្នកប្រើប្រាស់</translation> <translation id="6601612474695404578">គេហទំព័រមួយចំនួនប្រើខូគីភាគីទីបី ដើម្បីផ្ទុកទំព័ររបស់ពួកគេ។ ប្រសិនបើគេហទំព័រមិនដំណើរការ អ្នកអាចសាកល្បងអនុញ្ញាតខូគី។</translation> +<translation id="6602581642873576447">ការកាត់បន្ថយសារឥតបានការ និងការគៃបន្លំត្រូវបានបិទ</translation> <translation id="6602937173026466876">ចូលប្រើម៉ាស៊ីនបោះពុម្ពរបស់អ្នក</translation> <translation id="6602956230557165253">ប្រើប៊ូតុងព្រួញខាងស្តាំ និងខាងឆ្វេងដើម្បីរុករក។</translation> <translation id="6603185457265641428">ជ្រើសរើសថាតើត្រូវធ្វើសមកាលកម្មប្រវត្តិឬអត់</translation> @@ -6720,6 +6725,7 @@ <translation id="7047059339731138197">ជ្រើសរើសផ្ទៃខាងក្រោយ</translation> <translation id="7049293980323620022">រក្សាឯកសារឬ?</translation> <translation id="7050037487872780845">ការកំណត់រចនាសម្ព័ន្ធហតស្ប៉តមិនត្រឹមត្រូវ</translation> +<translation id="7050519587566342213">ការរុករកមានលក្ខណៈកាន់តែរលូន ដោយសារអ្នកកាន់តែទំនងជាទទួលបានការទុកចិត្ត ពេលរុករកពីគេហទំព័រមួយទៅគេហទំព័រមួយទៀត។</translation> <translation id="7051551856857948729">លាក់តម្លៃ IBAN</translation> <translation id="7052237160939977163">ផ្ញើទិន្នន័យតាមដានប្រតិបត្តិការ</translation> <translation id="7053983685419859001">ទប់ស្កាត់</translation> @@ -6937,6 +6943,7 @@ <translation id="7269736181983384521">ការប្រើទិន្នន័យនៃការចែករំលែកនៅជិត</translation> <translation id="7272674038937250585">មិនបានផ្តល់ការពណ៌នាទេ</translation> <translation id="7273110280511444812">បានភ្ជាប់ចុងក្រោយបំផុតនៅ <ph name="DATE" /></translation> +<translation id="7273921429569738933">ការកាត់បន្ថយសារឥតបានការ និងការគៃបន្លំត្រូវបានបើក</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% - <ph name="TIME" /> ទៀតទើបពេញ</translation> <translation id="727952162645687754">កំហុសឆ្គងការទាញយក</translation> <translation id="7280041992884344566">មានបញ្ហាកើតឡើង នៅពេល Chrome កំពុងស្វែងរកកម្មវិធីដែលបង្កគ្រោះថ្នាក់</translation> @@ -7231,7 +7238,6 @@ <translation id="7550830279652415241">ចំណាំ_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">ការទាញយក <ph name="FILE_NAME" /> មិនជោគជ័យ</translation> <translation id="7551643184018910560">ដៅទៅធ្នើ</translation> -<translation id="7552658769580484674">ផ្ដល់មតិកែលម្អមុខងារបំពេញស្វ័យប្រវត្តិ</translation> <translation id="7552846755917812628">សាកល្បងធ្វើតាមគន្លឹះខាងក្រោម៖</translation> <translation id="7553012839257224005">កំពុងពិនិត្យមើលទម្រង់ផ្ទុក Linux</translation> <translation id="7553242001898162573">បញ្ចូលពាក្យសម្ងាត់របស់អ្នក។</translation> @@ -8510,6 +8516,7 @@ <translation id="869884720829132584">ម៉ឺនុយកម្មវិធី</translation> <translation id="869891660844655955">កាលបរិច្ឆេទការផុតកំណត់</translation> <translation id="8699188901396699995">PPD សម្រាប់ <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">ម៉ឺនុយដែលមានក្រុមផ្ទាំងដែលបានរក្សាទុកដែលបានលាក់</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> របស់អ្នកត្រូវបានចាក់សោ។</translation> <translation id="8703346390800944767">រំលងការផ្សាយពាណិជ្ជកម្ម</translation> <translation id="8705331520020532516">លេខសេរ៊ី</translation> @@ -8790,7 +8797,6 @@ <translation id="8952831374766033534">មិនស្គាល់ជម្រើសនៃការកំណត់រចនាសម្ព័ន្ធ៖ <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ពេលកំពុងសាកថ្ម</translation> <translation id="895347679606913382">កំពុងចាប់ផ្តើម...</translation> -<translation id="8956230710625245889">បើកក្នុង Reader</translation> <translation id="8957757410289731985">ប្ដូរកម្រងព័ត៌មានតាមបំណង</translation> <translation id="895944840846194039">មេម៉ូរី JavaScript</translation> <translation id="8960208913905765425">ការបំប្លែងខ្នាតចម្លើយរហ័ស</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 168daf7..3e4d996 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೇ?</translation> <translation id="1047431265488717055">ಲಿಂಕ್ ಪ&ಠ್ಯ ನಕಲಿಸಿ</translation> <translation id="1048286738600630630">ಪ್ರದರ್ಶನಗಳು</translation> -<translation id="1048770690598418849">ನೀವು ಈಗ ಸ್ಕಿಪ್ ಮಾಡಬಹುದು ಮತ್ತು ನೀವು ಸೆಟಪ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ ನಾವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಪ್ರಯತ್ನಿಸುತ್ತೇವೆ</translation> <translation id="1048986595386481879">ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಹಂಚಲಾಗಿದೆ</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ಇಂದ <ph name="ATTACHMENTS" /> ಅನ್ನು ಸ್ವೀಕರಿಸಲಾಗುತ್ತಿದೆ}one{<ph name="DEVICE_NAME" /> ಇಂದ <ph name="ATTACHMENTS" /> ಅನ್ನು ಸ್ವೀಕರಿಸಲಾಗುತ್ತಿದೆ}other{<ph name="DEVICE_NAME" /> ಇಂದ <ph name="ATTACHMENTS" /> ಅನ್ನು ಸ್ವೀಕರಿಸಲಾಗುತ್ತಿದೆ}}</translation> <translation id="1049743911850919806">ಅದೃಶ್ಯ</translation> @@ -1362,6 +1361,7 @@ <translation id="2182058453334755893">ನಿಮ್ಮ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="2183570493397356669">ಮುಂದುವರೆಸಿ ಬಟನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="2184515124301515068">ಯಾವ ಸೈಟ್ಗಳು ಧ್ವನಿಯನ್ನು ಪ್ಲೇ ಮಾಡಬೇಕು ಎಂಬುದನ್ನು Chrome ಆಯ್ಕೆ ಮಾಡಲಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">ಮತ್ತೊಂದು ಸಾಧನದಿಂದ ಪುಟವನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ</translation> <translation id="2187675480456493911">ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ಇತರ ಸಾಧನಗಳ ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ. ಇತರ ಬಳಕೆದಾರರು ಮಾರ್ಪಡಿಸಿದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡುವುದಿಲ್ಲ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರದ ಆಮದು ದೋಷ</translation> @@ -1632,6 +1632,7 @@ <translation id="2408018932941436077">ಕಾರ್ಡ್ ಅನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2408955596600435184">ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ</translation> <translation id="2409268599591722235">ಪ್ರಾರಂಭಿಸೋಣ</translation> +<translation id="2409709393952490731">ಫೋನ್ ಅಥವಾ ಟ್ಯಾಬ್ಲೆಟ್ ಬಳಸಿ</translation> <translation id="2410079346590497630">ಬಿಲ್ಡ್ ವಿವರಗಳು</translation> <translation id="2410298923485357543">ಸಾಧನವು ಆನ್ಲೈನ್ನಲ್ಲಿರುವಾಗ ನೈಸರ್ಗಿಕ ಧ್ವನಿಯನ್ನು ಬಳಸಿ</translation> <translation id="2410754283952462441">ಖಾತೆಯೊಂದನ್ನು ಆರಿಸಿ</translation> @@ -1668,6 +1669,7 @@ <translation id="2442916515643169563">ಪಠ್ಯದ ನೆರಳು</translation> <translation id="2443487764245141020">ಗುರುತಿಸುವಿಕೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಸೈಟ್ಗಳು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಗುರುತಿಸಬೇಕಾಗಬಹುದು</translation> <translation id="244475495405467108">ಎಡಬದಿಯಲ್ಲಿರುವ ಟ್ಯಾಬ್ಗಳನ್ನು ಮುಚ್ಚಿ</translation> +<translation id="2444874983932528148">ನೀವು ಎಲ್ಲಿಗೆ ನಿಲ್ಲಿಸಿದ್ದಿರೋ, ಸುಲಭವಾಗಿ ಅಲ್ಲಿಂದಲೇ ಮುಂದುವರಿಸಿ</translation> <translation id="2445081178310039857">ವಿಸ್ತರಣೆ ಮೂಲ ಡೈರೆಕ್ಟರಿ ಅಗತ್ಯವಿದೆ.</translation> <translation id="2445484935443597917">ಹೊಸ ಪ್ರೊಫೈಲ್ ರಚಿಸಿ</translation> <translation id="2445726032315793326">ಭಾಗಶಃ ಮ್ಯಾಗ್ನಿಫೈರ್</translation> @@ -1928,7 +1930,6 @@ <translation id="2673135533890720193">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಓದಿ</translation> <translation id="2674764818721168631">ಆಫ್</translation> <translation id="2675570801872027281">Bruschetta ಅನ್ನು ತೆಗೆದುಹಾಕುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> -<translation id="2676492189600898281">ಆಟೋಫಿಲ್ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಒದಗಿಸಿ</translation> <translation id="2678063897982469759">ಮರು-ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2678100101831051676">ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> <translation id="268053382412112343">&ಇತಿಹಾಸ</translation> @@ -2486,6 +2487,7 @@ <translation id="3177909033752230686">ಪುಟದ ಭಾಷೆ:</translation> <translation id="3177914167275935955">ನಿಮ್ಮ ಸಾಧನವು Chrome Education ಅಪ್ಗ್ರೇಡ್ ಅನ್ನು ಹೊಂದಿದೆ, ಆದರೆ ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ Google for Education ಖಾತೆಯನ್ನು ಹೊಂದಿಲ್ಲ. ಸೆಕೆಂಡರಿ ಸಾಧನದಲ್ಲಿ g.co/workspace/edusignup ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ Google for Education ಖಾತೆಯನ್ನು ರಚಿಸಿ.</translation> <translation id="3179982752812949580">ಪಠ್ಯದ ಫಾಂಟ್</translation> +<translation id="3180284704187420717">ಸಿಂಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು ಹಾಗೂ ಮುಂತಾದವುಗಳನ್ನು ಉಳಿಸಿ</translation> <translation id="3181954750937456830">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ (ಅಪಾಯಕಾರಿ ಸೈಟ್ಗಳಿಂದ ನಿಮ್ಮನ್ನು ಮತ್ತು ನಿಮ್ಮ ಸಾಧನವನ್ನು ರಕ್ಷಿಸುತ್ತದೆ)</translation> <translation id="3182749001423093222">ಕಾಗುಣಿತ ಪರಿಶೀಲನೆ</translation> <translation id="3183139917765991655">ಪ್ರೊಫೈಲ್ ಆಮದುದಾರ</translation> @@ -2977,6 +2979,7 @@ <translation id="3637203148990213388">ಹೆಚ್ಚುವರಿ ಖಾತೆಗಳು</translation> <translation id="3639220004740062347">ರೀಡರ್ ಮೋಡ್ನಿಂದ ನಿರ್ಗಮಿಸಿ</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> ಬಳಕೆದಾರರಿಗೆ "<ph name="EXTENSION_NAME" />" ವಿಸ್ತರಣೆಯನ್ನು ಸೇರಿಸುವುದೇ?</translation> +<translation id="3640347231390550691">ಫಿಶಿಂಗ್ ದಾಳಿಯಿಂದ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ರಕ್ಷಿಸಿ</translation> <translation id="3640613767643722554">ನಿಮ್ಮ Assistant ಗೆ ನಿಮ್ಮ ಧ್ವನಿಯನ್ನು ಗುರುತಿಸಲು ಕಲಿಸಿ</translation> <translation id="3641456520301071208">ಸೈಟ್ಗಳು ನಿಮ್ಮ ಸ್ಥಳದ ಮಾಹಿತಿಯನ್ನು ಕೇಳಬಹುದು</translation> <translation id="3642070413432681490">ಮೌಸ್ ಕರ್ಸರ್ ಚಲಿಸುವಾಗ ಅದನ್ನು ಹೈಲೈಟ್ ಮಾಡಿ</translation> @@ -3402,6 +3405,7 @@ <translation id="3988996860813292272">ಸಮಯ ವಲಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="399179161741278232">ಆಮದುಮಾಡಲಾಗಿದೆ</translation> <translation id="3992008114154328194"><ph name="FILE_NAME" /> ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">ಡೇಟಾ ಬ್ಯಾಕಪ್ ಮಾಡಿ</translation> <translation id="3993887353483242788">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಸಿಂಕ್ ಮಾಡಿ ಇದರಿಂದ ನೀವು ನಿಮ್ಮ Google ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ ನಿಮ್ಮ ಆದ್ಯತೆಗಳು ಯಾವುದೇ ಸಾಧನದಲ್ಲಿ ಸಿದ್ಧವಾಗುತ್ತವೆ. ಆದ್ಯತೆಗಳು ಆ್ಯಪ್ಗಳು, ಸೆಟ್ಟಿಂಗ್ಗಳು, ವೈ-ಫೈ ಪಾಸ್ವರ್ಡ್ಗಳು, ಭಾಷೆಗಳು, ವಾಲ್ಪೇಪರ್, ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಒಳಗೊಂಡಿವೆ.</translation> <translation id="3994318741694670028">ದುರದೃಷ್ಟವಶಾತ್, ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಸರಿಯಾಗಿ ರೂಪುಗೊಳ್ಳದ ಹಾರ್ಡ್ವೇರ್ ID ಯ ಜೊತೆಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ. ಇದು ChromeOS Flex ಇತ್ತೀಚಿನ ಭದ್ರತಾ ಸರಿಪಡಿಸುವಿಕೆಗಳೊಂದಿಗೆ ಅಪ್ಡೇಟ್ ಆಗುವುದನ್ನು ತಡೆಗಟ್ಟುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ <ph name="BEGIN_BOLD" />ದುರುದ್ದೇಶಪ್ರೇರಿತ ದಾಳಿಗಳಿಗೆ ಗುರಿಯಾಗಬಹುದು<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಸಾಧನದ ಹತ್ತಿರ ಇರಿಸಿ.</translation> @@ -3781,6 +3785,7 @@ <translation id="4369215744064167350">ವೆಬ್ಸೈಟ್ ವಿನಂತಿಯನ್ನು ಅನುಮೋದಿಸಲಾಗಿದೆ</translation> <translation id="4369735607080757018">ನಿಮಗೆ ಜಾಹೀರಾತು ತೋರಿಸಲಾದ ದಿನದ ಸಮಯದಂತಹ ತಮ್ಮ ಜಾಹೀರಾತುಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಅಳೆಯಲು ಸೀಮಿತ ಪ್ರಕಾರದ ಡೇಟಾವನ್ನು ಸೈಟ್ಗಳ ನಡುವೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ</translation> <translation id="4370975561335139969">ನೀವು ನಮೂದಿಸಿದ ಇಮೇಲ್ ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ</translation> +<translation id="4374805630006466253">ಬೇರೆ ಫೋನ್ ಅಥವಾ ಟ್ಯಾಬ್ಲೆಟ್ ಬಳಸಿ</translation> <translation id="4374831787438678295">Linux ಇನ್ಸ್ಟಾಲರ್</translation> <translation id="4375035964737468845">ಡೌನ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲ್ಗಳನ್ನು ತೆರೆ</translation> <translation id="4376226992615520204">ಸ್ಥಳ ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -3961,6 +3966,7 @@ <translation id="452750746583162491">ಸಿಂಕ್ ಮಾಡಲಾಗಿರುವ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="4527929807707405172">ಹಿಮ್ಮುಖ ಸ್ಕ್ರಾಲ್ ಮಾಡುವಿಕೆ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="4528494169189661126">ಅನುವಾದ ಸಲಹೆ</translation> +<translation id="4528638190900283934">ಹೆಚ್ಚುವರಿ ಫೀಚರ್ಗಳಿಗಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="4529455689802245339">Chrome ಲೈವ್ ಕ್ಯಾಪ್ಶನ್ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು</translation> <translation id="4530494379350999373">ಮೂಲ</translation> <translation id="4531924570968473143">ಈ <ph name="DEVICE_TYPE" /> ಗೆ ನೀವು ಯಾರನ್ನು ಸೇರಿಸಲು ಬಯಸುತ್ತೀರಿ?</translation> @@ -6374,6 +6380,7 @@ <translation id="6774710250118040929">ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೇರಿಸಿ</translation> <translation id="6775163072363532304">ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ.</translation> <translation id="677646486571529447">ಟಿಪ್ಪಣಿಯನ್ನು ಸೇರಿಸಿ</translation> +<translation id="6776589734354015877">ಹೆಚ್ಚುವರಿ ಫೀಚರ್ಗಳನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="6776729248872343918">ಶೀಘ್ರ ಜೋಡಿಯಾಗಿಸುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="6777817260680419853">ಮರುನಿರ್ದೇಶಿಸುವಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="6779092717724412415">ಈ ರೀತಿಯ ಹೈಲೈಟ್ ರಚಿಸಲು, ಯಾವುದೇ ಪಠ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> @@ -7227,7 +7234,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ಡೌನ್ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</translation> <translation id="7551643184018910560">ಶೆಲ್ಫ್ಗೆ ಪಿನ್ ಮಾಡು</translation> -<translation id="7552658769580484674">ಆಟೋಫಿಲ್ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಒದಗಿಸಿ</translation> <translation id="7552846755917812628">ಕೆಳಗಿನ ಸಲಹೆಗಳನ್ನು ಪ್ರಯತ್ನಿಸಿ:</translation> <translation id="7553012839257224005">Linux ಕಂಟೇನರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="7553242001898162573">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ</translation> @@ -7767,6 +7773,7 @@ <translation id="8023801379949507775">ಈಗ ವಿಸ್ತರಣೆಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="8025151549289123443">ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡಿ ಹಾಗೂ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="8026334261755873520">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> +<translation id="8026471514777758216">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳು</translation> <translation id="8028060951694135607">Microsoft Key Recovery</translation> <translation id="8028803902702117856">ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">ಗಾತ್ರ</translation> @@ -8784,7 +8791,6 @@ <translation id="8952831374766033534">ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಗೆ ಬೆಂಬಲವಿಲ್ಲ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ</translation> <translation id="895347679606913382">ಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತಿದೆ...</translation> -<translation id="8956230710625245889">ರೀಡರ್ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="8957757410289731985">ಪ್ರೊಫೈಲ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation> <translation id="895944840846194039">JavaScript ಸ್ಮರಣೆ</translation> <translation id="8960208913905765425">ತ್ವರಿತ ಉತ್ತರಗಳ ಯೂನಿಟ್ ಪರಿವರ್ತನೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index fb4f7ff0..9280a96 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux를 다시 시작하시겠습니까?</translation> <translation id="1047431265488717055">링크 텍스트 복사(&X)</translation> <translation id="1048286738600630630">디스플레이</translation> -<translation id="1048770690598418849">지금은 이 단계를 건너뛸 수 있으며 설정을 완료한 후 자동으로 다시 시도합니다</translation> <translation id="1048986595386481879">동적으로 할당됨</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" />에서 <ph name="ATTACHMENTS" /> 수신 중}other{<ph name="DEVICE_NAME" />에서 <ph name="ATTACHMENTS" /> 수신 중}}</translation> <translation id="1049743911850919806">시크릿 모드</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">클립보드에 복사됨</translation> <translation id="2183570493397356669">계속 버튼 사용 중지됨</translation> <translation id="2184515124301515068">사이트의 소리 재생 여부를 Chrome이 결정(권장)</translation> +<translation id="2186206192313702726">Google 렌즈</translation> <translation id="2186711480981247270">다른 기기에서 공유된 페이지</translation> <translation id="2187675480456493911">계정에 연결된 다른 기기와 동기화되어 있습니다. 다른 사용자가 수정한 설정은 동기화되지 않습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="2187895286714876935">서버 인증서 가져오기 오류</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">카드 저장 중</translation> <translation id="2408955596600435184">PIN 입력</translation> <translation id="2409268599591722235">시작하기</translation> +<translation id="2409709393952490731">휴대전화 또는 태블릿 사용</translation> <translation id="2410079346590497630">빌드 세부정보</translation> <translation id="2410298923485357543">기기가 온라인일 때 자연 음성 사용</translation> <translation id="2410754283952462441">계정 선택</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">인터넷 사용 기록 확인</translation> <translation id="2674764818721168631">사용 안함</translation> <translation id="2675570801872027281">Bruschetta를 삭제하는 중에 오류가 발생했습니다. 다시 시도해 주세요.</translation> -<translation id="2676492189600898281">자동 완성 의견 보내기</translation> <translation id="2678063897982469759">다시 사용</translation> <translation id="2678100101831051676">전송할 수 없습니다</translation> <translation id="268053382412112343">내역(&S)</translation> @@ -3786,6 +3786,7 @@ <translation id="4369215744064167350">웹사이트 요청 승인됨</translation> <translation id="4369735607080757018">광고 실적을 측정할 수 있도록 광고 표시 시간 등 제한된 유형의 데이터가 사이트 간에 공유됩니다.</translation> <translation id="4370975561335139969">입력한 이메일과 비밀번호가 일치하지 않습니다.</translation> +<translation id="4374805630006466253">다른 휴대전화 또는 태블릿 사용</translation> <translation id="4374831787438678295">Linux 설치 프로그램</translation> <translation id="4375035964737468845">다운로드한 파일 열기</translation> <translation id="4376226992615520204">위치 사용 중지됨</translation> @@ -7228,7 +7229,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" />을(를) 다운로드하지 못함</translation> <translation id="7551643184018910560">실행기에 고정</translation> -<translation id="7552658769580484674">자동 완성 의견 보내기</translation> <translation id="7552846755917812628">다음 도움말을 확인해 보세요.</translation> <translation id="7553012839257224005">Linux 컨테이너 확인 중</translation> <translation id="7553242001898162573">비밀번호를 입력해 주세요.</translation> @@ -8789,7 +8789,6 @@ <translation id="8952831374766033534">설정 옵션이 지원되지 않음: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">충전 시</translation> <translation id="895347679606913382">다운로드 시작...</translation> -<translation id="8956230710625245889">Reader에서 열기</translation> <translation id="8957757410289731985">프로필 맞춤설정</translation> <translation id="895944840846194039">자바스크립트 메모리</translation> <translation id="8960208913905765425">빠른 답변 단위 변환</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index a448bf9..6bd203c 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux өчүрүлүп күйгүзүлсүнбү?</translation> <translation id="1047431265488717055">Шилтеме тек&стин көчүрүү</translation> <translation id="1048286738600630630">Дисплейлер</translation> -<translation id="1048770690598418849">Азырынча өткөрүп жиберсеңиз болот. Тууралап бүткөнүңүздөн кийин автоматтык түрдө кайра аракет кылабыз</translation> <translation id="1048986595386481879">Динамикалык түрдө бөлүнгөн</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> түзмөгүнөн <ph name="ATTACHMENTS" /> тиркеме алынууда}other{<ph name="DEVICE_NAME" /> түзмөгүнөн <ph name="ATTACHMENTS" /> тиркеме алынууда}}</translation> <translation id="1049743911850919806">Жашыруун</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Алмашуу буферине көчүрүлдү</translation> <translation id="2183570493397356669">Улантуу баскычы өчүрүлдү</translation> <translation id="2184515124301515068">Сайттардын добушун чыгарууну Chrome'го табыштаңыз (сунушталат)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Барак башка түзмөктөн бөлүшүлдү</translation> <translation id="2187675480456493911">Аккаунтуңуздагы башка түзмөктөр менен шайкештирилди. Башка колдонуучу өзгөрткөн жөндөө шайкештирилбейт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Сервердин тастыктамасын импорттоо катасы.</translation> @@ -1639,6 +1639,7 @@ <translation id="2408018932941436077">Карта сакталууда</translation> <translation id="2408955596600435184">PIN кодуңузду киргизиңиз</translation> <translation id="2409268599591722235">Кеттик!</translation> +<translation id="2409709393952490731">Телефонду же планшетти колдонуу</translation> <translation id="2410079346590497630">Кураманын чоо-жайы</translation> <translation id="2410298923485357543">Түзмөк онлайн режиминде болгондо кадимки үн колдонулсун</translation> <translation id="2410754283952462441">Аккаунт тандоо</translation> @@ -1935,7 +1936,6 @@ <translation id="2673135533890720193">Серептөө таржымалыңызды окуңуз</translation> <translation id="2674764818721168631">Өчүк</translation> <translation id="2675570801872027281">Bruschetta'ны өчүрүүдө ката кетти. Кайталап көрүңүз.</translation> -<translation id="2676492189600898281">Автотолтуруу тууралуу пикир билдирүү</translation> <translation id="2678063897982469759">Кайра иштетүү</translation> <translation id="2678100101831051676">Тышкы экранга чыгарылбай жатат.</translation> <translation id="268053382412112343">Та&ржымал</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">Вебсайт сурамы ырасталды</translation> <translation id="4369735607080757018">Жарнамалардын майнаптуулугун талдоо үчүн сайттардын ортосунда маалыматтын чектелген түрлөрү гана бөлүшүлөт, мисалы, жарнама сизге күндүн кайсы учурунда көрсөтүлдү</translation> <translation id="4370975561335139969">Киргизилген электрондук почта дареги менен сырсөз дал келбейт</translation> +<translation id="4374805630006466253">Башка телефонду же планшетти колдонуу</translation> <translation id="4374831787438678295">Linux орноткучу</translation> <translation id="4375035964737468845">Жүктөлүп алынган файлдарды ачуу</translation> <translation id="4376226992615520204">Жайгашкан жерди аныктоо функциясы өчүк</translation> @@ -7229,7 +7230,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> жүктөлүп алынган жок</translation> <translation id="7551643184018910560">Текчеге кадап коюу</translation> -<translation id="7552658769580484674">Автотолтуруу тууралуу пикир билдирүү</translation> <translation id="7552846755917812628">Төмөнкү кеңештерди пайдаланып көрүңүз:</translation> <translation id="7553012839257224005">Linux контейнери текшерилүүдө</translation> <translation id="7553242001898162573">Сырсөзүңүздү киргизиңиз</translation> @@ -8788,7 +8788,6 @@ <translation id="8952831374766033534">Конфигурациянын параметри колдоого алынбайт: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Кубатталып жатканда</translation> <translation id="895347679606913382">Башталууда…</translation> -<translation id="8956230710625245889">Окугучту ачуу</translation> <translation id="8957757410289731985">Профилди ыңгайлаштыруу</translation> <translation id="895944840846194039">JavaScript эстутуму</translation> <translation id="8960208913905765425">Ыкчам жооптордогу бирдик которуу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 2f5de856..b91eb91 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">ຣິສະຕາດ Linux ບໍ?</translation> <translation id="1047431265488717055">ອັດສຳເນົາຂໍ້ຄວາມລິ້ງ</translation> <translation id="1048286738600630630">ການສະແດງຜົນ</translation> -<translation id="1048770690598418849">ທ່ານສາມາດຂ້າມໄປກ່ອນໄດ້ ແລະ ພວກເຮົາຈະລອງອີກຄັ້ງໂດຍອັດຕະໂນມັດຫຼັງຈາກທ່ານຕິດຕັ້ງສຳເລັດ</translation> <translation id="1048986595386481879">ຈັດສັນແບບໄດນາມິກ</translation> <translation id="1049324577536766607">{COUNT,plural, =1{ກຳລັງຮັບ <ph name="ATTACHMENTS" /> ຈາກ <ph name="DEVICE_NAME" />}other{ກຳລັງຮັບ <ph name="ATTACHMENTS" /> ຈາກ <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">ບໍ່ເຜີຍຕົວຕົນ</translation> @@ -1367,6 +1366,7 @@ <translation id="2182058453334755893">ອັດສຳເນົາໃສ່ຄລິບບອດຂອງທ່ານແລ້ວ</translation> <translation id="2183570493397356669">ປິດການນຳໃຊ້ປຸ່ມສືບຕໍ່ແລ້ວ</translation> <translation id="2184515124301515068">ໃຫ້ Chrome ເລືອກວ່າເວັບໄຊສາມາດຫຼິ້ນສຽງໄດ້ເວລາໃດ (ແນະນຳ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">ໜ້າທີ່ແບ່ງປັນມາຈາກອຸປະກອນອື່ນ</translation> <translation id="2187675480456493911">ຊິ້ງຂໍ້ມູນກັບອຸປະກອນອື່ນໃນບັນຊີຂອງທ່ານແລ້ວ. ລະບົບຈະບໍ່ຊິ້ງຂໍ້ມູນການຕັ້ງຄ່າທີ່ຜູ້ໃຊ້ອື່ນແກ້ໄຂ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ການນໍາໃບຢັ້ງຢືນເຊີບເວີເຂົ້າຜິດພາດ</translation> @@ -1638,6 +1638,7 @@ <translation id="2408018932941436077">ກຳລັງບັນທຶກບັດ</translation> <translation id="2408955596600435184">ປ້ອນລະຫັດ PIN ຂອງທ່ານ</translation> <translation id="2409268599591722235">ເລີ່ມກັນເລີຍ</translation> +<translation id="2409709393952490731">ໃຊ້ໂທລະສັບ ຫຼື ແທັບເລັດ</translation> <translation id="2410079346590497630">ລາຍລະອຽດ build</translation> <translation id="2410298923485357543">ໃຊ້ສຽງທຳມະຊາດເມື່ອອຸປະກອນອອນລາຍຢູ່</translation> <translation id="2410754283952462441">ເລືອກໜຶ່ງບັນຊີ</translation> @@ -1934,7 +1935,6 @@ <translation id="2673135533890720193">ອ່ານປະຫວັດການທ່ອງເວັບຂອງທ່ານ</translation> <translation id="2674764818721168631">ປິດ</translation> <translation id="2675570801872027281">ການລຶບ Bruschetta ຜິດພາດ. ກະລຸນາລອງໃໝ່.</translation> -<translation id="2676492189600898281">ສົ່ງຄຳຕິຊົມການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ</translation> <translation id="2678063897982469759">ເປີດໃຊ້ງານຄືນໃໝ່</translation> <translation id="2678100101831051676">ບໍ່ສາມາດສົ່ງສັນຍານໄດ້.</translation> <translation id="268053382412112343">ປະຫວັດ</translation> @@ -3786,6 +3786,7 @@ <translation id="4369215744064167350">ອະນຸມັດຄຳຮ້ອງຂໍເວັບໄຊແລ້ວ</translation> <translation id="4369735607080757018">ປະເພດຂອງຂໍ້ມູນທີ່ຈໍາກັດແມ່ນຖືກແບ່ງປັນລະຫວ່າງເວັບໄຊເພື່ອວັດແທກປະສິດທິພາບການໂຄສະນາຂອງເຂົາເຈົ້າເຊັ່ນ: ເວລາຂອງມື້ທີ່ໂຄສະນາຖືກສະແດງໃຫ້ທ່ານເຫັນ</translation> <translation id="4370975561335139969">ອີເມວ ແລະລະຫັດຜ່ານທີ່ທ່ານປ້ອນເຂົ້າບໍ່ກົງກັນ.</translation> +<translation id="4374805630006466253">ໃຊ້ໂທລະສັບ ຫຼື ແທັບເລັດອື່ນ</translation> <translation id="4374831787438678295">ຕົວຕິດຕັ້ງ Linux</translation> <translation id="4375035964737468845">ເປີດໄຟລ໌ທີ່ດາວໂຫຼດແລ້ວ</translation> <translation id="4376226992615520204">ປິດສະຖານທີ່ແລ້ວ</translation> @@ -7227,7 +7228,6 @@ <translation id="7550830279652415241">ບຸກມາກ_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ດາວນ໌ໂຫລດບໍ່ສໍາເລັດ</translation> <translation id="7551643184018910560">ປັກໝຸດໃສ່ຖ້ານ</translation> -<translation id="7552658769580484674">ສົ່ງຄຳຕິຊົມການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ</translation> <translation id="7552846755917812628">ລອງຄຳແນະນຳຕໍ່ໄປນີ້:</translation> <translation id="7553012839257224005">ກຳລັງກວດເບິ່ງກ່ອງບັນຈຸ Linux</translation> <translation id="7553242001898162573">ປ້ອນລະຫັດຜ່ານຂອງທ່ານ</translation> @@ -8785,7 +8785,6 @@ <translation id="8952831374766033534">ບໍ່ຮອງຮັບຕົວເລືອກການກຳນົດຄ່າ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ໃນຂະນະທີ່ສາກຢູ່</translation> <translation id="895347679606913382">ກໍາລັງເລີ່ມຕົ້ນ...</translation> -<translation id="8956230710625245889">ເປີດໃນ Reader</translation> <translation id="8957757410289731985">ປັບແຕ່ງໂປຣໄຟລ໌</translation> <translation id="895944840846194039">ຄວາມຈໍາ JavaScript</translation> <translation id="8960208913905765425">ການປ່ຽນແປງຫົວໜ່ວຍຂອງຄຳຕອບດ່ວນ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index b89577e7..b23ba5fa 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Iš naujo paleisti „Linux“?</translation> <translation id="1047431265488717055">Kopijuoti nuorodos teks&tą</translation> <translation id="1048286738600630630">Pateiktys</translation> -<translation id="1048770690598418849">Galite dabar praleisti ir mes pabandysime iš naujo automatiškai, kai baigsite sąranką</translation> <translation id="1048986595386481879">Dinamiškai paskirstyta</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Gaunamas turinys (<ph name="ATTACHMENTS" />) iš „<ph name="DEVICE_NAME" />“ įrenginio}one{Gaunamas turinys (<ph name="ATTACHMENTS" />) iš „<ph name="DEVICE_NAME" />“ įrenginio}few{Gaunamas turinys (<ph name="ATTACHMENTS" />) iš „<ph name="DEVICE_NAME" />“ įrenginio}many{Gaunamas turinys (<ph name="ATTACHMENTS" />) iš „<ph name="DEVICE_NAME" />“ įrenginio}other{Gaunamas turinys (<ph name="ATTACHMENTS" />) iš „<ph name="DEVICE_NAME" />“ įrenginio}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -206,6 +205,7 @@ <translation id="1174073918202301297">Spartusis klavišas pridėtas</translation> <translation id="1174366174291287894">Jūsų ryšys visada saugus, nebent „Chrome“ nurodo kitaip</translation> <translation id="117445914942805388">Norėdami išvalyti naršymo duomenis iš sinchronizuotų įrenginių ir „Google“ paskyros, <ph name="BEGIN_LINK" />apsilankykite sinchronizavimo nustatymuose<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Administratorius išjungė šią funkciją.</translation> <translation id="1175364870820465910">&Spausdinti...</translation> <translation id="1176471985365269981">Neleidžiama įrenginyje redaguoti failų ar aplankų</translation> <translation id="1177863135347784049">Priskirtas</translation> @@ -1372,6 +1372,7 @@ <translation id="2182058453334755893">Nukopijuota į iškarpinę</translation> <translation id="2183570493397356669">Mygtukas „Tęsti“ išjungtas</translation> <translation id="2184515124301515068">Leisti „Chrome“ pasirinkti, kada svetainės gali leisti garsą (rekomenduojama)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Puslapis bendrintas iš kito įrenginio</translation> <translation id="2187675480456493911">Sinchronizuojama su kitais įrenginiais jūsų paskyroje. Kitų naudotojų pakeisti nustatymai nebus sinchronizuojami. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Serverio sertifikato importavimo klaida</translation> @@ -1642,6 +1643,7 @@ <translation id="2408018932941436077">Išsaugoma kortelė</translation> <translation id="2408955596600435184">Įveskite PIN kodą</translation> <translation id="2409268599591722235">Pradėti</translation> +<translation id="2409709393952490731">Naudoti telefoną ar planšetinį kompiuterį</translation> <translation id="2410079346590497630">Išsami versijos informacija</translation> <translation id="2410298923485357543">Naudokite natūralų balsą, kai įrenginys prijungtas prie interneto</translation> <translation id="2410754283952462441">Pasirinkite paskyrą</translation> @@ -1938,7 +1940,6 @@ <translation id="2673135533890720193">Skaityti naršymo istoriją</translation> <translation id="2674764818721168631">Išjungta</translation> <translation id="2675570801872027281">Klaida šalinant „Bruschetta“. Bandykite dar kartą.</translation> -<translation id="2676492189600898281">Pateikti atsiliepimą apie automatinį pildymą</translation> <translation id="2678063897982469759">Iš naujo įgalinti</translation> <translation id="2678100101831051676">Nepavyksta perduoti.</translation> <translation id="268053382412112343">Is&torija</translation> @@ -2456,6 +2457,7 @@ <translation id="3129215702932019810">Pristatant programą įvyko klaida</translation> <translation id="3130528281680948470">Įrenginys bus nustatytas iš naujo ir visos naudotojų paskyros bei vietiniai duomenys bus pašalinti. Šio veiksmo anuliuoti negalėsite.</translation> <translation id="3130863904455712965">Istorija ir daugiau</translation> +<translation id="3130966412954727147">Svetainės, kuriose lankotės, gali patvirtinti, kad esate tikras naudotojas, o ne robotas.</translation> <translation id="313205617302240621">Pamiršote slaptažodį?</translation> <translation id="3132277757485842847">Nepavyko išlaikyti ryšio su jūsų telefonu. Įsitikinkite, kad telefonas netoliese, atrakintas ir jame įjungtas „Bluetooth“ bei „Wi-Fi“ ryšys.</translation> <translation id="3132896062549112541">Taisyklė</translation> @@ -2997,6 +2999,7 @@ <translation id="3647654707956482440">Negalima naudoti šios nuorodos. Patikrinkite, ar nėra rašybos klaidų, arba bandykite dar kartą naudodami kitą nuorodą.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{Turinys (<ph name="ATTACHMENTS" />) gautas iš „<ph name="DEVICE_NAME" />“ įrenginio}one{Turinys (<ph name="ATTACHMENTS" />) gautas iš „<ph name="DEVICE_NAME" />“ įrenginio}few{Turinys (<ph name="ATTACHMENTS" />) gautas iš „<ph name="DEVICE_NAME" />“ įrenginio}many{Turinys (<ph name="ATTACHMENTS" />) gautas iš „<ph name="DEVICE_NAME" />“ įrenginio}other{Turinys (<ph name="ATTACHMENTS" />) gautas iš „<ph name="DEVICE_NAME" />“ įrenginio}}</translation> <translation id="3648348069317717750">Aptiktas „<ph name="USB_DEVICE_NAME" />“</translation> +<translation id="3649190289964910441">Svetainė, kurioje lankotės, gali išsaugoti informaciją sistemoje „Chrome“, pagal kurią patvirtinama, kad esate tikras naudotojas. Jums naršant toliau, svetainės gali tikrinti sistemoje „Chrome“ ir iš pirmosios svetainės patvirtinti, kad esate patikimas naudotojas.</translation> <translation id="3650753875413052677">Registracijos klaida</translation> <translation id="3650845953328929506">Laukiama, kol žurnalas bus įkeltas.</translation> <translation id="3650952250015018111">Leidimas „<ph name="APP_NAME" />“ pasiekti:</translation> @@ -3790,6 +3793,7 @@ <translation id="4369215744064167350">Svetainės užklausa patvirtinta</translation> <translation id="4369735607080757018">Skirtingose svetainėse bendrinami tam tikrų tipų duomenys siekiant įvertinti skelbimų našumą, pvz., paros laikas, kada skelbimas buvo jums rodomas</translation> <translation id="4370975561335139969">Įvestas slaptažodis neatitinka el. pašto adreso</translation> +<translation id="4374805630006466253">Naudoti kitą telefoną ar planšetinį kompiuterį</translation> <translation id="4374831787438678295">„Linux“ diegimo programa</translation> <translation id="4375035964737468845">Atidaryti atsisiųstus failus</translation> <translation id="4376226992615520204">Vietovė išjungta</translation> @@ -3966,6 +3970,7 @@ <translation id="4522890784888918985">Antrinės paskyros nepalaikomos</translation> <translation id="4523876148417776526">XML svetainių sąrašas dar negautas.</translation> <translation id="4524832533047962394">Ši operacinė sistema nepalaiko teikiamo registracijos režimo. Įsitikinkite, kad naudojate naujausią versiją.</translation> +<translation id="4526051299161934899">Paslėptos išsaugotos skirtukų grupės</translation> <translation id="4526853756266614740">Pasirinkite vaizdą, kad iš karto pritaikytumėte temą</translation> <translation id="452750746583162491">Peržiūrėti sinchronizuotus duomenis</translation> <translation id="4527929807707405172">Įgalinkite atvirkštinį slinkimą. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> @@ -4241,6 +4246,7 @@ <translation id="477647109558161443">Sukurti darbalaukio šaukinį</translation> <translation id="4776594120007763294">Jei norite pridėti puslapį, kad galėtumėte skaityti vėliau, spustelėkite mygtuką</translation> <translation id="4777458362738635055">Kiti šio įrenginio naudotojai gali naudoti šį tinklą</translation> +<translation id="477781522763920796">Šis nustatymas veikia jūsų neidentifikuojant ir neleidžiant svetainėms matyti jūsų naršymo istorijos.</translation> <translation id="4777825441726637019">„Play“ parduotuvė</translation> <translation id="4777943778632837590">Konfigūruoti tinklo pavadinimo serverius</translation> <translation id="4779083564647765204">Keisti mastelį</translation> @@ -6211,6 +6217,7 @@ <translation id="6597331566371766302">Toliau nurodytus plėtinius užblokavo administratorius.</translation> <translation id="6601262427770154296">Tvarkyti naudotojo žodynus</translation> <translation id="6601612474695404578">Kai kuriose svetainėse naudojami trečiosios šalies slapukai puslapiams įkelti. Jei svetainė neveikia, galite pabandyti leisti slapukus.</translation> +<translation id="6602581642873576447">Šlamšto ir apgaulių sumažinimas išjungtas</translation> <translation id="6602937173026466876">Prieiga prie spausdintuvų</translation> <translation id="6602956230557165253">Jei norite naršyti, naudokite rodyklių į kairę ir į dešinę klavišus.</translation> <translation id="6603185457265641428">Pasirinkimas, ar sinchronizuoti istoriją</translation> @@ -6727,6 +6734,7 @@ <translation id="7047059339731138197">Pasirinkite foną</translation> <translation id="7049293980323620022">Palikti failą?</translation> <translation id="7050037487872780845">Netinkama viešosios interneto prieigos taško konfigūracija</translation> +<translation id="7050519587566342213">Naršymas bus tolygesnis, nes didesnė tikimybė, kad būsite laikomas patikimu naudotoju, nukreipiant iš vienos svetainės į kitą.</translation> <translation id="7051551856857948729">Slėpti IBAN vertę</translation> <translation id="7052237160939977163">Siųsti našumo stebėjimo duomenis</translation> <translation id="7053983685419859001">Blokuoti</translation> @@ -6944,6 +6952,7 @@ <translation id="7269736181983384521">Bendrinimo netoliese duomenų naudojimas</translation> <translation id="7272674038937250585">Nepateikta jokių aprašų</translation> <translation id="7273110280511444812">paskutinį kartą pridėta <ph name="DATE" /></translation> +<translation id="7273921429569738933">Šlamšto ir apgaulių sumažinimas įjungtas</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" /> % – <ph name="TIME" /> iki visiško įkrovimo</translation> <translation id="727952162645687754">Atsisiuntimo klaida</translation> <translation id="7280041992884344566">„Chrome“ ieškant kenkėjiškos programinės įrangos įvyko klaida</translation> @@ -7238,7 +7247,6 @@ <translation id="7550830279652415241">žymės_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Nepavyko atsisiųsti <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Prisegti prie lentynos</translation> -<translation id="7552658769580484674">Pateikti atsiliepimą apie automatinį pildymą</translation> <translation id="7552846755917812628">Išbandykite toliau pateiktus patarimus.</translation> <translation id="7553012839257224005">Tikrinamas „Linux“ sudėtinis rodinys</translation> <translation id="7553242001898162573">Įveskite slaptažodį</translation> @@ -8517,6 +8525,7 @@ <translation id="869884720829132584">Programų meniu</translation> <translation id="869891660844655955">Galiojimo data</translation> <translation id="8699188901396699995">„<ph name="PRINTER_NAME" />“ PPD</translation> +<translation id="8702278591052316269">Meniu yra paslėptų išsaugotų skirtukų grupių</translation> <translation id="8702825062053163569">Jūsų „<ph name="DEVICE_TYPE" />“ buvo užrakintas.</translation> <translation id="8703346390800944767">Praleisti skelbimą</translation> <translation id="8705331520020532516">Serijos numeris</translation> @@ -8800,7 +8809,6 @@ <translation id="8952831374766033534">Konfigūracijos parinktis nepalaikoma: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Įkraunant</translation> <translation id="895347679606913382">Pradedama...</translation> -<translation id="8956230710625245889">Atidaryti naudojant skaitytuvą</translation> <translation id="8957757410289731985">Tinkinti profilį</translation> <translation id="895944840846194039">„JavaScript“ atmintis</translation> <translation id="8960208913905765425">Sparčiųjų atsakymų matavimo vienetų konvertavimas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 76ab79a..1340619 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Vai restartēt Linux?</translation> <translation id="1047431265488717055">Saites te&ksta kopēšana</translation> <translation id="1048286738600630630">Displeji</translation> -<translation id="1048770690598418849">Pagaidām varat izlaist šo darbību. Pēc iestatīšanas pabeigšanas mēs automātiski mēģināsim vēlreiz.</translation> <translation id="1048986595386481879">Dinamiski piešķirts</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Notiek satura (<ph name="ATTACHMENTS" />) saņemšana no ierīces <ph name="DEVICE_NAME" />}zero{Notiek satura (<ph name="ATTACHMENTS" />) saņemšana no ierīces <ph name="DEVICE_NAME" />}one{Notiek satura (<ph name="ATTACHMENTS" />) saņemšana no ierīces <ph name="DEVICE_NAME" />}other{Notiek satura (<ph name="ATTACHMENTS" />) saņemšana no ierīces <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Kopēts jūsu starpliktuvē</translation> <translation id="2183570493397356669">Poga “Turpināt” ir atspējota</translation> <translation id="2184515124301515068">Atļaut pārlūkam Chrome izvēlēties, kad vietnēs var atskaņot skaņu (ieteicams)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">No citas ierīces kopīgota lapa</translation> <translation id="2187675480456493911">Tīkls ir sinhronizēts ar citām ierīcēm jūsu kontā. Iestatījumi, kurus ir mainījuši citi lietotāji, netiks sinhronizēti. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="2187895286714876935">Servera sertifikāta importēšanas kļūda</translation> @@ -1626,6 +1626,7 @@ <translation id="2408018932941436077">Karte tiek saglabāta.</translation> <translation id="2408955596600435184">Ievadiet PIN kodu</translation> <translation id="2409268599591722235">Aiziet!</translation> +<translation id="2409709393952490731">Izmantot tālruni vai planšetdatoru</translation> <translation id="2410079346590497630">Detalizēta informācija par būvējumu</translation> <translation id="2410298923485357543">Izmantot dabisku balsi, kad ierīce ir tiešsaistē</translation> <translation id="2410754283952462441">Konta izvēle</translation> @@ -1922,7 +1923,6 @@ <translation id="2673135533890720193">Skatīt jūsu pārlūkošanas vēsturi</translation> <translation id="2674764818721168631">Izslēgts</translation> <translation id="2675570801872027281">Noņemot Bruschetta, radās kļūda. Lūdzu, mēģiniet vēlreiz.</translation> -<translation id="2676492189600898281">Sniegt atsauksmes par automātiskās aizpildes funkciju</translation> <translation id="2678063897982469759">Atkārtoti iespējot</translation> <translation id="2678100101831051676">Nevar veikt apraidi</translation> <translation id="268053382412112343">Vēsture</translation> @@ -3774,6 +3774,7 @@ <translation id="4369215744064167350">Tīmekļa vietnes pieprasījums apstiprināts</translation> <translation id="4369735607080757018">Noteiktu datu veidi (piemēram, diennakts daļa, kad reklāma tika jums rādīta) tiek kopīgoti starp vietnēm, lai izvērtētu tajās rādīto reklāmu veiktspēju</translation> <translation id="4370975561335139969">Ievadītā e-pasta adrese un parole neatbilst.</translation> +<translation id="4374805630006466253">Izmantot citu tālruni vai planšetdatoru</translation> <translation id="4374831787438678295">Linux instalēšanas programma</translation> <translation id="4375035964737468845">Atvērt lejupielādētos failus</translation> <translation id="4376226992615520204">Atrašanās vietas noteikšana ir izslēgta</translation> @@ -3949,6 +3950,7 @@ <translation id="4522890784888918985">Pakārtotie konti netiek atbalstīti</translation> <translation id="4523876148417776526">Vietņu saraksti XML formātā vēl nav ienesti.</translation> <translation id="4524832533047962394">Nodrošinātais reģistrācijas režīms netiek atbalstīts šajā operētājsistēmas versijā. Izmantojiet jaunāko versiju.</translation> +<translation id="4526051299161934899">Paslēptās saglabātās ciļņu grupas</translation> <translation id="4526853756266614740">Izvēlieties attēlu, lai nekavējoties lietotu motīvu.</translation> <translation id="452750746583162491">Pārskatīt sinhronizētos datus</translation> <translation id="4527929807707405172">Iespējot apgriezto ritināšanu. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> @@ -4273,6 +4275,7 @@ <translation id="4824037980212326045">Linux datu dublēšana un atjaunošana</translation> <translation id="4824958205181053313">Vai atcelt sinhronizāciju?</translation> <translation id="4825532258163983651">Nevar dzēst piekļuves atslēgu</translation> +<translation id="4827283332383516812">Kartes dzēšana</translation> <translation id="4827675678516992122">Nevarēja izveidot savienojumu</translation> <translation id="4827784381479890589">Uzlabotā pareizrakstības pārbaude pārlūkā Chrome (teksts tiek nosūtīts uzņēmumam Google, lai iegūtu pareizrakstības ieteikumus)</translation> <translation id="4827904420700932487">Izveidot kvadrātkodu šim attēlam</translation> @@ -5294,6 +5297,7 @@ <translation id="5792295754950501287"><ph name="CARD_DESCRIPTION" />: citas darbības</translation> <translation id="5792728279623964091">Lūdzu, pieskarieties savai barošanas pogai</translation> <translation id="5792874008054171483"><ph name="SITE_NAME" />: citas darbības</translation> +<translation id="5793317771769868848">Šis maksājuma veids tiks dzēsts no šīs ierīces.</translation> <translation id="5793339252089865437">Ja lejupielādēsiet atjauninājumu, izmantojot mobilo tīklu, tas var izraisīt papildu izmaksas.</translation> <translation id="5793420564274426163">Apstiprinājums par savienošanu pārī</translation> <translation id="5793430094159150686">Jūsu parole ir mainījusies. Lai atjaunotu lokālos datus, jums jāievada iepriekšējā parole.</translation> @@ -7213,7 +7217,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Neizdevās lejupielādēt failu <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Piespraust plauktam</translation> -<translation id="7552658769580484674">Sniegt atsauksmes par automātiskās aizpildes funkciju</translation> <translation id="7552846755917812628">Izmantojiet tālāk sniegtos padomus.</translation> <translation id="7553012839257224005">Linux konteinera pārbaude</translation> <translation id="7553242001898162573">Ievadiet paroli.</translation> @@ -7275,6 +7278,7 @@ <translation id="7609148976235050828">Izveidojiet savienojumu ar internetu un mēģiniet vēlreiz.</translation> <translation id="7612401678989660900">Atļaujiet piekļuvi lietotnēm un vietnēm, kurām ir mikrofona atļauja.</translation> <translation id="7612655942094160088">Iespējot pievienotā tālruņa funkcijas.</translation> +<translation id="7612989789287281429">Notiek pierakstīšanās…</translation> <translation id="7614260613810441905">Vaicāt, ja vietne vēlas rediģēt ierīces failus vai mapes (ieteicams)</translation> <translation id="761530003705945209">Datu dublēšana Google diskā. Varēsiet jebkurā laikā ērti atjaunot savus datus vai mainīt ierīci. Dublējumā ir ietverti arī lietotņu dati. Jūsu dublējumi tiek augšupielādēti Google serveros un šifrēti, izmantojot jūsu Google konta paroli.</translation> <translation id="7615365294369022248">Pievienojot kontu, radās kļūda</translation> @@ -8490,6 +8494,7 @@ <translation id="869884720829132584">Lietojumprogrammu izvēlne</translation> <translation id="869891660844655955">Derīguma termiņš</translation> <translation id="8699188901396699995">PPD fails printerim <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Izvēlne ar paslēptajām saglabātajām ciļņu grupām</translation> <translation id="8702825062053163569">Jūsu <ph name="DEVICE_TYPE" /> ierīce tika bloķēta</translation> <translation id="8703346390800944767">Izlaist reklāmu</translation> <translation id="8705331520020532516">Sērijas numurs</translation> @@ -8772,7 +8777,6 @@ <translation id="8952831374766033534">Konfigurācijas opcija netiek atbalstīta: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Uzlādes laikā</translation> <translation id="895347679606913382">Sākums...</translation> -<translation id="8956230710625245889">Atvērt lasītājā</translation> <translation id="8957757410289731985">Pielāgot profilu</translation> <translation id="895944840846194039">JavaScript atmiņa</translation> <translation id="8960208913905765425">Izteikšana citās mērvienībās, izmantojot ātrās atbildes</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 01dfce1..24d9bd6 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Да се рестартира Linux?</translation> <translation id="1047431265488717055">Копирај го &текстот на врската</translation> <translation id="1048286738600630630">Екрани</translation> -<translation id="1048770690598418849">Засега, може да прескокнете, па ќе се обидеме пак автоматски откако ќе завршите со поставувањето</translation> <translation id="1048986595386481879">Динамички доделена</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Се презема <ph name="ATTACHMENTS" /> од <ph name="DEVICE_NAME" />}one{Се презема <ph name="ATTACHMENTS" /> од <ph name="DEVICE_NAME" />}other{Се преземаат <ph name="ATTACHMENTS" /> од <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Инкогнито</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">Копирано во привремената меморија</translation> <translation id="2183570493397356669">Копчето „Продолжи“ е оневозможено</translation> <translation id="2184515124301515068">Дозволете му на Chrome да избира кога сајтовите може да пуштаат звук (се препорачува)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Страница споделена од друг уред</translation> <translation id="2187675480456493911">Синхронизирано со други уреди на вашата сметка. Поставките што другите корисници ги измениле нема да се синхронизираат. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Грешка при увезување сертификат на сервер</translation> @@ -1936,7 +1936,6 @@ <translation id="2673135533890720193">Прочитајте ја историјата на прелистувачот</translation> <translation id="2674764818721168631">Исклучено</translation> <translation id="2675570801872027281">Грешка при отстранување на Bruschetta. Обидете се повторно.</translation> -<translation id="2676492189600898281">Испратете повратни информации за автоматското пополнување</translation> <translation id="2678063897982469759">Овозможи повторно</translation> <translation id="2678100101831051676">Не може да се емитува.</translation> <translation id="268053382412112343">И&сторија</translation> @@ -4289,6 +4288,7 @@ <translation id="4824037980212326045">Бекап и враќање на Linux</translation> <translation id="4824958205181053313">Да се откаже синхронизацијата?</translation> <translation id="4825532258163983651">Не може да се избрише криптографскиот клуч</translation> +<translation id="4827283332383516812">Бришење картичка</translation> <translation id="4827675678516992122">Не може да се поврзе</translation> <translation id="4827784381479890589">Напредна проверка на правописот во прелистувачот Chrome (текстот се испраќа во Google за правописни предлози)</translation> <translation id="4827904420700932487">Создајте QR-код за сликава</translation> @@ -5312,6 +5312,7 @@ <translation id="5792295754950501287">Повеќе дејства за <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Допрете го копчето за вклучување</translation> <translation id="5792874008054171483">Повеќе дејства за <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Начинов на плаќање ќе се избрише од уредов</translation> <translation id="5793339252089865437">Доколку го преземете ажурирањето преку вашата мобилна мрежа, може да ви се наплати за надминување на квотата.</translation> <translation id="5793420564274426163">Потврда за спарување</translation> <translation id="5793430094159150686">Лозинката е сменета. За да ги вратите локалните податоци, треба да ја внесете старата лозинка.</translation> @@ -7230,7 +7231,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Преземањето на <ph name="FILE_NAME" /> е неуспешно</translation> <translation id="7551643184018910560">Прикачи на полицата</translation> -<translation id="7552658769580484674">Испратете повратни информации за автоматското пополнување</translation> <translation id="7552846755917812628">Испробајте ги следните совети:</translation> <translation id="7553012839257224005">Се проверува контејнерот за Linux</translation> <translation id="7553242001898162573">Внесете ја вашата лозинка</translation> @@ -7292,6 +7292,7 @@ <translation id="7609148976235050828">Поврзете се на интернет и обидете се повторно.</translation> <translation id="7612401678989660900">Дозволете пристап за апликации и веб-сајтови со дозвола за микрофонот</translation> <translation id="7612655942094160088">Овозможи ги функциите на поврзаниот телефон.</translation> +<translation id="7612989789287281429">Ве најавуваме…</translation> <translation id="7614260613810441905">Прашувај кога некој сајт сака да изменува датотеки или папки на уредот (препорачано)</translation> <translation id="761530003705945209">Направете бекап на Google Drive. Лесно враќајте ги податоците или менувајте ги уредите во секое време. Бекапот опфаќа податоци од апликациите. Вашиот бекап се прикачува во Google и се шифрира со лозинката за вашата сметка на Google.</translation> <translation id="7615365294369022248">Грешка при додавањето сметка</translation> @@ -8792,7 +8793,6 @@ <translation id="8952831374766033534">Опцијата за конфигурација не е поддржана: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Додека се полни</translation> <translation id="895347679606913382">Се стартува…</translation> -<translation id="8956230710625245889">Отвори во читач</translation> <translation id="8957757410289731985">Приспособете го профилот</translation> <translation id="895944840846194039">Меморија на JavaScript</translation> <translation id="8960208913905765425">Конверзија на валути на „Брзи одговори“</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index e74905c..6368ccf 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux റീസ്റ്റാർട്ട് ചെയ്യണോ?</translation> <translation id="1047431265488717055">ലിങ്ക് ടെ&ക്സ്റ്റ് പകർത്തുക</translation> <translation id="1048286738600630630">ഡിസ്പ്ലേകൾ</translation> -<translation id="1048770690598418849">നിങ്ങൾക്ക് ഇപ്പോഴത്തേക്ക് ഒഴിവാക്കാവുന്നതാണ്, സജ്ജീകരണം പൂർത്തിയാക്കിയ ശേഷം ഞങ്ങൾ സ്വയമേവ വീണ്ടും ശ്രമിക്കും</translation> <translation id="1048986595386481879">ഡൈനാമിക്കായി അനുവദിച്ചത്</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് <ph name="ATTACHMENTS" /> സ്വീകരിക്കുന്നു}other{<ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് <ph name="ATTACHMENTS" /> സ്വീകരിക്കുന്നു}}</translation> <translation id="1049743911850919806">ആള്മാറാട്ടം</translation> @@ -1356,6 +1355,7 @@ <translation id="2182058453334755893">നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി</translation> <translation id="2183570493397356669">'തുടരുക' ബട്ടൺ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="2184515124301515068">സൈറ്റുകൾക്ക് എപ്പോൾ ശബ്ദം പ്ലേ ചെയ്യാനാവും എന്നത് (ശുപാർശ ചെയ്തത്) തിരഞ്ഞെടുക്കാൻ Chrome-നെ അനുവദിക്കുക</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">മറ്റൊരു ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ട പേജ്</translation> <translation id="2187675480456493911">നിങ്ങളുടെ അക്കൗണ്ടിലെ മറ്റ് ഉപകരണങ്ങളുമായി സമന്വയിപ്പിച്ചു. മറ്റ് ഉപയോക്താക്കൾ പരിഷ്കരിച്ച ക്രമീകരണം സമന്വയിപ്പിക്കില്ല. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="2187895286714876935">സെര്വര് സാക്ഷ്യപത്ര ഇറക്കുമതി പിശക്</translation> @@ -1623,6 +1623,7 @@ <translation id="2408018932941436077">കാർഡ് സംരക്ഷിക്കുന്നു</translation> <translation id="2408955596600435184">നിങ്ങളുടെ പിൻ നൽകുക</translation> <translation id="2409268599591722235">നമുക്ക് ആരംഭിക്കാം</translation> +<translation id="2409709393952490731">ഒരു ഫോണോ ടാബ്ലെറ്റോ ഉപയോഗിക്കുക</translation> <translation id="2410079346590497630">ബിൽഡ് വിശദാംശങ്ങൾ</translation> <translation id="2410298923485357543">ഉപകരണം ഓൺലൈനായിരിക്കുമ്പോൾ സ്വാഭാവികമായ ശബ്ദം ഉപയോഗിക്കുക</translation> <translation id="2410754283952462441">ഒരു അക്കൗണ്ട് തിരഞ്ഞെടുക്കൂ</translation> @@ -1659,6 +1660,7 @@ <translation id="2442916515643169563">ടെക്സ്റ്റ് ഷാഡോ</translation> <translation id="2443487764245141020">ഐഡന്റിഫയർ ഉപയോഗിച്ച് സൈറ്റുകൾ നിങ്ങളുടെ ഉപകരണത്തെ തിരിച്ചറിയേണ്ടതായും വന്നേക്കാം</translation> <translation id="244475495405467108">ഇടതുവശത്തുള്ള ടാബുകൾ അടയ്ക്കുക</translation> +<translation id="2444874983932528148">നിങ്ങൾ നിർത്തിയിടത്ത് നിന്ന് തുടങ്ങൂ</translation> <translation id="2445081178310039857">വിപുലീകരണ റൂട്ട് ഡയറക്റ്ററി ആവശ്യമാണ്.</translation> <translation id="2445484935443597917">പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> <translation id="2445726032315793326">ഭാഗിക മാഗ്നിഫയർ</translation> @@ -1919,7 +1921,6 @@ <translation id="2673135533890720193">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം വായിക്കുക</translation> <translation id="2674764818721168631">ഓഫാണ്</translation> <translation id="2675570801872027281">Bruschetta നീക്കം ചെയ്യുന്നതിൽ പിശകുണ്ടായി. വീണ്ടും ശ്രമിക്കുക.</translation> -<translation id="2676492189600898281">സ്വയമേവ പൂരിപ്പിക്കൽ സംബന്ധിച്ച ഫീഡ്ബാക്ക് നൽകുക</translation> <translation id="2678063897982469759">വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2678100101831051676">കാസ്റ്റ് ചെയ്യാനാകുന്നില്ല.</translation> <translation id="268053382412112343">ച&രിത്രം</translation> @@ -2477,6 +2478,7 @@ <translation id="3177909033752230686">പേജ് ഭാഷ:</translation> <translation id="3177914167275935955">നിങ്ങളുടെ ഉപകരണത്തിൽ Chrome വിദ്യാഭ്യാസ അപ്ഗ്രേഡ് ഉൾപ്പെടുന്നു, എന്നാൽ നിങ്ങളുടെ ഉപയോക്തൃനാമം Google for Education അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടതല്ല. ഒരു സെക്കൻഡറി ഉപകരണത്തിൽ g.co/workspace/edusignup സന്ദർശിച്ച് Google for Education അക്കൗണ്ട് സൃഷ്ടിക്കുക.</translation> <translation id="3179982752812949580">ടെക്സ്റ്റ് ഫോണ്ട്</translation> +<translation id="3180284704187420717">സമന്വയിപ്പിക്കൽ ഉപയോഗിച്ച് നിങ്ങളുടെ ബുക്ക്മാർക്കുകളും പാസ്വേഡുകളും മറ്റും സംരക്ഷിക്കൂ</translation> <translation id="3181954750937456830">സുരക്ഷിത ബ്രൗസിംഗ് (അപകടകരമായ സൈറ്റുകളിൽ നിന്ന് നിങ്ങളെയും ഉപകരണത്തെയും പരിരക്ഷിക്കുന്നു)</translation> <translation id="3182749001423093222">സ്പെൽ ചെക്ക്</translation> <translation id="3183139917765991655">പ്രൊഫൈൽ ഇംപോർട്ടർ</translation> @@ -2968,6 +2970,7 @@ <translation id="3637203148990213388">മറ്റ് അക്കൗണ്ടുകൾ</translation> <translation id="3639220004740062347">റീഡർ മോഡിൽ നിന്ന് പുറത്ത് കടക്കുക</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> എന്നയാൾക്കായി "<ph name="EXTENSION_NAME" />" ചേർക്കണോ?</translation> +<translation id="3640347231390550691">നിങ്ങളുടെ പാസ്വേഡുകളെ ഫിഷിംഗിൽ നിന്ന് പരിരക്ഷിക്കൂ</translation> <translation id="3640613767643722554">നിങ്ങളുടെ ശബ്ദം തിരിച്ചറിയാൻ അസിസ്റ്റൻ്റിനെ പഠിപ്പിക്കുക</translation> <translation id="3641456520301071208">സൈറ്റുകൾക്ക് നിങ്ങളുടെ ലൊക്കേഷൻ ആവശ്യപ്പെടാം</translation> <translation id="3642070413432681490">സര്ക്കിള് കഴ്സർ</translation> @@ -3391,6 +3394,7 @@ <translation id="3988996860813292272">സമയ മേഖല തിരഞ്ഞെടുക്കുക</translation> <translation id="399179161741278232">ഇറക്കുമതിചെയ്തു</translation> <translation id="3992008114154328194"><ph name="FILE_NAME" /> ഡൗൺലോഡ് ചെയ്യുന്നു, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">ഡാറ്റ ബാക്കപ്പ് ചെയ്യുക</translation> <translation id="3993887353483242788">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> സമന്വയിപ്പിക്കുക, ഇതുവഴി നിങ്ങൾ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുമ്പോൾ ഏതൊരു ഉപകരണത്തിലും നിങ്ങളുടെ മുൻഗണനകൾ തയ്യാറായിരിക്കും. ആപ്പുകൾ, ക്രമീകരണം, വൈഫൈ പാസ്വേഡുകൾ, ഭാഷകൾ, വാൾപേപ്പർ, കീബോഡ് കുറുക്കുവഴികൾ എന്നിവയും മറ്റും മുൻഗണനകളിൽ ഉൾപ്പെടുന്നു.</translation> <translation id="3994318741694670028">നിർഭാഗ്യവശാൽ, കേടായ ഹാർഡ്വെയർ ഐഡി ഉപയോഗിച്ചാണ് നിങ്ങളുടെ കമ്പ്യൂട്ടർ കോൺഫിഗർ ചെയ്തിരിക്കുന്നത്. ഇത് ഏറ്റവും പുതിയ സുരക്ഷാ പ്രശ്നപരിഹാരമാർഗ്ഗങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ നിന്ന് ChromeOS Flex-നെ തടയുന്നു, നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ <ph name="BEGIN_BOLD" />ദോഷകരമായ ആക്രമണങ്ങളുണ്ടായേക്കാം<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">നിങ്ങളുടെ ഫോൺ അൺലോക്ക് ചെയ്ത്, <ph name="DEVICE_TYPE" /> അൺലോക്ക് ചെയ്യാൻ അടുത്തേക്ക് കൊണ്ടുവരിക.</translation> @@ -3770,6 +3774,7 @@ <translation id="4369215744064167350">വെബ്സൈറ്റ് അഭ്യർത്ഥന അംഗീകരിച്ചു</translation> <translation id="4369735607080757018">സൈറ്റുകളുടെ പരസ്യങ്ങളുടെ പ്രകടനം അളക്കുന്നതിന്, നിങ്ങളെ ഒരു പരസ്യം കാണിച്ച സമയം പോലുള്ള പരിമിതമായ ഡാറ്റാ തരങ്ങൾ സൈറ്റുകൾ തമ്മിൽ പങ്കിടുന്നു</translation> <translation id="4370975561335139969">നിങ്ങൾ നൽകിയ ഇമെയിലും പാസ്വേഡും പൊരുത്തപ്പെടുന്നില്ല</translation> +<translation id="4374805630006466253">മറ്റൊരു ഫോണോ ടാബ്ലെറ്റോ ഉപയോഗിക്കുക</translation> <translation id="4374831787438678295">Linux ഇൻസ്റ്റാളർ</translation> <translation id="4375035964737468845">ഡൗൺലോഡുചെയ്ത ഫയലുകൾ തുറക്കുക</translation> <translation id="4376226992615520204">ലൊക്കേഷൻ ഓഫാക്കി</translation> @@ -3945,10 +3950,12 @@ <translation id="4522890784888918985">ഉപ അക്കൗണ്ടുകൾക്ക് പിന്തുണയില്ല</translation> <translation id="4523876148417776526">XML സൈറ്റ്ലിസ്റ്റുകൾ ഇതുവരെ ലഭ്യമാക്കിയിട്ടില്ല.</translation> <translation id="4524832533047962394">വിതരണം ചെയ്ത എൻറോൾമെന്റ് മോഡിനെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ ഈ പതിപ്പ് പിന്തുണയ്ക്കുന്നില്ല. ഏറ്റവും പുതിയ പതിപ്പിലാണ് നിങ്ങൾ പ്രവർത്തിക്കുന്നതെന്ന് ഉറപ്പാക്കുക.</translation> +<translation id="4526051299161934899">മറച്ചിരിക്കുന്ന, സംരക്ഷിച്ച ടാബ് ഗ്രൂപ്പുകൾ</translation> <translation id="4526853756266614740">തൽക്ഷണം തീം ബാധകമാക്കാൻ ഒരു ചിത്രം തിരഞ്ഞെടുക്കുക</translation> <translation id="452750746583162491">നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഡാറ്റ അവലോകനം ചെയ്യുക</translation> <translation id="4527929807707405172">റിവേഴ്സ് സ്ക്രോള് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="4528494169189661126">വിവർത്തന നിർദ്ദേശം</translation> +<translation id="4528638190900283934">അധിക ഫീച്ചറുകൾക്കായി സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="4529455689802245339">Chrome തത്സമയ ക്യാപ്ഷൻ പ്രവർത്തിച്ചേക്കില്ല</translation> <translation id="4530494379350999373">ഉറവിടം</translation> <translation id="4531924570968473143">ആരെയാണ് ഈ <ph name="DEVICE_TYPE" /> എന്നതിലേക്ക് നിങ്ങൾക്ക് ചേർക്കേണ്ടത്?</translation> @@ -6360,6 +6367,7 @@ <translation id="6774710250118040929">പുതിയ പാസ്വേഡ് ചേർക്കുക</translation> <translation id="6775163072363532304">ലഭ്യമായ ഉപകരണങ്ങൾ ഇവിടെ ദൃശ്യമാകും.</translation> <translation id="677646486571529447">കുറിപ്പ് ചേർക്കുക</translation> +<translation id="6776589734354015877">അധിക ഫീച്ചറുകൾ നേടൂ</translation> <translation id="6776729248872343918">ഫാസ്റ്റ് പെയർ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="6777817260680419853">റീഡയറക്ട് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="6779092717724412415">ഇതുപോലുള്ള ഹൈലൈറ്റ് സൃഷ്ടിക്കാൻ ഏതെങ്കിലും ടെക്സ്റ്റ് തിരഞ്ഞെടുത്ത് വലത്-ക്ലിക്ക് ചെയ്യുക.</translation> @@ -7212,7 +7220,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation> <translation id="7551643184018910560">ഷെൽഫിലേക്ക് പിൻ ചെയ്യുക</translation> -<translation id="7552658769580484674">സ്വയമേവ പൂരിപ്പിക്കൽ സംബന്ധിച്ച ഫീഡ്ബാക്ക് നൽകുക</translation> <translation id="7552846755917812628">ഇനിപ്പറയുന്ന നുറുങ്ങുകൾ പരീക്ഷിക്കൂ:</translation> <translation id="7553012839257224005">Linux കണ്ടെയ്നർ പരിശോധിക്കുന്നു</translation> <translation id="7553242001898162573">നിങ്ങളുടെ പാസ്വേഡ് നല്കുക</translation> @@ -7756,6 +7763,7 @@ <translation id="8023801379949507775">ഇപ്പോള് വിപുലീകരണങ്ങള് അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="8025151549289123443">ലോക്ക് സ്ക്രീനും സൈൻ ഇൻ ചെയ്യലും</translation> <translation id="8026334261755873520">ബ്രൌസിംഗ് ഡാറ്റ മായ്ക്കുക</translation> +<translation id="8026471514777758216">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളും</translation> <translation id="8028060951694135607">Microsoft Key Recovery</translation> <translation id="8028803902702117856"><ph name="SIZE" /> ഡൗൺലോഡ് ചെയ്യുന്നു, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">വലുപ്പം</translation> @@ -8491,6 +8499,7 @@ <translation id="869884720829132584">അപ്ലിക്കേഷനുകള് മെനു</translation> <translation id="869891660844655955">കാലഹരണപ്പെടല് തീയതി</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> എന്നതിനുള്ള PPD</translation> +<translation id="8702278591052316269">മറച്ചിരിക്കുന്ന, സംരക്ഷിച്ച ടാബ് ഗ്രൂപ്പുകൾ അടങ്ങുന്ന മെനു</translation> <translation id="8702825062053163569">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ലോക്ക് ചെയ്തിരിക്കുന്നു.</translation> <translation id="8703346390800944767">പരസ്യം ഒഴിവാക്കുക</translation> <translation id="8705331520020532516">സീരിയല് നമ്പര്</translation> @@ -8770,7 +8779,6 @@ <translation id="8952831374766033534">കോൺഫിഗറേഷൻ ഓപ്ഷന് പിന്തുണയില്ല: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ചാർജ് ചെയ്യുമ്പോൾ</translation> <translation id="895347679606913382">ആരംഭിക്കുന്നു...</translation> -<translation id="8956230710625245889">റീഡറിൽ തുറക്കുക</translation> <translation id="8957757410289731985">പ്രൊഫൈൽ ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="895944840846194039">JavaScript മെമ്മറി</translation> <translation id="8960208913905765425">'വേഗത്തിലുള്ള ഉത്തരങ്ങൾ' യൂണിറ്റ് പരിവർത്തനം</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 5fd2b8c..549c696 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux-г дахин эхлүүлэх үү?</translation> <translation id="1047431265488717055">Текстийн холбоосыг хуулах</translation> <translation id="1048286738600630630">Дэлгэц</translation> -<translation id="1048770690598418849">Та одоогоор алгасаж болох бөгөөд бид таныг тохируулгыг дуусгасны дараа автоматаар дахин оролдоно</translation> <translation id="1048986595386481879">Динамикаар хуваарилсан</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" />-с <ph name="ATTACHMENTS" />-г хүлээн авч байна}other{<ph name="DEVICE_NAME" />-с <ph name="ATTACHMENTS" />-г хүлээн авч байна}}</translation> <translation id="1049743911850919806">Нууцлал</translation> @@ -1365,6 +1364,7 @@ <translation id="2182058453334755893">Түр санах ой руу хуулсан</translation> <translation id="2183570493397356669">Үргэлжлүүлэх товчлуурыг идэвхгүй болгосон</translation> <translation id="2184515124301515068">Сайтуудад дуу тоглуулах боломжтой үеийг сонгох зөвшөөрлийг Chrome-д олгох (санал болгосон)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Өөр төхөөрөмжөөс хуваалцсан хуудас</translation> <translation id="2187675480456493911">Таны бүртгэл дээрх бусад төхөөрөмжтэй синк хийдэг. Бусад хэрэглэгчийн өөрчилсөн тохиргоог синк хийхгүй. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Серверийн Гэрчилгээг Импортлох үеийн алдаа</translation> @@ -1635,6 +1635,7 @@ <translation id="2408018932941436077">Картыг хадгалж байна</translation> <translation id="2408955596600435184">ПИН-ээ оруулна уу</translation> <translation id="2409268599591722235">Явцгаая</translation> +<translation id="2409709393952490731">Утас эсвэл таблет ашиглах</translation> <translation id="2410079346590497630">Боловсруулагдсан программын дэлгэрэнгүй мэдээлэл</translation> <translation id="2410298923485357543">Төхөөрөмж онлайн үед төрөлхийн дуу хоолойг ашиглана уу</translation> <translation id="2410754283952462441">Бүртгэл сонгох</translation> @@ -1931,7 +1932,6 @@ <translation id="2673135533890720193">Хайлтын хадгалагдсан мэдээллийг уншина</translation> <translation id="2674764818721168631">Унтраалттай</translation> <translation id="2675570801872027281">Bruschetta-г хасахад алдаа гарлаа. Дахин оролдоно уу.</translation> -<translation id="2676492189600898281">Автоматаар бөглөх хэсгийн санал хүсэлт өгөх</translation> <translation id="2678063897982469759">Дахин идэвхжүүл</translation> <translation id="2678100101831051676">Дамжуулах боломжгүй.</translation> <translation id="268053382412112343">Түүх</translation> @@ -3782,6 +3782,7 @@ <translation id="4369215744064167350">Вебсайтын хүсэлтийг зөвшөөрсөн</translation> <translation id="4369735607080757018">Танд зар харуулсан өдрийн цаг зэрэг зарынхаа гүйцэтгэлийг хэмжихийн тулд сайтуудын хооронд хязгаарлагдмал төрлийн өгөгдлийг хуваалцдаг.</translation> <translation id="4370975561335139969">Таны оруулсан имэйл болон нууц үг таарахгүй байна</translation> +<translation id="4374805630006466253">Өөр утас эсвэл таблет ашиглах</translation> <translation id="4374831787438678295">Linux суулгагч</translation> <translation id="4375035964737468845">Татаж авсан файлуудыг нээх</translation> <translation id="4376226992615520204">Байршил унтраалттай байна</translation> @@ -7224,7 +7225,6 @@ <translation id="7550830279652415241">Хадгалагдсан хуудас_ <ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> татанж авах үйлдэл амжилтгүй</translation> <translation id="7551643184018910560">Програмын жагсаалтын өмнө гаргах</translation> -<translation id="7552658769580484674">Автоматаар бөглөх хэсгийн санал хүсэлт өгөх</translation> <translation id="7552846755917812628">Дараах зөвлөгөөг дагана уу:</translation> <translation id="7553012839257224005">Linux контейнерыг шалгаж байна</translation> <translation id="7553242001898162573">Нууц үгээ оруулна уу</translation> @@ -8779,7 +8779,6 @@ <translation id="8952831374766033534">Тохируулгын сонголт дэмжигдээгүй байна: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Цэнэглэх үед</translation> <translation id="895347679606913382">Үйлдлийг эхэлж байна ...</translation> -<translation id="8956230710625245889">Уншигчид нээх</translation> <translation id="8957757410289731985">Профайлыг өөрчлөх</translation> <translation id="895944840846194039">JavaScript санах ой</translation> <translation id="8960208913905765425">Шуурхай хариултын нэгж хөрвүүлэлт</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 9940ed5..cb70deb 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux रीस्टार्ट करायचे?</translation> <translation id="1047431265488717055">लिंक मजकूर कॉपी करा</translation> <translation id="1048286738600630630">प्रदर्शित करते</translation> -<translation id="1048770690598418849">तुम्ही सध्या वगळू शकता हा पर्याय निवडू शकता आणि तुम्ही सेटअप पूर्ण केल्यानंतर आम्ही आपोआप पुन्हा प्रयत्न करू</translation> <translation id="1048986595386481879">गतिशीलपणे वाटप केले</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> कडून <ph name="ATTACHMENTS" /> मिळवत आहे}other{<ph name="DEVICE_NAME" /> कडून <ph name="ATTACHMENTS" /> मिळवत आहे}}</translation> <translation id="1049743911850919806">गुप्त</translation> @@ -1368,6 +1367,7 @@ <translation id="2182058453334755893">तुमच्या क्लिपबोर्डवर कॉपी केले</translation> <translation id="2183570493397356669">पुढे सुरू ठेवा बटण बंद केले आहे</translation> <translation id="2184515124301515068">जेव्हा साइट आवाज प्ले करेल तेव्हा Chrome ला निवड करू दे (शिफारस केलेले)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">दुसऱ्या डिव्हाइसवरून शेअर केलेले पेज</translation> <translation id="2187675480456493911">तुमच्या खात्यावरील इतर डिव्हाइसशी सिंक केले आहे. इतर वापरकर्त्यांनी बदललेली सेटिंग्ज सिंक केली जाणार नाहीत. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="2187895286714876935">सर्व्हर सर्टिफिकेट आयात एरर</translation> @@ -1638,6 +1638,7 @@ <translation id="2408018932941436077">कार्ड सेव्ह करत आहे</translation> <translation id="2408955596600435184">तुमचा पिन प्रविष्ट करा</translation> <translation id="2409268599591722235">चला जाऊ या</translation> +<translation id="2409709393952490731">फोन किंवा टॅबलेट वापरा</translation> <translation id="2410079346590497630">बिल्डचे तपशील</translation> <translation id="2410298923485357543">डिव्हाइस ऑनलाइन असते तेव्हा नैसर्गिक आवाज वापरा</translation> <translation id="2410754283952462441">एक खाते निवडा</translation> @@ -1934,7 +1935,6 @@ <translation id="2673135533890720193">तुमचा ब्राउझिंग इतिहास वाचा</translation> <translation id="2674764818721168631">बंद</translation> <translation id="2675570801872027281">Bruschetta काढून टाकताना एरर आली. कृपया पुन्हा प्रयत्न करा.</translation> -<translation id="2676492189600898281">ऑटोफिल फीडबॅक पुरवा</translation> <translation id="2678063897982469759">पुन्हा सुरू करा</translation> <translation id="2678100101831051676">कास्ट करता आले नाही.</translation> <translation id="268053382412112343">इति&हास</translation> @@ -3784,6 +3784,7 @@ <translation id="4369215744064167350">वेबसाइट ॲक्सेस करण्याच्या विनंतीला मंजुरी मिळाली</translation> <translation id="4369735607080757018">साइटमध्ये त्यांच्या जाहिरातींचा परफॉर्मन्स मोजण्यासाठी मर्यादित प्रकारचा डेटा शेअर केला जातो, जसे की तुम्हाला जाहिरात दाखवण्यात आलेली दिवसाची वेळ</translation> <translation id="4370975561335139969">तुम्ही एंटर केलेला ईमेल आणि पासवर्ड जुळत नाही</translation> +<translation id="4374805630006466253">वेगळा फोन किंवा टॅबलेट वापरा</translation> <translation id="4374831787438678295">Linux इंस्टॉलर</translation> <translation id="4375035964737468845">डाउनलोड केलेल्या फाइल उघडा</translation> <translation id="4376226992615520204">स्थान बंद केले</translation> @@ -7227,7 +7228,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> डाउनलोड करणे अयशस्वी</translation> <translation id="7551643184018910560">शेल्फवर पिन करा</translation> -<translation id="7552658769580484674">ऑटोफिल फीडबॅक पुरवा</translation> <translation id="7552846755917812628">खालील टिपा वापरून पहा:</translation> <translation id="7553012839257224005">Linux कंटेनर तपासत आहे</translation> <translation id="7553242001898162573">तुमचा पासवर्ड एंटर करा</translation> @@ -8786,7 +8786,6 @@ <translation id="8952831374766033534">कॉंफिगरेशन पर्याय सपोर्ट करत नाही: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">चार्ज होत असताना</translation> <translation id="895347679606913382">सुरू करीत आहे...</translation> -<translation id="8956230710625245889">रीडर मध्ये उघडा</translation> <translation id="8957757410289731985">प्रोफाइल कस्टमाइझ करा</translation> <translation id="895944840846194039">JavaScript मेमरी</translation> <translation id="8960208913905765425">क्विक आन्सर्स युनिट कन्व्हर्जन</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 8aceec1..60841cb 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Mulakan semula Linux?</translation> <translation id="1047431265488717055">Salin Te&ks Pautan</translation> <translation id="1048286738600630630">Paparan</translation> -<translation id="1048770690598418849">Anda boleh melangkau buat masa ini dan kami akan mencuba semula secara automatik selepas anda menyelesaikan persediaan</translation> <translation id="1048986595386481879">Diuntukkan secara dinamik</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Menerima <ph name="ATTACHMENTS" /> daripada <ph name="DEVICE_NAME" />}other{Menerima <ph name="ATTACHMENTS" /> daripada <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Disalin ke Papan Keratan Anda</translation> <translation id="2183570493397356669">Butang teruskan dilumpuhkan</translation> <translation id="2184515124301515068">Benarkan Chrome memilih masa tapak boleh memainkan bunyi (disyorkan)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Halaman yang dikongsi daripada peranti lain</translation> <translation id="2187675480456493911">Disegerakkan dengan peranti lain dalam akaun anda. Tetapan yang diubah suai oleh pengguna lain tidak akan disegerakkan. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Ralat Import Sijil Pelayan</translation> @@ -1639,6 +1639,7 @@ <translation id="2408018932941436077">Menyimpan kad</translation> <translation id="2408955596600435184">Masukkan PIN anda</translation> <translation id="2409268599591722235">Jom</translation> +<translation id="2409709393952490731">Gunakan telefon atau tablet</translation> <translation id="2410079346590497630">Butiran binaan</translation> <translation id="2410298923485357543">Gunakan suara semula jadi semasa peranti di dalam talian</translation> <translation id="2410754283952462441">Pilih akaun</translation> @@ -1935,7 +1936,6 @@ <translation id="2673135533890720193">Baca sejarah penyemakan anda</translation> <translation id="2674764818721168631">Mati</translation> <translation id="2675570801872027281">Ralat semasa mengalih keluar Bruschetta. Sila cuba lagi.</translation> -<translation id="2676492189600898281">Berikan maklum balas Autolengkap</translation> <translation id="2678063897982469759">Dayakan semula</translation> <translation id="2678100101831051676">Tidak dapat menghantar.</translation> <translation id="268053382412112343">Se&jarah</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">Permintaan laman web diluluskan</translation> <translation id="4369735607080757018">Jenis data terhad dikongsi antara laman untuk mengukur prestasi iklan mereka, seperti masa hari iklan dipaparkan kepada anda</translation> <translation id="4370975561335139969">E-mel dan kata laluan yang anda masukkan tidak padan</translation> +<translation id="4374805630006466253">Gunakan telefon atau tablet yang lain</translation> <translation id="4374831787438678295">Pemasang Linux</translation> <translation id="4375035964737468845">Buka fail yang dimuat turun</translation> <translation id="4376226992615520204">Lokasi dimatikan</translation> @@ -7229,7 +7230,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> muat turun tidak berjaya</translation> <translation id="7551643184018910560">Sematkan pada rak</translation> -<translation id="7552658769580484674">Berikan Maklum Balas Autolengkap</translation> <translation id="7552846755917812628">Cuba petua berikut:</translation> <translation id="7553012839257224005">Menyemak bekas Linux</translation> <translation id="7553242001898162573">Masukkan kata laluan anda</translation> @@ -8790,7 +8790,6 @@ <translation id="8952831374766033534">Pilihan konfigurasi tidak disokong: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Semasa mengecas</translation> <translation id="895347679606913382">Memulakan...</translation> -<translation id="8956230710625245889">Buka dalam Reader</translation> <translation id="8957757410289731985">Sesuaikan profil</translation> <translation id="895944840846194039">Memori JavaScript</translation> <translation id="8960208913905765425">Jawapan Segera penukaran unit</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 157446d..355c090 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ပြန်စမလား။</translation> <translation id="1047431265488717055">လင့် စာ&သားကို ကူးယူပါ</translation> <translation id="1048286738600630630">မျက်နှာပြင်</translation> -<translation id="1048770690598418849">၎င်းကိုယခုကျော်နိုင်ပြီး စနစ်ထည့်သွင်းပြီးနောက် အလိုအလျောက် ထပ်စမ်းပါမည်</translation> <translation id="1048986595386481879">ပြောင်းလဲ သတ်မှတ်ထားသည်−</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ထံမှ <ph name="ATTACHMENTS" /> ခုကို ရရှိသည်}other{<ph name="DEVICE_NAME" /> ထံမှ <ph name="ATTACHMENTS" /> ခုကို ရရှိသည်}}</translation> <translation id="1049743911850919806">ရုပ်ဖျက်</translation> @@ -1367,6 +1366,7 @@ <translation id="2182058453334755893">'သင့်ကလစ်ဘုတ်' သို့ မိတ္တူကူးထားသည်</translation> <translation id="2183570493397356669">ရှေ့ဆက်ရန်ခလုတ် ပိတ်ထားသည်</translation> <translation id="2184515124301515068">ဝဘ်ဆိုက်များ အသံဖွင့်နိုင်ခြင်းရှိမရှိကို Chrome အား ရွေးချယ်ခွင့်ပေးပါ (အကြံပြုထားသည်)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">စက်နောက်တစ်ခုမှ မျှဝေထားသော စာမျက်နှာ</translation> <translation id="2187675480456493911">သင့်အကောင့်ရှိ အခြားစက်များနှင့် စင့်ခ်လုပ်ထားသည်။ အခြားအသုံးပြုသူများ ပြုပြင်ထားသော ဆက်တင်များကို စင့်ခ်လုပ်မည်မဟုတ်ပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ဆာဗာ လက်မှတ် တင်သွင်းမှု အမှား</translation> @@ -1637,6 +1637,7 @@ <translation id="2408018932941436077">ကတ်ကို သိမ်းနေသည်</translation> <translation id="2408955596600435184">သင့်ပင်နံပါတ်ကို ထည့်ပါ</translation> <translation id="2409268599591722235">စကြစို့</translation> +<translation id="2409709393952490731">ဖုန်း (သို့) တက်ဘလက် သုံးရန်</translation> <translation id="2410079346590497630">တည်ဆောက်ပုံ အသေးစိတ်</translation> <translation id="2410298923485357543">စက်အွန်လိုင်းဖြစ်သောအခါ ပင်ကိုအသံ သုံးပါ</translation> <translation id="2410754283952462441">အကောင့်တစ်ခု ရွေးပါ</translation> @@ -1933,7 +1934,6 @@ <translation id="2673135533890720193">သင်၏ ဘရောင်ဇာ မှတ်တမ်းကို ဖတ်ကြည့်ရန်</translation> <translation id="2674764818721168631">ပိတ်ရန်</translation> <translation id="2675570801872027281">Bruschetta ဖယ်ရှားရာတွင် အမှားဖြစ်သွားသည်။ ထပ်စမ်းကြည့်ပါ။</translation> -<translation id="2676492189600898281">‘အော်တိုဖြည့် အကြံပြုချက်’ ပေးရန်</translation> <translation id="2678063897982469759">ပြန်ဖွင့်ထားရန်</translation> <translation id="2678100101831051676">ကာစ်လုပ်၍မရပါ။</translation> <translation id="268053382412112343">မှတ်&တမ်း</translation> @@ -3784,6 +3784,7 @@ <translation id="4369215744064167350">ဝဘ်ဆိုက်တောင်းဆိုချက် အတည်ပြုလိုက်သည်</translation> <translation id="4369735607080757018">ဝဘ်ဆိုက်များ၏ ကြော်ငြာစွမ်းဆောင်ရည် တိုင်းတာရန် ကြော်ငြာပြသချိန်ကဲ့သို့ ကန့်သတ်ဒေတာအမျိုးအစားများကို ၎င်းတို့ကြားတွင် မျှဝေသည်</translation> <translation id="4370975561335139969">အီးမေးလိပ်စာနှင့် သင်ရိုက်ထည့်သော စကားဝှက် ကိုက်ညီမှု မရှိပါ</translation> +<translation id="4374805630006466253">အခြားဖုန်း (သို့) တက်ဘလက် သုံးရန်</translation> <translation id="4374831787438678295">Linux ထည့်သွင်းကိရိယာ</translation> <translation id="4375035964737468845">ဒေါင်းလုပ်လုပ်ထားသည့် ဖိုင်များ ဖွင့်ရန်</translation> <translation id="4376226992615520204">တည်နေရာကို ပိတ်ထားပါသည်</translation> @@ -7224,7 +7225,6 @@ <translation id="7550830279652415241">စာညှပ်များ_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> အား အောင်မြင်စွာ ဒေါင်းလုပ်ရယူပြီး၏</translation> <translation id="7551643184018910560">စင်သို့ ပင်ထိုးရန်</translation> -<translation id="7552658769580484674">အော်တိုဖြည့် အကြံပြုချက် ပေးရန်</translation> <translation id="7552846755917812628">အောက်ပါ နည်းလမ်းများကို စမ်းကြည့်ပါ−</translation> <translation id="7553012839257224005">Linux ကွန်တိန်နာ စစ်ဆေးနေသည်</translation> <translation id="7553242001898162573">သင့်စကားဝှက်အား ရိုက်ထည့်ရန်</translation> @@ -8783,7 +8783,6 @@ <translation id="8952831374766033534">စီစဉ်သတ်မှတ်ခြင်း ရွေးချယ်စရာကို ပံ့ပိုးမထားပါ- <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">အားသွင်းနေစဉ်</translation> <translation id="895347679606913382">စတင်နေ...</translation> -<translation id="8956230710625245889">Reader တွင် ဖွင့်ရန်</translation> <translation id="8957757410289731985">ပရိုဖိုင်ကို စိတ်ကြိုက်လုပ်ရန်</translation> <translation id="895944840846194039">JavaScript မှတ်ဉာဏ်</translation> <translation id="8960208913905765425">‘အမြန်အဖြေများ’ ယူနစ်ပြောင်းလဲခြင်း</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index f5f2741..8168e354 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux पुनः सुरु गर्ने हो?</translation> <translation id="1047431265488717055">लिंक पाठ प्रतिलिपि गर्नुहोस्</translation> <translation id="1048286738600630630">प्रदर्शनहरू</translation> -<translation id="1048770690598418849">तपाईं अहिले यो कार्य स्किप गर्न सक्नुहुन्छ र तपाईंले सेटअप गर्ने प्रक्रिया पूरा गरिसकेपछि हामी स्वतः पुनः प्रयास गर्ने छौँ</translation> <translation id="1048986595386481879">गतिशील रूपमा छुट्याइएको</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> बाट <ph name="ATTACHMENTS" /> प्राप्त गरिँदै}other{<ph name="DEVICE_NAME" /> बाट <ph name="ATTACHMENTS" /> प्राप्त गरिँदै}}</translation> <translation id="1049743911850919806">इन्कोग्निटो</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">तपाईंको क्लिपबोर्डमा प्रतिलिपि गरियो</translation> <translation id="2183570493397356669">"जारी राख्नुहोस्" बटन अफ गरिएको छ</translation> <translation id="2184515124301515068">साइटहरूले ध्वनि कहिले प्ले गर्न सक्छन् भन्ने कुरा Chrome लाई छनौट गर्न दिनुहोस् (सिफारिस गरिएको)</translation> +<translation id="2186206192313702726">Google लेन्स</translation> <translation id="2186711480981247270">अर्को डिभाइसबाट पेज सेयर गरिएको छ</translation> <translation id="2187675480456493911">तपाईंको खाता साइन इन गरिएका अन्य यन्त्रमा सिंक गरिएको छ। अन्य प्रयोगकर्ताहरूले परिमार्जन गरेका सेटिङ सिंक गरिने छैनन्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="2187895286714876935">सर्भर सर्टिफिकेट आयात त्रुटि</translation> @@ -1621,6 +1621,7 @@ <translation id="2408018932941436077">कार्ड सुरक्षित गर्दै</translation> <translation id="2408955596600435184">आफ्नो PIN प्रविष्टि गर्नुहोस्</translation> <translation id="2409268599591722235">जाऔँ</translation> +<translation id="2409709393952490731">कुनै फोन वा ट्याब्लेट प्रयोग गर्नुहोस्</translation> <translation id="2410079346590497630">बिल्डसम्बन्धी विवरण</translation> <translation id="2410298923485357543">डिभाइस अनलाइन हुँदा उच्च गुणस्तरको आवाज प्रयोग गरियोस्</translation> <translation id="2410754283952462441">कुनै खाता छान्नुहोस्</translation> @@ -1917,7 +1918,6 @@ <translation id="2673135533890720193">तपाईंको ब्राउजिङ इतिहास पढ्नुहोस्</translation> <translation id="2674764818721168631">निष्क्रिय छ</translation> <translation id="2675570801872027281">Bruschetta अनइन्स्टल गर्ने क्रममा कुनै त्रुटि भयो। कृपया फेरि प्रयास गर्नुहोस्।</translation> -<translation id="2676492189600898281">अटोफिलका बारेमा प्रतिक्रिया दिनुहोस्</translation> <translation id="2678063897982469759">पुन: सक्षम गर्नुहोस्</translation> <translation id="2678100101831051676">कास्ट गर्न सकिएन।</translation> <translation id="268053382412112343">इति&हास</translation> @@ -3769,6 +3769,7 @@ <translation id="4369215744064167350">तपाईंले वेबसाइट हेर्न पाऊँ भनी गर्नुभएको अनुरोध अनुमोदन गरिएको छ</translation> <translation id="4369735607080757018">साइटहरूमा देखाइने विज्ञापनको पर्फर्मेन्स मापन गर्न साइटहरूका बिचमा तपाईंलाई कुनै विज्ञापन देखाइएको समयलगायतका सीमित प्रकारका डेटा सेयर गरिन्छ</translation> <translation id="4370975561335139969">तपाईँले प्रविष्टि गर्नुभएको इमेल र पासवर्ड मेल खाँदैनन्</translation> +<translation id="4374805630006466253">कुनै अर्को फोन वा ट्याब्लेट प्रयोग गर्नुहोस्</translation> <translation id="4374831787438678295">Linux को स्थापनाकर्ता</translation> <translation id="4375035964737468845">डाउनलोड गरिएका फाइलहरू खोल्नुहोस्</translation> <translation id="4376226992615520204">स्थान अफ गरिएको छ</translation> @@ -7209,7 +7210,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> डाउनलोड असफल</translation> <translation id="7551643184018910560">शेल्फमा पिन गर्नुहोस्</translation> -<translation id="7552658769580484674">अटोफिलका बारेमा प्रतिक्रिया दिनुहोस्</translation> <translation id="7552846755917812628">निम्न सुझावहरूको पालना गरी हेर्नुहोस्:</translation> <translation id="7553012839257224005">Linux कन्टेनर जाँच गरिँदै छ</translation> <translation id="7553242001898162573">तपाईँको पासवर्ड प्रविष्टि गर्नुहोस्।</translation> @@ -8768,7 +8768,6 @@ <translation id="8952831374766033534">कन्फिगुरेसनको यो विकल्प प्रयोग गर्न मिल्दैन: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">चार्ज भइरहेका बेला</translation> <translation id="895347679606913382">सुरु हुँदैछ...</translation> -<translation id="8956230710625245889">Reader मा खोल्नुहोस्</translation> <translation id="8957757410289731985">प्रोफाइल आफू अनुकूल पार्नुहोस्</translation> <translation id="895944840846194039">जाभास्क्रिप्ट स्मृति</translation> <translation id="8960208913905765425">"द्रुत जवाफ"को एकाइ रूपान्तरण गर्ने सुविधा</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 243d8d5..4970907 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux opnieuw starten?</translation> <translation id="1047431265488717055">Lin&ktekst kopiëren</translation> <translation id="1048286738600630630">Schermen</translation> -<translation id="1048770690598418849">Je kunt dit nu overslaan. We proberen het automatisch opnieuw als je klaar bent met instellen.</translation> <translation id="1048986595386481879">Dynamisch toegewezen</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> ontvangen van <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> ontvangen van <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">Naar klembord gekopieerd</translation> <translation id="2183570493397356669">Knop Doorgaan staat uit</translation> <translation id="2184515124301515068">Chrome laten kiezen wanneer sites geluid mogen afspelen (aanbevolen)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Pagina gedeeld vanaf een ander apparaat</translation> <translation id="2187675480456493911">Gesynchroniseerd met andere apparaten in je account. Instellingen die zijn aangepast door andere gebruikers, worden niet gesynchroniseerd. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Fout bij importeren van servercertificaat</translation> @@ -1624,6 +1624,7 @@ <translation id="2408018932941436077">Kaart opslaan</translation> <translation id="2408955596600435184">Je pincode opgeven</translation> <translation id="2409268599591722235">Aan de slag</translation> +<translation id="2409709393952490731">Een telefoon of tablet gebruiken</translation> <translation id="2410079346590497630">Buildgegevens</translation> <translation id="2410298923485357543">Natuurlijke stem gebruiken als het apparaat online is</translation> <translation id="2410754283952462441">Een account selecteren</translation> @@ -1920,7 +1921,6 @@ <translation id="2673135533890720193">Je browsegeschiedenis lezen</translation> <translation id="2674764818721168631">Uit</translation> <translation id="2675570801872027281">Fout bij het verwijderen van Bruschetta. Probeer het opnieuw.</translation> -<translation id="2676492189600898281">Feedback geven over automatisch invullen</translation> <translation id="2678063897982469759">Opnieuw aanzetten</translation> <translation id="2678100101831051676">Kan niet casten.</translation> <translation id="268053382412112343">Geschi&edenis</translation> @@ -3771,6 +3771,7 @@ <translation id="4369215744064167350">Websiteverzoek goedgekeurd</translation> <translation id="4369735607080757018">Er worden beperkte typen gegevens gedeeld tussen sites om de prestaties van hun advertenties te meten (bijvoorbeeld het tijdstip waarop je een advertentie te zien kreeg)</translation> <translation id="4370975561335139969">Het opgegeven e-mailadres en wachtwoord komen niet overeen</translation> +<translation id="4374805630006466253">Een andere telefoon of tablet gebruiken</translation> <translation id="4374831787438678295">Linux-installatieprogramma</translation> <translation id="4375035964737468845">Gedownloade bestanden openen</translation> <translation id="4376226992615520204">Locatie staat uit</translation> @@ -7206,7 +7207,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> is gedownload</translation> <translation id="7551643184018910560">Vastzetten op plank</translation> -<translation id="7552658769580484674">Feedback geven over automatisch invullen</translation> <translation id="7552846755917812628">Probeer de volgende tips:</translation> <translation id="7553012839257224005">De Linux-container wordt gecontroleerd</translation> <translation id="7553242001898162573">Geef je wachtwoord op</translation> @@ -8765,7 +8765,6 @@ <translation id="8952831374766033534">Configuratie-optie niet ondersteund: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Tijdens het opladen</translation> <translation id="895347679606913382">Starten...</translation> -<translation id="8956230710625245889">Openen in Reader</translation> <translation id="8957757410289731985">Profiel aanpassen</translation> <translation id="895944840846194039">JavaScript-geheugen</translation> <translation id="8960208913905765425">Eenheidsconversie van Snelle antwoorden</translation> @@ -8841,7 +8840,7 @@ <translation id="9020300839812600209">Vul een URL in om te zien wat LBS ermee doet.</translation> <translation id="9020362265352758658">4x</translation> <translation id="9021662811137657072">Virus gedetecteerd</translation> -<translation id="902236149563113779">Sites volgen je camerapositie meestal voor AR-functies, zoals games of visuele aanduidingen voor routebeschrijvingen</translation> +<translation id="902236149563113779">Sites volgen je camerapositie meestal voor AR-functies, zoals games of visuele aanduidingen voor routes</translation> <translation id="9022847679183471841">Dit account wordt al op deze computer gebruikt door <ph name="AVATAR_NAME" />.</translation> <translation id="9022871169049522985">Sites en adverteerders kunnen de prestaties van hun advertenties meten</translation> <translation id="9023015617655685412">Bookmark toevoegen voor dit tabblad…</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 9f0545a..c3da7b2 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Vil du starte Linux på nytt?</translation> <translation id="1047431265488717055">Kopiér linkte&kst</translation> <translation id="1048286738600630630">Skjermer</translation> -<translation id="1048770690598418849">Du kan hoppe over foreløpig, så prøver vi automatisk på nytt når du har fullført konfigureringen</translation> <translation id="1048986595386481879">Dynamisk allokert</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Mottar <ph name="ATTACHMENTS" /> fra <ph name="DEVICE_NAME" />}other{Mottar <ph name="ATTACHMENTS" /> fra <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1363,6 +1362,7 @@ <translation id="2182058453334755893">Kopiert til utklippstavlen</translation> <translation id="2183570493397356669">Fortsett-knappen er deaktivert</translation> <translation id="2184515124301515068">La Chrome velge når nettsteder kan spille av lyd (anbefalt)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">En side er delt fra en annen enhet</translation> <translation id="2187675480456493911">Synkronisert med andre enheter på kontoen. Innstillinger som endres av andre brukere, blir ikke synkronisert. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Feil ved import av tjenersertifikat</translation> @@ -1633,6 +1633,7 @@ <translation id="2408018932941436077">Lagrer kortet</translation> <translation id="2408955596600435184">Skriv inn PIN-koden din</translation> <translation id="2409268599591722235">Sett i gang</translation> +<translation id="2409709393952490731">Bruk en telefon eller et nettbrett</translation> <translation id="2410079346590497630">Detaljer om delversjonen</translation> <translation id="2410298923485357543">Bruk naturlig stemme når enheten er på nett</translation> <translation id="2410754283952462441">Velg en konto</translation> @@ -1930,7 +1931,6 @@ <translation id="2673135533890720193">lese nettleserloggen din</translation> <translation id="2674764818721168631">Av</translation> <translation id="2675570801872027281">Feil ved fjerning av Bruschetta. Prøv igjen.</translation> -<translation id="2676492189600898281">Gi tilbakemelding om autofyll</translation> <translation id="2678063897982469759">Aktiver på nytt</translation> <translation id="2678100101831051676">Kan ikke caste.</translation> <translation id="268053382412112343">Lo&gg</translation> @@ -3783,6 +3783,7 @@ <translation id="4369215744064167350">Nettstedsforespørselen er godkjent</translation> <translation id="4369735607080757018">Begrensede datatyper deles mellom nettsteder for å måle resultatene for annonsene, for eksempel når på dagen en annonse ble vist for deg</translation> <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation> +<translation id="4374805630006466253">Bruk en annen telefon eller et annet nettbrett</translation> <translation id="4374831787438678295">Linux-installasjonsprogram</translation> <translation id="4375035964737468845">åpne nedlastede filer</translation> <translation id="4376226992615520204">Posisjon er slått av</translation> @@ -7225,7 +7226,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ble ikke lastet ned</translation> <translation id="7551643184018910560">Fest til hyllen</translation> -<translation id="7552658769580484674">Gi tilbakemelding om autofyll</translation> <translation id="7552846755917812628">Prøv følgende tips:</translation> <translation id="7553012839257224005">Kontrollerer Linux-beholderen</translation> <translation id="7553242001898162573">Skriv inn passordet ditt</translation> @@ -8786,7 +8786,6 @@ <translation id="8952831374766033534">Konfigurasjonsalternativet støttes ikke: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Når enheten lades</translation> <translation id="895347679606913382">Starter...</translation> -<translation id="8956230710625245889">Åpne i Reader</translation> <translation id="8957757410289731985">Tilpass profil</translation> <translation id="895944840846194039">JavaScript-minne</translation> <translation id="8960208913905765425">Hurtiginfo-enhetskonvertering</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index fa2db456..56974f6 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ରିଷ୍ଟାର୍ଟ କରିବେ?</translation> <translation id="1047431265488717055">ଟେ&କ୍ସଟ୍ ଲିଙ୍କ୍ କପି କରନ୍ତୁ</translation> <translation id="1048286738600630630">ଡିସ୍ପ୍ଲେ</translation> -<translation id="1048770690598418849">ଆପଣ ବର୍ତ୍ତମାନ ପାଇଁ ବାଦ ଦେଇପାରିବେ ଏବଂ ସେଟଅପ ସମ୍ପୂର୍ଣ୍ଣ କରିବା ପରେ ଆମେ ସ୍ୱତଃ ପୁଣି ଚେଷ୍ଟା କରିବୁ</translation> <translation id="1048986595386481879">ଗତିଶୀଳ ଭାବେ ଦିଆଯାଇଛି</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" />ରୁ <ph name="ATTACHMENTS" /> ମିଳୁଛି}other{<ph name="DEVICE_NAME" />ରୁ <ph name="ATTACHMENTS" /> ମିଳୁଛି}}</translation> <translation id="1049743911850919806">ଇନ୍କଗ୍ନିଟୋ</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">ଆପଣଙ୍କର କ୍ଲିପ୍ବୋର୍ଡକୁ କପି କରାଯାଇଛି</translation> <translation id="2183570493397356669">"ଜାରି ରଖନ୍ତୁ" ବଟନକୁ ଅକ୍ଷମ କରାଯାଇଛି</translation> <translation id="2184515124301515068">ସାଇଟ୍ଗୁଡ଼ିକ କେତେବେଳେ ସାଉଣ୍ଡ୍ ଚାଲୁ କରିବେ ତାହା Chromeକୁ ବାଛିବାକୁ ଦିଅନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">ଅନ୍ୟ ଏକ ଡିଭାଇସରୁ ସେୟାର୍ କରାଯାଇଥିବା ପୃଷ୍ଠା</translation> <translation id="2187675480456493911">ଆପଣଙ୍କ ଆକାଉଣ୍ଟରେ ଥିବା ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକ ସହ ସିଙ୍କ୍ ହୋଇଛି। ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ପରିବର୍ତ୍ତନ କରାଯାଇଥିବା ସେଟିଂସ୍ ସିଙ୍କ୍ ହେବ ନାହିଁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ସର୍ଭର୍ ସାର୍ଟିଫିକେଟ୍ ଇମ୍ପୋର୍ଟ କରିବାରେ ତ୍ରୁଟି</translation> @@ -1919,7 +1919,6 @@ <translation id="2673135533890720193">ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି ପଢ଼ନ୍ତୁ</translation> <translation id="2674764818721168631">ବନ୍ଦ ଅଛି</translation> <translation id="2675570801872027281">Bruschetta କାଢ଼ିବାରେ ତ୍ରୁଟି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> -<translation id="2676492189600898281">ଅଟୋଫିଲ ବିଷୟରେ ମତାମତ ପ୍ରଦାନ କରନ୍ତୁ</translation> <translation id="2678063897982469759">ପୁନଃ-ସକ୍ଷମ କରନ୍ତୁ</translation> <translation id="2678100101831051676">କାଷ୍ଟ କରିବାରେ ଅକ୍ଷମ।</translation> <translation id="268053382412112343">&ଇତିବୃତ୍ତି</translation> @@ -3947,6 +3946,7 @@ <translation id="4522890784888918985">ପିଲାର ଆକାଉଣ୍ଟଗୁଡ଼ିକ ସମର୍ଥିତ ନୁହେଁ</translation> <translation id="4523876148417776526">XML ସାଇଟଲିଷ୍ଟଗୁଡ଼ିକୁ ଏପର୍ଯ୍ୟନ୍ତ ଫେଚ କରାଯାଇନାହିଁ।</translation> <translation id="4524832533047962394">ପ୍ରଦାନ କରାଯାଇଥିବା ନାମାଙ୍କନ ମୋଡ୍, ଅପରେଟିଂ ସିଷ୍ଟମ୍ର ଏହି ସଂସ୍କରଣରେ ସମର୍ଥିତ ନୁହେଁ। ଦୟାକରି ସୁନିଶ୍ଚିତ କରନ୍ତୁ କି ଆପଣ ନବୀନତମ ସଂସ୍କରଣ ଚଲାଉଛନ୍ତି।</translation> +<translation id="4526051299161934899">ସେଭ କରାଯାଇଥିବା ଲୁକ୍କାୟିତ ଟାବ ଗ୍ରୁପଗୁଡ଼ିକ</translation> <translation id="4526853756266614740">ଥିମ ତୁରନ୍ତ ଲାଗୁ କରିବାକୁ ଏକ ଇମେଜ ବାଛନ୍ତୁ</translation> <translation id="452750746583162491">ଆପଣଙ୍କ ସିଙ୍କ୍ କରାଯାଇଥିବା ଡାଟାର ସମୀକ୍ଷା କରନ୍ତୁ</translation> <translation id="4527929807707405172">ରିଭର୍ସ ସ୍କ୍ରୋଲିଂଗୁଡ଼ିକୁ ସକ୍ଷମ କରନ୍ତୁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> @@ -4231,7 +4231,7 @@ <translation id="4781443161433589743">ଆପଣଙ୍କ ପାଖରେ Chromeର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ଅଛି</translation> <translation id="4781584184731045253">ଡାଟା ଏବଂ ଅନୁମତିଗୁଡ଼ିକୁ ଖାଲି କରନ୍ତୁ</translation> <translation id="4785719467058219317">ଆପଣ ଏପରି ଏକ କୀ ବ୍ୟବହାର କରୁଛନ୍ତି, ଯାହାକୁ ଏହି ୱେବସାଇଟ୍ରେ ପଞ୍ଜୀକୃତ କରାଯାଇ ନାହିଁ</translation> -<translation id="4785914069240823137">କ୍ରପ ବାତିଲ୍ କରନ୍ତୁ</translation> +<translation id="4785914069240823137">କ୍ରପ ବାତିଲ କରନ୍ତୁ</translation> <translation id="4788092183367008521">ଦୟାକରି ଆପଣଙ୍କ ନେଟ୍ୱର୍କ ସଂଯୋଗ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4789348252524569426">ସ୍ପିଚ ଫାଇଲଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ କରାଯାଇପାରିବ ନାହିଁ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅପଡେଟ କରାଯିବ ଆବଶ୍ୟକ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4789550509729954245">ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକ ସେୟାର କରୁଥିବା ବେଳେ ବିଜ୍ଞପ୍ତି ଦେଖାନ୍ତୁ</translation> @@ -4271,6 +4271,7 @@ <translation id="4824037980212326045">Linux ବ୍ୟାକଅପ୍ ଓ ରିଷ୍ଟୋର୍</translation> <translation id="4824958205181053313">ସିଙ୍କ୍ ବାତିଲ୍ କରିବେ?</translation> <translation id="4825532258163983651">ପାସକୀ ଡିଲିଟ କରାଯାଇପାରିବ ନାହିଁ</translation> +<translation id="4827283332383516812">କାର୍ଡ ଡିଲିଟ କରନ୍ତୁ</translation> <translation id="4827675678516992122">ସଂଯୋଗ କରିହେଲା ନାହିଁ</translation> <translation id="4827784381479890589">Chrome ବ୍ରାଉଜରରେ ଉନ୍ନତ ବନାନ ଯାଞ୍ଚ (ବନାନ ସମ୍ବନ୍ଧିତ ପରାମର୍ଶଗୁଡ଼ିକ ପାଇଁ ଟେକ୍ସଟ୍ Googleକୁ ପଠାଯାଇଛି)</translation> <translation id="4827904420700932487">ଏହି ଛବି ପାଇଁ QR କୋଡ୍ ତିଆରି କରନ୍ତୁ</translation> @@ -5292,6 +5293,7 @@ <translation id="5792295754950501287"><ph name="CARD_DESCRIPTION" /> ପାଇଁ ଅଧିକ ପଦକ୍ଷେପ</translation> <translation id="5792728279623964091">ଦୟାକରି ଆପଣଙ୍କର ପାୱର୍ ବଟନ୍କୁ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="5792874008054171483"><ph name="SITE_NAME" /> ପାଇଁ ଅଧିକ ପଦକ୍ଷେପ</translation> +<translation id="5793317771769868848">ଏହି ଡିଭାଇସରୁ ଏହି ପେମେଣ୍ଟ ପଦ୍ଧତିକୁ ଡିଲିଟ କରିଦିଆଯିବ</translation> <translation id="5793339252089865437">ଯଦି ଆପଣ ଆପଣଙ୍କ ମୋବାଇଲ୍ ନେଟ୍ୱର୍କରେ ଅପ୍ଡେଟ୍ ଡାଉନ୍ଲୋଡ୍ କରନ୍ତି, ତେବେ ଆପଣଙ୍କୁ ଅତିରିକ୍ତ ଶୁଳ୍କ ଦେବାକୁ ପଡ଼ିପାରେ।</translation> <translation id="5793420564274426163">ପେୟାର କରିବାର ସୁନିଶ୍ଚିତକରଣ</translation> <translation id="5793430094159150686">ଆପଣଙ୍କ ପାସୱାର୍ଡ ପରିବର୍ତ୍ତନ ହୋଇଛି। ଆପଣଙ୍କ ସ୍ଥାନୀୟ ଡାଟା ରିଷ୍ଟୋର କରିବାକୁ ଆପଣ ଆପଣଙ୍କ ପୁରୁଣା ପାସୱାର୍ଡ ଲେଖିବା ଆବଶ୍ୟକ।</translation> @@ -7209,7 +7211,6 @@ <translation id="7550830279652415241">ବୁକ୍ମାର୍କଗୁଡିକ_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ଡାଉନ୍ଲୋଡ୍ କରିବା ବିଫଳ ହେଲା</translation> <translation id="7551643184018910560">ସେଲ୍ଫରେ ପିନ୍ କରନ୍ତୁ</translation> -<translation id="7552658769580484674">ଅଟୋଫିଲ ବିଷୟରେ ମତାମତ ପ୍ରଦାନ କରନ୍ତୁ</translation> <translation id="7552846755917812628">ନିମ୍ନୋକ୍ତ ପରାମର୍ଶଗୁଡ଼ିକ ଚେଷ୍ଟା କରିଦେଖନ୍ତୁ:</translation> <translation id="7553012839257224005">Linux କଣ୍ଟେନର୍ ଯାଞ୍ଚ କରାଯାଉଛି</translation> <translation id="7553242001898162573">ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ</translation> @@ -7271,6 +7272,7 @@ <translation id="7609148976235050828">ଦୟାକରି ଇଣ୍ଟର୍ନେଟ୍ ସହ ସଂଯୋଗ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="7612401678989660900">ମାଇକ୍ରୋଫୋନ ଅନୁମତି ଥିବା ଆପ୍ସ ଓ ୱେବସାଇଟ ପାଇଁ ଆକ୍ସେସ କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ</translation> <translation id="7612655942094160088">ସଂଯୁକ୍ତ ଥିବା ଫୋନ୍ ଫିଚରଗୁଡ଼ିକୁ ସକ୍ଷମ କରନ୍ତୁ।</translation> +<translation id="7612989789287281429">ଆପଣଙ୍କୁ ସାଇନ ଇନ କରାଯାଉଛି…</translation> <translation id="7614260613810441905">କୌଣସି ସାଇଟ୍ ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଫାଇଲ୍ କିମ୍ବା ଫୋଲ୍ଡର୍ଗୁଡ଼ିକୁ ସମ୍ପାଦନ କରିବାକୁ ଚାହିଁଲେ, ସେଗୁଡ଼ିକୁ ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation> <translation id="761530003705945209">Google Driveରେ ବ୍ୟାକଅପ୍ ନିଅନ୍ତୁ। ସହଜରେ ଆପଣଙ୍କ ଡାଟା ରିଷ୍ଟୋର୍ କରନ୍ତୁ କିମ୍ୱା ଯେ କୌଣସି ସମୟରେ ଡିଭାଇସ୍ ସ୍ୱିଚ୍ କରନ୍ତୁ। ଆପଣଙ୍କ ବ୍ୟାକଅପ୍ ଆପ୍ ଡାଟା ଅନ୍ତର୍ଭୁକ୍ତ କରେ। ଆପଣଙ୍କ ବ୍ୟାକଅପଗୁଡ଼ିକୁ Googleରେ ଅପଲୋଡ୍ କରାଯାଇଛି ଏବଂ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟ ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରି ଏନକ୍ରିପ୍ଟ କରାଯାଇଛି।</translation> <translation id="7615365294369022248">ଗୋଟିଏ ଆକାଉଣ୍ଟ ଯୋଗ କରିବା ସମୟରେ ତ୍ରୁଟି ହୋଇଥିଲା</translation> @@ -8485,6 +8487,7 @@ <translation id="869884720829132584">ଆପ୍ଲିକେସନ୍ ମେନୁ</translation> <translation id="869891660844655955">ମିଆଦ ଶେଷ ହେଉଥିବା ତାରିଖ</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> ପାଇଁ PPD</translation> +<translation id="8702278591052316269">ସେଭ କରାଯାଇଥିବା ଲୁକ୍କାୟିତ ଟାବ ଗ୍ରୁପଗୁଡ଼ିକ ଥିବା ମେନୁ</translation> <translation id="8702825062053163569">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" /> ଲକ୍ ହୋଇଯାଇଛି।</translation> <translation id="8703346390800944767">ବିଜ୍ଞାପନକୁ ଛାଡ଼ି ଦିଅନ୍ତୁ</translation> <translation id="8705331520020532516">କ୍ରମିକ ସଂଖ୍ୟା</translation> @@ -8765,7 +8768,6 @@ <translation id="8952831374766033534">କନଫିଗ୍ରେସନ୍ ବିକଳ୍ପ ସମର୍ଥିତ ନୁହେଁ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ଚାର୍ଜ ହେଉଥିବା ସମୟରେ</translation> <translation id="895347679606913382">ଆରମ୍ଭ ହେଉଛି...</translation> -<translation id="8956230710625245889">Readerରେ ଖୋଲନ୍ତୁ</translation> <translation id="8957757410289731985">ପ୍ରୋଫାଇଲକୁ କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ</translation> <translation id="895944840846194039">JavaScript ମେମୋରୀ</translation> <translation id="8960208913905765425">କ୍ୱିକ୍ ଉତ୍ତରଗୁଡ଼ିକର ୟୁନିଟ୍ ରୂପାନ୍ତର</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 4acc54a..cce6b47 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">ਕੀ Linux ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?</translation> <translation id="1047431265488717055">ਕਾਪੀ ਲਿੰਕ ਲਿ&ਖਤ</translation> <translation id="1048286738600630630">ਡਿਸਪਲੇ</translation> -<translation id="1048770690598418849">ਤੁਸੀਂ ਹੁਣ ਲਈ ਛੱਡ ਸਕਦੇ ਹੋ ਅਤੇ ਅਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟਅੱਪ ਪੂਰਾ ਕਰਨ 'ਤੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰਾਂਗੇ</translation> <translation id="1048986595386481879">ਗਤੀਸ਼ੀਲ ਢੰਗ ਨਾਲ ਨਿਰਧਾਰਿਤ ਕੀਤਾ ਗਿਆ</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ਤੋਂ <ph name="ATTACHMENTS" /> ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ}one{<ph name="DEVICE_NAME" /> ਤੋਂ <ph name="ATTACHMENTS" /> ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ}other{<ph name="DEVICE_NAME" /> ਤੋਂ <ph name="ATTACHMENTS" /> ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ}}</translation> <translation id="1049743911850919806">ਗੁਮਨਾਮ</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">ਤੁਹਾਡੇ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation> <translation id="2183570493397356669">'ਜਾਰੀ ਰੱਖੋ' ਬਟਨ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> <translation id="2184515124301515068">Chrome ਨੂੰ ਚੁਣਨ ਦਿਓ ਕਿ ਸਾਈਟਾਂ ਕਦੋਂ ਧੁਨੀ ਚਲਾ ਸਕਦੀਆਂ ਹਨ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">ਪੰਨੇ ਨੂੰ ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="2187675480456493911">ਤੁਹਾਡੇ ਖਾਤੇ 'ਤੇ ਹੋਰ ਡੀਵਾਈਸਾਂ ਨਾਲ ਸਿੰਕ ਕੀਤਾ ਗਿਆ। ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਵੱਲੋਂ ਸੋਧੀਆਂ ਗਈਆਂ ਸੈਟਿੰਗਾਂ ਦਾ ਸਿੰਕ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ਸਰਵਰ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਆਯਾਤ ਗੜਬੜ</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">ਕਾਰਡ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="2408955596600435184">ਆਪਣਾ PIN ਦਾਖਲ ਕਰੋ</translation> <translation id="2409268599591722235">ਚਲੋ ਸ਼ੁਰੂ ਕਰੀਏ</translation> +<translation id="2409709393952490731">ਫ਼ੋਨ ਜਾਂ ਟੈਬਲੈੱਟ ਵਰਤੋ</translation> <translation id="2410079346590497630">ਬਿਲਡ ਦੇ ਵੇਰਵੇ</translation> <translation id="2410298923485357543">ਡੀਵਾਈਸ ਆਨਲਾਈਨ ਹੋਣ 'ਤੇ ਕੁਦਰਤੀ ਅਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="2410754283952462441">ਕੋਈ ਖਾਤਾ ਚੁਣੋ</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">ਆਪਣਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਪੜ੍ਹੋ</translation> <translation id="2674764818721168631">ਬੰਦ</translation> <translation id="2675570801872027281">Bruschetta ਨੂੰ ਹਟਾਉਣ ਦੌਰਾਨ ਗੜਬੜ ਹੋਈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> -<translation id="2676492189600898281">ਆਟੋਫਿਲ ਵਿਸ਼ੇਸ਼ਤਾ ਬਾਰੇ ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਓ</translation> <translation id="2678063897982469759">ਮੁੜ ਚਾਲੂ ਕਰੋ</translation> <translation id="2678100101831051676">ਕਾਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation> <translation id="268053382412112343">ਇ&ਤਿਹਾਸ</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">ਵੈੱਬਸਾਈਟ ਲਈ ਬੇਨਤੀ ਮਨਜ਼ੂਰ ਹੋ ਗਈ</translation> <translation id="4369735607080757018">ਵਿਗਿਆਪਨਾਂ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਮੁਲਾਂਕਣ ਕਰਨ ਲਈ ਸਾਈਟਾਂ ਵਿਚਕਾਰ ਸੀਮਤ ਕਿਸਮ ਦਾ ਡਾਟਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਦਿਨ ਦਾ ਉਹ ਸਮਾਂ ਜਦੋਂ ਤੁਹਾਨੂੰ ਵਿਗਿਆਪਨ ਦਿਖਾਇਆ ਗਿਆ ਸੀ</translation> <translation id="4370975561335139969">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਰਜ ਕੀਤਾ ਈਮੇਲ ਅਤੇ ਪਾਸਵਰਡ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ</translation> +<translation id="4374805630006466253">ਕੋਈ ਵੱਖਰਾ ਫ਼ੋਨ ਜਾਂ ਟੈਬਲੈੱਟ ਵਰਤੋ</translation> <translation id="4374831787438678295">Linux ਸਥਾਪਨਾਕਾਰ</translation> <translation id="4375035964737468845">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਖੋਲ੍ਹੋ</translation> <translation id="4376226992615520204">ਟਿਕਾਣਾ ਸੇਵਾ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ</translation> @@ -7232,7 +7233,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> ਡਾਊਨਲੋਡ ਅਸਫਲ</translation> <translation id="7551643184018910560">ਸ਼ੈਲਫ ਤੇ ਪਿਨ ਕਰੋ</translation> -<translation id="7552658769580484674">ਆਟੋਫਿਲ ਵਿਸ਼ੇਸ਼ਤਾ ਬਾਰੇ ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਓ</translation> <translation id="7552846755917812628">ਅੱਗੇ ਦਿੱਤੇ ਨੁਕਤਿਆਂ ਨੂੰ ਅਜ਼ਮਾਓ:</translation> <translation id="7553012839257224005">Linux ਕੰਟੇਨਰ ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="7553242001898162573">ਆਪਣਾ ਪਾਸਵਰਡ ਦਰਜ ਕਰੋ</translation> @@ -8791,7 +8791,6 @@ <translation id="8952831374766033534">ਸੰਰੂਪਣ ਵਿਕਲਪ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ਚਾਰਜਿੰਗ ਵੇਲੇ</translation> <translation id="895347679606913382">ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ...</translation> -<translation id="8956230710625245889">ਰੀਡਰ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="8957757410289731985">ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation> <translation id="895944840846194039">JavaScript ਮੈਮਰੀ</translation> <translation id="8960208913905765425">ਤਤਕਾਲ ਜਵਾਬਾਂ ਦਾ ਇਕਾਈ ਰੂਪਾਂਤਰਨ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 8b2dc0a..4bb69ee 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Uruchomić Linuksa ponownie?</translation> <translation id="1047431265488717055">Kopiuj te&kst linku</translation> <translation id="1048286738600630630">Wyświetlanie</translation> -<translation id="1048770690598418849">Możesz na razie pominąć ten krok. Gdy zakończysz konfigurację, spróbujemy ponowić go automatycznie</translation> <translation id="1048986595386481879">Dynamicznie alokowany</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Odbieram <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}few{Odbieram <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}many{Odbieram <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}other{Odbieram <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -204,6 +203,7 @@ <translation id="1174073918202301297">Skrót został dodany</translation> <translation id="1174366174291287894">Twoje połączenie jest zawsze bezpieczne, chyba że Chrome poinformuje Cię, że jest inaczej</translation> <translation id="117445914942805388">Aby wyczyścić dane przeglądania ze wszystkich swoich zsynchronizowanych urządzeń i z konta Google, <ph name="BEGIN_LINK" />otwórz ustawienia synchronizacji<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Administrator wyłączył tę funkcję.</translation> <translation id="1175364870820465910">&Drukuj...</translation> <translation id="1176471985365269981">Nie zezwolono na edytowanie plików ani folderów na urządzeniu</translation> <translation id="1177863135347784049">Niestandardowe</translation> @@ -1355,6 +1355,7 @@ <translation id="2182058453334755893">Skopiowano do schowka</translation> <translation id="2183570493397356669">Przycisk Dalej jest wyłączony</translation> <translation id="2184515124301515068">Niech Chrome decyduje, które strony mogą odtwarzać dźwięk (zalecane)</translation> +<translation id="2186206192313702726">Obiektyw Google</translation> <translation id="2186711480981247270">Strona udostępniona z innego urządzenia</translation> <translation id="2187675480456493911">Sieć jest zsynchronizowana ze wszystkimi urządzeniami na Twoim koncie. Ustawienia zmienione przez innych użytkowników nie zostaną zsynchronizowane. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Błąd importowania certyfikatu serwera</translation> @@ -1611,6 +1612,7 @@ <translation id="2408018932941436077">Zapisuję kartę</translation> <translation id="2408955596600435184">Wpisz kod PIN</translation> <translation id="2409268599591722235">Rozpocznij</translation> +<translation id="2409709393952490731">Użyj telefonu lub tabletu</translation> <translation id="2410079346590497630">Szczegóły kompilacji</translation> <translation id="2410298923485357543">Używaj naturalnego głosu, gdy urządzenie jest online</translation> <translation id="2410754283952462441">Wybierz konto</translation> @@ -1647,6 +1649,7 @@ <translation id="2442916515643169563">Cień tekstu</translation> <translation id="2443487764245141020">Do rozpoznawania Twojego urządzenia strony mogą też potrzebować identyfikatora</translation> <translation id="244475495405467108">Zamknij karty po lewej</translation> +<translation id="2444874983932528148">Łatwo wracaj do tego samego miejsca</translation> <translation id="2445081178310039857">Wymagany jest główny katalog rozszerzenia.</translation> <translation id="2445484935443597917">Utwórz nowy profil</translation> <translation id="2445726032315793326">Lupa częściowa</translation> @@ -1907,7 +1910,6 @@ <translation id="2673135533890720193">Odczytywanie historii przeglądania</translation> <translation id="2674764818721168631">Wyłączono</translation> <translation id="2675570801872027281">Błąd podczas usuwania Brukschetta. Spróbuj ponownie.</translation> -<translation id="2676492189600898281">Prześlij opinię o autouzupełnianiu</translation> <translation id="2678063897982469759">Włącz ponownie</translation> <translation id="2678100101831051676">Nie udało się przesłać treści.</translation> <translation id="268053382412112343">Hi&storia</translation> @@ -2425,6 +2427,7 @@ <translation id="3129215702932019810">Błąd podczas uruchamiania aplikacji</translation> <translation id="3130528281680948470">Twoje urządzenie zostanie zresetowane. Wszystkie zapisane lokalnie konta użytkowników i dane zostaną usunięte. Tej czynności nie można cofnąć.</translation> <translation id="3130863904455712965">Historia i inne elementy</translation> +<translation id="3130966412954727147">Odwiedzane przez Ciebie witryny mogą potwierdzić, że jesteś rzeczywistym użytkownikiem, a nie botem.</translation> <translation id="313205617302240621">Nie pamiętasz hasła?</translation> <translation id="3132277757485842847">Nie udało się utrzymać połączenia z Twoim telefonem. Sprawdź, czy telefon jest w pobliżu, jest odblokowany i ma włączone Bluetooth oraz Wi-Fi.</translation> <translation id="3132896062549112541">Reguła</translation> @@ -2465,6 +2468,7 @@ <translation id="3177909033752230686">Język strony:</translation> <translation id="3177914167275935955">Twoje urządzenie ma licencję na Chrome Education, ale Twoja nazwa użytkownika nie jest powiązana z kontem Google for Education. Utwórz takie konto na stronie g.co/workspace/edusignup, korzystając z dodatkowego urządzenia.</translation> <translation id="3179982752812949580">Czcionka tekstu</translation> +<translation id="3180284704187420717">Zapisuj m.in. swoje zakładki i hasła dzięki synchronizacji</translation> <translation id="3181954750937456830">Bezpieczne przeglądanie (chroni Ciebie i Twoje urządzenie przed niebezpiecznymi witrynami)</translation> <translation id="3182749001423093222">Sprawdzanie pisowni</translation> <translation id="3183139917765991655">Importer profilów</translation> @@ -2956,6 +2960,7 @@ <translation id="3637203148990213388">Dodatkowe konta</translation> <translation id="3639220004740062347">Zamknij tryb czytnika</translation> <translation id="3640214691812501263">Dodać „<ph name="EXTENSION_NAME" />” dla: <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Chroń hasła przed phishingiem</translation> <translation id="3640613767643722554">Naucz Asystenta rozpoznawać Twój głos</translation> <translation id="3641456520301071208">Strony mogą prosić o informacje o Twojej lokalizacji</translation> <translation id="3642070413432681490">Obwódka kursora</translation> @@ -2966,6 +2971,7 @@ <translation id="3647654707956482440">Nie można użyć tego linku. Sprawdź, czy nie ma literówek, lub użyj innego linku i spróbuj jeszcze raz.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{Odebrano <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}few{Odebrano <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}many{Odebrano <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}other{Odebrano <ph name="ATTACHMENTS" /> z urządzenia <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750">Wykryto <ph name="USB_DEVICE_NAME" /></translation> +<translation id="3649190289964910441">Strona, którą odwiedzasz, może zapisywać w Chrome informacje, że jesteś prawdziwym użytkownikiem. Podczas przeglądania witryny mogą sprawdzać je w Chrome i potwierdzać w pierwszej odwiedzonej witrynie, że prawdopodobnie jesteś zaufanym użytkownikiem.</translation> <translation id="3650753875413052677">Błąd podczas rejestrowania</translation> <translation id="3650845953328929506">Log oczekuje na przesłanie.</translation> <translation id="3650952250015018111">Zezwól aplikacji „<ph name="APP_NAME" />” na dostęp do:</translation> @@ -3380,6 +3386,7 @@ <translation id="3988996860813292272">Wybierz strefę czasową</translation> <translation id="399179161741278232">Zaimportowane</translation> <translation id="3992008114154328194">Pobieram <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Utwórz kopię zapasową danych</translation> <translation id="3993887353483242788">Zsynchronizuj to urządzenie (<ph name="DEVICE_TYPE" />), aby Twoje preferencje były dostępne wszędzie tam, gdzie logujesz się na konto Google. Preferencje obejmują m.in. aplikacje, ustawienia, hasła Wi-Fi, języki, tapety i skróty klawiszowe.</translation> <translation id="3994318741694670028">Twój komputer jest skonfigurowany przy użyciu błędnie sformatowanego identyfikatora sprzętu. Uniemożliwia to zaktualizowanie ChromeOS Flex za pomocą najnowszych poprawek zabezpieczeń, a komputer <ph name="BEGIN_BOLD" />może być narażony na szkodliwe ataki<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Aby odblokować system, <ph name="DEVICE_TYPE" /> i odblokowany telefon muszą być bliżej siebie.</translation> @@ -3759,6 +3766,7 @@ <translation id="4369215744064167350">Zaakceptowano prośbę dotyczącą strony</translation> <translation id="4369735607080757018">Na potrzeby pomiaru skuteczności wyświetlanych reklam witryny udostępniają sobie nawzajem niektóre dane, np. porę dnia, o której reklama została Ci wyświetlona</translation> <translation id="4370975561335139969">Podany adres e-mail i hasło nie pasują do siebie</translation> +<translation id="4374805630006466253">Użyj innego telefonu lub tabletu</translation> <translation id="4374831787438678295">Instalator Linuksa</translation> <translation id="4375035964737468845">Otwieranie pobranych plików</translation> <translation id="4376226992615520204">Lokalizacja wyłączona</translation> @@ -3939,6 +3947,7 @@ <translation id="452750746583162491">Przejrzyj synchronizowane dane</translation> <translation id="4527929807707405172">Włącz odwrotne przewijanie. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Sugestia tłumaczenia</translation> +<translation id="4528638190900283934">Zaloguj się, aby mieć dostęp do dodatkowych funkcji</translation> <translation id="4529455689802245339">Napisy na żywo w Chrome mogą nie działać</translation> <translation id="4530494379350999373">Pochodzenie</translation> <translation id="4531924570968473143">Kogo chcesz dodać na tym urządzeniu z <ph name="DEVICE_TYPE" />?</translation> @@ -4210,6 +4219,7 @@ <translation id="477647109558161443">Utwórz skrót na pulpicie</translation> <translation id="4776594120007763294">Aby dodać stronę, którą chcesz przeczytać później, kliknij ten przycisk</translation> <translation id="4777458362738635055">Inni użytkownicy tego urządzenia mogą używać tej sieci</translation> +<translation id="477781522763920796">To ustawienie działa bez ujawniania Twojej tożsamości i udzielania witrynom dostępu do Twojej historii przeglądania.</translation> <translation id="4777825441726637019">Sklep Play</translation> <translation id="4777943778632837590">Skonfiguruj serwery nazw sieci</translation> <translation id="4779083564647765204">Powiększ</translation> @@ -6176,6 +6186,7 @@ <translation id="6597331566371766302">Te rozszerzenia zablokował administrator:</translation> <translation id="6601262427770154296">Zarządzanie słownikami użytkownika</translation> <translation id="6601612474695404578">Niektóre witryny używają plików cookie innych firm do wczytywania stron. Jeśli strona nie działa, zezwól na używanie plików cookie.</translation> +<translation id="6602581642873576447">Ograniczenie spamu i oszustw jest wyłączone</translation> <translation id="6602937173026466876">Dostęp do drukarek</translation> <translation id="6602956230557165253">Nawiguj za pomocą strzałek w lewo i w prawo.</translation> <translation id="6603185457265641428">Wybierz, czy chcesz zsynchronizować historię</translation> @@ -6351,6 +6362,7 @@ <translation id="6774710250118040929">Dodaj nowe hasło</translation> <translation id="6775163072363532304">Tu pojawią się dostępne urządzenia.</translation> <translation id="677646486571529447">Dodaj notatkę</translation> +<translation id="6776589734354015877">Korzystaj z dodatkowych funkcji</translation> <translation id="6776729248872343918">Włącz Szybkie parowanie</translation> <translation id="6777817260680419853">Przekierowanie zostało zablokowane</translation> <translation id="6779092717724412415">Aby utworzyć wyróżnienie takie jak to, zaznacz dowolny tekst i kliknij prawym przyciskiem myszy.</translation> @@ -6690,6 +6702,7 @@ <translation id="7047059339731138197">Wybierz tło</translation> <translation id="7049293980323620022">Zachować plik?</translation> <translation id="7050037487872780845">Nieprawidłowa konfiguracja hotspota</translation> +<translation id="7050519587566342213">Przeglądanie działa płynniej, ponieważ jesteś bardziej wiarygodnym użytkownikiem dla kolejnych witryn.</translation> <translation id="7051551856857948729">Ukryj numer IBAN</translation> <translation id="7052237160939977163">Wyślij dane śledzenia wydajności</translation> <translation id="7053983685419859001">Blokuj</translation> @@ -6907,6 +6920,7 @@ <translation id="7269736181983384521">Udostępnianie w pobliżu użycie danych</translation> <translation id="7272674038937250585">Brak opisu</translation> <translation id="7273110280511444812">ostatnio podłączone w dniu <ph name="DATE" /></translation> +<translation id="7273921429569738933">Ograniczenie spamu i oszustw jest włączone</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% – pełne naładowanie za <ph name="TIME" /></translation> <translation id="727952162645687754">Błąd pobierania</translation> <translation id="7280041992884344566">Podczas wyszukiwania szkodliwego oprogramowania przez Chrome wystąpił błąd</translation> @@ -7201,7 +7215,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Nie udało się pobrać pliku <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Przypnij do półki</translation> -<translation id="7552658769580484674">Prześlij opinię o autouzupełnianiu</translation> <translation id="7552846755917812628">Skorzystaj z tych wskazówek:</translation> <translation id="7553012839257224005">Sprawdzam kontener Linuksa</translation> <translation id="7553242001898162573">Wpisz hasło</translation> @@ -7745,6 +7758,7 @@ <translation id="8023801379949507775">Aktualizuj rozszerzenia</translation> <translation id="8025151549289123443">Ekran blokady i logowanie</translation> <translation id="8026334261755873520">Wyczyść dane przeglądania</translation> +<translation id="8026471514777758216">Wszystkie Twoje urządzenia</translation> <translation id="8028060951694135607">Odzyskiwanie kluczy firmy Microsoft</translation> <translation id="8028803902702117856">Pobieram <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Rozmiar</translation> @@ -8763,7 +8777,6 @@ <translation id="8952831374766033534">Nieobsługiwana opcja konfiguracyjna: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Podczas ładowania</translation> <translation id="895347679606913382">Zaczynam...</translation> -<translation id="8956230710625245889">Otwórz w czytniku</translation> <translation id="8957757410289731985">Dostosuj profil</translation> <translation id="895944840846194039">Pamięć JavaScript</translation> <translation id="8960208913905765425">Szybkie podpowiedzi – konwersja jednostek</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 4f2b29d0..2e48550 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Reiniciar Linux?</translation> <translation id="1047431265488717055">Copiar te&xto do link</translation> <translation id="1048286738600630630">Telas</translation> -<translation id="1048770690598418849">Você pode pular esta etapa por enquanto. Vamos tentar de novo automaticamente depois que a configuração for concluída</translation> <translation id="1048986595386481879">Alocado dinamicamente</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Recebendo <ph name="ATTACHMENTS" /> do <ph name="DEVICE_NAME" />}one{Recebendo <ph name="ATTACHMENTS" /> do <ph name="DEVICE_NAME" />}other{Recebendo <ph name="ATTACHMENTS" /> do <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Modo anônimo</translation> @@ -1370,6 +1369,7 @@ <translation id="2182058453334755893">Copiado para a área de transferência</translation> <translation id="2183570493397356669">Botão "Continuar" desativado</translation> <translation id="2184515124301515068">Permitir que Chrome defina quando os sites podem tocar áudio (recomendado)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Página compartilhada de outro dispositivo</translation> <translation id="2187675480456493911">Sincronizada com outros dispositivos na sua conta. As configurações modificadas por outros usuários não serão sincronizadas. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Erro de importação do certificado de servidor</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">Salvando cartão</translation> <translation id="2408955596600435184">Informe seu PIN</translation> <translation id="2409268599591722235">Vamos lá</translation> +<translation id="2409709393952490731">Usar um smartphone ou tablet</translation> <translation id="2410079346590497630">Detalhes da versão</translation> <translation id="2410298923485357543">Usar voz natural quando o dispositivo estiver on-line</translation> <translation id="2410754283952462441">Escolher uma conta</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">Ler seu histórico de navegação</translation> <translation id="2674764818721168631">Desativado</translation> <translation id="2675570801872027281">Erro ao remover Bruschetta. Tente de novo.</translation> -<translation id="2676492189600898281">Enviar feedback sobre o preenchimento automático</translation> <translation id="2678063897982469759">Reativar</translation> <translation id="2678100101831051676">Falha na transmissão</translation> <translation id="268053382412112343">Hi&stórico</translation> @@ -3789,6 +3789,7 @@ <translation id="4369215744064167350">A solicitação de acesso ao site foi aprovada</translation> <translation id="4369735607080757018">Tipos limitados de dados são compartilhados entre sites para avaliar a performance de anúncios, como a hora do dia em que foram mostrados</translation> <translation id="4370975561335139969">O e-mail e a senha que você digitou não coincidem.</translation> +<translation id="4374805630006466253">Usar outro smartphone ou tablet</translation> <translation id="4374831787438678295">Instalador do Linux</translation> <translation id="4375035964737468845">Abrir arquivos baixados</translation> <translation id="4376226992615520204">Localização desativada</translation> @@ -7234,7 +7235,6 @@ <translation id="7550830279652415241">favoritos_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Falha no dowload de <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Fixar na estante</translation> -<translation id="7552658769580484674">Enviar feedback sobre o preenchimento automático</translation> <translation id="7552846755917812628">Tente seguir estas dicas:</translation> <translation id="7553012839257224005">Verificando o contêiner Linux</translation> <translation id="7553242001898162573">Digite sua senha</translation> @@ -8795,7 +8795,6 @@ <translation id="8952831374766033534">Opção de configuração indisponível: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Ao carregar</translation> <translation id="895347679606913382">Iniciando...</translation> -<translation id="8956230710625245889">Abrir no leitor</translation> <translation id="8957757410289731985">Personalizar perfil</translation> <translation id="895944840846194039">Memória JavaScript</translation> <translation id="8960208913905765425">Conversão de unidades das Respostas rápidas</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index a352e5d..f985405 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Pretende reiniciar o Linux?</translation> <translation id="1047431265488717055">Copiar te&xto do link</translation> <translation id="1048286738600630630">Ecrãs</translation> -<translation id="1048770690598418849">Pode ignorar por agora e vamos tentar de novo automaticamente após concluir a configuração</translation> <translation id="1048986595386481879">Atribuído dinamicamente</translation> <translation id="1049324577536766607">{COUNT,plural, =1{A receber <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}other{A receber <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Navegação anónima</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">Copiado para a área de transferência.</translation> <translation id="2183570493397356669">Botão Continuar desativado</translation> <translation id="2184515124301515068">Permitir que o Chrome escolha quando os sites podem reproduzir som (recomendado)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Página partilhada a partir de outro dispositivo</translation> <translation id="2187675480456493911">Sincronizada com outros dispositivos na sua conta. As definições modificadas por outros utilizadores não serão sincronizadas. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Erro na importação do certificado do servidor</translation> @@ -1624,6 +1624,7 @@ <translation id="2408018932941436077">A guardar o cartão…</translation> <translation id="2408955596600435184">Introduza o PIN</translation> <translation id="2409268599591722235">Vamos lá</translation> +<translation id="2409709393952490731">Usar um telemóvel ou um tablet</translation> <translation id="2410079346590497630">Detalhes da compilação</translation> <translation id="2410298923485357543">Utilizar a voz natural quando o dispositivo estiver online</translation> <translation id="2410754283952462441">Selecione uma conta</translation> @@ -1660,6 +1661,7 @@ <translation id="2442916515643169563">Sombra do texto</translation> <translation id="2443487764245141020">Os sites também podem ter de reconhecer o seu dispositivo através de um identificador</translation> <translation id="244475495405467108">Fechar separadores à esquerda</translation> +<translation id="2444874983932528148">Continue facilmente a partir do ponto onde ficou</translation> <translation id="2445081178310039857">É necessário o directório de raiz da extensão.</translation> <translation id="2445484935443597917">Criar um novo perfil</translation> <translation id="2445726032315793326">Lupa parcial</translation> @@ -1920,7 +1922,6 @@ <translation id="2673135533890720193">Ler o seu histórico de navegação</translation> <translation id="2674764818721168631">Desativado</translation> <translation id="2675570801872027281">Erro ao remover o Bruschetta. Tente novamente.</translation> -<translation id="2676492189600898281">Enviar feedback sobre o preenchimento automático</translation> <translation id="2678063897982469759">Reactivar</translation> <translation id="2678100101831051676">Não é possível transmitir.</translation> <translation id="268053382412112343">&Histórico</translation> @@ -2479,6 +2480,7 @@ <translation id="3177909033752230686">Idioma da página:</translation> <translation id="3177914167275935955">O seu dispositivo inclui uma Atualização do Chrome Education, mas o seu nome de utilizador não está associado a uma conta do Google for Education. Crie uma conta do Google for Education ao visitar g.co/workspace/edusignup num dispositivo secundário.</translation> <translation id="3179982752812949580">Tipo de letra do texto</translation> +<translation id="3180284704187420717">Guarde os seus marcadores, palavras-passe e muito mais com a sincronização</translation> <translation id="3181954750937456830">Navegação segura (protege o utilizador e o seu dispositivo contra sites perigosos)</translation> <translation id="3182749001423093222">Verificação ortográfica</translation> <translation id="3183139917765991655">Importador de perfis</translation> @@ -2970,6 +2972,7 @@ <translation id="3637203148990213388">Contas adicionais</translation> <translation id="3639220004740062347">Sair do modo de leitor</translation> <translation id="3640214691812501263">Adicionar "<ph name="EXTENSION_NAME" />" para <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Proteja as suas palavras-passe contra phishing</translation> <translation id="3640613767643722554">Ensine o Assistente a reconhecer a sua voz</translation> <translation id="3641456520301071208">Os sites podem solicitar a sua localização</translation> <translation id="3642070413432681490">Cursor circular</translation> @@ -3394,6 +3397,7 @@ <translation id="3988996860813292272">Selecionar fuso horário</translation> <translation id="399179161741278232">Importado</translation> <translation id="3992008114154328194">A transferir <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Faça uma cópia de segurança dos dados</translation> <translation id="3993887353483242788">Sincronize o dispositivo <ph name="DEVICE_TYPE" /> para que as suas preferências fiquem prontas em qualquer dispositivo quando iniciar sessão com a sua Conta Google. As preferências incluem apps, definições, palavras-passe do Wi-Fi, idiomas, imagem de fundo, atalhos de teclado e muito mais.</translation> <translation id="3994318741694670028">Infelizmente, o seu computador está configurado com um ID de hardware formatado incorretamente. Este facto impede que o ChromeOS Flex faça a atualização com as últimas correções de segurança e o seu computador <ph name="BEGIN_BOLD" />pode estar vulnerável a ataques maliciosos<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Desbloqueie o telemóvel e aproxime-o para desbloquear o <ph name="DEVICE_TYPE" />.</translation> @@ -3773,6 +3777,7 @@ <translation id="4369215744064167350">Pedido de Website aprovado</translation> <translation id="4369735607080757018">São partilhados tipos de dados limitados entre sites para medir o desempenho dos respetivos anúncios, como a hora do dia em que um anúncio lhe foi mostrado</translation> <translation id="4370975561335139969">O email e a palavra-passe introduzidos não coincidem.</translation> +<translation id="4374805630006466253">Usar um telemóvel ou um tablet diferente</translation> <translation id="4374831787438678295">Instalador para o Linux</translation> <translation id="4375035964737468845">Abrir ficheiros transferidos</translation> <translation id="4376226992615520204">Localização desativada</translation> @@ -3953,6 +3958,7 @@ <translation id="452750746583162491">Rever os dados sincronizados</translation> <translation id="4527929807707405172">Ative o deslocamento inverso. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Sugestão de tradução</translation> +<translation id="4528638190900283934">Inicie sessão para obter funcionalidades adicionais</translation> <translation id="4529455689802245339">As Legendas instantâneas do Chrome podem não funcionar</translation> <translation id="4530494379350999373">Origem</translation> <translation id="4531924570968473143">Quem pretende adicionar a este dispositivo <ph name="DEVICE_TYPE" />?</translation> @@ -6363,6 +6369,7 @@ <translation id="6774710250118040929">Adicione uma nova palavra-passe</translation> <translation id="6775163072363532304">Os dispositivos disponíveis aparecem aqui.</translation> <translation id="677646486571529447">Adicionar nota</translation> +<translation id="6776589734354015877">Obtenha funcionalidades adicionais</translation> <translation id="6776729248872343918">Ative o Fast Pair</translation> <translation id="6777817260680419853">Redirecionamento bloqueado</translation> <translation id="6779092717724412415">Para criar um realce como este, selecione qualquer texto e clique com o botão direito do rato.</translation> @@ -7215,7 +7222,6 @@ <translation id="7550830279652415241">marcadores_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">A transferência de <ph name="FILE_NAME" /> falhou</translation> <translation id="7551643184018910560">Fixar na prateleira</translation> -<translation id="7552658769580484674">Enviar feedback sobre o preenchimento automático</translation> <translation id="7552846755917812628">Experimente as sugestões seguintes:</translation> <translation id="7553012839257224005">A verificar o contentor do Linux…</translation> <translation id="7553242001898162573">Introduza a palavra-passe</translation> @@ -7759,6 +7765,7 @@ <translation id="8023801379949507775">Atualizar extensões agora</translation> <translation id="8025151549289123443">Ecrã de bloqueio e início de sessão</translation> <translation id="8026334261755873520">Limpar dados de navegação</translation> +<translation id="8026471514777758216">Todos os seus dispositivos</translation> <translation id="8028060951694135607">Recuperação de chaves da Microsoft</translation> <translation id="8028803902702117856">A transferir <ph name="SIZE" />… <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Tamanho</translation> @@ -8775,7 +8782,6 @@ <translation id="8952831374766033534">Opção de configuração não suportada: <ph name="ERROR_LINE" />.</translation> <translation id="8953476467359856141">Estando a carregar</translation> <translation id="895347679606913382">A iniciar...</translation> -<translation id="8956230710625245889">Abrir no Reader</translation> <translation id="8957757410289731985">Personalizar perfil</translation> <translation id="895944840846194039">Memória JavaScript</translation> <translation id="8960208913905765425">Conversão de unidades das Respostas rápidas</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 82fc7b6..a496272 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Repornești Linux?</translation> <translation id="1047431265488717055">Copiază te&xtul linkului</translation> <translation id="1048286738600630630">Afișări</translation> -<translation id="1048770690598418849">Momentan, poți să omiți acțiunea și o vom reîncerca automat după ce finalizezi configurarea</translation> <translation id="1048986595386481879">Alocată dinamic</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Se primește <ph name="ATTACHMENTS" /> de la <ph name="DEVICE_NAME" />}few{Se primesc <ph name="ATTACHMENTS" /> de la <ph name="DEVICE_NAME" />}other{Se primesc <ph name="ATTACHMENTS" /> de la <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Incognito</translation> @@ -1358,6 +1357,7 @@ <translation id="2182058453334755893">Copiat în clipboard</translation> <translation id="2183570493397356669">Butonul Continuă este dezactivat</translation> <translation id="2184515124301515068">Permite Chrome să aleagă când site-urile pot reda sunet (recomandat)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Pagină trimisă de pe alt dispozitiv</translation> <translation id="2187675480456493911">Sincronizată cu alte dispozitive din contul tău. Setările modificate de alți utilizatori nu vor fi sincronizate. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Eroare de import a certificatului serverului</translation> @@ -1662,6 +1662,7 @@ <translation id="2442916515643169563">Umbrirea textului</translation> <translation id="2443487764245141020">Ar putea fi necesar și ca site-urile să recunoască dispozitivul folosind un identificator</translation> <translation id="244475495405467108">Închide filele din stânga</translation> +<translation id="2444874983932528148">Reia cu ușurință de unde ai rămas</translation> <translation id="2445081178310039857">Este necesar directorul rădăcină pentru extensie.</translation> <translation id="2445484935443597917">Creează un profil nou</translation> <translation id="2445726032315793326">Lupă parțială</translation> @@ -1922,7 +1923,6 @@ <translation id="2673135533890720193">Citește istoricul de navigare</translation> <translation id="2674764818721168631">Dezactivat</translation> <translation id="2675570801872027281">Eroare la eliminarea Bruschetta. Încearcă din nou.</translation> -<translation id="2676492189600898281">Trimite feedback despre completarea automată</translation> <translation id="2678063897982469759">Reactivează</translation> <translation id="2678100101831051676">Nu se poate proiecta.</translation> <translation id="268053382412112343">Is&toric</translation> @@ -2480,6 +2480,7 @@ <translation id="3177909033752230686">Limba paginii:</translation> <translation id="3177914167275935955">Dispozitivul include Upgrade-ul la Chrome pentru educație, dar numele de utilizator nu este asociat unui cont Google for Education. Creează un cont Google for Education accesând g.co/workspace/edusignup pe un dispozitiv secundar.</translation> <translation id="3179982752812949580">Fontul textului</translation> +<translation id="3180284704187420717">Salvează-ți marcajele, parolele și altele cu sincronizarea</translation> <translation id="3181954750937456830">Navigare sigură (protecție împotriva site-urilor periculoase)</translation> <translation id="3182749001423093222">Verificarea ortografiei</translation> <translation id="3183139917765991655">Instrument de import al profilurilor</translation> @@ -2971,6 +2972,7 @@ <translation id="3637203148990213388">Conturi suplimentare</translation> <translation id="3639220004740062347">Ieși din modul Cititor</translation> <translation id="3640214691812501263">Adaugi „<ph name="EXTENSION_NAME" />” pentru <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Protejează-ți parolele împotriva phishingului</translation> <translation id="3640613767643722554">Învață Asistentul să îți recunoască vocea</translation> <translation id="3641456520301071208">Site-urile pot solicita permisiunea de a accesa locația</translation> <translation id="3642070413432681490">Cursor cerc</translation> @@ -3395,6 +3397,7 @@ <translation id="3988996860813292272">Selectează fusul orar</translation> <translation id="399179161741278232">Importate</translation> <translation id="3992008114154328194">Se descarcă <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Fă backup datelor</translation> <translation id="3993887353483242788">Sincronizează dispozitivul <ph name="DEVICE_TYPE" />, iar preferințele tale vor fi disponibile pe orice dispozitiv când te conectezi folosind Contul Google. Preferințele includ aplicații, setări, parole Wi-Fi, limbi, imagini de fundal, comenzi rapide de la tastatură și altele.</translation> <translation id="3994318741694670028">Din păcate, computerul este configurat cu un ID de hardware incorect. Acest lucru împiedică actualizarea sistemului de operare Chrome Flex cu cele mai recente remedieri de securitate, iar computerul <ph name="BEGIN_BOLD" />ar putea fi vulnerabil la atacuri<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Deblochează telefonul și apropie-l mai mult pentru a debloca dispozitivul <ph name="DEVICE_TYPE" />.</translation> @@ -3955,6 +3958,7 @@ <translation id="452750746583162491">Examinează datele sincronizate</translation> <translation id="4527929807707405172">Activează derularea inversă. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Sugestie de traducere</translation> +<translation id="4528638190900283934">Conectează-te pentru funcții suplimentare</translation> <translation id="4529455689802245339">Este posibil ca Subtitrările live din Chrome să nu funcționeze</translation> <translation id="4530494379350999373">Origine</translation> <translation id="4531924570968473143">Pe cine vrei să adaugi la acest <ph name="DEVICE_TYPE" />?</translation> @@ -6366,6 +6370,7 @@ <translation id="6774710250118040929">Adaugă o parolă nouă</translation> <translation id="6775163072363532304">Dispozitivele disponibile vor apărea aici.</translation> <translation id="677646486571529447">Adaugă o notă</translation> +<translation id="6776589734354015877">Obține funcții suplimentare</translation> <translation id="6776729248872343918">Activează Fast Pair</translation> <translation id="6777817260680419853">Redirecționarea a fost blocată</translation> <translation id="6779092717724412415">Pentru a crea o evidențiere precum aceasta, selectează orice text și dă clic dreapta.</translation> @@ -7218,7 +7223,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> a fost descărcat</translation> <translation id="7551643184018910560">Fixați în raft</translation> -<translation id="7552658769580484674">Trimite feedback despre completarea automată</translation> <translation id="7552846755917812628">Încearcă următoarele sfaturi:</translation> <translation id="7553012839257224005">Verificarea containerului Linux este în curs</translation> <translation id="7553242001898162573">Introdu parola</translation> @@ -7762,6 +7766,7 @@ <translation id="8023801379949507775">Actualizează extensiile acum</translation> <translation id="8025151549289123443">Ecranul de blocare și conectarea</translation> <translation id="8026334261755873520">Șterge datele de navigare</translation> +<translation id="8026471514777758216">Toate dispozitivele tale</translation> <translation id="8028060951694135607">Recuperare de chei Microsoft</translation> <translation id="8028803902702117856">Se descarcă <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Dimensiune</translation> @@ -8779,7 +8784,6 @@ <translation id="8952831374766033534">Opțiunea de configurare nu este acceptată: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">În timpul încărcării</translation> <translation id="895347679606913382">Se începe...</translation> -<translation id="8956230710625245889">Deschide în Reader</translation> <translation id="8957757410289731985">Personalizează profilul</translation> <translation id="895944840846194039">Memorie JavaScript</translation> <translation id="8960208913905765425">Conversia unităților cu Răspunsuri rapide</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index f66948b..6829957 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Перезапустить Linux?</translation> <translation id="1047431265488717055">Скопировать &текст ссылки</translation> <translation id="1048286738600630630">Дисплеи</translation> -<translation id="1048770690598418849">Сейчас этот процесс можно пропустить. Он будет автоматически запущен после настройки.</translation> <translation id="1048986595386481879">Динамическое выделение места</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Выполняется передача данных (<ph name="ATTACHMENTS" />) с устройства "<ph name="DEVICE_NAME" />"…}one{Выполняется передача данных (<ph name="ATTACHMENTS" />) с устройства "<ph name="DEVICE_NAME" />"…}few{Выполняется передача данных (<ph name="ATTACHMENTS" />) с устройства "<ph name="DEVICE_NAME" />"…}many{Выполняется передача данных (<ph name="ATTACHMENTS" />) с устройства "<ph name="DEVICE_NAME" />"…}other{Выполняется передача данных (<ph name="ATTACHMENTS" />) с устройства "<ph name="DEVICE_NAME" />"…}}</translation> <translation id="1049743911850919806">Инкогнито</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Скопировано в буфер обмена.</translation> <translation id="2183570493397356669">Кнопка "Продолжить" недоступна</translation> <translation id="2184515124301515068">Разрешить браузеру определять, на каких сайтах можно воспроизводить звук (рекомендуется)</translation> +<translation id="2186206192313702726">Google Объектив</translation> <translation id="2186711480981247270">Страница, полученная с другого устройства</translation> <translation id="2187675480456493911">Синхронизировано с другими устройствами в вашем аккаунте. Настройки, измененные другими пользователями, не будут синхронизироваться. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Ошибка при импорте сертификата сервера</translation> @@ -1663,6 +1663,7 @@ <translation id="2442916515643169563">Тень текста</translation> <translation id="2443487764245141020">Возможно, сайтам потребуется распознавать ваше устройство с помощью идентификатора.</translation> <translation id="244475495405467108">Закрыть вкладки слева</translation> +<translation id="2444874983932528148">Продолжайте работу с того места, где остановились.</translation> <translation id="2445081178310039857">Требуется корневой каталог расширения.</translation> <translation id="2445484935443597917">Создать профиль</translation> <translation id="2445726032315793326">Лупа для части экрана</translation> @@ -1923,7 +1924,6 @@ <translation id="2673135533890720193">Чтение истории просмотров</translation> <translation id="2674764818721168631">Отключено</translation> <translation id="2675570801872027281">При удалении Bruschetta произошла ошибка. Повторите попытку.</translation> -<translation id="2676492189600898281">Оставить отзыв об автозаполнении</translation> <translation id="2678063897982469759">Включить снова</translation> <translation id="2678100101831051676">Не удалось запустить трансляцию</translation> <translation id="268053382412112343">&История</translation> @@ -2481,6 +2481,7 @@ <translation id="3177909033752230686">Язык страницы:</translation> <translation id="3177914167275935955">На этом устройстве есть лицензия Chrome Education, но ваше имя пользователя не связано с аккаунтом Google for Education. Создайте аккаунт Google for Education на странице g.co/workspace/edusignup, используя другое устройство.</translation> <translation id="3179982752812949580">Шрифт текста</translation> +<translation id="3180284704187420717">Сохраняйте закладки, пароли и многое другое с помощью функции синхронизации.</translation> <translation id="3181954750937456830">Безопасный просмотр (защищает вас и ваше устройство от опасных сайтов)</translation> <translation id="3182749001423093222">Проверка правописания</translation> <translation id="3183139917765991655">Импорт профилей</translation> @@ -2972,6 +2973,7 @@ <translation id="3637203148990213388">Дополнительные аккаунты</translation> <translation id="3639220004740062347">Выйти из режима чтения</translation> <translation id="3640214691812501263">Добавить расширение "<ph name="EXTENSION_NAME" />" для пользователя <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Защитите пароли от фишинга.</translation> <translation id="3640613767643722554">Научите Ассистента узнавать ваш голос</translation> <translation id="3641456520301071208">Разрешить сайтам запрашивать ваше местоположение</translation> <translation id="3642070413432681490">Обводка курсора</translation> @@ -3396,6 +3398,7 @@ <translation id="3988996860813292272">Выбор часового пояса</translation> <translation id="399179161741278232">Выполнен импорт</translation> <translation id="3992008114154328194">Скачивание файла "<ph name="FILE_NAME" />" (<ph name="STATUS" />)</translation> +<translation id="3993259701827857030">Резервное копирование</translation> <translation id="3993887353483242788">Синхронизируйте устройство <ph name="DEVICE_TYPE" />. После этого приложения, настройки, пароли Wi-Fi, языки, обои, сочетания клавиш и другие параметры будут доступны на всех устройствах, на которых выполнен вход в аккаунт Google.</translation> <translation id="3994318741694670028">В настройках компьютера указан неверный аппаратный идентификатор устройства. Chrome OS Flex не сможет устанавливать обновления системы безопасности для защиты компьютера от <ph name="BEGIN_BOLD" />вредоносных атак<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Разблокируйте телефон и поднесите его к устройству <ph name="DEVICE_TYPE" />.</translation> @@ -3956,6 +3959,7 @@ <translation id="452750746583162491">Проверить синхронизированные данные</translation> <translation id="4527929807707405172">Включить прокрутку в обратную сторону. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Предлагать перевод</translation> +<translation id="4528638190900283934">Войдите в аккаунт и начните пользоваться дополнительными функциями</translation> <translation id="4529455689802245339">Автоматические субтитры Chrome могут не поддерживаться</translation> <translation id="4530494379350999373">Происхождение</translation> <translation id="4531924570968473143">Добавьте пользователя на это устройство (<ph name="DEVICE_TYPE" />)</translation> @@ -6371,6 +6375,7 @@ <translation id="6774710250118040929">Добавление пароля</translation> <translation id="6775163072363532304">Здесь будут появляться доступные устройства.</translation> <translation id="677646486571529447">Добавить заметку</translation> +<translation id="6776589734354015877">Вас ждут дополнительные функции</translation> <translation id="6776729248872343918">Включить Быстрое подключение</translation> <translation id="6777817260680419853">Попытка переадресации заблокирована</translation> <translation id="6779092717724412415">Чтобы задать такое же выделение, выберите текст и нажмите на него правой кнопкой мыши.</translation> @@ -7223,7 +7228,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Не удалось скачать файл <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Закрепить на панели запуска</translation> -<translation id="7552658769580484674">Оставить отзыв об автозаполнении</translation> <translation id="7552846755917812628">Попробуйте сделать следующее:</translation> <translation id="7553012839257224005">Проверка контейнера Linux</translation> <translation id="7553242001898162573">Пароль</translation> @@ -7767,6 +7771,7 @@ <translation id="8023801379949507775">Обновить расширения</translation> <translation id="8025151549289123443">Блокировка экрана и вход</translation> <translation id="8026334261755873520">Очистить историю</translation> +<translation id="8026471514777758216">Синхронизация данных на всех устройствах</translation> <translation id="8028060951694135607">Восстановление ключей Microsoft</translation> <translation id="8028803902702117856">Скачивание файла <ph name="FILE_NAME" /> (<ph name="SIZE" />)</translation> <translation id="8028993641010258682">Размер</translation> @@ -8786,7 +8791,6 @@ <translation id="8952831374766033534">Конфигурация не поддерживается: <ph name="ERROR_LINE" />.</translation> <translation id="8953476467359856141">Если устройство заряжается</translation> <translation id="895347679606913382">Запуск...</translation> -<translation id="8956230710625245889">Открыть в программе чтения</translation> <translation id="8957757410289731985">Настроить профиль</translation> <translation id="895944840846194039">Память JavaScript</translation> <translation id="8960208913905765425">Преобразование единиц измерения с помощью функции "Быстрые ответы"</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index a41b6e4..e2af3bbdd 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">ලිනක්ස් යළි අරඹන්නේද?</translation> <translation id="1047431265488717055">සබැඳි පෙළ පිටපත් කරන්න</translation> <translation id="1048286738600630630">සංදර්ශක</translation> -<translation id="1048770690598418849">ඔබට දැනට මඟ හැරිය හැකි අතර ඔබ පිහිටුවීම අවසන් කළ පසු අපි ස්වයංක්රීයව යළි උත්සාහ කරන්නෙමු</translation> <translation id="1048986595386481879">ගතිකව වෙන් කළා</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> වෙතින් <ph name="ATTACHMENTS" /> ලැබෙමින්}one{<ph name="DEVICE_NAME" /> වෙතින් <ph name="ATTACHMENTS" /> ලැබෙමින්}other{<ph name="DEVICE_NAME" /> වෙතින් <ph name="ATTACHMENTS" /> ලැබෙමින්}}</translation> <translation id="1049743911850919806">අප්රකට</translation> @@ -1358,6 +1357,7 @@ <translation id="2182058453334755893">ඔබේ පසුරු පුවරුවට පිටපත් කළා</translation> <translation id="2183570493397356669">ඉදිරියට යාමේ බොත්තම අබල කර ඇත</translation> <translation id="2184515124301515068">අඩවි හට හඬ වාදනය කළ හැකි වේලාව තේරීමට Chrome හට ඉඩ දෙන්න (නිර්දේශිත)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">වෙනත් උපාංගයකින් බෙදා ගත් පිටුව</translation> <translation id="2187675480456493911">ඔබේ ගිණුම මත අනෙකුත් උපාංග සමඟ සමමුහූර්ත කෙරේ. අනෙකුත් පරිශීලකයින් විසින් වෙනස් කරන ලද සැකසීම් සමමුහූර්ත නොකරේ. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="2187895286714876935">සේවාදායක සහතික ආනයන දෝශය</translation> @@ -1628,6 +1628,7 @@ <translation id="2408018932941436077">කාඩ්පත සුරකිනු ලැබේ</translation> <translation id="2408955596600435184">ඔබගේ PIN එක ඇතුළු කරන්න</translation> <translation id="2409268599591722235">අරඹමු</translation> +<translation id="2409709393952490731">දුරකථනයක් හෝ ටැබ්ලටයක් භාවිතා කරන්න</translation> <translation id="2410079346590497630">නිමැවුම් විස්තර</translation> <translation id="2410298923485357543">උපාංගය සබැඳි විට ස්වභාවික හඬ භාවිත කරන්න</translation> <translation id="2410754283952462441">ගිණුමක් තෝරා ගන්න</translation> @@ -1924,7 +1925,6 @@ <translation id="2673135533890720193">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය කියවන්න</translation> <translation id="2674764818721168631">අක්රිය</translation> <translation id="2675570801872027281">Bruschetta ඉවත් කිරීමේ දෝෂයකි. නැවත උත්සාහ කරන්න.</translation> -<translation id="2676492189600898281">ස්වයං පිරවුම් ප්රතිපෝෂණය සපයන්න</translation> <translation id="2678063897982469759">යළි-සබල කරන්න</translation> <translation id="2678100101831051676">විකාශය කළ නොහැකි වේ.</translation> <translation id="268053382412112343">ඉතිහාසය</translation> @@ -3777,6 +3777,7 @@ <translation id="4369215744064167350">වෙබ් අඩවි ඉල්ලීම අනුමත කරන ලදි</translation> <translation id="4369735607080757018">ඔබට දැන්වීමක් පෙන්වූ දවසේ වේලාව වැනි සීමිත දත්ත වර්ග ඔවුන්ගේ දැන්වීම්වල කාර්ය සාධනය මැනීමට අඩවි අතර බෙදා ගනු ලැබේ.</translation> <translation id="4370975561335139969">ඔබ ඇතුළු කළ ඊ-තැපැෑල සහ මුරපදය නොගැළපේ.</translation> +<translation id="4374805630006466253">වෙනස් දුරකථනයක් හෝ ටැබ්ලටයක් භාවිතා කරන්න</translation> <translation id="4374831787438678295">Linux ස්ථාපකය</translation> <translation id="4375035964737468845">බාගත් ගොනු විවෘත කරන්න</translation> <translation id="4376226992615520204">ස්ථානය ක්රියාවිරහිතයි</translation> @@ -3952,6 +3953,7 @@ <translation id="4522890784888918985">ළමා ගිණුම් සඳහා සහාය නොදක්වයි</translation> <translation id="4523876148417776526">XML අඩවි ලැයිස්තු තවම ලබා ගෙන නොමැත.</translation> <translation id="4524832533047962394">සපයන ලද ලියාපදිංචි කිරීමේ ප්රකාරයට මෙහෙයුම් පද්ධතියේ මෙම අනුවාදය සහය නොදක්වයි. ඔබ නවතම අනුවාදය ධාවන කරන බව තහවුරු කරන්න.</translation> +<translation id="4526051299161934899">සැඟවුණු සුරැකි පටිති සමූහ</translation> <translation id="4526853756266614740">තේමාව ක්ෂණිකව යෙදීමට රූපයක් තෝරා ගන්න</translation> <translation id="452750746583162491">ඔබේ සමමුහූර්ත කළ දත්ත සමාලෝචන කරන්න</translation> <translation id="4527929807707405172">ආපස්සට අනුචලනය සබල කරන්න <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> @@ -7218,7 +7220,6 @@ <translation id="7550830279652415241">පිටුසලකුණු_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> බාගැනීම සාර්ථකයි</translation> <translation id="7551643184018910560">රාක්කය වෙත අමුණන්න</translation> -<translation id="7552658769580484674">ස්වයං පිරවුම් ප්රතිපෝෂණය සපයන්න</translation> <translation id="7552846755917812628">පහත ඉඟි උත්සාහ කරන්න:</translation> <translation id="7553012839257224005">ලිනක්ස් භාජනය පරීක්ෂා කිරීම</translation> <translation id="7553242001898162573">ඔබේ මුරපදය ඇතුළු කරන්න</translation> @@ -8495,6 +8496,7 @@ <translation id="869884720829132584">යෙදුම් මෙනුව</translation> <translation id="869891660844655955">කල් ඉකුත් වීමේ දිනය:</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> සඳහා PPD</translation> +<translation id="8702278591052316269">සැඟවුණු සුරැකි පටිති සමූහ අඩංගු මෙනුව</translation> <translation id="8702825062053163569">ඔබගේ <ph name="DEVICE_TYPE" /> අගුලු දමන ලදි.</translation> <translation id="8703346390800944767">දැන්වීම මඟ හරින්න</translation> <translation id="8705331520020532516">කාණ්ඩ අංකය</translation> @@ -8776,7 +8778,6 @@ <translation id="8952831374766033534">වින්යාස විකල්පයට සහය නොදැක්වේ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ආරෝපණය වන අතරතුර</translation> <translation id="895347679606913382">ආරම්භ කරමින්...</translation> -<translation id="8956230710625245889">Reader හි විවෘත කරන්න</translation> <translation id="8957757410289731985">පැතිකඩ අභිරුචිකරණය කරන්න</translation> <translation id="895944840846194039">JavaScript මතකය</translation> <translation id="8960208913905765425">ඉක්මන් පිළිතුරු ඒකක පරිවර්තනය</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 18a783f0..17db867 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Chcete Linux reštartovať?</translation> <translation id="1047431265488717055">Kopírovať te&xt odkazu</translation> <translation id="1048286738600630630">Zobrazenie</translation> -<translation id="1048770690598418849">Teraz môžete túto možnosť preskočiť a keď dokončíte nastavenie, skúsime to znova automaticky</translation> <translation id="1048986595386481879">Dynamicky priradené</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Prijímajú sa prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}few{Prijímajú sa prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}many{Prijímajú sa prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}other{Prijímajú sa prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1359,6 +1358,7 @@ <translation id="2182058453334755893">Skopírované do schránky</translation> <translation id="2183570493397356669">Tlačidlo Pokračovať je deaktivované</translation> <translation id="2184515124301515068">Povoľte Chromu vyberať, kedy môžu weby prehrať zvuk (odporúčané)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Stránka je zdieľaná z iného zariadenia</translation> <translation id="2187675480456493911">Synchronizované s ostatnými zariadeniami vo vašom účte. Nastavenia upravené ostatnými používateľmi nebudú synchronizované. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Chyba importovania certifikátu servera</translation> @@ -1626,6 +1626,7 @@ <translation id="2408018932941436077">Karta sa ukladá</translation> <translation id="2408955596600435184">Zadajte kód PIN</translation> <translation id="2409268599591722235">Poďme na to</translation> +<translation id="2409709393952490731">Použiť telefón alebo tablet</translation> <translation id="2410079346590497630">podrobnosti o zostave</translation> <translation id="2410298923485357543">Keď je zariadenie online, používajte prirodzený hlas</translation> <translation id="2410754283952462441">Výber účtu</translation> @@ -1922,7 +1923,6 @@ <translation id="2673135533890720193">Čítať históriu prehliadania</translation> <translation id="2674764818721168631">Vypnuté</translation> <translation id="2675570801872027281">Pri odstraňovaní počítača Bruschetta sa vyskytla chyba. Skúste to znova.</translation> -<translation id="2676492189600898281">Poskytnúť spätnú väzbu k automatickému dopĺňaniu</translation> <translation id="2678063897982469759">Znova povoliť</translation> <translation id="2678100101831051676">Nedá sa prenášať.</translation> <translation id="268053382412112343">Hi&stória</translation> @@ -3774,6 +3774,7 @@ <translation id="4369215744064167350">Žiadosť o web bola schválená</translation> <translation id="4369735607080757018">Medzi webmi sa zdieľajú obmedzené typy údajov na meranie výkonnosti reklám, napríklad čas dňa, kedy sa vám reklama zobrazila.</translation> <translation id="4370975561335139969">Zadaný e-mail a heslo nesúhlasia.</translation> +<translation id="4374805630006466253">Použiť iný telefón alebo tablet</translation> <translation id="4374831787438678295">Inštalátor systému Linux</translation> <translation id="4375035964737468845">Otvárať stiahnuté súbory</translation> <translation id="4376226992615520204">Poloha je vypnutá</translation> @@ -7219,7 +7220,6 @@ <translation id="7550830279652415241">záložky_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Nepodarilo sa stiahnuť súbor <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Pripnúť na poličku</translation> -<translation id="7552658769580484674">Poskytnúť spätnú väzbu k automatickému dopĺňaniu</translation> <translation id="7552846755917812628">Vyskúšajte nasledujúce tipy:</translation> <translation id="7553012839257224005">Kontroluje sa kontajner Linux</translation> <translation id="7553242001898162573">Zadajte svoje heslo</translation> @@ -8781,7 +8781,6 @@ <translation id="8952831374766033534">Konfiguračná možnosť nie je k podporovaná: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Počas nabíjania</translation> <translation id="895347679606913382">Spúšťa sa...</translation> -<translation id="8956230710625245889">Otvoriť v čítačke</translation> <translation id="8957757410289731985">Prispôsobiť profil</translation> <translation id="895944840846194039">Pamäť JavaScript</translation> <translation id="8960208913905765425">Prevod jednotiek v rámci rýchlych odpovedí</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index e224819..7521233 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Želite znova zagnati Linux?</translation> <translation id="1047431265488717055">&Kopiraj besedilo povezave</translation> <translation id="1048286738600630630">Zasloni</translation> -<translation id="1048770690598418849">Zaenkrat lahko preskočite. Po končani nastavitvi bomo samodejno znova poskusili.</translation> <translation id="1048986595386481879">Dinamično dodeljeno</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Prejemanje prilog (<ph name="ATTACHMENTS" />) iz naprave <ph name="DEVICE_NAME" />}one{Prejemanje prilog (<ph name="ATTACHMENTS" />) iz naprave <ph name="DEVICE_NAME" />}two{Prejemanje prilog (<ph name="ATTACHMENTS" />) iz naprave <ph name="DEVICE_NAME" />}few{Prejemanje prilog (<ph name="ATTACHMENTS" />) iz naprave <ph name="DEVICE_NAME" />}other{Prejemanje prilog (<ph name="ATTACHMENTS" />) iz naprave <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Anonimni način</translation> @@ -1372,6 +1371,7 @@ <translation id="2182058453334755893">Kopirano v odložišče</translation> <translation id="2183570493397356669">Gumb za nadaljevanje je onemogočen</translation> <translation id="2184515124301515068">Naj Chrome izbere, kdaj lahko spletna mesta predvajajo zvok (priporočeno)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Stran je bila deljena iz druge naprave</translation> <translation id="2187675480456493911">Sinhronizirano z drugimi napravami v računu. Nastavitve, ki jih spremenijo drugi uporabniki, ne bodo sinhronizirane. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Napaka pri uvozu strežniškega potrdila</translation> @@ -1642,6 +1642,7 @@ <translation id="2408018932941436077">Shranjevanje kartice</translation> <translation id="2408955596600435184">Vnos kode PIN</translation> <translation id="2409268599591722235">Pa začnimo</translation> +<translation id="2409709393952490731">Uporaba telefona ali tabličnega računalnika</translation> <translation id="2410079346590497630">Podrobnosti o gradnji</translation> <translation id="2410298923485357543">Uporabite naraven glas, ko je naprava povezana v splet.</translation> <translation id="2410754283952462441">Izbira računa</translation> @@ -1678,6 +1679,7 @@ <translation id="2442916515643169563">Senčenje besedila</translation> <translation id="2443487764245141020">Spletna mesta bodo morda morala tudi prepoznati napravo z identifikatorjem.</translation> <translation id="244475495405467108">Zapri zavihke na levi</translation> +<translation id="2444874983932528148">Preprosto nadaljujte, kjer ste končali.</translation> <translation id="2445081178310039857">Potreben je korenski imenik razširitve.</translation> <translation id="2445484935443597917">Ustvari nov profil</translation> <translation id="2445726032315793326">Delna lupa</translation> @@ -1938,7 +1940,6 @@ <translation id="2673135533890720193">Branje zgodovine brskanja</translation> <translation id="2674764818721168631">Izklopljeno</translation> <translation id="2675570801872027281">Napaka pri odstranjevanju Bruschette. Poskusite znova.</translation> -<translation id="2676492189600898281">Pošlji povratne informacije glede samodejnega izpolnjevanja</translation> <translation id="2678063897982469759">Znova omogoči</translation> <translation id="2678100101831051676">Ni mogoče predvajati.</translation> <translation id="268053382412112343">Z&godovina</translation> @@ -2496,6 +2497,7 @@ <translation id="3177909033752230686">Jezik strani:</translation> <translation id="3177914167275935955">Vaša naprava vključuje nadgradnjo za Chrome Education, vendar vaše uporabniško ime ni povezano z računom za Google for Education. Ustvarite račun za Google for Education tako, da v drugi napravi obiščete g.co/workspace/edusignup.</translation> <translation id="3179982752812949580">Pisava besedila</translation> +<translation id="3180284704187420717">Shranite zaznamke, gesla in drugo z uporabo sinhronizacije.</translation> <translation id="3181954750937456830">Varno brskanje (ščiti vas in napravo pred nevarnimi spletnimi mesti)</translation> <translation id="3182749001423093222">Preverjanje črkovanja</translation> <translation id="3183139917765991655">Uvoznik profilov</translation> @@ -2987,6 +2989,7 @@ <translation id="3637203148990213388">Dodatni računi</translation> <translation id="3639220004740062347">Zapiranje načina bralnika</translation> <translation id="3640214691812501263">Želite dodati »<ph name="EXTENSION_NAME" />« za uporabnika <ph name="USER_NAME" />?</translation> +<translation id="3640347231390550691">Zaščitite svoja gesla pred lažnim predstavljanjem.</translation> <translation id="3640613767643722554">Naučite Pomočnika prepoznati vaš glas</translation> <translation id="3641456520301071208">Spletna mesta lahko zahtevajo lokacijo.</translation> <translation id="3642070413432681490">Krog okoli kazalca</translation> @@ -3411,6 +3414,7 @@ <translation id="3988996860813292272">Izbira časovnega pasu</translation> <translation id="399179161741278232">Uvoženo</translation> <translation id="3992008114154328194">Prenašanje datoteke <ph name="FILE_NAME" />, <ph name="STATUS" /></translation> +<translation id="3993259701827857030">Varnostno kopiranje podatkov</translation> <translation id="3993887353483242788">Sinhronizirajte napravo <ph name="DEVICE_TYPE" />, da bodo nastavitve pripravljene v kateri koli napravi, ko se prijavite z računom Google. Nastavitve vključujejo aplikacije, nastavitve, gesla za Wi-Fi, jezike, zaslonska ozadja, bližnjične tipke in drugo.</translation> <translation id="3994318741694670028">Vaš računalnik je konfiguriran s popačenim ID-jem strojne opreme. Zaradi tega ChromeOS Flex ne more namestiti najnovejših varnostnih popravkov in vaš računalnik <ph name="BEGIN_BOLD" />je lahko še bolj izpostavljen zlonamernim napadom<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Odklenite telefon in ga približajte napravi <ph name="DEVICE_TYPE" />, če jo želite odkleniti.</translation> @@ -3790,6 +3794,7 @@ <translation id="4369215744064167350">Odobrena zahteva za dostop do spletnega mesta</translation> <translation id="4369735607080757018">S spletnimi mesti se delijo omejene vrste podatkov, na primer ura v dnevu, ko je bil oglas prikazan.</translation> <translation id="4370975561335139969">E-poštni naslov in geslo, ki ste ju vnesli, se ne ujemata.</translation> +<translation id="4374805630006466253">Uporaba drugega telefona ali tabličnega računalnika</translation> <translation id="4374831787438678295">Namestitveni program za Linux</translation> <translation id="4375035964737468845">Odpiranje prenesenih slik</translation> <translation id="4376226992615520204">Lokacija je izklopljena</translation> @@ -3971,6 +3976,7 @@ <translation id="452750746583162491">Pregled sinhroniziranih podatkov</translation> <translation id="4527929807707405172">Omogoči obratno pomikanje. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Predlog prevoda</translation> +<translation id="4528638190900283934">Če želite dodatne funkcije, se prijavite.</translation> <translation id="4529455689802245339">Samodejni podnapisi v Chromu morda ne bodo delovali</translation> <translation id="4530494379350999373">Izvor</translation> <translation id="4531924570968473143">Koga želite dodati tej napravi <ph name="DEVICE_TYPE" />?</translation> @@ -6388,6 +6394,7 @@ <translation id="6774710250118040929">Dodajanje novega gesla</translation> <translation id="6775163072363532304">Tu bodo prikazane razpoložljive naprave.</translation> <translation id="677646486571529447">Dodajanje opombe</translation> +<translation id="6776589734354015877">Zagotovite si dodatne funkcije.</translation> <translation id="6776729248872343918">Omogočanje hitre seznanitve</translation> <translation id="6777817260680419853">Preusmeritev je blokirana</translation> <translation id="6779092717724412415">Če želite označiti na tak način, izberite poljubno besedilo in kliknite z desnim gumbom.</translation> @@ -7240,7 +7247,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Prenos datoteke <ph name="FILE_NAME" /> ni uspel</translation> <translation id="7551643184018910560">Pripenjanje na polico</translation> -<translation id="7552658769580484674">Pošlji povratne informacije glede samodejnega izpolnjevanja</translation> <translation id="7552846755917812628">Poskusite te nasvete:</translation> <translation id="7553012839257224005">Preverjanje vsebnika za Linux</translation> <translation id="7553242001898162573">Vnesite geslo</translation> @@ -7784,6 +7790,7 @@ <translation id="8023801379949507775">Posodobi razširitve</translation> <translation id="8025151549289123443">Zaklenjen zaslon in prijava</translation> <translation id="8026334261755873520">Izbriši podatke brskanja</translation> +<translation id="8026471514777758216">Vse vaše naprave</translation> <translation id="8028060951694135607">Microsoftova obnovitev ključa</translation> <translation id="8028803902702117856">Prenašanje <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Velikost</translation> @@ -8803,7 +8810,6 @@ <translation id="8952831374766033534">Možnost konfiguracije ni podprta: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Med polnjenjem</translation> <translation id="895347679606913382">Začetek ...</translation> -<translation id="8956230710625245889">Odpri v bralniku</translation> <translation id="8957757410289731985">Prilagodi profil</translation> <translation id="895944840846194039">Pomnilnik za JavaScript</translation> <translation id="8960208913905765425">Pretvorba enot hitrih odgovorov</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 5b75affe..cbf1077b 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Do ta rinisësh Linux?</translation> <translation id="1047431265488717055">Kopjo tekstin e lidhjes</translation> <translation id="1048286738600630630">Ekranet</translation> -<translation id="1048770690598418849">Mund ta kapërcesh për momentin dhe ne do ta provojmë përsëri automatikisht pasi të përfundosh konfigurimin</translation> <translation id="1048986595386481879">Caktuar në mënyrë dinamike</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Po merr <ph name="ATTACHMENTS" /> nga <ph name="DEVICE_NAME" />}other{Po merr <ph name="ATTACHMENTS" /> nga <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">I fshehtë</translation> @@ -1354,6 +1353,7 @@ <translation id="2182058453334755893">Kopjuar te kujtesa e fragmenteve</translation> <translation id="2183570493397356669">Butoni "Vazhdo" është çaktivizuar</translation> <translation id="2184515124301515068">Lejo që Chrome të zgjedhë se cilat sajte mund të luajnë tinguj (rekomandohet)</translation> +<translation id="2186206192313702726">Lentja e Google</translation> <translation id="2186711480981247270">Faqja është ndarë nga një pajisje tjetër</translation> <translation id="2187675480456493911">Sinkronizuar me pajisjet e tjera në llogarinë tënde. Cilësimet e modifikuara nga përdoruesit e tjerë nuk do të sinkronizohen. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Gabim në importimin e certifikatës së serverit</translation> @@ -1918,7 +1918,6 @@ <translation id="2673135533890720193">Lexo historikun e shfletimit</translation> <translation id="2674764818721168631">Joaktive</translation> <translation id="2675570801872027281">Gabim gjatë heqjes së Bruschetta. Provo përsëri.</translation> -<translation id="2676492189600898281">Jep komente për "Plotësimin automatik"</translation> <translation id="2678063897982469759">Aktivizoje përsëri</translation> <translation id="2678100101831051676">Nuk mund të transmetohet.</translation> <translation id="268053382412112343">Hi&storiku</translation> @@ -4270,6 +4269,7 @@ <translation id="4824037980212326045">Rezervimi dhe restaurimi i Linux</translation> <translation id="4824958205181053313">Të anulohet sinkronizimi?</translation> <translation id="4825532258163983651">Çelësi i kalimit nuk mund të fshihet</translation> +<translation id="4827283332383516812">Fshi kartën</translation> <translation id="4827675678516992122">Nuk mund të lidhej</translation> <translation id="4827784381479890589">Kontrolli drejtshkrimor i përmirësuar në shfletuesin Chrome (teksti dërgohet te Google për sugjerime për drejtshkrimin)</translation> <translation id="4827904420700932487">Krijo kodin QR për këtë imazh</translation> @@ -5293,6 +5293,7 @@ <translation id="5792295754950501287">Më shumë veprime për "<ph name="CARD_DESCRIPTION" />"</translation> <translation id="5792728279623964091">Trokit te butoni i energjisë</translation> <translation id="5792874008054171483">Më shumë veprime për <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Kjo mënyrë pagese do të fshihet nga kjo pajisje</translation> <translation id="5793339252089865437">Nëse e shkarkon përditësimin nëpërmjet rrjetit celular, kjo mund të shkaktojë tarifa të tepërta.</translation> <translation id="5793420564274426163">Konfirmimi i çiftimit</translation> <translation id="5793430094159150686">Fjalëkalimi yt është ndryshuar. Për të restauruar të dhënat e tua lokale, duhet të futësh fjalëkalimin tënd të vjetër.</translation> @@ -7209,7 +7210,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Shkarkimi i <ph name="FILE_NAME" /> nuk u krye me sukses</translation> <translation id="7551643184018910560">Gozhdo në raft</translation> -<translation id="7552658769580484674">Jep komente për "Plotësimin automatik"</translation> <translation id="7552846755917812628">Provo këshillat e mëposhtme:</translation> <translation id="7553012839257224005">Po kontrollon kontejnerin e Linux</translation> <translation id="7553242001898162573">Fut fjalëkalimin</translation> @@ -7271,6 +7271,7 @@ <translation id="7609148976235050828">Lidhu me internetin dhe provo sërish</translation> <translation id="7612401678989660900">Lejo qasjen për aplikacionet dhe sajtet e uebit me lejen e mikrofonit</translation> <translation id="7612655942094160088">Aktivizo veçoritë e telefonit të lidhur.</translation> +<translation id="7612989789287281429">Po identifikohesh…</translation> <translation id="7614260613810441905">Pyet kur një sajt dëshiron të modifikojë skedarë ose dosje në pajisjen tënde (rekomandohet)</translation> <translation id="761530003705945209">Rezervo në "Diskun e Google". Restauro të dhënat e tua ose ndërro me lehtësi pajisjen në çdo kohë. Rezervimi yt përfshin të dhënat e aplikacioneve. Rezervimet e tua ngarkohen te Google dhe enkriptohen duke përdorur fjalëkalimin e "Llogarisë sate të Google".</translation> <translation id="7615365294369022248">Ndodhi një gabim gjatë shtimit të një llogarie</translation> @@ -8766,7 +8767,6 @@ <translation id="8952831374766033534">Opsioni i konfigurimit nuk mbështetet: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Gjatë karikimit</translation> <translation id="895347679606913382">Po niset...</translation> -<translation id="8956230710625245889">Hape te "Lexuesi"</translation> <translation id="8957757410289731985">Personalizo profilin</translation> <translation id="895944840846194039">Memoria e JavaScript</translation> <translation id="8960208913905765425">Konvertimi i njësive i "Përgjigjeve të shpejta"</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 0c97fbd..aef3724 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Želite li da restartujete Linux?</translation> <translation id="1047431265488717055">Kopiraj tek&st linka</translation> <translation id="1048286738600630630">Prikazi</translation> -<translation id="1048770690598418849">Možete da preskočite za sada, a mi ćemo ponovo probati automatski kada završite podešavanje</translation> <translation id="1048986595386481879">Dinamički dodeljen</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Prima se <ph name="ATTACHMENTS" /> sa uređaja <ph name="DEVICE_NAME" />}one{Prima se <ph name="ATTACHMENTS" /> sa uređaja <ph name="DEVICE_NAME" />}few{Primaju se <ph name="ATTACHMENTS" /> sa uređaja <ph name="DEVICE_NAME" />}other{Prima se <ph name="ATTACHMENTS" /> sa uređaja <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Bez arhiviranja</translation> @@ -204,6 +203,7 @@ <translation id="1174073918202301297">Prečica je dodata</translation> <translation id="1174366174291287894">Veza je uvek bezbedna ako vam Chrome ne kaže drugačije</translation> <translation id="117445914942805388">Da biste obrisali podatke pregledanja sa svih sinhronizovanih uređaja i sa Google naloga, <ph name="BEGIN_LINK" />idite u podešavanja sinhronizacije<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Administrator je onemogućio ovu funkciju.</translation> <translation id="1175364870820465910">&Odštampaj...</translation> <translation id="1176471985365269981">Nije im dozvoljeno da menjaju fajlove ili foldere na uređaju</translation> <translation id="1177863135347784049">Prilagođeno</translation> @@ -1356,6 +1356,7 @@ <translation id="2182058453334755893">Kopirano je u privremenu memoriju</translation> <translation id="2183570493397356669">Dugme Nastavi je onemogućeno</translation> <translation id="2184515124301515068">Neka Chrome odabere kada sajtovi mogu da puste zvuk (preporučeno)</translation> +<translation id="2186206192313702726">Google objektiv</translation> <translation id="2186711480981247270">Stranica se deli sa drugog uređaja</translation> <translation id="2187675480456493911">Sinhronizovano je sa ostalim uređajima na nalogu. Podešavanja koja menjaju drugi korisnici se ne sinhronizuju. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Greška pri uvozu serverskog sertifikata</translation> @@ -1920,7 +1921,6 @@ <translation id="2673135533890720193">Čitanje vaše istorije pregledanja</translation> <translation id="2674764818721168631">Isključeno</translation> <translation id="2675570801872027281">Greška pri uklanjanju Bruschetta-e. Probajte ponovo.</translation> -<translation id="2676492189600898281">Pošalji povratne informacije za automatsko popunjavanje</translation> <translation id="2678063897982469759">Ponovo omogući</translation> <translation id="2678100101831051676">Prebacivanje nije uspelo.</translation> <translation id="268053382412112343">Hi&story (Istorija)</translation> @@ -2438,6 +2438,7 @@ <translation id="3129215702932019810">Greška pri pokretanju aplikacije</translation> <translation id="3130528281680948470">Uređaj će biti resetovan i svi korisnički nalozi i lokalni podaci će biti uklonjeni. To ne može da se opozove.</translation> <translation id="3130863904455712965">Istorija i drugo</translation> +<translation id="3130966412954727147">Sajtovi koje posećujete mogu da potvrde da ste stvarni korisnik, a ne robot.</translation> <translation id="313205617302240621">Zaboravili ste lozinku?</translation> <translation id="3132277757485842847">Nismo uspeli da održimo vezu sa telefonom. Uverite se da je telefon u blizini, da je otključan i da su Bluetooth i WiFi uključeni.</translation> <translation id="3132896062549112541">Pravilo</translation> @@ -2979,6 +2980,7 @@ <translation id="3647654707956482440">Korišćenje ovog linka nije uspelo. Proverite da li ima grešaka u kucanju ili probajte ponovo sa drugim linkom.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> je primljena sa uređaja <ph name="DEVICE_NAME" />}one{<ph name="ATTACHMENTS" /> je primljena sa uređaja <ph name="DEVICE_NAME" />}few{<ph name="ATTACHMENTS" /> su primljene sa uređaja <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> je primljeno sa uređaja <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750">Uređaj <ph name="USB_DEVICE_NAME" /> je otkriven</translation> +<translation id="3649190289964910441">Sajt koji posetite može da čuva informacije pomoću Chrome-a koje potvrđuju da ste stvarni korisnik. Dok nastavljate da pregledate, sajtovi mogu da proveravaju sa Chrome-om i uveravaju se na prvom sajtu da ste verovatno pouzdani korisnik.</translation> <translation id="3650753875413052677">Greška pri registraciji</translation> <translation id="3650845953328929506">Otpremanje evidencije je na čekanju.</translation> <translation id="3650952250015018111">Dozvolite da „<ph name="APP_NAME" />“ pristupa:</translation> @@ -4224,6 +4226,7 @@ <translation id="477647109558161443">Napravi prečicu na radnoj površini</translation> <translation id="4776594120007763294">Kliknite na dugme da biste dodali stranicu i čitali je kasnije</translation> <translation id="4777458362738635055">Drugi korisnici ovog uređaja mogu da koriste ovu mrežu</translation> +<translation id="477781522763920796">Ovo podešavanje radi, a da ne mora da vas identifikuje ili da dozvoli sajtovima da vide istoriju pregledanja.</translation> <translation id="4777825441726637019">Play prodavnica</translation> <translation id="4777943778632837590">Konfiguriši nazive servera mreže</translation> <translation id="4779083564647765204">Zumiranje</translation> @@ -6191,6 +6194,7 @@ <translation id="6597331566371766302">Administrator je blokirao sledeće dodatke:</translation> <translation id="6601262427770154296">Upravljanje korisničkim rečnicima</translation> <translation id="6601612474695404578">Neki sajtovi koriste kolačiće treće strane da bi učitavali svoje stranice. Ako sajt ne radi, možete da probate da dozvolite kolačiće.</translation> +<translation id="6602581642873576447">Umanjenje nepoželjnog sadržaja i prevara je isključeno</translation> <translation id="6602937173026466876">Pristupite štampačima</translation> <translation id="6602956230557165253">Koristite tastere sa strelicama ulevo i udesno za kretanje.</translation> <translation id="6603185457265641428">Odaberite da li ćete sinhronizovati istoriju</translation> @@ -6707,6 +6711,7 @@ <translation id="7047059339731138197">Izaberite pozadinu</translation> <translation id="7049293980323620022">Želite li da zadržite datoteku?</translation> <translation id="7050037487872780845">Nevažeća konfiguracija hotspota</translation> +<translation id="7050519587566342213">Pregledanje je bolje jer će vam više verovati kada prelazite sa jednog sajta na drugi.</translation> <translation id="7051551856857948729">Sakrij IBAN vrednost</translation> <translation id="7052237160939977163">Šalji podatke o praćenju učinka</translation> <translation id="7053983685419859001">Blokiraj</translation> @@ -6924,6 +6929,7 @@ <translation id="7269736181983384521">Potrošnja podataka Deljenja u blizini</translation> <translation id="7272674038937250585">Nije naveden nijedan opis</translation> <translation id="7273110280511444812">poslednji put je priključeno <ph name="DATE" /></translation> +<translation id="7273921429569738933">Umanjenje nepoželjnog sadržaja i prevara je uključeno</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% – <ph name="TIME" /> do kraja punjenja</translation> <translation id="727952162645687754">Greška pri preuzimanju</translation> <translation id="7280041992884344566">Došlo je do greške dok je Chrome tražio štetan softver</translation> @@ -7218,7 +7224,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Niste uspeli da preuzmete <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Zakači na policu</translation> -<translation id="7552658769580484674">Pošalji povratne informacije za automatsko popunjavanje</translation> <translation id="7552846755917812628">Isprobajte sledeće savete:</translation> <translation id="7553012839257224005">Proverava se Linux kontejner</translation> <translation id="7553242001898162573">Unesite lozinku</translation> @@ -8780,7 +8785,6 @@ <translation id="8952831374766033534">Opcija konfigurisanja nije podržana: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Tokom punjenja</translation> <translation id="895347679606913382">Započinjanje...</translation> -<translation id="8956230710625245889">Otvori u čitaču</translation> <translation id="8957757410289731985">Prilagodi profil</translation> <translation id="895944840846194039">JavaScript memorija</translation> <translation id="8960208913905765425">Konverzija jedinica za brze odgovore</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index b16970a..0a622d3 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Желите ли да рестартујете Linux?</translation> <translation id="1047431265488717055">Копирај тек&ст линка</translation> <translation id="1048286738600630630">Прикази</translation> -<translation id="1048770690598418849">Можете да прескочите за сада, а ми ћемо поново пробати аутоматски када завршите подешавање</translation> <translation id="1048986595386481879">Динамички додељен</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Прима се <ph name="ATTACHMENTS" /> са уређаја <ph name="DEVICE_NAME" />}one{Прима се <ph name="ATTACHMENTS" /> са уређаја <ph name="DEVICE_NAME" />}few{Примају се <ph name="ATTACHMENTS" /> са уређаја <ph name="DEVICE_NAME" />}other{Прима се <ph name="ATTACHMENTS" /> са уређаја <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Без архивирања</translation> @@ -204,6 +203,7 @@ <translation id="1174073918202301297">Пречица је додата</translation> <translation id="1174366174291287894">Веза је увек безбедна ако вам Chrome не каже другачије</translation> <translation id="117445914942805388">Да бисте обрисали податке прегледања са свих синхронизованих уређаја и са Google налога, <ph name="BEGIN_LINK" />идите у подешавања синхронизације<ph name="END_LINK" />.</translation> +<translation id="1175131936083782305">Администратор је онемогућио ову функцију.</translation> <translation id="1175364870820465910">&Одштампај...</translation> <translation id="1176471985365269981">Није им дозвољено да мењају фајлове или фолдере на уређају</translation> <translation id="1177863135347784049">Прилагођено</translation> @@ -1356,6 +1356,7 @@ <translation id="2182058453334755893">Копирано је у привремену меморију</translation> <translation id="2183570493397356669">Дугме Настави је онемогућено</translation> <translation id="2184515124301515068">Нека Chrome одабере када сајтови могу да пусте звук (препоручено)</translation> +<translation id="2186206192313702726">Google објектив</translation> <translation id="2186711480981247270">Страница се дели са другог уређаја</translation> <translation id="2187675480456493911">Синхронизовано је са осталим уређајима на налогу. Подешавања која мењају други корисници се не синхронизују. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Грешка при увозу серверског сертификата</translation> @@ -1920,7 +1921,6 @@ <translation id="2673135533890720193">Читање ваше историје прегледања</translation> <translation id="2674764818721168631">Искључено</translation> <translation id="2675570801872027281">Грешка при уклањању Bruschetta-е. Пробајте поново.</translation> -<translation id="2676492189600898281">Пошаљи повратне информације за аутоматско попуњавање</translation> <translation id="2678063897982469759">Поново омогући</translation> <translation id="2678100101831051676">Пребацивање није успело.</translation> <translation id="268053382412112343">Hi&story (Историја)</translation> @@ -2438,6 +2438,7 @@ <translation id="3129215702932019810">Грешка при покретању апликације</translation> <translation id="3130528281680948470">Уређај ће бити ресетован и сви кориснички налози и локални подаци ће бити уклоњени. То не може да се опозове.</translation> <translation id="3130863904455712965">Историја и друго</translation> +<translation id="3130966412954727147">Сајтови које посећујете могу да потврде да сте стварни корисник, а не робот.</translation> <translation id="313205617302240621">Заборавили сте лозинку?</translation> <translation id="3132277757485842847">Нисмо успели да одржимо везу са телефоном. Уверите се да је телефон у близини, да је откључан и да су Bluetooth и WiFi укључени.</translation> <translation id="3132896062549112541">Правило</translation> @@ -2979,6 +2980,7 @@ <translation id="3647654707956482440">Коришћење овог линка није успело. Проверите да ли има грешака у куцању или пробајте поново са другим линком.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> је примљена са уређаја <ph name="DEVICE_NAME" />}one{<ph name="ATTACHMENTS" /> је примљена са уређаја <ph name="DEVICE_NAME" />}few{<ph name="ATTACHMENTS" /> су примљене са уређаја <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> је примљено са уређаја <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750">Уређај <ph name="USB_DEVICE_NAME" /> је откривен</translation> +<translation id="3649190289964910441">Сајт који посетите може да чува информације помоћу Chrome-а које потврђују да сте стварни корисник. Док настављате да прегледате, сајтови могу да проверавају са Chrome-ом и уверавају се на првом сајту да сте вероватно поуздани корисник.</translation> <translation id="3650753875413052677">Грешка при регистрацији</translation> <translation id="3650845953328929506">Отпремање евиденције је на чекању.</translation> <translation id="3650952250015018111">Дозволите да „<ph name="APP_NAME" />“ приступа:</translation> @@ -4224,6 +4226,7 @@ <translation id="477647109558161443">Направи пречицу на радној површини</translation> <translation id="4776594120007763294">Кликните на дугме да бисте додали страницу и читали је касније</translation> <translation id="4777458362738635055">Други корисници овог уређаја могу да користе ову мрежу</translation> +<translation id="477781522763920796">Ово подешавање ради, а да не мора да вас идентификује или да дозволи сајтовима да виде историју прегледања.</translation> <translation id="4777825441726637019">Play продавница</translation> <translation id="4777943778632837590">Конфигуриши називе сервера мреже</translation> <translation id="4779083564647765204">Зумирање</translation> @@ -6191,6 +6194,7 @@ <translation id="6597331566371766302">Администратор је блокирао следеће додатке:</translation> <translation id="6601262427770154296">Управљање корисничким речницима</translation> <translation id="6601612474695404578">Неки сајтови користе колачиће треће стране да би учитавали своје странице. Ако сајт не ради, можете да пробате да дозволите колачиће.</translation> +<translation id="6602581642873576447">Умањење непожељног садржаја и превара је искључено</translation> <translation id="6602937173026466876">Приступите штампачима</translation> <translation id="6602956230557165253">Користите тастере са стрелицама улево и удесно за кретање.</translation> <translation id="6603185457265641428">Одаберите да ли ћете синхронизовати историју</translation> @@ -6707,6 +6711,7 @@ <translation id="7047059339731138197">Изаберите позадину</translation> <translation id="7049293980323620022">Желите ли да задржите датотеку?</translation> <translation id="7050037487872780845">Неважећа конфигурација хотспота</translation> +<translation id="7050519587566342213">Прегледање је боље јер ће вам више веровати када прелазите са једног сајта на други.</translation> <translation id="7051551856857948729">Сакриј IBAN вредност</translation> <translation id="7052237160939977163">Шаљи податке о праћењу учинка</translation> <translation id="7053983685419859001">Блокирај</translation> @@ -6924,6 +6929,7 @@ <translation id="7269736181983384521">Потрошња података Дељења у близини</translation> <translation id="7272674038937250585">Није наведен ниједан опис</translation> <translation id="7273110280511444812">последњи пут је прикључено <ph name="DATE" /></translation> +<translation id="7273921429569738933">Умањење непожељног садржаја и превара је укључено</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% – <ph name="TIME" /> до краја пуњења</translation> <translation id="727952162645687754">Грешка при преузимању</translation> <translation id="7280041992884344566">Дошло је до грешке док је Chrome тражио штетан софтвер</translation> @@ -7218,7 +7224,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Нисте успели да преузмете <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Закачи на полицу</translation> -<translation id="7552658769580484674">Пошаљи повратне информације за аутоматско попуњавање</translation> <translation id="7552846755917812628">Испробајте следеће савете:</translation> <translation id="7553012839257224005">Проверава се Linux контејнер</translation> <translation id="7553242001898162573">Унесите лозинку</translation> @@ -8780,7 +8785,6 @@ <translation id="8952831374766033534">Опција конфигурисања није подржана: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Током пуњења</translation> <translation id="895347679606913382">Започињање...</translation> -<translation id="8956230710625245889">Отвори у читачу</translation> <translation id="8957757410289731985">Прилагоди профил</translation> <translation id="895944840846194039">JavaScript меморија</translation> <translation id="8960208913905765425">Конверзија јединица за брзе одговоре</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index d8733b440..7ec32d6 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Vill du starta om Linux?</translation> <translation id="1047431265488717055">Kopiera länktext</translation> <translation id="1048286738600630630">Skärmar</translation> -<translation id="1048770690598418849">Du kan hoppa över detta tills vidare så försöker vi igen automatiskt när du har slutfört konfigurationen</translation> <translation id="1048986595386481879">Dynamiskt tilldelad</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Tar emot <ph name="ATTACHMENTS" /> från <ph name="DEVICE_NAME" />}other{Tar emot <ph name="ATTACHMENTS" /> från <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Kopierat till urklipp</translation> <translation id="2183570493397356669">Fortsätt-knappen har inaktiverats</translation> <translation id="2184515124301515068">Låt Chrome välja när webbplatser kan spela upp ljud (rekommenderas)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Sidan delas från en annan enhet</translation> <translation id="2187675480456493911">Synkroniseras med andra enheter i kontot. Inställningar som andra användare har ändrat synkroniseras inte. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Fel vid import av servercertifikat</translation> @@ -1936,7 +1936,6 @@ <translation id="2673135533890720193">Läsa webbhistoriken</translation> <translation id="2674764818721168631">Av</translation> <translation id="2675570801872027281">Det gick inte att ta bort Bruschetta. Försök igen.</translation> -<translation id="2676492189600898281">Ge feedback om Autofyll</translation> <translation id="2678063897982469759">Aktivera igen</translation> <translation id="2678100101831051676">Det gick inte att casta.</translation> <translation id="268053382412112343">Hi&storik</translation> @@ -4290,6 +4289,7 @@ <translation id="4824037980212326045">Säkerhetskopiering och återställning i Linux</translation> <translation id="4824958205181053313">Vill du avbryta synkroniseringen?</translation> <translation id="4825532258163983651">Det gick inte att radera nyckeln</translation> +<translation id="4827283332383516812">Radera kort</translation> <translation id="4827675678516992122">Det gick inte att ansluta</translation> <translation id="4827784381479890589">Utökad stavningskontroll i webbläsaren Chrome (texten skickas till Google för stavningsförslag)</translation> <translation id="4827904420700932487">Skapa QR-kod för den här bilden</translation> @@ -5313,6 +5313,7 @@ <translation id="5792295754950501287">Fler åtgärder för <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Tryck på av/på-knappen</translation> <translation id="5792874008054171483">Fler åtgärder för <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Den här betalningsmetoden raderas från enheten</translation> <translation id="5793339252089865437">Om du laddar ned uppdateringen via mobilnätverket kan det leda till avgifter för överskriden förbrukningsgräns.</translation> <translation id="5793420564274426163">Bekräftelse av parkoppling</translation> <translation id="5793430094159150686">Ditt lösenord har ändrats. Du måste ange ditt gamla lösenord för att återställa lokal data.</translation> @@ -7229,7 +7230,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Det gick inte att ladda ned <ph name="FILE_NAME" /></translation> <translation id="7551643184018910560">Fäst på hyllan</translation> -<translation id="7552658769580484674">Ge feedback om Autofyll</translation> <translation id="7552846755917812628">Testa följande tips:</translation> <translation id="7553012839257224005">Linux-behållaren kontrolleras</translation> <translation id="7553242001898162573">Ange ditt lösenord</translation> @@ -7291,6 +7291,7 @@ <translation id="7609148976235050828">Anslut till internet och försök igen.</translation> <translation id="7612401678989660900">Tillåt åtkomst för appar och webbplatser med mikrofonbehörighet</translation> <translation id="7612655942094160088">Aktivera anslutna mobilfunktioner.</translation> +<translation id="7612989789287281429">Du loggas in …</translation> <translation id="7614260613810441905">Fråga när en webbplats vill kunna redigera filer eller mappar på enheten (rekommenderas)</translation> <translation id="761530003705945209">Säkerhetskopiera på Google Drive. Återställ data eller byt enkelt enhet när du vill. Säkerhetskopian innehåller appdata. Säkerhetskopiorna krypteras med hjälp av Google-kontots lösenord och laddas upp på Google.</translation> <translation id="7615365294369022248">Ett fel uppstod när kontot skulle läggas till</translation> @@ -8788,7 +8789,6 @@ <translation id="8952831374766033534">Konfigurationsalternativet stöds inte: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Vid laddning</translation> <translation id="895347679606913382">Startar...</translation> -<translation id="8956230710625245889">Öppna i läsare</translation> <translation id="8957757410289731985">Anpassa profil</translation> <translation id="895944840846194039">JavaScript-minne</translation> <translation id="8960208913905765425">Enhetskonvertering i Snabbinfo</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 270276f..d0de5ff5a 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Ungependa Kuzima Kisha Uwashe Linux?</translation> <translation id="1047431265488717055">Nakili Maandishi ya Kiungo</translation> <translation id="1048286738600630630">Maonyesho</translation> -<translation id="1048770690598418849">Unaweza kuruka hatua hii kwa sasa na tutajaribu tena kiotomatiki utakapokamilisha kuweka mipangilio</translation> <translation id="1048986595386481879">Haikuchaguliwa na mtumiaji</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Inapokea <ph name="ATTACHMENTS" /> kutoka <ph name="DEVICE_NAME" />}other{Inapokea <ph name="ATTACHMENTS" /> kutoka <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Kichupo fiche</translation> @@ -69,6 +68,7 @@ <translation id="1059484610606223931">Itifaki ya Uhamishaji wa Maandishi yenye Viungo (HTTPS)</translation> <translation id="1059944192885972544">Imepata Vichupo <ph name="NUM" /> Vya '<ph name="SEARCH_TEXT" />'</translation> <translation id="1060292118287751956">Hubaini kasi ya kusasisha skrini</translation> +<translation id="1060570945511946595">Dhibiti tiketi</translation> <translation id="1061130374843955397">Karibu kwenye <ph name="DEVICE_TYPE" /> yako</translation> <translation id="1061373870045429865">Tunga Msimbo wa QR wa Kiungo hiki</translation> <translation id="1061904396131502319">Muda wa kupumzika umekaribia</translation> @@ -1122,6 +1122,7 @@ <translation id="1975841812214822307">Ondoa...</translation> <translation id="1976150099241323601">Ingia kwenye Kifaa Salama</translation> <translation id="1977965994116744507">Sogeza simu yako karibu ili ukifungue kifaa chako cha <ph name="DEVICE_TYPE" />.</translation> +<translation id="1978666928180318515">Ondoa Bruschetta</translation> <translation id="1979095679518582070">Hatua ya kuzima kipengele hiki haiathiri uwezo wa kifaa hiki wa kutuma maelezo yanayohitajika kutekeleza huduma muhimu kama vile masasisho ya mfumo na usalama.</translation> <translation id="1979280758666859181">Unabadilisha hadi kituo chenye toleo zee la <ph name="PRODUCT_NAME" />. Mabadiliko ya kituo yatatumika wakati toleo la kituo linalingana na toleo lililosanidiwa kwenye kifaa chako.</translation> <translation id="197989455406964291">KDC haitumii aina ya usimbaji fiche</translation> @@ -1363,6 +1364,7 @@ <translation id="2182058453334755893">Yamenakiliwa kwenye Ubao wa Kunakili</translation> <translation id="2183570493397356669">Kitufe cha "endelea" kimezimwa</translation> <translation id="2184515124301515068">Ruhusu Chrome ichague wakati ambapo tovuti zitacheza sauti (inapendekezwa)</translation> +<translation id="2186206192313702726">Lenzi ya Google</translation> <translation id="2186711480981247270">Ukurasa umeshirikiwa kutoka kwenye kifaa kingine</translation> <translation id="2187675480456493911">Umesawazishwa na vifaa vingine kwenye akaunti yako. Mipangilio iliyorekebishwa na watumiaji wengine haitasawazishwa. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Hitilafu ya Kuleta Cheti cha Seva</translation> @@ -1634,6 +1636,7 @@ <translation id="2408018932941436077">Inahifadhi kadi</translation> <translation id="2408955596600435184">Weka PIN yako</translation> <translation id="2409268599591722235">Anza kutumia</translation> +<translation id="2409709393952490731">Tumia simu au kompyuta kibao</translation> <translation id="2410079346590497630">Maelezo ya muundo</translation> <translation id="2410298923485357543">Tumia sauti ya kawaida kifaa kikiwa mtandaoni</translation> <translation id="2410754283952462441">Chagua akaunti</translation> @@ -1929,7 +1932,7 @@ <translation id="2672142220933875349">Faili mbaya ya CRX, imeshindwa kutenganishwa.</translation> <translation id="2673135533890720193">Kusoma historia yako ya kuvinjari</translation> <translation id="2674764818721168631">Imezimwa</translation> -<translation id="2676492189600898281">Weka maoni kuhusu kipengele cha Kujaza kiotomatiki</translation> +<translation id="2675570801872027281">Hitilafu imetokea wakati wa kuondoa Bruschetta. Tafadhali jaribu tena.</translation> <translation id="2678063897982469759">Washa tena</translation> <translation id="2678100101831051676">Imeshindwa kutuma.</translation> <translation id="268053382412112343">Historia</translation> @@ -2927,6 +2930,7 @@ <translation id="3593965109698325041">Vizuizi vya Jina la Cheti</translation> <translation id="3596012367874587041">Mipangilio ya programu</translation> <translation id="3596414637720633074">Zuia vidakuzi vya watu au kampuni nyingine katika Hali Fiche</translation> +<translation id="3598010454707842106">Bofya “Weka mapendeleo ya Chrome”</translation> <translation id="3599221874935822507">Imeinuliwa</translation> <translation id="3600051066689725006">Maelezo ya ombi la wavuti</translation> <translation id="360180734785106144">Kutoa vipengele vipya kadri vinavyopatikana</translation> @@ -3778,6 +3782,7 @@ <translation id="4369215744064167350">Ombi la tovuti limeidhinishwa</translation> <translation id="4369735607080757018">Baadhi ya data zinashirikiwa kati ya tovuti ili kupima ufanisi wa matangazo yao, kama vile wakati wa siku ambapo ulionyeshwa tangazo</translation> <translation id="4370975561335139969">Anwani ya barua pepe na nenosiri uliloweka havilingani</translation> +<translation id="4374805630006466253">Tumia simu au kompyuta kibao nyingine</translation> <translation id="4374831787438678295">Kisakinishaji cha Linux</translation> <translation id="4375035964737468845">Fungua faili zilizopakuliwa</translation> <translation id="4376226992615520204">Kipengele cha maelezo ya mahali kimezimwa</translation> @@ -3923,6 +3928,7 @@ <translation id="4497145443434063861">Kompyuta na Chromecast ziko kwenye mitandao tofauti ya Wi-Fi (k.m. GHZ 2.4 dhidi ya GHz 5)</translation> <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> imeacha kufanya kazi</translation> +<translation id="4500647907053779331">Tafsiri chaguo kwenda <ph name="LANGUAGE" /></translation> <translation id="450099669180426158">Aikoni ya alama hisi</translation> <translation id="4501530680793980440">Thibitisha Uondoaji</translation> <translation id="4502423230170890588">Ondoa kwenye kifaa hiki</translation> @@ -3953,6 +3959,7 @@ <translation id="4522890784888918985">Akaunti za watoto haziwezi kutumika</translation> <translation id="4523876148417776526">Faili za XML zenye orodha za tovuti bado hazijapatikana.</translation> <translation id="4524832533047962394">Toleo hili la mfumo wa uendeshaji halitumii hali ya usajili iliyotolewa. Tafadhali hakikisha unatumia toleo jipya.</translation> +<translation id="4526051299161934899">Vikundi vya vichupo vilivyofichwa ambavyo vimehifadhiwa</translation> <translation id="4526853756266614740">Chagua picha ya kuweka katika mandhari papo hapo</translation> <translation id="452750746583162491">Kagua data yako iliyosawazishwa</translation> <translation id="4527929807707405172">Washa kipengele cha kusogeza kinyume. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> @@ -4277,6 +4284,7 @@ <translation id="4824037980212326045">Kuhifadhi na kurejesha nakala kwenye Linux</translation> <translation id="4824958205181053313">Ungependa kughairi usawazishaji?</translation> <translation id="4825532258163983651">Imeshindwa kufuta nenosiri</translation> +<translation id="4827283332383516812">Futa kadi</translation> <translation id="4827675678516992122">Imeshindwa kuunganisha</translation> <translation id="4827784381479890589">Kikagua maendelezo kilichoboreshwa katika kivinjari cha Chrome (maandishi hutumwa kwa Google ili ikupe mapendekezo ya maendelezo)</translation> <translation id="4827904420700932487">Tunga Msimbo wa QR wa picha hii</translation> @@ -5300,6 +5308,7 @@ <translation id="5792295754950501287">Vitendo zaidi vya <ph name="CARD_DESCRIPTION" /></translation> <translation id="5792728279623964091">Tafadhali gusa kitufe chako cha kuwasha/kuzima</translation> <translation id="5792874008054171483">Vitendo zaidi vya <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Njia hii ya kulipa itafutwa kwenye kifaa hiki</translation> <translation id="5793339252089865437">Iwapo unapakua sasisho kupitia mtandao wa simu, huenda utatozwa zaidi.</translation> <translation id="5793420564274426163">Uthibitisho wa Kuoanisha</translation> <translation id="5793430094159150686">Nenosiri lako limebadilishwa. Ili urejeshe data yako iliyo kwenye kifaa, utahitaji kuweka nenosiri lako la awali.</translation> @@ -5735,6 +5744,7 @@ <translation id="617213288191670920">Hujaweka lugha zozote</translation> <translation id="6173623053897475761">Weka PIN yako tena</translation> <translation id="6175314957787328458">GUID ya Vikoa kutoka Microsoft</translation> +<translation id="6177412385419165772">Inaondoa...</translation> <translation id="6178664161104547336">Chagua cheti</translation> <translation id="6178682841350631965">Data yako ya kuingia katika akaunti imesasishwa</translation> <translation id="6180510783007738939">Zana ya kuhariri Mstari</translation> @@ -6211,6 +6221,7 @@ <translation id="6619801788773578757">Ongeza programu ya skrini nzima</translation> <translation id="6619990499523117484">Thibitisha PIN yako</translation> <translation id="6620254580880484313">Jina la metadata</translation> +<translation id="6620927550847360014">Ungependa kuondoa Bruschetta kwenye <ph name="DEVICE_TYPE" /> yako?</translation> <translation id="6621391692573306628">Ili utume kichupo hiki kwenda kwenye kifaa kingine, ingia katika Chrome kwenye vifaa vyote</translation> <translation id="6622980291894852883">Endelea kuzuia picha</translation> <translation id="6624036901798307345">Katika hali ya kompyuta kibao, gusa kitufe cha upau wa vidhibiti wa sehemu ya kuhesabu vichupo ili ufungue ukanda mpya wa vichupo unaoonyesha vijipicha vya kila kichupo.</translation> @@ -6428,6 +6439,7 @@ <translation id="6818547713623251698">Angalia picha, maudhui, arifa na programu za simu yako</translation> <translation id="6818802132960437751">Ulinzi uliojumuishwa dhidi ya virusi</translation> <translation id="6818920801736417483">Ungependa kuhifadhi manenosiri?</translation> +<translation id="6820079682647046800">Uthibitishaji wa Kerberos haukufanikiwa</translation> <translation id="6823174134746916417">Kipengele cha 'gusa ili ubofye' kwenye padi ya kugusa</translation> <translation id="6824564591481349393">Nakili Anwani ya Barua P&epe</translation> <translation id="6824584962142919697">&Kagua vipengee</translation> @@ -6582,6 +6594,7 @@ <translation id="6955698182324067397">Unawasha vipengele vya utatuzi vya Chrome OS ambavyo vitaweka mipangilio ya sshd daemon na kuruhusu uwashe kutoka kwenye hifadhi za USB.</translation> <translation id="6955893174999506273">Kabidhi swichi nyingine moja</translation> <translation id="6957044667612803194">Ufunguo huu wa usalama hautumii PIN</translation> +<translation id="6960133692707095572">Tembelea bila kuwa na tiketi</translation> <translation id="6960507406838246615">Linux inahitaji kusasishwa</translation> <translation id="6960648667961844909">Imeshindwa kupakua faili za matamshi za <ph name="LANGUAGE" />. Itajaribu kupakua baadaye. Matamshi yatatumwa kwa Google ili yachakatwe hadi upakuaji utakapokamilika.</translation> <translation id="696103774840402661">Faili na data yote ya watumiaji wote iliyo kwenye <ph name="DEVICE_TYPE" /> imefutwa kabisa.</translation> @@ -7212,7 +7225,6 @@ <translation id="7550830279652415241">vialamisho_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Upakuaji wa <ph name="FILE_NAME" /> haujafaulu</translation> <translation id="7551643184018910560">Bandika kwenye rafu</translation> -<translation id="7552658769580484674">Weka Maoni kuhusu Kipengele cha Kujaza Kiotomatiki</translation> <translation id="7552846755917812628">Jaribu vidokezo vinavyofuata:</translation> <translation id="7553012839257224005">Inakagua metadata ya Linux</translation> <translation id="7553242001898162573">Weka nenosiri lako</translation> @@ -7274,6 +7286,7 @@ <translation id="7609148976235050828">Tafadhali unganisha kwenye intaneti na ujaribu tena.</translation> <translation id="7612401678989660900">Ruhusu ufikiaji wa programu na tovuti zenye ruhusa ya maikrofoni</translation> <translation id="7612655942094160088">Washa vipengele vya simu iliyounganishwa.</translation> +<translation id="7612989789287281429">Unaingia katika akaunti…</translation> <translation id="7614260613810441905">Uulizwe wakati tovuti inataka kubadilisha faili au folda kwenye kifaa chako (inapendekezwa)</translation> <translation id="761530003705945209">Hifadhi nakala kwenye Hifadhi ya Google. Rejesha data au ubadilishe kifaa unachotumia kwa urahisi wakati wowote. Nakala unayohifadhi huwa na data ya programu. Nakala unazohifadhi hupakiwa kwenye Google na kusimbwa kwa njia fiche kwa kutumia nenosiri la Akaunti yako ya Google.</translation> <translation id="7615365294369022248">Hitilafu fulani imetokea wakati wa kuweka akaunti</translation> @@ -8044,6 +8057,7 @@ <translation id="8272443605911821513">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya "Zana zaidi".</translation> <translation id="8272786333453048167">Ipatie tena ruhusa</translation> <translation id="8273905181216423293">Pakua sasa</translation> +<translation id="827488840488530039">Ukurasa unaojaribu kutembelea umeshindwa kuthibitisha tiketi zako za Kerberos</translation> <translation id="8274921654076766238">Kikuzaji cha skrini huendana na kinacholengwa na kibodi</translation> <translation id="8274924778568117936">Usizime wala kufunga kifaa chako cha <ph name="DEVICE_TYPE" /> hadi sasisho likamilike. Kifaa chako cha <ph name="DEVICE_TYPE" /> kitazimika na kuwaka baada ya sasisho kukamilika.</translation> <translation id="8275038454117074363">Leta</translation> @@ -8490,6 +8504,7 @@ <translation id="869884720829132584">Menyu ya programu</translation> <translation id="869891660844655955">Muda wake unakwisha tarehe</translation> <translation id="8699188901396699995">PPD ya <ph name="PRINTER_NAME" /></translation> +<translation id="8702278591052316269">Menyu iliyo na vikundi vya vichupo vilivyofichwa ambavyo vimehifadhiwa</translation> <translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> yako imefungwa.</translation> <translation id="8703346390800944767">Ruka Tangazo</translation> <translation id="8705331520020532516">Nambari ya Ufuatiliaji</translation> @@ -8770,7 +8785,6 @@ <translation id="8952831374766033534">Chaguo la kuweka mipangilio halitumiki: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Inapochaji</translation> <translation id="895347679606913382">Inaanza...</translation> -<translation id="8956230710625245889">Fungua ukurasa kwenye Reader</translation> <translation id="8957757410289731985">Weka wasifu wako uwe unavyotaka</translation> <translation id="895944840846194039">Kumbukumbu ya JavaScipt</translation> <translation id="8960208913905765425">Kipengele cha ubadilishaji wa vipimo cha Majibu ya Haraka</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 86016e3..02578c98 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linuxஸை மீண்டும் தொடங்கவா?</translation> <translation id="1047431265488717055">இணைப்பு &உரையை நகலெடு</translation> <translation id="1048286738600630630">திரை அமைப்புகள்</translation> -<translation id="1048770690598418849">தற்போது நீங்கள் இந்தப் படியைத் தவிர்க்கலாம். அமைவை முடித்த பிறகு மீண்டும் தானாகவே முயல்வோம்.</translation> <translation id="1048986595386481879">மாறிக்கொண்டே இருக்கும்படி ஒதுக்கியது</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> சாதனத்திலிருந்து <ph name="ATTACHMENTS" /> ஐப் பெறுகிறது}other{<ph name="DEVICE_NAME" /> சாதனத்திலிருந்து <ph name="ATTACHMENTS" /> ஐப் பெறுகிறது}}</translation> <translation id="1049743911850919806">மறைநிலை</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">உங்கள் கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது</translation> <translation id="2183570493397356669">தொடர்க பட்டன் முடக்கப்பட்டுள்ளது</translation> <translation id="2184515124301515068">தளங்கள் எப்போது ஒலியை இயக்கலாம் என்பதை Chrome தேர்வு செய்ய அனுமதிக்கவும் (பரிந்துரைக்கப்படுவது)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">மற்றொரு சாதனத்தில் இருந்து பகிரப்பட்ட பக்கம்</translation> <translation id="2187675480456493911">உங்கள் கணக்கில் உள்ள பிற சாதனங்களுடன் ஒத்திசைக்கப்பட்டது. பிற பயனர்கள் மாற்றியமைக்கும் அமைப்புகள் ஒத்திசைக்கப்படாது. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="2187895286714876935">சேவையக சான்றிதழ் இறக்குமதி பிழை</translation> @@ -1639,6 +1639,7 @@ <translation id="2408018932941436077">கார்டு விவரங்களைச் சேமிக்கிறது</translation> <translation id="2408955596600435184">பின்னை உள்ளிடவும்</translation> <translation id="2409268599591722235">பயன்படுத்துங்கள்</translation> +<translation id="2409709393952490731">மொபைல் அல்லது டேப்லெட்டைப் பயன்படுத்து</translation> <translation id="2410079346590497630">பதிப்பு விவரங்கள்</translation> <translation id="2410298923485357543">சாதனம் ஆன்லைனில் இருக்கும்போது இயல்பான குரலைப் பயன்படுத்து</translation> <translation id="2410754283952462441">கணக்கைத் தேர்வு செய்யவும்</translation> @@ -1935,7 +1936,6 @@ <translation id="2673135533890720193">உங்கள் உலாவல் வரலாற்றைப் படித்தல்</translation> <translation id="2674764818721168631">ஆஃப்</translation> <translation id="2675570801872027281">Bruschettaவை அகற்றுவதில் பிழை. மீண்டும் முயலவும்.</translation> -<translation id="2676492189600898281">தன்னிரப்பி அம்சம் குறித்த கருத்தை வழங்குக</translation> <translation id="2678063897982469759">மீண்டும் இயக்கு</translation> <translation id="2678100101831051676">அலைபரப்ப முடியவில்லை.</translation> <translation id="268053382412112343">Hi&story</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">இணையதளக் கோரிக்கை அனுமதிக்கப்பட்டது</translation> <translation id="4369735607080757018">தங்களின் விளம்பரச் செயல்திறனை அளவிடுவதற்காகத் தளங்களுக்கிடையே குறைந்த அளவிலான தரவு வகைகள் பகிரப்படும் (எ.கா. விளம்பரத்தை நீங்கள் பார்வையிட்ட நாள், நேரம் போன்றவை)</translation> <translation id="4370975561335139969">உள்ளிட்ட மின்னஞ்சலும், கடவுச்சொல்லும் பொருந்தவில்லை.</translation> +<translation id="4374805630006466253">வேறொரு மொபைல் அல்லது டேப்லெட்டைப் பயன்படுத்து</translation> <translation id="4374831787438678295">Linux நிறுவி</translation> <translation id="4375035964737468845">பதிவிறக்கப்பட்ட ஃபைல்களைத் திறக்கவும்</translation> <translation id="4376226992615520204">இருப்பிடம் முடக்கப்பட்டுள்ளது</translation> @@ -3963,6 +3964,7 @@ <translation id="4522890784888918985">உப கணக்குகளில் பயன்படுத்த முடியாது</translation> <translation id="4523876148417776526">இதுவரை XML தளப்பட்டியல்களைப் பெற முடியவில்லை.</translation> <translation id="4524832533047962394">வழங்கப்பட்ட பதிவுப் பயன்முறையை இந்த ஆப்ரேட்டிங் சிஸ்டத்தின் பதிப்பு ஆதரிக்கவில்லை. புதிய பதிப்பில் இயக்குவதை உறுதிசெய்யவும்.</translation> +<translation id="4526051299161934899">மறைத்து வைக்கப்பட்டிருக்கும் சேமிக்கப்பட்ட பக்கக் குழுக்கள்</translation> <translation id="4526853756266614740">தீமினை உடனடியாகப் பயன்படுத்த படத்தைத் தேர்வுசெய்யுங்கள்</translation> <translation id="452750746583162491">ஒத்திசைத்த தரவை மதிப்பாய்வு செய்க</translation> <translation id="4527929807707405172">பின்னோக்கிய ஸ்க்ரோலிங்கை இயக்கு. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> @@ -4287,6 +4289,7 @@ <translation id="4824037980212326045">Linux காப்புப் பிரதி மற்றும் மீட்டெடுப்பு</translation> <translation id="4824958205181053313">ஒத்திசைவை ரத்துசெய்யவா?</translation> <translation id="4825532258163983651">கடவுக்குறியீடுகளை நீக்க முடியவில்லை</translation> +<translation id="4827283332383516812">கார்டை நீக்குதல்</translation> <translation id="4827675678516992122">இணைக்க முடியவில்லை</translation> <translation id="4827784381479890589">Chrome உலாவியில் உள்ள மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பான் (எழுத்துச் சரிபார்ப்புப் பரிந்துரைகளுக்காக உரை Googleளுக்கு அனுப்பப்படும்)</translation> <translation id="4827904420700932487">இந்தப் படத்திற்கு QR குறியீட்டை உருவாக்கு</translation> @@ -5311,6 +5314,7 @@ <translation id="5792295754950501287"><ph name="CARD_DESCRIPTION" />க்கான கூடுதல் செயல்கள்</translation> <translation id="5792728279623964091">பவர் பட்டனைத் தட்டவும்</translation> <translation id="5792874008054171483"><ph name="SITE_NAME" /> தளத்திற்கான கூடுதல் செயல்கள்</translation> +<translation id="5793317771769868848">இந்தச் சாதனத்திலிருந்து இந்தப் பேமெண்ட் முறை நீக்கப்படும்</translation> <translation id="5793339252089865437">புதுப்பிப்பை மொபைல் நெர்ட்வொர்க் மூலம் பதிவிறக்கினால் கூடுதல் கட்டணங்கள் வசூலிக்கப்படலாம்.</translation> <translation id="5793420564274426163">இணைத்தலை உறுதிப்படுத்தல்</translation> <translation id="5793430094159150686">உங்கள் கடவுச்சொல் மாற்றப்பட்டது. அகத் தரவை மீட்டெடுக்க பழைய கடவுச்சொல்லை வழங்க வேண்டும்.</translation> @@ -7227,7 +7231,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை</translation> <translation id="7551643184018910560">அடுக்கில் பொருத்து</translation> -<translation id="7552658769580484674">தன்னிரப்பி அம்சம் குறித்த கருத்தை வழங்குக</translation> <translation id="7552846755917812628">பின்வரும் உதவிக் குறிப்புகளைச் செய்து பார்க்கவும்:</translation> <translation id="7553012839257224005">Linux கண்டெய்னரைச் சரிபார்க்கிறது</translation> <translation id="7553242001898162573">கடவுச்சொல்லை உள்ளிடவும்</translation> @@ -7289,6 +7292,7 @@ <translation id="7609148976235050828">இணையத்துடன் இணைத்து, மீண்டும் முயலவும்.</translation> <translation id="7612401678989660900">மைக்ரோஃபோனைப் பயன்படுத்த அனுமதி கேட்கும் ஆப்ஸுக்கும் இணையதளங்களுக்கும் அணுகலை வழங்கும்</translation> <translation id="7612655942094160088">இணைக்கப்பட்ட மொபைல் அம்சங்களை இயக்கும்.</translation> +<translation id="7612989789287281429">உள்நுழைகிறீர்கள்…</translation> <translation id="7614260613810441905">எனது சாதனத்திலுள்ள ஃபைல்களையோ ஃபோல்டர்களையோ ஒரு தளம் மாற்ற விரும்பும்போது அனுமதி கேள் (பரிந்துரைக்கப்படுகிறது)</translation> <translation id="761530003705945209">Google Driveவிற்குக் காப்புப் பிரதி எடுக்கவும். எப்போது வேண்டுமானாலும் உங்கள் தரவை எளிதாக மீட்டெடுக்கலாம் அல்லது சாதனத்தை மாற்றலாம். ஆப்ஸ் தரவும் உங்கள் காப்புப் பிரதியில் அடங்கும். உங்களின் காப்புப்பிரதிகள் Googleளுக்குப் பதிவேற்றப்பட்டு Google கணக்கின் கடவுச்சொல்லைப் பயன்படுத்தி என்க்ரிப்ஷன் செய்யப்படுகின்றன.</translation> <translation id="7615365294369022248">கணக்கைச் சேர்க்கும்போது பிழை ஏற்பட்டது</translation> @@ -8505,6 +8509,7 @@ <translation id="869884720829132584">ஆப்ஸ் மெனு</translation> <translation id="869891660844655955">காலாவதியாகும் தேதி</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" />க்கான PPD</translation> +<translation id="8702278591052316269">மறைத்து வைக்கப்பட்டிருக்கும் சேமிக்கப்பட்ட பக்கக் குழுக்கள் உள்ள மெனு</translation> <translation id="8702825062053163569">உங்கள் <ph name="DEVICE_TYPE" /> பூட்டப்பட்டது.</translation> <translation id="8703346390800944767">விளம்பரத்தைத் தவிர்</translation> <translation id="8705331520020532516">வரிசை எண்</translation> @@ -8785,7 +8790,6 @@ <translation id="8952831374766033534">உள்ளமைவு விருப்பம் ஆதரிக்கப்படவில்லை: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">சார்ஜ் செய்யும்போது</translation> <translation id="895347679606913382">தொடங்குகிறது...</translation> -<translation id="8956230710625245889">Readerரில் திற</translation> <translation id="8957757410289731985">சுயவிவரத்தைப் பிரத்தியேகமாக்கலாம்</translation> <translation id="895944840846194039">JavaScript நினைவகம்</translation> <translation id="8960208913905765425">‘விரைவான பதில்கள்’ அம்சம் வழங்கும் அலகு மாற்றம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 2247991c..961efe5 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linuxను రీస్టార్ట్ చేయాలా?</translation> <translation id="1047431265488717055">లింక్ వచ&నం కాపీ చేయి</translation> <translation id="1048286738600630630">ప్రదర్శనలు</translation> -<translation id="1048770690598418849">మీరు ప్రస్తుతానికి స్కిప్ చేయవచ్చు, మీరు సెటప్ చేయడం పూర్తి చేసిన తర్వాత మేము ఆటోమేటిక్గా మళ్లీ ట్రై చేస్తాము</translation> <translation id="1048986595386481879">డైనమిక్గా కేటాయించబడింది</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> నుండి <ph name="ATTACHMENTS" />ని స్వీకరిస్తోంది}other{<ph name="DEVICE_NAME" /> నుండి <ph name="ATTACHMENTS" />ని స్వీకరిస్తోంది}}</translation> <translation id="1049743911850919806">అజ్ఞాత మోడ్</translation> @@ -1367,6 +1366,7 @@ <translation id="2182058453334755893">మీ క్లిప్బోర్డ్కు కాపీ చేయబడింది</translation> <translation id="2183570493397356669">కొనసాగించండి బటన్ డిజేబుల్ చేయబడింది</translation> <translation id="2184515124301515068">సైట్లు ధ్వనిని ఎప్పుడు ప్లే చేయాలనేది Chrome ఎంచుకునేలా సెట్ చేయండి (సిఫార్సు చేయబడింది)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">మరో పరికరం నుండి పేజీ షేర్ చేయబడింది</translation> <translation id="2187675480456493911">మీ ఖాతాలోని ఇతర పరికరాలతో సింక్ చేయబడింది. ఇతర యూజర్ల చేత మార్చబడిన సెట్టింగ్లు సింక్ చేయబడవు. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="2187895286714876935">సర్వర్ ప్రమాణపత్రం దిగుమతి ఎర్రర్</translation> @@ -1637,6 +1637,7 @@ <translation id="2408018932941436077">కార్డ్ సేవ్ అవుతోంది</translation> <translation id="2408955596600435184">మీ PINని నమోదు చేయండి</translation> <translation id="2409268599591722235">ప్రారంభించండి</translation> +<translation id="2409709393952490731">ఫోన్ లేదా టాబ్లెట్ను ఉపయోగించండి</translation> <translation id="2410079346590497630">బిల్డ్ వివరాలు</translation> <translation id="2410298923485357543">పరికరం ఆన్లైన్లో ఉన్నప్పుడు సహజ వాయిస్ను ఉపయోగించండి</translation> <translation id="2410754283952462441">ఖాతాను ఎంచుకోండి</translation> @@ -1933,7 +1934,6 @@ <translation id="2673135533890720193">మీ బ్రౌజింగ్ హిస్టరీని చదవడానికి అనుమతి</translation> <translation id="2674764818721168631">ఆఫ్ చేయబడి ఉంది</translation> <translation id="2675570801872027281">Bruschettaను తీసివేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation> -<translation id="2676492189600898281">ఆటోఫిల్ ఫీడ్బ్యాక్ను అందించండి</translation> <translation id="2678063897982469759">మళ్లీ-ప్రారంభించండి</translation> <translation id="2678100101831051676">ప్రసారం చేయడం సాధ్యపడలేదు.</translation> <translation id="268053382412112343">&చరిత్ర</translation> @@ -3785,6 +3785,7 @@ <translation id="4369215744064167350">వెబ్సైట్ రిక్వెస్ట్ ఆమోదించబడింది</translation> <translation id="4369735607080757018">రోజులో యాడ్ మీకు కనిపించిన సమయం వంటి పరిమిత రకాల డేటాను సైట్ల మధ్య షేర్ చేయడం ద్వారా, వాటిలో యాడ్ల పనితీరును అంచనా వేయవచ్చు</translation> <translation id="4370975561335139969">మీరు నమోదు చేసిన ఈమెయిల్, పాస్వర్డ్ సరిపోలలేదు</translation> +<translation id="4374805630006466253">వేరే ఫోన్ లేదా టాబ్లెట్ను ఉపయోగించండి</translation> <translation id="4374831787438678295">Linux ఇన్స్టాలర్</translation> <translation id="4375035964737468845">డౌన్లోడ్ చేసిన పైల్లను తెరవండి</translation> <translation id="4376226992615520204">లొకేషన్ ఆఫ్ చేయబడింది</translation> @@ -7227,7 +7228,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> డౌన్లోడ్ విఫలమైంది</translation> <translation id="7551643184018910560">అరకు పిన్ చేయండి</translation> -<translation id="7552658769580484674">ఆటోఫిల్ ఫీడ్బ్యాక్ను అందించండి</translation> <translation id="7552846755917812628">కింది చిట్కాలను ప్రయత్నించండి:</translation> <translation id="7553012839257224005">Linux కంటెయినర్ను చెక్ చేస్తోంది</translation> <translation id="7553242001898162573">మీ పాస్వర్డ్ను నమోదు చేయండి</translation> @@ -8783,7 +8783,6 @@ <translation id="8952831374766033534">కాన్ఫిగరేషన్ ఎంపికకు మద్దతు లేదు: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ఛార్జింగ్లో ఉన్నప్పుడు</translation> <translation id="895347679606913382">ప్రారంభిస్తోంది...</translation> -<translation id="8956230710625245889">రీడర్లో తెరవండి</translation> <translation id="8957757410289731985">ప్రొఫైల్ను అనుకూలంగా మార్చండి</translation> <translation id="895944840846194039">JavaScript మెమరీ</translation> <translation id="8960208913905765425">త్వరిత సమాధానాల యూనిట్ మార్పిడి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 0617c07..200613a5 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">รีสตาร์ท Linux ไหม</translation> <translation id="1047431265488717055">คัดลอก&ข้อความของลิงก์</translation> <translation id="1048286738600630630">การแสดงผล</translation> -<translation id="1048770690598418849">คุณข้ามไปก่อนได้ และเราจะลองอีกครั้งโดยอัตโนมัติหลังจากที่คุณตั้งค่าเสร็จแล้ว</translation> <translation id="1048986595386481879">จัดสรรแบบไดนามิก</translation> <translation id="1049324577536766607">{COUNT,plural, =1{กำลังรับ <ph name="ATTACHMENTS" />จาก <ph name="DEVICE_NAME" />}other{กำลังรับ <ph name="ATTACHMENTS" />จาก <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">โหมดไม่ระบุตัวตน</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">คัดลอกไปยังคลิปบอร์ดแล้ว</translation> <translation id="2183570493397356669">ปุ่มดําเนินการต่อปิดอยู่</translation> <translation id="2184515124301515068">ให้ Chrome เลือกว่าเว็บไซต์จะเล่นเสียงได้เมื่อใด (แนะนำ)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">หน้าเว็บที่แชร์จากอุปกรณ์อื่น</translation> <translation id="2187675480456493911">ซิงค์กับอุปกรณ์อื่นในบัญชีของคุณแล้ว ระบบจะไม่ซิงค์การตั้งค่าที่ผู้ใช้คนอื่นๆ แก้ไข <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="2187895286714876935">ข้อผิดพลาดในการนำเข้าใบรับรองเซิร์ฟเวอร์</translation> @@ -1624,6 +1624,7 @@ <translation id="2408018932941436077">กำลังบันทึกบัตร</translation> <translation id="2408955596600435184">ป้อน PIN ของคุณ</translation> <translation id="2409268599591722235">เริ่มเลย</translation> +<translation id="2409709393952490731">ใช้โทรศัพท์หรือแท็บเล็ต</translation> <translation id="2410079346590497630">รายละเอียดบิลด์</translation> <translation id="2410298923485357543">ใช้เสียงที่เป็นธรรมชาติเมื่ออุปกรณ์ออนไลน์</translation> <translation id="2410754283952462441">เลือกบัญชี</translation> @@ -1921,7 +1922,6 @@ <translation id="2673135533890720193">อ่านประวัติการเข้าชม</translation> <translation id="2674764818721168631">ปิด</translation> <translation id="2675570801872027281">เกิดข้อผิดพลาดในการนำ Bruschetta ออก โปรดลองอีกครั้ง</translation> -<translation id="2676492189600898281">แสดงความคิดเห็นเกี่ยวกับการป้อนข้อความอัตโนมัติ</translation> <translation id="2678063897982469759">เปิดการใช้งานอีกครั้ง</translation> <translation id="2678100101831051676">แคสต์ไม่ได้</translation> <translation id="268053382412112343">ประวั&ติ</translation> @@ -3776,6 +3776,7 @@ <translation id="4369215744064167350">คำขอเว็บไซต์ได้รับการอนุมัติแล้ว</translation> <translation id="4369735607080757018">ระบบจะแชร์ข้อมูลแบบจำกัดระหว่างเว็บไซต์เพื่อวัดประสิทธิภาพของโฆษณา เช่น ช่วงเวลาของวันที่มีการแสดงโฆษณาแก่คุณ</translation> <translation id="4370975561335139969">อีเมลและรหัสผ่านที่คุณป้อนไม่ตรงกัน</translation> +<translation id="4374805630006466253">ใช้โทรศัพท์หรือแท็บเล็ตเครื่องอื่น</translation> <translation id="4374831787438678295">โปรแกรมติดตั้ง Linux</translation> <translation id="4375035964737468845">เปิดไฟล์ที่ดาวน์โหลดมา</translation> <translation id="4376226992615520204">ตำแหน่งปิดอยู่</translation> @@ -7216,7 +7217,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">ดาวน์โหลด <ph name="FILE_NAME" /> สำเร็จแล้ว</translation> <translation id="7551643184018910560">ปักหมุดที่ชั้นวาง</translation> -<translation id="7552658769580484674">แสดงความคิดเห็นเกี่ยวกับการป้อนข้อความอัตโนมัติ</translation> <translation id="7552846755917812628">ลองทำตามเคล็ดลับต่อไปนี้:</translation> <translation id="7553012839257224005">กำลังตรวจสอบคอนเทนเนอร์ Linux</translation> <translation id="7553242001898162573">ป้อนรหัสผ่าน</translation> @@ -8777,7 +8777,6 @@ <translation id="8952831374766033534">ตัวเลือกการกำหนดค่าที่ไม่รองรับ: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">ขณะที่ชาร์จ</translation> <translation id="895347679606913382">กำลังเริ่มต้น...</translation> -<translation id="8956230710625245889">เปิดในโปรแกรมอ่าน</translation> <translation id="8957757410289731985">ปรับแต่งโปรไฟล์</translation> <translation id="895944840846194039">หน่วยความจำ JavaScript</translation> <translation id="8960208913905765425">การแปลงหน่วยของคำตอบด่วน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 8dbac46..19bda78 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux yeniden başlatılsın mı?</translation> <translation id="1047431265488717055">&Bağlantı Metnini Kopyala</translation> <translation id="1048286738600630630">Ekranlar</translation> -<translation id="1048770690598418849">Bu adımı atlayabilirsiniz. Kurulumu tamamlamanızın ardından otomatik olarak yeniden deneyeceğiz</translation> <translation id="1048986595386481879">Dinamik olarak ayrıldı</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> adlı cihazdan <ph name="ATTACHMENTS" /> alınıyor}other{<ph name="DEVICE_NAME" /> adlı cihazdan <ph name="ATTACHMENTS" /> alınıyor}}</translation> <translation id="1049743911850919806">Gizli mod</translation> @@ -1356,6 +1355,7 @@ <translation id="2182058453334755893">Panonuza Kopyalandı</translation> <translation id="2183570493397356669">Devam düğmesi devre dışı bırakıldı</translation> <translation id="2184515124301515068">Sitelerin ne zaman ses çalacağını Chrome'un seçmesine izin verin (önerilir)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Başka bir cihazdan paylaşılan sayfa</translation> <translation id="2187675480456493911">Hesabınızdaki diğer cihazlarla senkronize edildi. Diğer kullanıcılar tarafından değiştirilen ayarlar senkronize edilmez. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Sunucu Sertifikası İçe Aktarma Hatası</translation> @@ -1622,6 +1622,7 @@ <translation id="2408018932941436077">Kart kaydediliyor</translation> <translation id="2408955596600435184">PIN'inizi girin</translation> <translation id="2409268599591722235">Başlayalım</translation> +<translation id="2409709393952490731">Telefon veya tablet kullanın</translation> <translation id="2410079346590497630">Derleme ayrıntıları</translation> <translation id="2410298923485357543">Cihaz internete bağlıyken doğal ses kullan</translation> <translation id="2410754283952462441">Bir hesap seçin</translation> @@ -1918,7 +1919,6 @@ <translation id="2673135533890720193">Göz atma geçmişinizi okuma</translation> <translation id="2674764818721168631">Kapalı</translation> <translation id="2675570801872027281">Bruschetta kaldırılırken hata oluştu. Lütfen tekrar deneyin.</translation> -<translation id="2676492189600898281">Otomatik doldurmayla ilgili geri bildirim verin</translation> <translation id="2678063897982469759">Tekrar etkinleştir</translation> <translation id="2678100101831051676">Yayınlayamıyor.</translation> <translation id="268053382412112343">Geç&miş</translation> @@ -3770,6 +3770,7 @@ <translation id="4369215744064167350">Web sitesi isteği onaylandı</translation> <translation id="4369735607080757018">Reklamlarının performansını ölçmek isteyen siteler arasında, bir reklamın size gösterildiği saat gibi sınırlı veri türleri paylaşılır</translation> <translation id="4370975561335139969">Girdiğiniz e-posta ve şifre eşleşmiyor</translation> +<translation id="4374805630006466253">Farklı bir telefon veya tablet kullanın</translation> <translation id="4374831787438678295">Linux yükleyici</translation> <translation id="4375035964737468845">İndirilen dosyaları açma</translation> <translation id="4376226992615520204">Konum kapatıldı</translation> @@ -7212,7 +7213,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> indirmesi başarısız oldu</translation> <translation id="7551643184018910560">Rafa sabitle</translation> -<translation id="7552658769580484674">Otomatik Doldurmayla İlgili Geri Bildirim Verin</translation> <translation id="7552846755917812628">Aşağıdaki ipuçlarını deneyin:</translation> <translation id="7553012839257224005">Linux kapsayıcı kontrol ediliyor</translation> <translation id="7553242001898162573">Şifrenizi girin</translation> @@ -8772,7 +8772,6 @@ <translation id="8952831374766033534">Yapılandırma seçeneği desteklenmiyor: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Şarj olurken</translation> <translation id="895347679606913382">Başlatılıyor...</translation> -<translation id="8956230710625245889">Okuyucuda aç</translation> <translation id="8957757410289731985">Profili özelleştir</translation> <translation id="895944840846194039">JavaScript Belleği</translation> <translation id="8960208913905765425">Bil bakalım birim dönüştürmesi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 4b528163..74a4e738 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Перезапустити Linux?</translation> <translation id="1047431265488717055">Копіювати те&кст посилання</translation> <translation id="1048286738600630630">Дисплеї</translation> -<translation id="1048770690598418849">Ви можете пропустити цей крок зараз, і ми автоматично повторимо спробу, коли ви завершите налаштування</translation> <translation id="1048986595386481879">Розміщено динамічно</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Вхідні дані: <ph name="ATTACHMENTS" /> з пристрою "<ph name="DEVICE_NAME" />"}one{Вхідні дані: <ph name="ATTACHMENTS" /> з пристрою "<ph name="DEVICE_NAME" />"}few{Вхідні дані: <ph name="ATTACHMENTS" /> з пристрою "<ph name="DEVICE_NAME" />"}many{Вхідні дані: <ph name="ATTACHMENTS" /> з пристрою "<ph name="DEVICE_NAME" />"}other{Вхідні дані: <ph name="ATTACHMENTS" /> з пристрою "<ph name="DEVICE_NAME" />"}}</translation> <translation id="1049743911850919806">Анонімний перегляд</translation> @@ -1372,6 +1371,7 @@ <translation id="2182058453334755893">Скопійовано в буфер обміну</translation> <translation id="2183570493397356669">Кнопку "Продовжити" вимкнено</translation> <translation id="2184515124301515068">Дозволити Chrome вибирати, коли відтворювати звук на сайтах (рекомендується)</translation> +<translation id="2186206192313702726">Google Об’єктив</translation> <translation id="2186711480981247270">Сторінка, надіслана з іншого пристрою</translation> <translation id="2187675480456493911">Мережу синхронізовано з іншими пристроями у вашому обліковому записі. Налаштування, які змінюють інші користувачі, не синхронізуватимуться. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Помилка імпортування сертифіката сервера</translation> @@ -1642,6 +1642,7 @@ <translation id="2408018932941436077">Зберігання картки</translation> <translation id="2408955596600435184">Введіть PIN-код</translation> <translation id="2409268599591722235">Почати</translation> +<translation id="2409709393952490731">Використовувати телефон або планшет</translation> <translation id="2410079346590497630">Дані складання</translation> <translation id="2410298923485357543">Використовувати природний голос, коли пристрій у мережі</translation> <translation id="2410754283952462441">Виберіть обліковий запис</translation> @@ -1938,7 +1939,6 @@ <translation id="2673135533890720193">Переглядати історію веб-перегляду</translation> <translation id="2674764818721168631">Вимкнено</translation> <translation id="2675570801872027281">Не вдалося вилучити Bruschetta. Повторіть спробу.</translation> -<translation id="2676492189600898281">Надіслати відгук про автозаповнення</translation> <translation id="2678063897982469759">Знову ввімкнути</translation> <translation id="2678100101831051676">Не вдалося транслювати.</translation> <translation id="268053382412112343">Іс&торія</translation> @@ -3790,6 +3790,7 @@ <translation id="4369215744064167350">Запит на доступ до веб-сайту схвалено</translation> <translation id="4369735607080757018">Сайти отримують доступ лише до певних типів даних, на основі яких можуть визначати ефективність своїх оголошень. Зокрема, ідеться про час доби, коли вам було показано рекламу.</translation> <translation id="4370975561335139969">Введені електронна адреса та пароль не збігаються</translation> +<translation id="4374805630006466253">Вибрати інший телефон або планшет</translation> <translation id="4374831787438678295">Файл встановлення Linux</translation> <translation id="4375035964737468845">Відкривати завантажені файли</translation> <translation id="4376226992615520204">Визначення місцезнаходження вимкнено</translation> @@ -4291,6 +4292,7 @@ <translation id="4824037980212326045">Резервне копіювання й відновлення Linux</translation> <translation id="4824958205181053313">Скасувати синхронізацію?</translation> <translation id="4825532258163983651">Не вдалося видалити ключ доступу</translation> +<translation id="4827283332383516812">Видалити картку</translation> <translation id="4827675678516992122">Не вдалося під’єднатись</translation> <translation id="4827784381479890589">Покращена перевірка орфографії у веб-переглядачі Chrome (текст надсилається в Google для пропозицій написання)</translation> <translation id="4827904420700932487">Створити QR-код для цього зображення</translation> @@ -5312,6 +5314,7 @@ <translation id="5792295754950501287">Інші дії з карткою "<ph name="CARD_DESCRIPTION" />"</translation> <translation id="5792728279623964091">Натисніть кнопку живлення</translation> <translation id="5792874008054171483">Інші дії для сайту <ph name="SITE_NAME" /></translation> +<translation id="5793317771769868848">Цей спосіб оплати буде видалено з поточного пристрою</translation> <translation id="5793339252089865437">Завантаження оновлень через мобільну мережу може призвести до стягнення значно вищої плати.</translation> <translation id="5793420564274426163">Підтвердження підключення</translation> <translation id="5793430094159150686">Ваш пароль змінено. Щоб відновити локальні дані, потрібно ввести старий пароль.</translation> @@ -7233,7 +7236,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Не вдалося завантажити файл "<ph name="FILE_NAME" />"</translation> <translation id="7551643184018910560">Закріпити на панелі запуску</translation> -<translation id="7552658769580484674">Надіслати відгук про автозаповнення</translation> <translation id="7552846755917812628">Виконайте вказівки нижче.</translation> <translation id="7553012839257224005">Перевірка контейнера Linux</translation> <translation id="7553242001898162573">Пароль</translation> @@ -7295,6 +7297,7 @@ <translation id="7609148976235050828">Підключіться до Інтернету та повторіть спробу.</translation> <translation id="7612401678989660900">Надайте доступ для всіх додатків і веб-сайтів, яким потрібен дозвіл на використання мікрофона</translation> <translation id="7612655942094160088">Увімкнути функції підключеного телефона.</translation> +<translation id="7612989789287281429">Виконується вхід…</translation> <translation id="7614260613810441905">Запитувати, коли сайт хоче змінювати файли або папки на пристрої (рекомендується)</translation> <translation id="761530003705945209">Створювати резервні копії на Google Диску. Легко відновлюйте дані чи переносьте їх на інші пристрої. Резервні копії містять дані додатків. Ваші резервні копії завантажуються в Google і шифруються за допомогою пароля облікового запису Google.</translation> <translation id="7615365294369022248">Не вдалося додати обліковий запис</translation> @@ -8795,7 +8798,6 @@ <translation id="8952831374766033534">Параметр конфігурації не підтримується: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Якщо пристрій заряджається</translation> <translation id="895347679606913382">Запуск...</translation> -<translation id="8956230710625245889">Відкрити в режимі перегляду</translation> <translation id="8957757410289731985">Налаштувати профіль</translation> <translation id="895944840846194039">Пам’ять JavaScript</translation> <translation id="8960208913905765425">Конвертування одиниць у швидких відповідях</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 9d6e45f..cc7db12 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux ری اسٹارٹ کریں؟</translation> <translation id="1047431265488717055">لنک کا مت&ن کاپی کریں</translation> <translation id="1048286738600630630">ڈسپلیز</translation> -<translation id="1048770690598418849">آپ ابھی کے لیے نظر انداز کر سکتے ہیں اور آپ کے سیٹ اپ مکمل کرنے کے بعد ہم خودکار طور پر دوبارہ کوشش کریں گے</translation> <translation id="1048986595386481879">ڈائنیمک طور پر مختص</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> سے <ph name="ATTACHMENTS" /> موصول ہو رہی ہیں}other{<ph name="DEVICE_NAME" /> سے <ph name="ATTACHMENTS" /> موصول ہو رہی ہیں}}</translation> <translation id="1049743911850919806">پوشیدگی</translation> @@ -204,6 +203,7 @@ <translation id="1174073918202301297">شارٹ کٹ شامل ہو گیا</translation> <translation id="1174366174291287894">جب تک کہ Chrome آپ کو بصورت دیگر کچھ نہیں بتاتا ہے تب تک آپ کا کنکشن ہمیشہ محفوظ رہتا ہے</translation> <translation id="117445914942805388">اپنے سبھی مطابقت پذیر آلات اور اپنے Google اکاؤنٹ سے براؤزنگ ڈیٹا صاف کرنے کیلئے، <ph name="BEGIN_LINK" />مطابقت پذیری کی ترتیبات ملاحظہ کریں<ph name="END_LINK" />۔</translation> +<translation id="1175131936083782305">آپ کے منتظم نے اس خصوصیت کو غیر فعال کر دیا ہے۔</translation> <translation id="1175364870820465910">&پرنٹ کریں…</translation> <translation id="1176471985365269981">آپ کے آلے پر موجود فائلز یا فولڈرز میں ترمیم کرنے کی اجازت نہیں ہے</translation> <translation id="1177863135347784049">حسب ضرورت</translation> @@ -1358,6 +1358,7 @@ <translation id="2182058453334755893">آپ کے کلپ بورڈ پر کاپی کر دیا گیا</translation> <translation id="2183570493397356669">جاری رکھیں بٹن کو غیر فعال کیا گیا</translation> <translation id="2184515124301515068">Chrome کو منتخب کرنے دیں کہ سائٹس کب آواز چلا سکتی ہیں (تجویز کردہ)</translation> +<translation id="2186206192313702726">Google لینز</translation> <translation id="2186711480981247270">صفحہ کا اشتراک دوسرے آلے سے کیا گیا</translation> <translation id="2187675480456493911">آپ کے اکاؤنٹ پر موجود دیگر آلات کے ساتھ مطابقت پذیر۔ دوسرے صارفین کے ذریعے ترمیم کی گئی ترتیبات کو مطابقت پذیر نہیں کیا جائے گا۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="2187895286714876935">سرور سرٹیفکیٹ کی درآمد میں خرابی</translation> @@ -1663,6 +1664,7 @@ <translation id="2442916515643169563">متنی سایہ</translation> <translation id="2443487764245141020">سائٹس کو شناخت کنندہ کا استعمال کرتے ہوئے آپ کے آلے کی شناخت کرنے کی بھی ضرورت پڑ سکتی ہے</translation> <translation id="244475495405467108">بائیں جانب والے ٹیبز بند کریں</translation> +<translation id="2444874983932528148">جہاں آپ نے چھوڑا تھا آسانی سے وہیں سے شروع کریں</translation> <translation id="2445081178310039857">ایکسٹینشن روٹ ڈائریکٹری درکار ہے۔</translation> <translation id="2445484935443597917">'نیا پروفائل' بنائیں</translation> <translation id="2445726032315793326">جزوی میگنیفائر</translation> @@ -1923,7 +1925,6 @@ <translation id="2673135533890720193">اپنی براؤزنگ سرگزشت پڑھیں</translation> <translation id="2674764818721168631">آف</translation> <translation id="2675570801872027281">Bruschetta کو ہٹانے میں خرابی۔ براہ کرم دوبارہ کوشش کریں۔</translation> -<translation id="2676492189600898281">آٹو فل تاثرات فراہم کریں</translation> <translation id="2678063897982469759">دوبارہ فعال کریں</translation> <translation id="2678100101831051676">کاسٹ کرنے سے قاصر۔</translation> <translation id="268053382412112343">سر&گزشت</translation> @@ -2441,6 +2442,7 @@ <translation id="3129215702932019810">ایپلیکشن شروع کرنے میں خرابی</translation> <translation id="3130528281680948470">آپ کا آلہ دوبارہ ترتیب دیا جائے گا اور سبھی صارف اکاؤنٹس اور مقامی ڈیٹا ہٹا دیے جائیں گے۔ اسے کالعدم نہیں کیا جا سکتا ہے۔</translation> <translation id="3130863904455712965">سرگزشت اور مزید</translation> +<translation id="3130966412954727147">آپ کی ملاحظہ کردہ سائٹس اس بات کی توثیق کر سکتی ہیں کہ آپ ایک بوٹ نہیں بلکہ ایک حقیقی صارف ہیں۔</translation> <translation id="313205617302240621">پاس ورڈ بھول گئے؟</translation> <translation id="3132277757485842847">ہم آپ کے فون کے ساتھ کنکشن برقرار رکھنے سے قاصر تھے۔ یقینی بنائیں کہ آپ کا فون قریب ہے، غیر مقفل ہے اور اس میں بلوٹوتھ اور Wi-Fi آن ہے۔</translation> <translation id="3132896062549112541">اصول</translation> @@ -2481,6 +2483,7 @@ <translation id="3177909033752230686">صفحہ کی زبان:</translation> <translation id="3177914167275935955">آپ کے آلے میں Chrome Education اپ گریڈ شامل ہے، لیکن آپ کا صارف نام Google for Education اکاؤنٹ سے وابستہ نہیں ہے۔ براہ کرم ثانوی آلہ پر g.co/workspace/edusignup پر جا کر Google for Education اکاؤنٹ تخلیق کریں۔</translation> <translation id="3179982752812949580">متن کا فونٹ</translation> +<translation id="3180284704187420717">مطابقت پذیری کے ساتھ اپنے بُک مارکس پاس ورڈز اور بہت کچھ کو محفوظ کریں</translation> <translation id="3181954750937456830">محفوظ براؤزنگ (آپ اور آپ کے آلہ کی خطرناک سائٹس سے حفاظت کرتی ہے)</translation> <translation id="3182749001423093222">املا کی جانچ</translation> <translation id="3183139917765991655">پروفائل درآمد کنندہ</translation> @@ -2972,6 +2975,7 @@ <translation id="3637203148990213388">اضافی اکاؤنٹس</translation> <translation id="3639220004740062347">ریڈر وضع سے باہر نکلیں</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> کیلئے "<ph name="EXTENSION_NAME" />" شامل کریں؟</translation> +<translation id="3640347231390550691">فریب دہی سے اپنے پاس ورڈز کی حفاظت کریں</translation> <translation id="3640613767643722554">اپنی اسسٹنٹ کو اپنی آواز کی شناخت کرنا سکھائیں</translation> <translation id="3641456520301071208">سائٹس آپ کے مقام کیلئے پوچھ سکتی ہیں</translation> <translation id="3642070413432681490">کرسر پر چکر لگائیں</translation> @@ -2982,6 +2986,7 @@ <translation id="3647654707956482440">اس لنک کا استعمال نہیں کر سکتے۔ ٹائپنگ کی غلطیاں چیک کریں یا دوبارہ کوشش کرنے کیلئے دوسرا لنک استعمال کریں۔</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> سے <ph name="ATTACHMENTS" /> موصول ہوئیں}other{<ph name="DEVICE_NAME" /> سے <ph name="ATTACHMENTS" /> موصول ہوئیں}}</translation> <translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> کا پتا چلا</translation> +<translation id="3649190289964910441">آپ کی ملاحظہ کردہ ایک ایسی سائٹ Chrome کے ساتھ معلومات کو محفوظ کر سکتی ہے جو یہ توثیق کرتی ہے کہ آپ ایک حقیقی صارف ہیں۔ چونکہ آپ براؤز کرتے رہتے ہیں، اس لیے سائٹس Chrome سے رابطہ کر کے پہلی سائٹ سے یہ توثیق کر سکتی ہیں کہ ہو سکتا ہے آپ ایک بھروسہ مند صارف ہوں۔</translation> <translation id="3650753875413052677">اندراج میں خرابی</translation> <translation id="3650845953328929506">لاگ اپ لوڈ زیر التواء ہے۔</translation> <translation id="3650952250015018111">"<ph name="APP_NAME" />" کو رسائی کی اجازت دیں:</translation> @@ -3396,6 +3401,7 @@ <translation id="3988996860813292272">ٹائم زون منتخب کریں</translation> <translation id="399179161741278232">درآمد کردہ</translation> <translation id="3992008114154328194">ڈاؤن لوڈ جاری ہے <ph name="FILE_NAME" />، <ph name="STATUS" /></translation> +<translation id="3993259701827857030">ڈیٹا کا بیک اپ لیں</translation> <translation id="3993887353483242788">اپنے <ph name="DEVICE_TYPE" /> کو مطابقت پذیر بنائیں تاکہ جب آپ اپنے Google اکاؤنٹ سے سائن ان کریں تو آپ کی ترجیحات کسی بھی آلہ پر تیار ہوں گی۔ ترجیحات میں ایپس، ترتیبات، Wi-Fi پاس ورڈز، زبانیں، وال پیپر، کی بورڈ شارٹ کٹس وغیرہ شامل ہیں۔</translation> <translation id="3994318741694670028">بدقسمتی سے، آپ کا کمپیوٹر خراب ہارڈ ویئر ID کے ساتھ کنفیگر کیا ہوا ہے۔ یہ ChromeOS Flex کو تازہ ترین سیکیورٹی اصلاحات کے ساتھ اپ ڈیٹ ہونے سے روکتا ہے اور آپ کے کمپیوٹر کو <ph name="BEGIN_BOLD" />نقصان دہ حملوں سے خطرہ ہو سکتا ہے<ph name="END_BOLD" />۔</translation> <translation id="3994374631886003300">اپنا فون غیر مقفل کریں اور اپنا <ph name="DEVICE_TYPE" /> غیر مقفل کرنے کیلئے اسے قریب کریں۔</translation> @@ -3951,10 +3957,12 @@ <translation id="4522890784888918985">بچوں کے اکاؤنٹس تعاون یافتہ نہیں ہیں</translation> <translation id="4523876148417776526">XML سائٹ لسٹس جو ابھی تک بازیاب نہیں کی گئی ہیں۔</translation> <translation id="4524832533047962394">فراہم کردہ اندراج کا موڈ آپریٹنگ سسٹم کے اس ورژن کے ساتھ تعاون یافتہ نہیں ہے۔ براہ کرم یہ یقینی بنائیں کہ آپ جدید ترین ورژن چلا رہے ہیں۔</translation> +<translation id="4526051299161934899">پوشیدہ محفوظ کردہ ٹیب گروپس</translation> <translation id="4526853756266614740">فوری طور پر تھیم کو لاگو کرنے کے لیے تصویر کو منتخب کریں</translation> <translation id="452750746583162491">اپنے مطابقت پذیر ڈیٹا کا جائزہ لیں</translation> <translation id="4527929807707405172">معکوس اسکرولنگ کو فعال کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="4528494169189661126">ترجمہ کی تجویز</translation> +<translation id="4528638190900283934">اضافی خصوصیات کے لیے سائن ان کریں</translation> <translation id="4529455689802245339">ہو سکتا ہے Chrome لائیو کیپشن کام نہ کرے</translation> <translation id="4530494379350999373">اصل</translation> <translation id="4531924570968473143">آپ اس <ph name="DEVICE_TYPE" /> میں کس کو شامل کرنا چاہیں گے؟</translation> @@ -4226,6 +4234,7 @@ <translation id="477647109558161443">ڈیسک ٹاپ شارٹ کٹ بنائیں</translation> <translation id="4776594120007763294">بعد میں پڑھنے کی خاطر صفحہ شامل کرنے کے لیے، بٹن پر کلک کریں</translation> <translation id="4777458362738635055">اس آلہ کے دیگر صارفین یہ نیٹ ورک استعمال کر سکتے ہيں</translation> +<translation id="477781522763920796">یہ ترتیب آپ کی شناخت کیے بغیر یا سائٹس کو آپ کی براؤزنگ کی سرگزشت دیکھنے کی اجازت دیے بغیر کام کرتی ہے۔</translation> <translation id="4777825441726637019">Play اسٹور</translation> <translation id="4777943778632837590">نیٹ ورک کے نام کے سرورز کو کنفیگر کریں</translation> <translation id="4779083564647765204">زوم</translation> @@ -6188,6 +6197,7 @@ <translation id="6597331566371766302">آپ کے منتظم نے درج ذیل ایکسٹینشنز کو مسدود کر دیا ہے:</translation> <translation id="6601262427770154296">صارف کی لغات کا نظم کریں</translation> <translation id="6601612474695404578">کچھ سائٹس اپنے صفحات لوڈ کرنے کے لیے فریق ثالث کوکیز استعمال کرتی ہیں۔ اگر کوئی سائٹ کام نہیں کر رہی ہے، تو آپ کوکیز کو اجازت دینے کی کوشش کر سکتے ہیں۔</translation> +<translation id="6602581642873576447">اسپام اور دھوکہ دہی میں تخفیف آف ہے</translation> <translation id="6602937173026466876">اپنے پرنٹرز تک رسائی حاصل کریں</translation> <translation id="6602956230557165253">نیویگیٹ کرنے کیلئے بائیں اور دائیں تیر کے نشانات کی کلیدیں استعمال کریں۔</translation> <translation id="6603185457265641428">منتخب کریں کہ آیا سرگزشت کو سِنک کیا جائے</translation> @@ -6363,6 +6373,7 @@ <translation id="6774710250118040929">نیا پاس ورڈ شامل کریں</translation> <translation id="6775163072363532304">دستیاب آلات یہاں دکھائی دیں گے۔</translation> <translation id="677646486571529447">ایک نوٹ شامل کریں</translation> +<translation id="6776589734354015877">اضافی خصوصیات حاصل کریں</translation> <translation id="6776729248872343918">فاسٹ پئیر کو فعال کریں</translation> <translation id="6777817260680419853">ری ڈائریکٹ مسدود ہے</translation> <translation id="6779092717724412415">اس طرح کی ہائی لائٹ تخلیق کرنے کے لیے، کوئی بھی ٹیکسٹ منتخب کریں اور دائیں طرف کلک کریں۔</translation> @@ -6704,6 +6715,7 @@ <translation id="7047059339731138197">ایک پس منظر منتخب کریں</translation> <translation id="7049293980323620022">فائل رکھیں؟</translation> <translation id="7050037487872780845">ہاٹ اسپاٹ کا غلط کنفیگریشن</translation> +<translation id="7050519587566342213">براؤز کرنا زیادہ ہموار ہے کیونکہ زیادہ امکان ہے کہ آپ پر ایک سائٹ سے دوسری سائٹ پر جانے کے لیے بھروسہ کیا جائے۔</translation> <translation id="7051551856857948729">IBAN قدر کو چھپائیں</translation> <translation id="7052237160939977163">کارکردگی کا پتا لگانے کا ڈیٹا بھیجیں</translation> <translation id="7053983685419859001">مسدود کریں</translation> @@ -6921,6 +6933,7 @@ <translation id="7269736181983384521">قریبی آلات کے ساتھ اشتراک کے ڈیٹا کا استعمال</translation> <translation id="7272674038937250585">کوئی تفصیل فراہم نہيں کی گئی</translation> <translation id="7273110280511444812">آخری بار منسلک کرنے کی تاریخ <ph name="DATE" /></translation> +<translation id="7273921429569738933">اسپام اور دھوکہ دہی میں تخفیف آن ہے</translation> <translation id="727441411541283857"><ph name="PERCENTAGE" />% - <ph name="TIME" /> مکمل ہو جانے تک</translation> <translation id="727952162645687754">ڈاؤن لوڈ میں خرابی</translation> <translation id="7280041992884344566">Chrome کی طرف سے نقصان دہ سافٹ ویئر تلاش کرتے وقت ایک خرابی پیش آ گئی</translation> @@ -7215,7 +7228,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> کو ڈاؤن لوڈ کرنا ناکام رہا</translation> <translation id="7551643184018910560">شیلف میں پن کریں</translation> -<translation id="7552658769580484674">آٹو فل تاثرات فراہم کریں</translation> <translation id="7552846755917812628">درج ذیل تجاویز کی کوشش کریں:</translation> <translation id="7553012839257224005">Linux کنٹینر کو چیک کیا جا رہا ہے</translation> <translation id="7553242001898162573">اپنا پاس ورڈ درج کریں</translation> @@ -7758,6 +7770,7 @@ <translation id="8023801379949507775">ایکسٹینشنز کو ابھی اپ ڈیٹ کریں</translation> <translation id="8025151549289123443">مقفل اسکرین اور سائن ان</translation> <translation id="8026334261755873520">براؤزنگ ڈیٹا صاف کریں</translation> +<translation id="8026471514777758216">آپ کے تمام آلات</translation> <translation id="8028060951694135607">Microsoft کلید کی بازیابی</translation> <translation id="8028803902702117856">ڈاؤن لوڈ جاری ہے <ph name="SIZE" />، <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">سائز</translation> @@ -8493,6 +8506,7 @@ <translation id="869884720829132584">ایپلیکیشنز مینو</translation> <translation id="869891660844655955">میعاد ختم ہونے کی تاریخ</translation> <translation id="8699188901396699995"><ph name="PRINTER_NAME" /> کیلئے PPD</translation> +<translation id="8702278591052316269">پوشیدہ محفوظ کردہ ٹیب گروپس پر مشتمل مینو</translation> <translation id="8702825062053163569">آپ کا <ph name="DEVICE_TYPE" /> مقفل تھا۔</translation> <translation id="8703346390800944767">اشتہار کو نظر انداز کریں</translation> <translation id="8705331520020532516">نمبر شمار</translation> @@ -8773,7 +8787,6 @@ <translation id="8952831374766033534">کنفیگریشن اختیار تعاون یافتہ نہیں ہے: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">چارج ہوتے وقت</translation> <translation id="895347679606913382">اسٹارٹ ہو رہا ہے…</translation> -<translation id="8956230710625245889">ریڈر میں کھولیں</translation> <translation id="8957757410289731985">پروفائل حسب ضرورت بنائیں</translation> <translation id="895944840846194039">JavaScript میموری</translation> <translation id="8960208913905765425">فوری جوابات یونٹ کی تبدیلی</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 83e82428..8e4c109 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Linux qayta ishga tushirilsinmi?</translation> <translation id="1047431265488717055">Havola matnidan nusxa olish</translation> <translation id="1048286738600630630">Ekranlar</translation> -<translation id="1048770690598418849">Hozircha tashlab ketishingiz mumkin va sozlashni tugatganingizdan keyin avtomatik ravishda qayta uriniladi</translation> <translation id="1048986595386481879">Dinamik joy ajratish</translation> <translation id="1049324577536766607">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> qurilmasidan <ph name="ATTACHMENTS" /> qabul qilinmoqda}other{<ph name="DEVICE_NAME" /> qurilmasidan <ph name="ATTACHMENTS" /> qabul qilinmoqda}}</translation> <translation id="1049743911850919806">Inkognito</translation> @@ -1356,6 +1355,7 @@ <translation id="2182058453334755893">Vaqtinchalik xotiraga nusxalandi</translation> <translation id="2183570493397356669">Davom etish tugmasi faolsizlantirildi</translation> <translation id="2184515124301515068">Ovoz ijrosi Chromening o‘ziga havola (tavsiya etiladi)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Sahifa boshqa qurilmadan ulashildi</translation> <translation id="2187675480456493911">Hisobingizdagi boshqa qurilmalarga sinxronlandi. Boshqa foydalanuvchilar oʻzgartirgan sozlamalar sinxronlanmaydi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Server sertifikatini import qilishda xatolik yuz berdi</translation> @@ -1663,6 +1663,7 @@ <translation id="2442916515643169563">Matn soyasi</translation> <translation id="2443487764245141020">Saytlar identifikator yordamida qurilmangizni tanib olishi kerak boʻlishi mumkin.</translation> <translation id="244475495405467108">Varaqlarni chapga yopish</translation> +<translation id="2444874983932528148">Ishni kelgan joyidan davom ettiring</translation> <translation id="2445081178310039857">Kengaytma tub katalogi talab qilinadi.</translation> <translation id="2445484935443597917">Yangi profil yaratish</translation> <translation id="2445726032315793326">Qisman kattalashtirish</translation> @@ -1923,7 +1924,6 @@ <translation id="2673135533890720193">Kezish tarixini ko‘rish</translation> <translation id="2674764818721168631">Yoqilmagan</translation> <translation id="2675570801872027281">Bruschetta olib tashlanmadi. Qayta urining.</translation> -<translation id="2676492189600898281">Avtomatik kiritish haqida fikr-mulohaza</translation> <translation id="2678063897982469759">Qayta faollashtirish</translation> <translation id="2678100101831051676">Translatsiya qilinmadi.</translation> <translation id="268053382412112343">&Tarix</translation> @@ -2481,6 +2481,7 @@ <translation id="3177909033752230686">Sahifa tili:</translation> <translation id="3177914167275935955">Qurilmangiz uchun Chrome Education yangilanishi mavjud, lekin qurilmadagi foydalanuvchi nomi Google for Education hisobiga tegishli emas. Google for Education hisobini ochish uchun boshqa qurilma orqali g.co/workspace/edusignup sahifasini oching.</translation> <translation id="3179982752812949580">Matn shrifti</translation> +<translation id="3180284704187420717">Sinxronizatsiya orqali bukmark, parollar va boshqa axborotlarni saqlang</translation> <translation id="3181954750937456830">Saytlarni xavfsiz kezish (sizni va qurilmangizni xavfli saytlardan himoya qiladi)</translation> <translation id="3182749001423093222">Imlo tekshiruvi</translation> <translation id="3183139917765991655">Profillar importi</translation> @@ -2972,6 +2973,7 @@ <translation id="3637203148990213388">Qoʻshimcha hisoblar</translation> <translation id="3639220004740062347">Mutolaa rejimidan chiqish</translation> <translation id="3640214691812501263"><ph name="USER_NAME" /> uchun “<ph name="EXTENSION_NAME" />” kengaytmasi qo‘shilsinmi?</translation> +<translation id="3640347231390550691">Parollarni fishingdan himoyalang</translation> <translation id="3640613767643722554">Ovozingizni Assistentga taniting</translation> <translation id="3641456520301071208">Saytlar joylashuv axborotingizni talab qilishi mumkin</translation> <translation id="3642070413432681490">Kursor halqasi</translation> @@ -3396,6 +3398,7 @@ <translation id="3988996860813292272">Vaqt mintaqasini tanlang</translation> <translation id="399179161741278232">Import qilindi</translation> <translation id="3992008114154328194">Yuklab olinmoqda: <ph name="STATUS" /> (<ph name="FILE_NAME" />)</translation> +<translation id="3993259701827857030">Maʼlumotlarni zaxiralang</translation> <translation id="3993887353483242788"><ph name="DEVICE_TYPE" /> qurilmangiz sinxronlansa, parametrlaringiz Google hisobingizdan kiritilgan barcha qurilmalaringizga ishlaydi. Bu parametrlarga ilovalar, sozlamalar, Wi-Fi parollar, tillar, fon rasmi, klaviatura sozlamalari va boshqa axborotlar kiradi.</translation> <translation id="3994318741694670028">Kompyuteringiz apparat identifikatori xato sozlangan. Buning natijasida ChromeOS Flex xavfsizlikka oid eng oxirgi tuzatishlar bilan yangilanmaydi va kompyuteringiz <ph name="BEGIN_BOLD" />zararli hujumlardan himoyalanmasligi mumkin<ph name="END_BOLD" />.</translation> <translation id="3994374631886003300">Telefoningizni qulfdan chiqaring va uni <ph name="DEVICE_TYPE" /> qurilmasiga yaqinlashtiring.</translation> @@ -3957,6 +3960,7 @@ <translation id="452750746583162491">Sinxronlangan maʼlumotlaringizni tekshiring</translation> <translation id="4527929807707405172">Teskari varaqlashni yoqish. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Tarjima taklifi</translation> +<translation id="4528638190900283934">Qoʻshimcha funksiyalar olish uchun hisobga kiring</translation> <translation id="4529455689802245339">Chrome Jonli izoh funksiyasi ishlamasligi mumkin</translation> <translation id="4530494379350999373">Kelib chiqishi</translation> <translation id="4531924570968473143">Bu <ph name="DEVICE_TYPE" /> qurilmasiga kimni qoʻshmoqchisiz?</translation> @@ -6366,6 +6370,7 @@ <translation id="6774710250118040929">Yangi parol kiritish</translation> <translation id="6775163072363532304">Ulangan qurilmalar shu yerda chiqadi.</translation> <translation id="677646486571529447">Qayd kiritish</translation> +<translation id="6776589734354015877">Qoʻshimcha funksiyalar oling</translation> <translation id="6776729248872343918">Tezkor ulanish funksiyasini yoqish</translation> <translation id="6777817260680419853">Yo‘naltirish bloklandi</translation> <translation id="6779092717724412415">Bu kabi ajratib koʻrsatish uchun istalgan matnni tanlang va sichqonchaning oʻng tugmasini bosing.</translation> @@ -7218,7 +7223,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> yuklab olinmadi</translation> <translation id="7551643184018910560">Javonga qadab qo‘yish</translation> -<translation id="7552658769580484674">Avtomatik kiritish haqida fikr-mulohaza</translation> <translation id="7552846755917812628">Quyidagi amallarni bajarib ko‘ring:</translation> <translation id="7553012839257224005">Linux konteyneri tekshirilmoqda</translation> <translation id="7553242001898162573">Parolni kiriting</translation> @@ -7760,6 +7764,7 @@ <translation id="8023801379949507775">Kengaytmalarni hoziroq yangilash</translation> <translation id="8025151549289123443">Ekranni qulflash va kirish</translation> <translation id="8026334261755873520">Brauzer tarixini tozalash</translation> +<translation id="8026471514777758216">Barcha qurilmalarda</translation> <translation id="8028060951694135607">Microsoft kalitlarini tiklash</translation> <translation id="8028803902702117856">Yuklab olinmoqda: <ph name="FILE_NAME" /> (<ph name="SIZE" />)</translation> <translation id="8028993641010258682">Hajm</translation> @@ -8776,7 +8781,6 @@ <translation id="8952831374766033534">Ishlamadigan konfiguratsiya: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Quvvat olayotganda</translation> <translation id="895347679606913382">Boshlanmoqda...</translation> -<translation id="8956230710625245889">Riderda ochish</translation> <translation id="8957757410289731985">Profilni moslash</translation> <translation id="895944840846194039">JavaScript xotirasi</translation> <translation id="8960208913905765425">Tezkor javoblardagi birliklar konvertori</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 719ea3d5..0d0f19a3 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Khởi động lại Linux?</translation> <translation id="1047431265488717055">Sao chép &văn bản liên kết</translation> <translation id="1048286738600630630">Hiển thị</translation> -<translation id="1048770690598418849">Bạn có thể tạm thời bỏ qua và chúng tôi sẽ tự động thử lại sau khi bạn hoàn tất quá trình thiết lập</translation> <translation id="1048986595386481879">Tự động phân bổ</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Đang nhận <ph name="ATTACHMENTS" /> từ thiết bị <ph name="DEVICE_NAME" />}other{Đang nhận <ph name="ATTACHMENTS" /> từ thiết bị <ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">Ẩn danh</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Đã sao chép vào bảng nhớ tạm</translation> <translation id="2183570493397356669">Nút Tiếp tục đã bị vô hiệu hoá</translation> <translation id="2184515124301515068">Cho phép Chrome chọn thời điểm trang web có thể phát âm thanh (khuyên dùng)</translation> +<translation id="2186206192313702726">Google Ống kính</translation> <translation id="2186711480981247270">Trang được chia sẻ từ một thiết bị khác</translation> <translation id="2187675480456493911">Đã đồng bộ hóa với các thiết bị khác trên tài khoản của bạn. Các tùy chọn cài đặt do những người dùng khác sửa đổi sẽ không được đồng bộ hóa. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Lỗi nhập chứng chỉ máy chủ</translation> @@ -1935,7 +1935,6 @@ <translation id="2673135533890720193">Đọc nhật ký duyệt web của bạn</translation> <translation id="2674764818721168631">Đang tắt</translation> <translation id="2675570801872027281">Có lỗi xảy ra khi xoá Bruschetta. Vui lòng thử lại.</translation> -<translation id="2676492189600898281">Cung cấp phản hồi Tự động điền</translation> <translation id="2678063897982469759">Kích hoạt lại</translation> <translation id="2678100101831051676">Không truyền được.</translation> <translation id="268053382412112343">Lị&ch sử</translation> @@ -7229,7 +7228,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Tải xuống <ph name="FILE_NAME" /> không thành công</translation> <translation id="7551643184018910560">Ghim vào kệ</translation> -<translation id="7552658769580484674">Cung cấp phản hồi Tự động điền</translation> <translation id="7552846755917812628">Thử các mẹo sau:</translation> <translation id="7553012839257224005">Đang kiểm tra vùng chứa Linux</translation> <translation id="7553242001898162573">Nhập mật khẩu của bạn</translation> @@ -8789,7 +8787,6 @@ <translation id="8952831374766033534">Không hỗ trợ tùy chọn cấu hình: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Trong khi sạc</translation> <translation id="895347679606913382">Đang bắt đầu...</translation> -<translation id="8956230710625245889">Mở trong Trình đọc</translation> <translation id="8957757410289731985">Tùy chỉnh hồ sơ</translation> <translation id="895944840846194039">Bộ nhớ dành cho JavaScript</translation> <translation id="8960208913905765425">Tính năng chuyển đổi đơn vị của Thông tin nhanh</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 47fe75f..704c485 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">重启 Linux?</translation> <translation id="1047431265488717055">复制链接文字(&X)</translation> <translation id="1048286738600630630">显示</translation> -<translation id="1048770690598418849">您可以暂时跳过此步骤,系统会在您完成设置后自动重试</translation> <translation id="1048986595386481879">动态分配</translation> <translation id="1049324577536766607">{COUNT,plural, =1{正在接收“<ph name="DEVICE_NAME" />”发来的 <ph name="ATTACHMENTS" />}other{正在接收“<ph name="DEVICE_NAME" />”发来的 <ph name="ATTACHMENTS" />}}</translation> <translation id="1049743911850919806">无痕</translation> @@ -1350,6 +1349,7 @@ <translation id="2182058453334755893">已复制到您的剪贴板</translation> <translation id="2183570493397356669">已停用“继续”按钮</translation> <translation id="2184515124301515068">让 Chrome 选择何时允许网站播放声音(推荐)</translation> +<translation id="2186206192313702726">Google 智能镜头</translation> <translation id="2186711480981247270">收到了另一设备分享的页面</translation> <translation id="2187675480456493911">已与您帐号中的其他设备同步。其他用户修改的设置不会进行同步。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="2187895286714876935">服务器证书导入错误</translation> @@ -1617,6 +1617,7 @@ <translation id="2408018932941436077">正在保存信用卡信息</translation> <translation id="2408955596600435184">输入您的 PIN 码</translation> <translation id="2409268599591722235">开始使用</translation> +<translation id="2409709393952490731">使用手机或平板电脑</translation> <translation id="2410079346590497630">版本详情</translation> <translation id="2410298923485357543">在设备已联网时使用自然语音</translation> <translation id="2410754283952462441">选择帐号</translation> @@ -1653,6 +1654,7 @@ <translation id="2442916515643169563">文字阴影</translation> <translation id="2443487764245141020">网站可能还需要使用标识符来识别您的设备</translation> <translation id="244475495405467108">关闭左侧标签页</translation> +<translation id="2444874983932528148">轻松地从上次停下的地方继续</translation> <translation id="2445081178310039857">必须指定扩展程序根目录。</translation> <translation id="2445484935443597917">创建新的个人资料</translation> <translation id="2445726032315793326">局部放大镜</translation> @@ -1912,7 +1914,6 @@ <translation id="2673135533890720193">读取您的浏览记录</translation> <translation id="2674764818721168631">已关闭</translation> <translation id="2675570801872027281">移除 Bruschetta 时出错。请重试。</translation> -<translation id="2676492189600898281">针对自动填充功能提供反馈</translation> <translation id="2678063897982469759">重新启用</translation> <translation id="2678100101831051676">无法投放。</translation> <translation id="268053382412112343">历史记录(&S)</translation> @@ -2470,6 +2471,7 @@ <translation id="3177909033752230686">网页语言:</translation> <translation id="3177914167275935955">您的设备随附了一份 Chrome 教育版升级许可,但您的用户名并未与 Google for Education 帐号关联。请先在辅助设备上前往 g.co/workspace/edusignup 创建一个 Google for Education 帐号。</translation> <translation id="3179982752812949580">文本字体</translation> +<translation id="3180284704187420717">借助同步功能保存您的书签、密码等数据</translation> <translation id="3181954750937456830">安全浏览(保护您和您的设备不受危险网站的侵害)</translation> <translation id="3182749001423093222">拼写检查</translation> <translation id="3183139917765991655">个人资料导入应用</translation> @@ -2961,6 +2963,7 @@ <translation id="3637203148990213388">其他帐号</translation> <translation id="3639220004740062347">退出阅读器模式</translation> <translation id="3640214691812501263">要为<ph name="USER_NAME" />添加“<ph name="EXTENSION_NAME" />”吗?</translation> +<translation id="3640347231390550691">保护您的密码,防范钓鱼式攻击</translation> <translation id="3640613767643722554">训练 Google 助理识别您的声音</translation> <translation id="3641456520301071208">网站可以请求取得您的位置信息</translation> <translation id="3642070413432681490">圆圈光标</translation> @@ -3384,6 +3387,7 @@ <translation id="3988996860813292272">选择时区</translation> <translation id="399179161741278232">已导入</translation> <translation id="3992008114154328194">正在下载“<ph name="FILE_NAME" />”,<ph name="STATUS" /></translation> +<translation id="3993259701827857030">备份数据</translation> <translation id="3993887353483242788">同步您的 <ph name="DEVICE_TYPE" /> 后,无论是在哪部设备上,您只需登录自己的 Google 帐号,便能使用您保存的偏好设置。偏好设置包括应用、设置、Wi-Fi 密码、语言、壁纸、键盘快捷键,等等。</translation> <translation id="3994318741694670028">很遗憾,您的计算机配置了格式错误的硬件 ID。这导致 ChromeOS Flex 无法使用最新的安全修正程序进行更新,以致您的计算机<ph name="BEGIN_BOLD" />很容易遭到恶意攻击<ph name="END_BOLD" />。</translation> <translation id="3994374631886003300">请解锁您的手机并将它靠近您的 <ph name="DEVICE_TYPE" />,以解锁此设备。</translation> @@ -3761,6 +3765,7 @@ <translation id="4369215744064167350">网站请求已获批准</translation> <translation id="4369735607080757018">为了衡量各自的广告效果,网站之间会分享有限类型的数据,例如一天当中向您展示广告的时段</translation> <translation id="4370975561335139969">您输入的电子邮件地址和密码不匹配。</translation> +<translation id="4374805630006466253">改用别的手机或平板电脑</translation> <translation id="4374831787438678295">Linux 安装程序</translation> <translation id="4375035964737468845">打开已下载的文件</translation> <translation id="4376226992615520204">已关闭位置信息服务</translation> @@ -3941,6 +3946,7 @@ <translation id="452750746583162491">查看您已同步的数据</translation> <translation id="4527929807707405172">启用反向滚动。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="4528494169189661126">建议翻译</translation> +<translation id="4528638190900283934">登录即可获享更多功能</translation> <translation id="4529455689802245339">Chrome 实时字幕功能可能无法运行</translation> <translation id="4530494379350999373">来源</translation> <translation id="4531924570968473143">您想将谁添加到此 <ph name="DEVICE_TYPE" />?</translation> @@ -6347,6 +6353,7 @@ <translation id="6774710250118040929">添加新密码</translation> <translation id="6775163072363532304">可用设备将会显示在此处。</translation> <translation id="677646486571529447">添加备注</translation> +<translation id="6776589734354015877">获享更多功能</translation> <translation id="6776729248872343918">启用快速配对</translation> <translation id="6777817260680419853">已禁止重定向</translation> <translation id="6779092717724412415">如需创建与这相似的突出显示内容,请选择任意文本并右键点击它。</translation> @@ -7199,7 +7206,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> 下载失败</translation> <translation id="7551643184018910560">固定到任务栏</translation> -<translation id="7552658769580484674">针对自动填充功能提供反馈</translation> <translation id="7552846755917812628">请尝试按以下提示操作:</translation> <translation id="7553012839257224005">正在检查 Linux 容器</translation> <translation id="7553242001898162573">输入您的密码</translation> @@ -7743,6 +7749,7 @@ <translation id="8023801379949507775">立即更新扩展程序</translation> <translation id="8025151549289123443">锁定屏幕和登录</translation> <translation id="8026334261755873520">清除浏览数据</translation> +<translation id="8026471514777758216">使您的所有设备保持同步</translation> <translation id="8028060951694135607">Microsoft 密钥恢复</translation> <translation id="8028803902702117856">正在下载“<ph name="FILE_NAME" />”,大小为 <ph name="SIZE" /></translation> <translation id="8028993641010258682">大小</translation> @@ -8408,7 +8415,7 @@ <translation id="8643403533759285912">删除群组</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> 可能含有危险内容。发送给 Google 高级保护进行扫描?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{无 Cookie}=1{屏蔽了 1 个 Cookie}other{屏蔽了 # 个 Cookie}}</translation> -<translation id="864423554496711319">设备已保存到您的帐号中</translation> +<translation id="864423554496711319">已保存在您帐号下的设备</translation> <translation id="8644655801811752511">无法重置此安全密钥。请尝试在插入此密钥后立即重置它。</translation> <translation id="8645354835496065562">继续允许使用传感器</translation> <translation id="8645920082661222035">预测危险事件并在此类事件发生前向您发出警告</translation> @@ -8759,7 +8766,6 @@ <translation id="8952831374766033534">有配置选项不受支持:<ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">充电时</translation> <translation id="895347679606913382">即将开始下载...</translation> -<translation id="8956230710625245889">在阅读器中打开</translation> <translation id="8957757410289731985">自定义个人资料</translation> <translation id="895944840846194039">JavaScript 使用的内存</translation> <translation id="8960208913905765425">快速解答单位换算</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 50c127dc..b0eb53cf 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">要重新啟動 Linux 嗎?</translation> <translation id="1047431265488717055">複製連結文字(&X)</translation> <translation id="1048286738600630630">顯示</translation> -<translation id="1048770690598418849">您可暫時略過,我們會在您完成設定後自動重試</translation> <translation id="1048986595386481879">動態分配</translation> <translation id="1049324577536766607">{COUNT,plural, =1{現正從「<ph name="DEVICE_NAME" />」接收 <ph name="ATTACHMENTS" />}other{現正從「<ph name="DEVICE_NAME" />」接收 <ph name="ATTACHMENTS" />}}</translation> <translation id="1049743911850919806">無痕</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">已複製至剪貼簿</translation> <translation id="2183570493397356669">停用咗繼續按鈕</translation> <translation id="2184515124301515068">允許 Chrome 選擇何時讓網站播放音效 (建議)</translation> +<translation id="2186206192313702726">Google 智能鏡頭</translation> <translation id="2186711480981247270">由其他裝置分享的頁面</translation> <translation id="2187675480456493911">此網絡已與您帳戶上的其他裝置同步。系統不會同步處理其他使用者修改的設定。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="2187895286714876935">伺服器憑證匯入錯誤</translation> @@ -1639,6 +1639,7 @@ <translation id="2408018932941436077">正在儲存信用卡</translation> <translation id="2408955596600435184">請輸入您的 PIN</translation> <translation id="2409268599591722235">開始使用</translation> +<translation id="2409709393952490731">使用手機或平板電腦</translation> <translation id="2410079346590497630">版本詳細資料</translation> <translation id="2410298923485357543">在裝置連線後,使用自然語音</translation> <translation id="2410754283952462441">選擇帳戶</translation> @@ -1675,6 +1676,7 @@ <translation id="2442916515643169563">文字陰影</translation> <translation id="2443487764245141020">網站亦可能需要透過識別碼來辨識您的裝置</translation> <translation id="244475495405467108">關閉左側分頁</translation> +<translation id="2444874983932528148">輕鬆接續瀏覽進度</translation> <translation id="2445081178310039857">請指定擴充功能根目錄。</translation> <translation id="2445484935443597917">建立新的設定檔</translation> <translation id="2445726032315793326">局部放大鏡</translation> @@ -1935,7 +1937,6 @@ <translation id="2673135533890720193">讀取您的瀏覽記錄</translation> <translation id="2674764818721168631">關閉</translation> <translation id="2675570801872027281">移除 Bruschetta 時發生問題,請再試一次。</translation> -<translation id="2676492189600898281">提供自動填入的意見</translation> <translation id="2678063897982469759">重新啟用</translation> <translation id="2678100101831051676">無法投放。</translation> <translation id="268053382412112343">記錄(&S)</translation> @@ -2493,6 +2494,7 @@ <translation id="3177909033752230686">網頁語言:</translation> <translation id="3177914167275935955">您的裝置包含一項 Chrome Education 升級,但您的使用者名稱尚未連結 Google for Education 帳戶。請在次要裝置上前往 g.co/workspace/edusignup 建立 Google for Education 帳戶。</translation> <translation id="3179982752812949580">文字字型</translation> +<translation id="3180284704187420717">透過同步處理功能儲存書籤、密碼等其他資訊</translation> <translation id="3181954750937456830">安全瀏覽 (保護您和裝置免受危險網站攻擊)</translation> <translation id="3182749001423093222">拼字檢查</translation> <translation id="3183139917765991655">個人檔案匯入工具</translation> @@ -2984,6 +2986,7 @@ <translation id="3637203148990213388">其他帳戶</translation> <translation id="3639220004740062347">離開閱讀器模式</translation> <translation id="3640214691812501263">要為<ph name="USER_NAME" />新增「<ph name="EXTENSION_NAME" />」嗎?</translation> +<translation id="3640347231390550691">保護密碼,防範網路釣魚</translation> <translation id="3640613767643722554">教導「Google 助理」識別您的聲音</translation> <translation id="3641456520301071208">網站可要求取得您的位置</translation> <translation id="3642070413432681490">圓形游標</translation> @@ -3408,6 +3411,7 @@ <translation id="3988996860813292272">選取時區</translation> <translation id="399179161741278232">已匯入</translation> <translation id="3992008114154328194">下載緊 <ph name="FILE_NAME" />,<ph name="STATUS" /></translation> +<translation id="3993259701827857030">備份資料</translation> <translation id="3993887353483242788">同步 <ph name="DEVICE_TYPE" />,以便在使用 Google 帳戶登入後,將偏好設定同步至任何裝置。偏好設定包括應用程式、設定、Wi-Fi 密碼、語言、桌布、鍵盤快速鍵等。</translation> <translation id="3994318741694670028">抱歉,您的電腦是由格式錯誤的硬件 ID 設定。這導致 ChromeOS Flex 無法使用最新的安全性修正程式進行更新,您的電腦亦可能因此<ph name="BEGIN_BOLD" />容易被惡意攻擊<ph name="END_BOLD" />。</translation> <translation id="3994374631886003300">解鎖手機並靠近您的 <ph name="DEVICE_TYPE" /> 即可解鎖。</translation> @@ -3787,6 +3791,7 @@ <translation id="4369215744064167350">已核准網站要求</translation> <translation id="4369735607080757018">網站之間會分享有限種類的資料 (例如系統向您顯示廣告的時段),以評估廣告的效益</translation> <translation id="4370975561335139969">您所輸入的電郵與密碼不符</translation> +<translation id="4374805630006466253">使用其他手機或平板電腦</translation> <translation id="4374831787438678295">Linux 安裝程式</translation> <translation id="4375035964737468845">開啟已下載的檔案</translation> <translation id="4376226992615520204">已關閉位置功能</translation> @@ -3968,6 +3973,7 @@ <translation id="452750746583162491">查看您已同步的資料</translation> <translation id="4527929807707405172">啟用反向捲動功能。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4528494169189661126">翻譯建議</translation> +<translation id="4528638190900283934">登入即可使用額外的實用功能</translation> <translation id="4529455689802245339">「Chrome 即時字幕」可能無法運作</translation> <translation id="4530494379350999373">來源</translation> <translation id="4531924570968473143">您想將誰加入此 <ph name="DEVICE_TYPE" />?</translation> @@ -6375,6 +6381,7 @@ <translation id="6774710250118040929">新增密碼</translation> <translation id="6775163072363532304">可用的裝置將會在這裡顯示。</translation> <translation id="677646486571529447">新增附註</translation> +<translation id="6776589734354015877">取得額外的實用功能</translation> <translation id="6776729248872343918">啟用「快速配對」</translation> <translation id="6777817260680419853">已禁止重新導向</translation> <translation id="6779092717724412415">如要建立其他突顯內容,請選取所需文字後按一下右鍵。</translation> @@ -7227,7 +7234,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> 下載失敗</translation> <translation id="7551643184018910560">固定至捷徑列</translation> -<translation id="7552658769580484674">提供自動填入的意見</translation> <translation id="7552846755917812628">請嘗試按照以下提示操作:</translation> <translation id="7553012839257224005">正在檢查 Linux 容器</translation> <translation id="7553242001898162573">輸入您的密碼</translation> @@ -7771,6 +7777,7 @@ <translation id="8023801379949507775">立即更新擴充功能</translation> <translation id="8025151549289123443">上鎖畫面和登入</translation> <translation id="8026334261755873520">清除瀏覽數據</translation> +<translation id="8026471514777758216">你的所有裝置</translation> <translation id="8028060951694135607">Microsoft 金鑰復原</translation> <translation id="8028803902702117856">下載緊 <ph name="FILE_NAME" />,檔案大小係 <ph name="SIZE" /></translation> <translation id="8028993641010258682">大小</translation> @@ -8787,7 +8794,6 @@ <translation id="8952831374766033534">不支援的設定選項:<ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">充電時</translation> <translation id="895347679606913382">即將開始下載…</translation> -<translation id="8956230710625245889">在閱讀器中開啟</translation> <translation id="8957757410289731985">自訂個人檔案</translation> <translation id="895944840846194039">JavaScript 記憶體使用量</translation> <translation id="8960208913905765425">「快速解答」的單位轉換</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 9cf50fa8..73d3e5c 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">要重新啟動 Linux 嗎?</translation> <translation id="1047431265488717055">複製連結文字(&X)</translation> <translation id="1048286738600630630">顯示</translation> -<translation id="1048770690598418849">你可以暫時略過這個步驟,系統會在你完成設定程序後自動重試</translation> <translation id="1048986595386481879">動態分配</translation> <translation id="1049324577536766607">{COUNT,plural, =1{正在從「<ph name="DEVICE_NAME" />」接收 <ph name="ATTACHMENTS" />}other{正在從「<ph name="DEVICE_NAME" />」接收 <ph name="ATTACHMENTS" />}}</translation> <translation id="1049743911850919806">無痕模式</translation> @@ -1357,6 +1356,7 @@ <translation id="2182058453334755893">已複製到剪貼簿</translation> <translation id="2183570493397356669">已停用「繼續」按鈕</translation> <translation id="2184515124301515068">讓 Chrome 自行判斷何時允許網站播放音訊 (建議使用)</translation> +<translation id="2186206192313702726">Google 智慧鏡頭</translation> <translation id="2186711480981247270">透過其他裝置分享的網頁</translation> <translation id="2187675480456493911">已與你帳戶中的其他裝置同步。系統不會同步處理其他使用者修改的設定。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="2187895286714876935">伺服器憑證匯入錯誤</translation> @@ -1660,6 +1660,7 @@ <translation id="2442916515643169563">文字陰影</translation> <translation id="2443487764245141020">網站可能也需要使用 ID 來辨識你的裝置</translation> <translation id="244475495405467108">關閉左側的分頁</translation> +<translation id="2444874983932528148">輕鬆接續瀏覽進度</translation> <translation id="2445081178310039857">請指定擴充功能根目錄。</translation> <translation id="2445484935443597917">建立新的個人資料</translation> <translation id="2445726032315793326">局部放大鏡</translation> @@ -1920,7 +1921,6 @@ <translation id="2673135533890720193">讀取你的瀏覽記錄</translation> <translation id="2674764818721168631">關閉</translation> <translation id="2675570801872027281">移除 Bruschetta 時發生錯誤,請再試一次。</translation> -<translation id="2676492189600898281">提供有關自動填入功能的意見</translation> <translation id="2678063897982469759">重新啟用</translation> <translation id="2678100101831051676">無法投放。</translation> <translation id="268053382412112343">記錄(&S)</translation> @@ -2478,6 +2478,7 @@ <translation id="3177909033752230686">網頁語言:</translation> <translation id="3177914167275935955">你的裝置含有 Chrome Education 升級版,但你的使用者名稱沒有相關聯的 Google for Education 帳戶。請在次要裝置上前往 g.co/workspace/edusignup 建立 Google for Education 帳戶。</translation> <translation id="3179982752812949580">文字字型</translation> +<translation id="3180284704187420717">透過同步處理功能儲存書籤、密碼等其他資訊</translation> <translation id="3181954750937456830">安全瀏覽 (保護你和你的裝置不受危險網站攻擊)</translation> <translation id="3182749001423093222">拼字檢查</translation> <translation id="3183139917765991655">設定檔匯入工具</translation> @@ -2969,6 +2970,7 @@ <translation id="3637203148990213388">其他帳戶</translation> <translation id="3639220004740062347">結束閱讀器模式</translation> <translation id="3640214691812501263">為<ph name="USER_NAME" />新增「<ph name="EXTENSION_NAME" />」?</translation> +<translation id="3640347231390550691">保護密碼,防範網路釣魚</translation> <translation id="3640613767643722554">訓練 Google 助理辨識你的聲音</translation> <translation id="3641456520301071208">網站可以要求取得你的位置資訊</translation> <translation id="3642070413432681490">圓形游標</translation> @@ -3392,6 +3394,7 @@ <translation id="3988996860813292272">選取時區</translation> <translation id="399179161741278232">已匯入</translation> <translation id="3992008114154328194">正在下載「<ph name="FILE_NAME" />」,<ph name="STATUS" /></translation> +<translation id="3993259701827857030">備份資料</translation> <translation id="3993887353483242788">將 <ph name="DEVICE_TYPE" /> 同步處理,如此一來,在使用 Google 帳戶登入後,就能將偏好設定同步至任何裝置。偏好設定包含應用程式、設定、Wi-Fi 密碼、語言、桌布、鍵盤快速鍵等。</translation> <translation id="3994318741694670028">很抱歉,你的電腦是由格式錯誤的硬體 ID 所設定。這導致 ChromeOS Flex 無法使用最新的安全性修正程式進行更新,你的電腦也可能因此<ph name="BEGIN_BOLD" />容易遭受惡意攻擊<ph name="END_BOLD" />。</translation> <translation id="3994374631886003300">解除手機的鎖定狀態,並且讓你的手機與 <ph name="DEVICE_TYPE" /> 更靠近,即可進入解鎖模式。</translation> @@ -3951,6 +3954,7 @@ <translation id="452750746583162491">查看已同步處理的資料</translation> <translation id="4527929807707405172">啟用反向捲動功能。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="4528494169189661126">翻譯建議</translation> +<translation id="4528638190900283934">登入即可使用額外的實用功能</translation> <translation id="4529455689802245339">Chrome 即時字幕可能無法運作</translation> <translation id="4530494379350999373">來源</translation> <translation id="4531924570968473143">你想要將誰加入這部 <ph name="DEVICE_TYPE" />?</translation> @@ -6357,6 +6361,7 @@ <translation id="6774710250118040929">新增密碼</translation> <translation id="6775163072363532304">可用的裝置會顯示在這裡。</translation> <translation id="677646486571529447">新增附註</translation> +<translation id="6776589734354015877">取得額外的實用功能</translation> <translation id="6776729248872343918">啟用快速配對</translation> <translation id="6777817260680419853">已禁止重新導向</translation> <translation id="6779092717724412415">如要建立其他醒目標示內容,請選取所需文字後按一下滑鼠右鍵。</translation> @@ -7209,7 +7214,6 @@ <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432"><ph name="FILE_NAME" /> 下載失敗</translation> <translation id="7551643184018910560">固定至檔案櫃</translation> -<translation id="7552658769580484674">提供有關自動填入功能的意見</translation> <translation id="7552846755917812628">嘗試按照下列提示操作:</translation> <translation id="7553012839257224005">正在檢查 Linux 容器</translation> <translation id="7553242001898162573">請輸入您的密碼</translation> @@ -7753,6 +7757,7 @@ <translation id="8023801379949507775">立即更新擴充功能</translation> <translation id="8025151549289123443">螢幕鎖定和登入</translation> <translation id="8026334261755873520">清除瀏覽資料</translation> +<translation id="8026471514777758216">你的所有裝置</translation> <translation id="8028060951694135607">Microsoft 金鑰修復</translation> <translation id="8028803902702117856">正在下載 <ph name="FILE_NAME" />,檔案大小為 <ph name="SIZE" /></translation> <translation id="8028993641010258682">大小</translation> @@ -8769,7 +8774,6 @@ <translation id="8952831374766033534">不支援的設定選項:<ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">充電時</translation> <translation id="895347679606913382">啟動中...</translation> -<translation id="8956230710625245889">在 Reader 中開啟</translation> <translation id="8957757410289731985">自訂檔案</translation> <translation id="895944840846194039">JavaScript 記憶體使用量</translation> <translation id="8960208913905765425">快速解答功能的單位轉換結果</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 671dcaa9..b842957 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -53,7 +53,6 @@ <translation id="104710386808485638">Qala kabusha i-Linux?</translation> <translation id="1047431265488717055">Kopisha um&bhalo wesixhumanisi</translation> <translation id="1048286738600630630">Izibonisi</translation> -<translation id="1048770690598418849">Ungakweqa okwamanje futhi sizozama kabusha ngokuzenzekelayo lapho usuqede ukusetha</translation> <translation id="1048986595386481879">Kwabiwe ngamandla</translation> <translation id="1049324577536766607">{COUNT,plural, =1{Ithola i-<ph name="ATTACHMENTS" /> evela ku-<ph name="DEVICE_NAME" />}one{Ithola i-<ph name="ATTACHMENTS" /> evela ku-<ph name="DEVICE_NAME" />}other{Ithola i-<ph name="ATTACHMENTS" /> evela ku-<ph name="DEVICE_NAME" />}}</translation> <translation id="1049743911850919806">I-Incognito</translation> @@ -1369,6 +1368,7 @@ <translation id="2182058453334755893">Kukopishelwe kubhodi lakho lokunamathisela</translation> <translation id="2183570493397356669">Inkinobho yokuqhubeka ikhutshaziwe</translation> <translation id="2184515124301515068">Vumela i-Chrome ukuthi ikhethe uma amasayithi angakwazi ukudlala umsindo (kunconyiwe)</translation> +<translation id="2186206192313702726">Google Lens</translation> <translation id="2186711480981247270">Ikhasi elabiwe kusuka kwenye idivayisi</translation> <translation id="2187675480456493911">Ivunyelaniswe namanye amadivayisi ku-akhawunti yakho. Amasethingi alungiswe abanye abasebenzisi ngeke aze avunyelaniswe. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="2187895286714876935">Iphutha lokungenisa isitifiketi seseva</translation> @@ -1640,6 +1640,7 @@ <translation id="2408018932941436077">Ilondoloza ikhadi</translation> <translation id="2408955596600435184">Faka iphinikhodi yakho</translation> <translation id="2409268599591722235">Masihambe</translation> +<translation id="2409709393952490731">Sebenzisa ifoni noma ithebulethi.</translation> <translation id="2410079346590497630">Imininingwane yokwakha</translation> <translation id="2410298923485357543">Sebenzisa izwi elingokwemvelo lapho idivayisi ixhumeke ku-inthanethi</translation> <translation id="2410754283952462441">Khetha i-akhawunti</translation> @@ -1936,7 +1937,6 @@ <translation id="2673135533890720193">Funda umlando wakho wokuphequlula</translation> <translation id="2674764818721168631">Valiwe</translation> <translation id="2675570801872027281">Iphutha ekususeni i-Bruschetta. Sicela uzame futhi.</translation> -<translation id="2676492189600898281">Nikeza ngempendulo yokugcwalisa ngokuzenzakalelayo</translation> <translation id="2678063897982469759">Phinda unike amandla</translation> <translation id="2678100101831051676">Ayikwazi ukusakaza.</translation> <translation id="268053382412112343">Umlando</translation> @@ -3787,6 +3787,7 @@ <translation id="4369215744064167350">Isicelo sewebhusayithi sigunyaziwe</translation> <translation id="4369735607080757018">Izinhlobo zedatha ezilinganiselwe zabiwa phakathi kwamasayithi ukuze kulinganiselwe ukusebenza kwezikhangiso zawo, njengesikhathi sosuku isikhangiso esiboniswe ngaso</translation> <translation id="4370975561335139969">I-imeyili nephasiwedi oyifakile ayifani</translation> +<translation id="4374805630006466253">Sebenzisa ifoni noma ithebulethi ehlukile</translation> <translation id="4374831787438678295">Isifaki se-Linux</translation> <translation id="4375035964737468845">Vula amafayela alandiwe</translation> <translation id="4376226992615520204">Indawo ivaliwe</translation> @@ -7234,7 +7235,6 @@ <translation id="7550830279652415241">amabhukhimakhi_<ph name="DATESTAMP" />.html</translation> <translation id="7551059576287086432">Ukulanda kwe-<ph name="FILE_NAME" /> akuphumelelanga</translation> <translation id="7551643184018910560">Phina kushelufu</translation> -<translation id="7552658769580484674">Nikeza Ngempendulo Yokugcwalisa Ngokuzenzakalelayo</translation> <translation id="7552846755917812628">Zama amathiphu alandelayo:</translation> <translation id="7553012839257224005">Kuhlola isiqukathi se-Linux</translation> <translation id="7553242001898162573">Faka iphasiwedi yakho</translation> @@ -8793,7 +8793,6 @@ <translation id="8952831374766033534">Inketho yokulungiselela ayisekelwe: <ph name="ERROR_LINE" /></translation> <translation id="8953476467359856141">Ngenkathi ishaja</translation> <translation id="895347679606913382">Iyaqala...</translation> -<translation id="8956230710625245889">Vula ku-Reader</translation> <translation id="8957757410289731985">Enza ngezifiso iphrofayela</translation> <translation id="895944840846194039">Imemori ye-JavaScript</translation> <translation id="8960208913905765425">Ukuguqulwa kweyunithi Kwezimpendulo Ezisheshayo</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 79433398..ea1c618 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -130,6 +130,7 @@ <translation id="3245429137663807393">Ako dijelite i izvještaje o korištenju Chromea, ti izvještaji uključuju URL-ove koje posjećujete</translation> <translation id="3282568296779691940">Prijava na Chrome</translation> <translation id="3286538390144397061">Ponovo pokreni sada</translation> +<translation id="3293912612584488930">Učinite više uz Chrome</translation> <translation id="3360895254066713204">Pomoćnik za Chrome</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome će se sada ponovo pokrenuti}=1{Chrome će se ponovo pokrenuti za 1 sekundu}one{Chrome će se ponovo pokrenuti za # sekundu}few{Chrome će se ponovo pokrenuti za # sekunde}other{Chrome će se ponovo pokrenuti za # sekundi}}</translation> <translation id="3396977131400919238">Došlo je do greške operativnog sistema prilikom instalacije. Ponovo preuzmite Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 8d27628a..5c2b1655 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -126,6 +126,7 @@ <translation id="3245429137663807393">Ako dijelite i izvješća o upotrebi Chromea, ta izvješća uključuju URL-ove koje posjećujete</translation> <translation id="3282568296779691940">Prijavite se u Chrome</translation> <translation id="3286538390144397061">Ponovo pokreni sad</translation> +<translation id="3293912612584488930">Učinite više s Chromeom</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome će se sada ponovo pokrenuti}=1{Chrome će se ponovo pokrenuti za jednu sekundu}one{Chrome će se ponovo pokrenuti za # s}few{Chrome će se ponovo pokrenuti za # s}other{Chrome će se ponovo pokrenuti za # s}}</translation> <translation id="3396977131400919238">Došlo je do pogreške operacijskog sustava tijekom instalacije. Ponovno preuzmite program Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index dc75b38b..04ca01b 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -125,6 +125,7 @@ <translation id="3245429137663807393">Se condividi anche report sull'utilizzo di Chrome, tali report includono gli URL visitati</translation> <translation id="3282568296779691940">Accedi a Chrome</translation> <translation id="3286538390144397061">Riavvia adesso</translation> +<translation id="3293912612584488930">Fai di più con Chrome</translation> <translation id="3360895254066713204">Supporto Chrome</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome verrà riavviato ora}=1{Chrome verrà riavviato tra 1 secondo}other{Chrome verrà riavviato tra # secondi}}</translation> <translation id="3396977131400919238">Durante l'installazione si è verificato un errore del sistema operativo. Scarica nuovamente Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 1c8c176..283110b 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -126,6 +126,7 @@ <translation id="3245429137663807393">אם בנוסף ישותפו דוחות שימוש ב-Chrome, הדוחות האלה יכללו את כתובות ה-URL שבהן ביקרת</translation> <translation id="3282568296779691940">כניסה ל-Chrome</translation> <translation id="3286538390144397061">הפעל מחדש כעת</translation> +<translation id="3293912612584488930">מספיקים יותר עם Chrome</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome יופעל מחדש עכשיו}=1{Chrome יופעל מחדש בעוד שנייה}one{Chrome יופעל מחדש בעוד # שניות}two{Chrome יופעל מחדש בעוד # שניות}other{Chrome יופעל מחדש בעוד # שניות}}</translation> <translation id="3396977131400919238">במהלך ההתקנה אירעה שגיאה של מערכת ההפעלה. יש להוריד שוב את Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index 79a43dc2..92312c10 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -129,6 +129,7 @@ <translation id="3245429137663807393">თუ თქვენ აზიარებთ Chrome-ის მოხმარების ანგარიშებსაც, ეს ანგარიშები ასევე მოიცავს თქვენ მიერ მონახულებულ URL-ებს</translation> <translation id="3282568296779691940">შესვლა Chrome-ში</translation> <translation id="3286538390144397061">გადატვირთეთ ახლა</translation> +<translation id="3293912612584488930">შეძელით მეტი Chrome-ის მეშვეობით</translation> <translation id="3360895254066713204">Chrome-ის დამხმარე</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome ახლა ხელახლა გაეშვება}=1{Chrome ხელახლა გაეშვება 1 წამში}other{Chrome ხელახლა გაეშვება # წამში}}</translation> <translation id="3396977131400919238">ინსტალაციის დროს წარმოიქმნა ოპერატიული სისტემის შეცდომა. ხელახლა ჩამოტვირთეთ Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index a46fca1..1dde72f 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -129,6 +129,7 @@ <translation id="3245429137663807393">Chrome пайдалану есептерін де бөліссеңіз, бұл есептерде сіз кірген URL мекенжайлары қамтылады.</translation> <translation id="3282568296779691940">Chrome жүйесіне кіру</translation> <translation id="3286538390144397061">Қазір қайта іске қосу</translation> +<translation id="3293912612584488930">Chrome-мен көбірек іс тындырыңыз</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome браузері қазір қайта іске қосылады}=1{Chrome браузері 1 секундтан кейін қайта іске қосылады}other{Chrome браузері # секундтан кейін қайта іске қосылады}}</translation> <translation id="3396977131400919238">Орнату барысында операциялық жүйе қатесі орын алды. Google Chrome қолданбасын қайта жүктеңіз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index 7198061..b99c76b0 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -127,6 +127,7 @@ <translation id="3245429137663807393">ನೀವು Chrome ಬಳಕೆಯ ವರದಿಗಳನ್ನು ಸಹ ಹಂಚಿಕೊಂಡರೆ, ಆ ವರದಿಗಳು ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ</translation> <translation id="3282568296779691940">Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="3286538390144397061">ಈಗ ಮರುಪ್ರಾರಂಭಿಸಿ</translation> +<translation id="3293912612584488930">Chrome ಮೂಲಕ ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಿ</translation> <translation id="3360895254066713204">Chrome ಸಹಾಯಕ</translation> <translation id="3379938682270551431">{0,plural, =0{ಇದೀಗ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}=1{1 ಸೆಕೆಂಡಿನಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> <translation id="3396977131400919238">ಸ್ಥಾಪನೆ ವೇಳೆ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂ ದೋಷವು ಸಂಭವಿಸಿದೆ. ದಯವಿಟ್ಟು Google Chrome ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಡೌನ್ಲೋಡ್ ಮಾಡಿ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 595f5b8..73510ca 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -130,6 +130,7 @@ <translation id="3245429137663807393">നിങ്ങൾ Chrome ഉപയോഗ റിപ്പോർട്ടുകളും പങ്കിടുന്നുവെങ്കിൽ ആ റിപ്പോർട്ടുകളിൽ നിങ്ങൾ സന്ദർശിക്കുന്ന URL-കളും ഉൾപ്പെടും</translation> <translation id="3282568296779691940">Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="3286538390144397061">ഇപ്പോള് പുനരാരംഭിക്കുക</translation> +<translation id="3293912612584488930">Chrome ഉപയോഗിച്ച് കൂടുതൽ കാര്യങ്ങൾ ചെയ്യൂ</translation> <translation id="3360895254066713204">Chrome സഹായി</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome ഇപ്പോൾ വീണ്ടും സമാരംഭിക്കും}=1{ഒരു സെക്കൻഡിൽ Chrome വീണ്ടും സമാരംഭിക്കും}other{# സെക്കൻഡിൽ Chrome വീണ്ടും സമാരംഭിക്കും}}</translation> <translation id="3396977131400919238">ഇന്സ്റ്റാള് ചെയ്യുന്ന സമയത്ത് ഒരു ഓപ്പറേറ്റിംഗ് സിസ്റ്റം പിശക് സംഭവിച്ചു. ദയവായി Google Chrome വീണ്ടും ഡൗൺലോഡ് ചെയ്യുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb index 5f6e9fd2..5be6bfac 100644 --- a/chrome/app/resources/google_chrome_strings_or.xtb +++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -69,7 +69,7 @@ <translation id="2131230230468101642">ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, ଆମେ ଆପଣଙ୍କ 4 ସପ୍ତାହରୁ ଅଧିକ ପୁରୁଣା ରୁଚିଗୁଡ଼ିକୁ ସ୍ୱତଃ-ଡିଲିଟ କରୁ। ଆପଣ ବ୍ରାଉଜ କରିବା ଜାରି ରଖିବା ସମୟରେ, ତାଲିକାରେ ଏକ ରୁଚି ପୁଣି ଦେଖାଯାଇପାରେ। କିମ୍ବା Chrome ଯେଉଁ ରୁଚିଗୁଡ଼ିକୁ ବିଚାରକୁ ନେଉ ବୋଲି ଆପଣ ଚାହୁଁନାହାଁନ୍ତି ସେଗୁଡ଼ିକୁ ଆପଣ କାଢ଼ିପାରିବେ।</translation> <translation id="2139300032719313227">ChromeOSକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation> <translation id="2151406531797534936">ଦୟାକରି ବର୍ତ୍ତମାନ Chrome ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation> -<translation id="2174917724755363426">ଇନଷ୍ଟଲେସନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନାହିଁ। ଆପଣ ବାତିଲ୍ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ?</translation> +<translation id="2174917724755363426">ଇନଷ୍ଟଲେସନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇନାହିଁ। ଆପଣ ବାତିଲ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ?</translation> <translation id="223889379102603431">Chrome ଏହାର ରୁଟ ସାର୍ଟିଫିକେଟଗୁଡ଼ିକୁ କିପରି ପରିଚାଳନା କରେ ସେ ବିଷୟରେ ସୂଚନା</translation> <translation id="2258103955319320201">ଆପଣଙ୍କ ସମସ୍ତ ଡିଭାଇସରେ ଆପଣଙ୍କର Chrome ବ୍ରାଉଜର ଷ୍ଟଫଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ସାଇନ ଇନ କରି ତା’ପରେ ସିଙ୍କ ଚାଲୁ କରନ୍ତୁ</translation> <translation id="2290014774651636340">Google API କୀ' ମିଳୁନାହିଁ। Google Chromeର କିଛି ପ୍ରକାର୍ଯ୍ୟ ଅକ୍ଷମ କରାଯିବ।</translation> @@ -198,7 +198,7 @@ <translation id="4600710005438004015">Chrome ନବୀନତମ ସଂସ୍କରଣରେ ଅପ୍ଡେଟ୍ କରିପାରିଲା ନାହିଁ, ତେଣୁ ଆପଣ ନୂତନ ବୈଶିଷ୍ଟ୍ୟ ଏବଂ ସୁରକ୍ଷା ସମସ୍ୟାର ସମାଧାନରୁ ବଞ୍ଚିତ ହେଉଛନ୍ତି।</translation> <translation id="4627412468266359539">ଇଚ୍ଛାଧୀନ: Googleକୁ ସ୍ୱଚାଳିତ ଭାବେ ଡାଏଗ୍ନୋଷ୍ଟିକ ଓ ବ୍ୟବହାର ଡାଟା ପଠାଇ ChromeOS Flex ଫିଚର ଓ ପରଫରମାନ୍ସକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ।</translation> <translation id="4633000520311261472">Chromeକୁ ଆହୁରି ସୁରକ୍ଷିତ କରିବା ପାଇଁ, ଆମେ <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />ରେ ତାଲିକାଭୁକ୍ତ ହୋଇନଥିବା ଏବଂ ଆପଣଙ୍କର ଅଜାଣତରେ ଯୋଗ କରାଯାଇଥିବା କିଛି ଏକ୍ସଟେନ୍ସନ୍ଗୁଡ଼ିକୁ ଅକ୍ଷମ କରିଦେଇଛୁ।</translation> -<translation id="4680828127924988555">ଇନଷ୍ଟଲେସନ ବାତିଲ୍ କରନ୍ତୁ</translation> +<translation id="4680828127924988555">ଇନଷ୍ଟଲେସନ ବାତିଲ କରନ୍ତୁ</translation> <translation id="469553575393225953">ଅଜଣା ସୋର୍ସରୁ ଏକ୍ସଟେନସନ, ଆପ ଏବଂ ଥିମଗୁଡ଼ିକ ଆପଣଙ୍କ ଡିଭାଇସକୁ କ୍ଷତି ପହଞ୍ଚାଇପାରିବ। କେବଳ Chrome Web Storeରୁ ସେଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ କରିବା ପାଇଁ Chrome ସୁପାରିଶ କରେ</translation> <translation id="4728575227883772061">ଅଣନିର୍ଦ୍ଧିଷ୍ଟିତ ତ୍ରୁଟି ଯୋଗୁଁ ସଂସ୍ଥାପନ ବିଫଳ ହେଲା । ଯଦି Google Chrome ବର୍ତ୍ତମାନ ଚାଲୁଛି, ଦୟାକରି ଏହାକୁ ବନ୍ଦ କରନ୍ତୁ ଏବଂ ପୁନଃ ଚେଷ୍ଟା କରନ୍ତୁ ।</translation> <translation id="4747730611090640388">Chrome ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଆକଳନ କରିପାରିବ। ପରେ, ଆପଣ ଭିଜିଟ କରୁଥିବା ଏକ ସାଇଟ, ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ପର୍ସନାଲାଇଜ କରିବା ପାଇଁ Chromeକୁ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ କହିପାରିବ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 4d88ec1..9992323d 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -125,6 +125,7 @@ <translation id="3245429137663807393">Jeśli udostępnisz także raporty o użytkowaniu Chrome, będą one zawierały odwiedzane przez Ciebie adresy URL.</translation> <translation id="3282568296779691940">Zaloguj się w Chrome</translation> <translation id="3286538390144397061">Uruchom ponownie teraz</translation> +<translation id="3293912612584488930">Chrome pozwala na więcej</translation> <translation id="3360895254066713204">Pomoc Chrome</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome uruchomi się ponownie teraz}=1{Chrome uruchomi się ponownie za 1 sekundę}few{Chrome uruchomi się ponownie za # sekundy}many{Chrome uruchomi się ponownie za # sekund}other{Chrome uruchomi się ponownie za # sekundy}}</translation> <translation id="3396977131400919238">Podczas instalacji wystąpił błąd systemu operacyjnego. Pobierz Google Chrome ponownie.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index a7e504a..e795667 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -126,6 +126,7 @@ <translation id="3245429137663807393">Se também partilhar relatórios de utilização do Chrome, esses relatórios incluem os URLs que visita</translation> <translation id="3282568296779691940">Iniciar sessão no Chrome</translation> <translation id="3286538390144397061">Reiniciar agora</translation> +<translation id="3293912612584488930">Faça mais com o Chrome</translation> <translation id="3360895254066713204">Ajudante do Chrome</translation> <translation id="3379938682270551431">{0,plural, =0{O Chrome será reiniciado agora}=1{O Chrome será reiniciado dentro de 1 segundo}other{O Chrome será reiniciado dentro de # segundos}}</translation> <translation id="3396977131400919238">Ocorreu um erro no sistema operativo durante a instalação. Descarregue de novo o Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index c6e61b0..e2e62ab 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -125,6 +125,7 @@ <translation id="3245429137663807393">Dacă trimiți rapoarte privind folosirea Chrome, acestea includ adresele URL pe care le accesezi</translation> <translation id="3282568296779691940">Conectează-te la Chrome</translation> <translation id="3286538390144397061">Repornește acum</translation> +<translation id="3293912612584488930">Fă mai multe cu Chrome</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome se va relansa acum}=1{Chrome se va relansa într-o secundă}few{Chrome se va relansa în # secunde}other{Chrome se va relansa în # de secunde}}</translation> <translation id="3396977131400919238">S-a produs o eroare de sistem de operare în timpul instalării. Descarcă din nou Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index aa08731f..25e6b87e 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -125,6 +125,7 @@ <translation id="3245429137663807393">Если вы также отправляете отчеты об использовании Chrome, в них включаются URL посещенных вами страниц.</translation> <translation id="3282568296779691940">Войти в Chrome</translation> <translation id="3286538390144397061">Перезапустить сейчас</translation> +<translation id="3293912612584488930">Больше возможностей в Chrome</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome перезапускается}=1{Chrome перезапустится через 1 секунду}one{Chrome перезапустится через # секунду}few{Chrome перезапустится через # секунды}many{Chrome перезапустится через # секунд}other{Chrome перезапустится через # секунды}}</translation> <translation id="3396977131400919238">При установке произошла ошибка операционной системы. Скачайте Google Chrome снова.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index cb627c4..39ac81fc 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -130,6 +130,7 @@ <translation id="3245429137663807393">Če delite tudi poročila o uporabi Chroma, so v teh poročilih vključeni URL-ji, ki jih obiščete.</translation> <translation id="3282568296779691940">Prijava v Chrome</translation> <translation id="3286538390144397061">Znova zaženi</translation> +<translation id="3293912612584488930">Opravite več s Chromom</translation> <translation id="3360895254066713204">Pomočnik za Chrome</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome se bo zdaj znova zagnal}=1{Chrome se bo znova zagnal čez eno sekundo}one{Chrome se bo znova zagnal čez # sekundo}two{Chrome se bo znova zagnal čez # sekundi}few{Chrome se bo znova zagnal čez # sekunde}other{Chrome se bo znova zagnal čez # sekund}}</translation> <translation id="3396977131400919238">Med namestitvijo je prišlo do napake v operacijskem sistemu. Ponovno prenesite program Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 569d228..fc8a844 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -129,6 +129,7 @@ <translation id="3245429137663807393">اگر آپ Chrome کے استعمال کی رپورٹس کا بھی اشتراک کرتے ہیں تو ان رپورٹس میں آپ کے ملاحظہ کردہ URLs شامل ہوں گے</translation> <translation id="3282568296779691940">Chrome میں سائن ان کریں</translation> <translation id="3286538390144397061">ابھی ری اسٹارٹ کریں</translation> +<translation id="3293912612584488930">Chrome کے ساتھ مزید بہت کچھ کریں</translation> <translation id="3360895254066713204">Chrome مدد کنندہ</translation> <translation id="3379938682270551431">{0,plural, =0{ابھی Chrome دوبارہ لانچ ہوگا}=1{1 سیکنڈ میں Chrome دوبارہ لانچ ہوگا}other{# سیکنڈ میں Chrome دوبارہ لانچ ہوگا}}</translation> <translation id="3396977131400919238">انسٹالیشن کے دوران آپریٹنگ سسٹم کی ایک خرابی پیش آ گئی۔ براہ کرم Google Chrome دوبارہ ڈاؤن لوڈ کریں۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index 0d15c87..c6389770 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -127,6 +127,7 @@ <translation id="3245429137663807393">Shuningdek, Chrome foydalanish statistikasini ham ulashsangiz, bu hisobotlarga siz tashrif qilgan URL manzillar ham kiradi</translation> <translation id="3282568296779691940">Chrome hisobiga kirish</translation> <translation id="3286538390144397061">Hozir qaytadan ishga tushirish</translation> +<translation id="3293912612584488930">Chrome imkoniyatlaridan maksimal foydalaning</translation> <translation id="3360895254066713204">Chrome Helper</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome hozir qayta ishga tushadi}=1{Chrome 1 soniyadan keyin qayta ishga tushadi}other{Chrome # soniyadan keyin qayta ishga tushadi}}</translation> <translation id="3396977131400919238">O‘rnatish mobaynida operatsion tizim xatoligi yuz berdi. Google Chrome’ni qaytadan yuklab oling.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 4221b20..c154a57a 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -125,6 +125,7 @@ <translation id="3245429137663807393">如果您还共享了 Chrome 使用情况报告,这些报告会包含您访问过的网址</translation> <translation id="3282568296779691940">登录 Chrome</translation> <translation id="3286538390144397061">立即重新启动</translation> +<translation id="3293912612584488930">Chrome 功能多,任您探索</translation> <translation id="3360895254066713204">Chrome 浏览器帮助应用</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome 将立即重新启动}=1{Chrome 将在 1 秒后重新启动}other{Chrome 将在 # 秒后重新启动}}</translation> <translation id="3396977131400919238">安装过程中出现操作系统错误。请重新下载 Google Chrome。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 2218d7d..7a04add 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -129,6 +129,7 @@ <translation id="3245429137663807393">如果您同時分享 Chrome 使用情況報告,這些報告將會包含您瀏覽的網址</translation> <translation id="3282568296779691940">登入 Chrome</translation> <translation id="3286538390144397061">立即重新啟動</translation> +<translation id="3293912612584488930">Chrome 讓你事半功倍</translation> <translation id="3360895254066713204">Chrome 輔助工具</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome 將立即重新啟動}=1{Chrome 將於 1 秒後重新啟動}other{Chrome 將於 # 秒後重新啟動}}</translation> <translation id="3396977131400919238">安裝過程中發生作業系統錯誤,請再次下載 Google Chrome。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index ff200e0..13dffbb0 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -126,6 +126,7 @@ <translation id="3245429137663807393">如果你一併提供 Chrome 使用報告,這些報告中會包含你造訪的網址</translation> <translation id="3282568296779691940">登入 Chrome</translation> <translation id="3286538390144397061">立即重新啟動</translation> +<translation id="3293912612584488930">Chrome 讓你事半功倍</translation> <translation id="3360895254066713204">Chrome 小幫手</translation> <translation id="3379938682270551431">{0,plural, =0{Chrome 將立即重新啟動}=1{Chrome 將在 1 秒後重新啟動}other{Chrome 將在 # 秒後重新啟動}}</translation> <translation id="3396977131400919238">安裝過程中發生作業系統錯誤,請再次下載 Google Chrome。</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index cc7851e..ff48993d 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2229,6 +2229,7 @@ "//components/policy/core/browser", "//components/policy/proto", "//components/power_bookmarks/core", + "//components/power_bookmarks/core:features", "//components/power_bookmarks/storage", "//components/pref_registry", "//components/prefs",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 687de6953..e73f774c 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -252,6 +252,7 @@ "+components/pdf/browser", "+components/pdf/common", "+components/policy", + "+components/power_bookmarks", "+components/power_metrics", "+components/pref_registry", "+components/prefs",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 7e5e9f67..f4267aac 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -130,6 +130,7 @@ #include "components/performance_manager/public/features.h" #include "components/permissions/features.h" #include "components/policy/core/common/features.h" +#include "components/power_bookmarks/core/power_bookmark_features.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "components/query_tiles/switches.h" #include "components/reading_list/features/reading_list_switches.h" @@ -967,6 +968,8 @@ }; const char kLacrosSelectionInternalName[] = "lacros-selection"; +const char kProjectorServerSideSpeechRecognition[] = + "enable-projector-server-side-speech-recognition"; const FeatureEntry::Choice kLacrosSelectionChoices[] = { {flags_ui::kGenericExperimentChoiceDefault, "", ""}, @@ -2721,29 +2724,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_ANDROID) -const FeatureEntry::FeatureParam kReadLaterUseRootBookmarkAsDefault[] = { - {"use_root_bookmark_as_default", "true"}}; -const FeatureEntry::FeatureParam kReadLaterInAppMenu[] = { - {"use_root_bookmark_as_default", "true"}, - {"reading_list_in_app_menu", "true"}, - {"allow_bookmark_type_swapping", "true"}}; -const FeatureEntry::FeatureParam kReadLaterSemiIntegrated[] = { - {"use_root_bookmark_as_default", "true"}, - {"allow_bookmark_type_swapping", "true"}}; -const FeatureEntry::FeatureParam kReadLaterNoCustomTab[] = { - {"use_root_bookmark_as_default", "true"}, - {"use_cct", "false"}}; - -const FeatureEntry::FeatureVariation kReadLaterVariations[] = { - {"(use root bookmark as default)", kReadLaterUseRootBookmarkAsDefault, - std::size(kReadLaterUseRootBookmarkAsDefault), nullptr}, - {"(with app menu item)", kReadLaterInAppMenu, - std::size(kReadLaterInAppMenu), nullptr}, - {"(bookmarks semi-integration)", kReadLaterSemiIntegrated, - std::size(kReadLaterSemiIntegrated), nullptr}, - {"(no custom tab)", kReadLaterNoCustomTab, std::size(kReadLaterNoCustomTab), - nullptr}}; - const FeatureEntry::FeatureParam kBookmarksRefreshVisuals[] = { {"bookmark_visuals_enabled", "true"}}; const FeatureEntry::FeatureParam kBookmarksRefreshCompactVisuals[] = { @@ -3477,6 +3457,10 @@ {"apn-revamp", flag_descriptions::kApnRevampName, flag_descriptions::kApnRevampDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kApnRevamp)}, + {"audio-ap-noise-cancellation", + flag_descriptions::kAudioAPNoiseCancellationName, + flag_descriptions::kAudioAPNoiseCancellationDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootAudioAPNoiseCancellation")}, {"audio-flexible-loopback", flag_descriptions::kAudioFlexibleLoopbackName, flag_descriptions::kAudioFlexibleLoopbackDescription, kOsCrOS, PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootAudioFlexibleLoopback")}, @@ -3795,6 +3779,12 @@ kOsCrOS, FEATURE_VALUE_TYPE( ash::features::kPolicyProvidedTrustAnchorsAllowedAtLockScreen)}, + {"time-of-day-screen-saver", flag_descriptions::kTimeOfDayScreenSaverName, + flag_descriptions::kTimeOfDayScreenSaverDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTimeOfDayScreenSaver)}, + {"time-of-day-wallpaper", flag_descriptions::kTimeOfDayWallpaperName, + flag_descriptions::kTimeOfDayWallpaperDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTimeOfDayWallpaper)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS) @@ -5650,14 +5640,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_ANDROID) - {flag_descriptions::kReadLaterFlagId, flag_descriptions::kReadLaterName, - flag_descriptions::kReadLaterDescription, kOsAndroid, - FEATURE_WITH_PARAMS_VALUE_TYPE(reading_list::switches::kReadLater, - kReadLaterVariations, - "Collections")}, -#endif - -#if BUILDFLAG(IS_ANDROID) {"read-later-reminder-notification", flag_descriptions::kReadLaterReminderNotificationName, flag_descriptions::kReadLaterReminderNotificationDescription, kOsAndroid, @@ -5914,13 +5896,6 @@ FEATURE_VALUE_TYPE(features::kAsyncDns)}, #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) -#if BUILDFLAG(IS_ANDROID) - {"download-auto-resumption-native", - flag_descriptions::kDownloadAutoResumptionNativeName, - flag_descriptions::kDownloadAutoResumptionNativeDescription, kOsAndroid, - FEATURE_VALUE_TYPE(download::features::kDownloadAutoResumptionNative)}, -#endif - {"enable-new-download-backend", flag_descriptions::kEnableNewDownloadBackendName, flag_descriptions::kEnableNewDownloadBackendDescription, kOsAll, @@ -8296,7 +8271,14 @@ flag_descriptions::kExtensionsMenuAccessControlName, flag_descriptions::kExtensionsMenuAccessControlDescription, kOsDesktop, FEATURE_VALUE_TYPE(extensions_features::kExtensionsMenuAccessControl)}, -#endif + +#if BUILDFLAG(IS_CHROMEOS_ASH) + {"extension-web-file-handlers", + flag_descriptions::kExtensionWebFileHandlersName, + flag_descriptions::kExtensionWebFileHandlersDescription, kOsCrOS, + FEATURE_VALUE_TYPE(extensions_features::kExtensionWebFileHandlers)}, +#endif // IS_CHROMEOS_ASH +#endif // ENABLE_EXTENSIONS {"canvas-oop-rasterization", flag_descriptions::kCanvasOopRasterizationName, flag_descriptions::kCanvasOopRasterizationDescription, kOsAll, @@ -8657,6 +8639,12 @@ {"enable-projector-app-debug", flag_descriptions::kProjectorAppDebugName, flag_descriptions::kProjectorAppDebugDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kProjectorAppDebug)}, + + {kProjectorServerSideSpeechRecognition, + flag_descriptions::kProjectorServerSideSpeechRecognitionName, + flag_descriptions::kProjectorServerSideSpeechRecognitionDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kInternalServerSideSpeechRecognition)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) {"web-sql-access", flag_descriptions::kWebSQLAccessName, @@ -9446,6 +9434,10 @@ FEATURE_VALUE_TYPE( autofill::features::kAutofillUpstreamUseAlternateSecureDataType)}, + {"power-bookmark-backend", flag_descriptions::kPowerBookmarkBackendName, + flag_descriptions::kPowerBookmarkBackendDescription, kOsAll, + FEATURE_VALUE_TYPE(power_bookmarks::kPowerBookmarkBackend)}, + // 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 @@ -9498,6 +9490,13 @@ const FeatureEntry& entry) { version_info::Channel channel = chrome::GetChannel(); #if BUILDFLAG(IS_CHROMEOS_ASH) + // enable-projector-server-side-speech-recognition is only available if + // the InternalServerSideSpeechRecognitionControl flag is enabled as well. + if (!strcmp(kProjectorServerSideSpeechRecognition, entry.internal_name)) { + return !ash::features:: + IsInternalServerSideSpeechRecognitionControlEnabled(); + } + // enable-ui-devtools is only available on for non Stable channels. if (!strcmp(ui_devtools::switches::kEnableUiDevTools, entry.internal_name) && channel == version_info::Channel::STABLE) { @@ -9614,7 +9613,7 @@ // explicitly built without it (b/228902194 for more info). if (!strcmp(kBluetoothUseFlossInternalName, entry.internal_name)) { return base::FeatureList::GetInstance()->IsFeatureOverriddenFromCommandLine( - floss::features::kFlossEnabled.name, + floss::features::kFlossIsAvailable.name, base::FeatureList::OVERRIDE_DISABLE_FEATURE); } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/accessibility/live_caption/live_caption_surface.cc b/chrome/browser/accessibility/live_caption/live_caption_surface.cc index 813687d..636d08ef 100644 --- a/chrome/browser/accessibility/live_caption/live_caption_surface.cc +++ b/chrome/browser/accessibility/live_caption/live_caption_surface.cc
@@ -9,7 +9,6 @@ #include "build/build_config.h" #include "chrome/browser/accessibility/caption_bubble_context_browser.h" #include "chrome/browser/accessibility/live_caption/live_caption_controller_factory.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
diff --git a/chrome/browser/android/reading_list/reading_list_manager_factory.cc b/chrome/browser/android/reading_list/reading_list_manager_factory.cc index 8f6ae24..8c7d22a1 100644 --- a/chrome/browser/android/reading_list/reading_list_manager_factory.cc +++ b/chrome/browser/android/reading_list/reading_list_manager_factory.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "chrome/browser/reading_list/android/empty_reading_list_manager.h" #include "chrome/browser/reading_list/android/reading_list_manager_impl.h" #include "chrome/browser/reading_list/reading_list_model_factory.h" #include "components/reading_list/features/reading_list_switches.h" @@ -34,9 +33,6 @@ KeyedService* ReadingListManagerFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { - if (!base::FeatureList::IsEnabled(reading_list::switches::kReadLater)) - return new EmptyReadingListManager(); - auto* reading_list_model = ReadingListModelFactory::GetForBrowserContext(context); return new ReadingListManagerImpl(reading_list_model);
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_decoder.cc b/chrome/browser/apps/app_service/app_icon/app_icon_decoder.cc index 6919bc61..f1e00aed 100644 --- a/chrome/browser/apps/app_service/app_icon/app_icon_decoder.cc +++ b/chrome/browser/apps/app_service/app_icon/app_icon_decoder.cc
@@ -7,7 +7,6 @@ #include "base/task/thread_pool.h" #include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h" #include "chrome/browser/image_decoder/image_decoder.h" -#include "chrome/browser/profiles/profile.h" #include "extensions/grit/extensions_browser_resources.h" #include "services/data_decoder/public/cpp/data_decoder.h" #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_util.cc b/chrome/browser/apps/app_service/app_icon/app_icon_util.cc index 1c0b3a9..fa712e7 100644 --- a/chrome/browser/apps/app_service/app_icon/app_icon_util.cc +++ b/chrome/browser/apps/app_service/app_icon/app_icon_util.cc
@@ -9,7 +9,6 @@ #include "base/strings/stringprintf.h" #include "base/task/thread_pool.h" #include "chrome/browser/apps/app_service/app_icon/dip_px_util.h" -#include "chrome/browser/profiles/profile.h" #include "ui/base/layout.h" #include "ui/gfx/geometry/size.h"
diff --git a/chrome/browser/apps/app_service/intent_util_unittest.cc b/chrome/browser/apps/app_service/intent_util_unittest.cc index d778d787..c205a84 100644 --- a/chrome/browser/apps/app_service/intent_util_unittest.cc +++ b/chrome/browser/apps/app_service/intent_util_unittest.cc
@@ -389,7 +389,7 @@ // Extension feature flag. base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature( - extensions_features::kWebFileHandlers); + extensions_features::kExtensionWebFileHandlers); // Create extension that provides file_handlers. extensions::ExtensionBuilder extension_builder("Test");
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc index 371429e5..fb02c32 100644 --- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc +++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos_browsertest.cc
@@ -35,7 +35,8 @@ : public extensions::ExtensionBrowserTest { public: ExtensionAppsChromeOsBrowserTest() { - feature_list_.InitAndEnableFeature(extensions_features::kWebFileHandlers); + feature_list_.InitAndEnableFeature( + extensions_features::kExtensionWebFileHandlers); } protected:
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc index e2817c6..26f187b 100644 --- a/chrome/browser/ash/accessibility/accessibility_manager.cc +++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -2537,17 +2537,39 @@ // Paths to TTS DLCs. static constexpr auto kTtsDlcTypeToSubDir = base::MakeFixedFlatMap<DlcType, base::StringPiece>( - {{DlcType::DLC_TYPE_TTSDEDE, "tts-de-de/"}, + {{DlcType::DLC_TYPE_TTSBNBD, "tts-bn-bd/"}, + {DlcType::DLC_TYPE_TTSCSCZ, "tts-cs-cz/"}, + {DlcType::DLC_TYPE_TTSDADK, "tts-da-dk/"}, + {DlcType::DLC_TYPE_TTSDEDE, "tts-de-de/"}, + {DlcType::DLC_TYPE_TTSELGR, "tts-el-gr/"}, + {DlcType::DLC_TYPE_TTSENAU, "tts-en-au/"}, + {DlcType::DLC_TYPE_TTSENGB, "tts-en-gb/"}, {DlcType::DLC_TYPE_TTSENUS, "tts-en-us/"}, {DlcType::DLC_TYPE_TTSESES, "tts-es-es/"}, {DlcType::DLC_TYPE_TTSESUS, "tts-es-us/"}, + {DlcType::DLC_TYPE_TTSFIFI, "tts-fi-fi/"}, + {DlcType::DLC_TYPE_TTSFILPH, "tts-fil-ph/"}, {DlcType::DLC_TYPE_TTSFRFR, "tts-fr-fr/"}, {DlcType::DLC_TYPE_TTSHIIN, "tts-hi-in/"}, + {DlcType::DLC_TYPE_TTSHUHU, "tts-hu-hu/"}, + {DlcType::DLC_TYPE_TTSIDID, "tts-id-id/"}, {DlcType::DLC_TYPE_TTSITIT, "tts-it-it/"}, {DlcType::DLC_TYPE_TTSJAJP, "tts-ja-jp/"}, + {DlcType::DLC_TYPE_TTSKMKH, "tts-km-kh/"}, + {DlcType::DLC_TYPE_TTSKOKR, "tts-ko-kr/"}, + {DlcType::DLC_TYPE_TTSNBNO, "tts-nb-no/"}, + {DlcType::DLC_TYPE_TTSNENP, "tts-ne-np/"}, {DlcType::DLC_TYPE_TTSNLNL, "tts-nl-nl/"}, + {DlcType::DLC_TYPE_TTSPLPL, "tts-pl-pl/"}, {DlcType::DLC_TYPE_TTSPTBR, "tts-pt-br/"}, - {DlcType::DLC_TYPE_TTSSVSE, "tts-sv-se/"}}); + {DlcType::DLC_TYPE_TTSSILK, "tts-si-lk/"}, + {DlcType::DLC_TYPE_TTSSKSK, "tts-sk-sk/"}, + {DlcType::DLC_TYPE_TTSSVSE, "tts-sv-se/"}, + {DlcType::DLC_TYPE_TTSTHTH, "tts-th-th/"}, + {DlcType::DLC_TYPE_TTSTRTR, "tts-tr-tr/"}, + {DlcType::DLC_TYPE_TTSUKUA, "tts-uk-ua/"}, + {DlcType::DLC_TYPE_TTSVIVN, "tts-vi-vn/"}, + {DlcType::DLC_TYPE_TTSYUEHK, "tts-yue-hk/"}}); if (!base::Contains(kTtsDlcTypeToSubDir, dlc)) { NOTREACHED();
diff --git a/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc b/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc index 67ab1c64..8560a83 100644 --- a/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc +++ b/chrome/browser/ash/accessibility/accessibility_manager_browsertest.cc
@@ -13,6 +13,7 @@ #include "base/functional/callback_helpers.h" #include "base/run_loop.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "chrome/browser/ash/accessibility/accessibility_test_utils.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" #include "chrome/browser/ash/login/session/user_session_manager.h" @@ -926,39 +927,33 @@ } IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, TtsDlcTypeToPath) { - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-de-de/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSDEDE)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-en-us/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSENUS)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-es-es/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSESES)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-es-us/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSESUS)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-fr-fr/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSFRFR)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-hi-in/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSHIIN)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-it-it/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSITIT)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-ja-jp/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSJAJP)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-nl-nl/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSNLNL)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-pt-br/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSPTBR)); - EXPECT_EQ( - base::FilePath("/run/imageloader/tts-sv-se/package/root/voice.zvoice"), - TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSSVSE)); + auto get_full_path = [](const std::string& locale) -> std::string { + return base::StringPrintf( + "/run/imageloader/tts-%s/package/root/voice.zvoice", locale.c_str()); + }; + + EXPECT_EQ(base::FilePath(get_full_path("de-de")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSDEDE)); + EXPECT_EQ(base::FilePath(get_full_path("en-us")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSENUS)); + EXPECT_EQ(base::FilePath(get_full_path("es-es")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSESES)); + EXPECT_EQ(base::FilePath(get_full_path("es-us")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSESUS)); + EXPECT_EQ(base::FilePath(get_full_path("fr-fr")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSFRFR)); + EXPECT_EQ(base::FilePath(get_full_path("hi-in")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSHIIN)); + EXPECT_EQ(base::FilePath(get_full_path("it-it")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSITIT)); + EXPECT_EQ(base::FilePath(get_full_path("ja-jp")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSJAJP)); + EXPECT_EQ(base::FilePath(get_full_path("nl-nl")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSNLNL)); + EXPECT_EQ(base::FilePath(get_full_path("pt-br")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSPTBR)); + EXPECT_EQ(base::FilePath(get_full_path("sv-se")), + TtsDlcTypeToPath(DlcType::DLC_TYPE_TTSSVSE)); } class AccessibilityManagerDlcTest : public AccessibilityManagerTest {
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc index 9dc1c2e6..85415b9f 100644 --- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc +++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -280,6 +280,11 @@ } IN_PROC_BROWSER_TEST_F(LoggedInSpokenFeedbackTest, NavigateNotificationCenter) { + // TODO: (b/270605638) test the revamped notification center. + if (base::FeatureList::IsEnabled(features::kQsRevamp)) { + return; + } + EnableChromeVox(); sm_.Call([this]() { @@ -912,6 +917,11 @@ // with parameterized tests). #if !defined(ADDRESS_SANITIZER) IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, NavigateSystemTray) { + // TODO: (b/270609503) test the revapmped power button. + if (base::FeatureList::IsEnabled(features::kQsRevamp)) { + return; + } + EnableChromeVox(); sm_.Call([this]() {
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc index e01a0f9..428fd66 100644 --- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc +++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -130,9 +130,14 @@ void DisplayOverlayController::SetEventTarget(views::Widget* overlay_widget, bool on_overlay) { - overlay_widget->GetNativeWindow()->SetEventTargetingPolicy( - on_overlay ? aura::EventTargetingPolicy::kTargetAndDescendants - : aura::EventTargetingPolicy::kNone); + auto* overlay_window = overlay_widget->GetNativeWindow(); + if (on_overlay) { + overlay_window->SetEventTargetingPolicy( + aura::EventTargetingPolicy::kTargetAndDescendants); + } else { + overlay_window->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone); + EnsureTaskWindowToFrontForViewMode(overlay_widget); + } } void DisplayOverlayController::AddNudgeView(views::Widget* overlay_widget) { @@ -169,8 +174,9 @@ } void DisplayOverlayController::RemoveNudgeView() { - if (!nudge_view_alpha_ && !nudge_view_) + if (!ShowingNudge()) { return; + } if (nudge_view_alpha_) { nudge_view_alpha_->parent()->RemoveChildViewT(nudge_view_alpha_); @@ -260,10 +266,13 @@ menu_entry_->RequestFocus(); } -void DisplayOverlayController::ClearFocusOnMenuEntry() { - if (!menu_entry_) +void DisplayOverlayController::ClearFocus() { + auto* widget = + views::Widget::GetWidgetForNativeWindow(touch_injector_->window()); + if (!widget) { return; - auto* focus_manager = menu_entry_->GetFocusManager(); + } + auto* focus_manager = widget->GetFocusManager(); if (focus_manager) focus_manager->ClearFocus(); } @@ -488,6 +497,7 @@ SetEventTarget(overlay_widget, /*on_overlay=*/true); break; case DisplayMode::kView: + ClearFocus(); RemoveEditMessage(); RemoveInputMenuView(); RemoveEditFinishView(); @@ -499,7 +509,6 @@ } AddInputMappingView(overlay_widget); AddMenuEntryView(overlay_widget); - ClearFocusOnMenuEntry(); if (touch_injector_->show_nudge()) AddNudgeView(overlay_widget); SetEventTarget(overlay_widget, /*on_overlay=*/false); @@ -634,7 +643,7 @@ } void DisplayOverlayController::OnMouseEvent(ui::MouseEvent* event) { - if ((display_mode_ == DisplayMode::kView && !nudge_view_) || + if ((display_mode_ == DisplayMode::kView && !ShowingNudge()) || event->type() != ui::ET_MOUSE_PRESSED) { return; } @@ -643,7 +652,7 @@ } void DisplayOverlayController::OnTouchEvent(ui::TouchEvent* event) { - if ((display_mode_ == DisplayMode::kView && !nudge_view_) || + if ((display_mode_ == DisplayMode::kView && !ShowingNudge()) || event->type() != ui::ET_TOUCH_PRESSED) { return; } @@ -721,8 +730,9 @@ void DisplayOverlayController::ProcessPressedEvent( const ui::LocatedEvent& event) { - if (!action_edit_menu_ && !message_ && !input_menu_view_ && !nudge_view_) + if (!action_edit_menu_ && !message_ && !input_menu_view_ && !ShowingNudge()) { return; + } auto root_location = event.root_location(); // Convert the LocatedEvent root location to screen location. @@ -749,8 +759,9 @@ } // Dismiss the nudge, regardless where the click was. - if (nudge_view_) + if (ShowingNudge()) { OnNudgeDismissed(); + } } void DisplayOverlayController::SetMenuEntryHoverState(bool curr_hover_state) { @@ -758,6 +769,34 @@ menu_entry_->ChangeHoverState(curr_hover_state); } +void DisplayOverlayController::EnsureTaskWindowToFrontForViewMode( + views::Widget* overlay_widget) { + DCHECK(overlay_widget); + DCHECK(overlay_widget->GetNativeWindow()); + DCHECK_EQ(overlay_widget->GetNativeWindow()->event_targeting_policy(), + aura::EventTargetingPolicy::kNone); + + auto* shell_surface_base = + exo::GetShellSurfaceBaseForWindow(touch_injector_->window()); + DCHECK(shell_surface_base); + auto* host_window = shell_surface_base->host_window(); + DCHECK(host_window); + const auto& children = host_window->children(); + if (children.size() > 0u) { + // First child is the root ExoSurface window. Focus on the root surface + // window can bring the task window to the front of the task stack. + if (!children[0]->HasFocus()) { + children[0]->Focus(); + } + } else { + host_window->Focus(); + } +} + +bool DisplayOverlayController::ShowingNudge() { + return nudge_view_ || nudge_view_alpha_; +} + void DisplayOverlayController::DismissEducationalViewForTesting() { OnEducationalViewDismissed(); }
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h index 9b01f12..2bb52a5 100644 --- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h +++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
@@ -128,7 +128,7 @@ void OnMenuEntryPositionChanged(bool leave_focus, absl::optional<gfx::Point> location); void FocusOnMenuEntry(); - void ClearFocusOnMenuEntry(); + void ClearFocus(); void RemoveInputMenuView(); void AddInputMappingView(views::Widget* overlay_widget); @@ -166,6 +166,13 @@ // of their view bounds. void ProcessPressedEvent(const ui::LocatedEvent& event); + // When the input is processed on overlay in edit mode, PlaceholderActivity + // task window becomes the front task window. This ensures the target task + // window is moved back to the front of task stack on ARC side for view mode. + void EnsureTaskWindowToFrontForViewMode(views::Widget* overlay_widget); + + bool ShowingNudge(); + // For test: gfx::Rect GetInputMappingViewBoundsForTesting(); void DismissEducationalViewForTesting();
diff --git a/chrome/browser/ash/arc/vmm/arc_vmm_manager.cc b/chrome/browser/ash/arc/vmm/arc_vmm_manager.cc index 9a9627c..f2df896 100644 --- a/chrome/browser/ash/arc/vmm/arc_vmm_manager.cc +++ b/chrome/browser/ash/arc/vmm/arc_vmm_manager.cc
@@ -37,7 +37,6 @@ ~ArcVmmManagerFactory() override = default; }; -constexpr auto kSwapOutDelay = base::Seconds(3); } // namespace // static @@ -57,6 +56,19 @@ if (base::FeatureList::IsEnabled(kVmmSwapKeyboardShortcut)) { accelerator_ = std::make_unique<AcceleratorTarget>(this); } + if (base::FeatureList::IsEnabled(kVmmSwapPolicy)) { + swap_out_delay_ = base::Seconds(kVmmSwapOutDelaySecond.Get()); + scheduler_ = std::make_unique<ArcVmmSwapScheduler>( + base::Seconds(kVmmSwapOutTimeIntervalSecond.Get()), + base::Seconds(kVmmSwapArcSilenceIntervalSecond.Get()), + base::BindRepeating([]() { + // TODO(sstan): Placeholder for ARC side implementation. + return false; + }), + base::BindRepeating(&ArcVmmManager::SetSwapState, + weak_ptr_factory_.GetWeakPtr())); + scheduler_->Start(); + } } ArcVmmManager::~ArcVmmManager() = default; @@ -108,7 +120,7 @@ void ArcVmmManager::PostWithSwapDelay(base::OnceClosure callback) { base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, std::move(callback), kSwapOutDelay); + FROM_HERE, std::move(callback), swap_out_delay_); } // ArcVmmManager::AcceleratorTarget --------------------------------------------
diff --git a/chrome/browser/ash/arc/vmm/arc_vmm_manager.h b/chrome/browser/ash/arc/vmm/arc_vmm_manager.h index fe84730..b7029635 100644 --- a/chrome/browser/ash/arc/vmm/arc_vmm_manager.h +++ b/chrome/browser/ash/arc/vmm/arc_vmm_manager.h
@@ -8,6 +8,7 @@ #include <string> #include "base/functional/callback_forward.h" +#include "chrome/browser/ash/arc/vmm/arc_vmm_swap_scheduler.h" #include "chromeos/ash/components/dbus/concierge/concierge_service.pb.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/browser_context.h" @@ -51,9 +52,17 @@ void PostWithSwapDelay(base::OnceClosure callback); + // The default delay from swap enabled and swap out. Basically it's used for + // keyboard swap. In finch, it will be replaced by the flag parameter. + base::TimeDelta swap_out_delay_ = base::Seconds(3); + // Accelerator for experimental usage. Always behind the feature flag. std::unique_ptr<AcceleratorTarget> accelerator_; + // Swap request scheduler for experimental usage. Always behind the feature + // flag and parameters. + std::unique_ptr<ArcVmmSwapScheduler> scheduler_; + std::string user_id_hash_; base::WeakPtrFactory<ArcVmmManager> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc b/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc index bee5535f..502bedb 100644 --- a/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc +++ b/chrome/browser/ash/drive/fileapi/drivefs_async_file_util.cc
@@ -173,16 +173,15 @@ return; } - if (ash::features::IsDriveFsBulkPinningEnabled()) { - if (drive_->GetRelativeDrivePath(path_, &drive_path_)) { - // TODO(b/266168982): In the case this is a folder, only the folder will - // get unpinned leaving all the children pinned. When the new method is - // exposed (or parameter on the existing method) update the - // implementation here. - drive_->GetDriveFsInterface()->GetMetadata( - drive_path_, base::BindOnce(&DeleteOperation::OnGotMetadata, this)); - return; - } + if (drive_->GetPinManager() && + drive_->GetRelativeDrivePath(path_, &drive_path_)) { + // TODO(b/266168982): In the case this is a folder, only the folder will + // get unpinned leaving all the children pinned. When the new method is + // exposed (or parameter on the existing method) update the + // implementation here. + drive_->GetDriveFsInterface()->GetMetadata( + drive_path_, base::BindOnce(&DeleteOperation::OnGotMetadata, this)); + return; } blocking_task_runner_->PostTask( @@ -195,6 +194,8 @@ void OnGotMetadata(const drive::FileError error, const drivefs::mojom::FileMetadataPtr metadata) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + if (error == drive::FILE_ERROR_OK) { DCHECK(metadata); id_ = Id(metadata->stable_id);
diff --git a/chrome/browser/ash/file_manager/app_service_file_tasks_unittest.cc b/chrome/browser/ash/file_manager/app_service_file_tasks_unittest.cc index 7df9984..638d182 100644 --- a/chrome/browser/ash/file_manager/app_service_file_tasks_unittest.cc +++ b/chrome/browser/ash/file_manager/app_service_file_tasks_unittest.cc
@@ -690,7 +690,8 @@ class AppServiceFileHandlersTest : public AppServiceFileTasksTestEnabled { public: AppServiceFileHandlersTest() { - feature_list_.InitAndEnableFeature(extensions_features::kWebFileHandlers); + feature_list_.InitAndEnableFeature( + extensions_features::kExtensionWebFileHandlers); } private:
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc index 8e66f4b..11b54394 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -2173,7 +2173,8 @@ TestCase("searchWithRecencyOptions").EnableSearchV2(), TestCase("searchRemovableDevice").EnableSearchV2(), TestCase("resetSearchOptionsOnFolderChange").EnableSearchV2(), - TestCase("showSearchResultMessageWhenSearching").EnableSearchV2() + TestCase("showSearchResultMessageWhenSearching").EnableSearchV2(), + TestCase("showsEducationNudge").EnableSearchV2() // TODO(b/189173190): Enable // TestCase("searchQueryLaunchParam") ));
diff --git a/chrome/browser/ash/file_manager/file_manager_string_util.cc b/chrome/browser/ash/file_manager/file_manager_string_util.cc index f9246ab..3dfa8b11 100644 --- a/chrome/browser/ash/file_manager/file_manager_string_util.cc +++ b/chrome/browser/ash/file_manager/file_manager_string_util.cc
@@ -829,6 +829,8 @@ SET_STRING("SEARCH_NO_MATCHING_RESULTS_DESC", IDS_FILE_BROWSER_SEARCH_NO_MATCHING_RESULTS_DESC); SET_STRING("SEARCH_RESULTS_LABEL", IDS_FILE_BROWSER_SEARCH_RESULTS_LABEL); + SET_STRING("SEARCH_V2_EDUCATION_NUDGE", + IDS_FILE_BROWSER_SEARCH_V2_EDUCATION_NUDGE); SET_STRING("SELECT_ALL_COMMAND_LABEL", IDS_FILE_BROWSER_SELECT_ALL_COMMAND_LABEL);
diff --git a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc index 08f4bc1..abdbfc1 100644 --- a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
@@ -849,9 +849,9 @@ } } -class ManagedAccount : public TestAccountBrowserTest { +class EnterpriseAccount : public TestAccountBrowserTest { public: - ManagedAccount() + EnterpriseAccount() : TestAccountBrowserTest(kEnterprise, /*is_google_account=*/false) { feature_list_.InitAndEnableFeature(ash::features::kUploadOfficeToCloud); } @@ -860,13 +860,29 @@ base::test::ScopedFeatureList feature_list_; }; -// Tests that a |IsEligibleAndEnabledUploadOfficeToCloud| returns false when a -// managed user is logged in and |kUploadOfficeToCloud| is enabled. -IN_PROC_BROWSER_TEST_F(ManagedAccount, +// Tests that a |IsEligibleAndEnabledUploadOfficeToCloud| returns false when an +// enterprise user is logged in and |kUploadOfficeToCloud| is enabled. +IN_PROC_BROWSER_TEST_F(EnterpriseAccount, IsEligibleAndEnabledUploadOfficeToCloud) { ASSERT_FALSE(ash::cloud_upload::IsEligibleAndEnabledUploadOfficeToCloud()); } +class ChildAccount : public TestAccountBrowserTest { + public: + ChildAccount() : TestAccountBrowserTest(kChild, /*is_google_account=*/false) { + feature_list_.InitAndEnableFeature(ash::features::kUploadOfficeToCloud); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Tests that a |IsEligibleAndEnabledUploadOfficeToCloud| returns false when a +// child user is logged in and |kUploadOfficeToCloud| is enabled. +IN_PROC_BROWSER_TEST_F(ChildAccount, IsEligibleAndEnabledUploadOfficeToCloud) { + ASSERT_FALSE(ash::cloud_upload::IsEligibleAndEnabledUploadOfficeToCloud()); +} + class GoogleAccount : public TestAccountBrowserTest { public: GoogleAccount()
diff --git a/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc b/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc index 3f1d151..2e86165 100644 --- a/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc
@@ -254,7 +254,8 @@ histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Tos", 0); } -IN_PROC_BROWSER_TEST_F(PublicSessionTosScreenTest, Accepted) { +// TODO(crbug.com/1418704) flaky. +IN_PROC_BROWSER_TEST_F(PublicSessionTosScreenTest, DISABLED_Accepted) { SetUpTermsOfServiceUrlPolicy(); StartPublicSession();
diff --git a/chrome/browser/ash/net/apn_migrator.cc b/chrome/browser/ash/net/apn_migrator.cc index 4881d92b..2a4a5f0 100644 --- a/chrome/browser/ash/net/apn_migrator.cc +++ b/chrome/browser/ash/net/apn_migrator.cc
@@ -97,8 +97,7 @@ const base::Value::List* apn_list) { network_configuration_handler_->SetProperties( network.path(), - base::Value( - chromeos::network_config::UserApnListToOnc(network.guid(), apn_list)), + chromeos::network_config::UserApnListToOnc(network.guid(), apn_list), base::BindOnce(&OnSetShillUserApnListSuccess), base::BindOnce(&OnSetShillUserApnListFailure, network.guid())); }
diff --git a/chrome/browser/ash/net/apn_migrator_unittest.cc b/chrome/browser/ash/net/apn_migrator_unittest.cc index b74065f0..731cbba 100644 --- a/chrome/browser/ash/net/apn_migrator_unittest.cc +++ b/chrome/browser/ash/net/apn_migrator_unittest.cc
@@ -190,12 +190,13 @@ .Times(0); base::Value::Dict expected_onc1 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid1, /*user_apn_list=*/nullptr); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_1, - Truly([&expected_onc1](const base::Value& value) { - return expected_onc1 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_1, + Truly([&expected_onc1](const base::Value::Dict& value) { + return expected_onc1 == value; + }), + _, _)) .Times(1); // Ensure that the function does not modify the non-migrated network. @@ -270,32 +271,35 @@ // empty user APN lists. base::Value::Dict expected_onc_1 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid1, &empty_apn_list); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_1, - Truly([&expected_onc_1](const base::Value& value) { - return expected_onc_1 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_1, + Truly([&expected_onc_1](const base::Value::Dict& value) { + return expected_onc_1 == value; + }), + _, _)) .Times(1); base::Value::Dict expected_onc_2 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid2, &empty_apn_list); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_2, - Truly([&expected_onc_2](const base::Value& value) { - return expected_onc_2 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_2, + Truly([&expected_onc_2](const base::Value::Dict& value) { + return expected_onc_2 == value; + }), + _, _)) .Times(1); // Verify that Shill receives the user APNs for the third list. base::Value::Dict expected_onc_3 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid3, &populated_apn_list); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_3, - Truly([&expected_onc_3](const base::Value& value) { - return expected_onc_3 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_3, + Truly([&expected_onc_3](const base::Value::Dict& value) { + return expected_onc_3 == value; + }), + _, _)) .Times(1); // Function under test. @@ -335,21 +339,23 @@ // The function should only update Shill with empty user APN lists. base::Value::Dict expected_onc_1 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid1, &empty_apn_list); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_1, - Truly([&expected_onc_1](const base::Value& value) { - return expected_onc_1 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_1, + Truly([&expected_onc_1](const base::Value::Dict& value) { + return expected_onc_1 == value; + }), + _, _)) .Times(1); base::Value::Dict expected_onc_2 = chromeos::network_config::UserApnListToOnc( kTestCellularGuid2, &empty_apn_list); - EXPECT_CALL(*managed_network_configuration_handler(), - SetProperties(cellular_service_path_2, - Truly([&expected_onc_2](const base::Value& value) { - return expected_onc_2 == value.GetDict(); - }), - _, _)) + EXPECT_CALL( + *managed_network_configuration_handler(), + SetProperties(cellular_service_path_2, + Truly([&expected_onc_2](const base::Value::Dict& value) { + return expected_onc_2 == value; + }), + _, _)) .Times(1); // All network should be marked as migrated
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc index f005cc7..43ea0abb 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
@@ -90,13 +90,13 @@ onc::network_config::kSourceDevice); if (!network_state || !network_state->IsInProfile()) { managed_network_configuration_handler()->CreateConfiguration( - kDeviceUserHash, network, + kDeviceUserHash, network.GetDict(), base::BindOnce([](const std::string&, const std::string&) { }).Then(std::move(success_callback)), base::BindOnce(&PrintError).Then(std::move(failure_callback))); } else if (network_state) { managed_network_configuration_handler()->SetProperties( - network_state->path(), network, std::move(success_callback), + network_state->path(), network.GetDict(), std::move(success_callback), base::BindOnce(&PrintError).Then(std::move(failure_callback))); } } @@ -130,7 +130,7 @@ rollback_network_config::ManagedOncCollapseToUiData(&ui_data); managed_network_configuration_handler()->SetProperties( - network_state->path(), ui_data, base::DoNothing(), + network_state->path(), ui_data.GetDict(), base::DoNothing(), base::BindOnce(&PrintError)); }
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc index 08b98ac..f180d9f5 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc
@@ -193,7 +193,7 @@ void SetUpDeviceWideNetworkConfig(const base::Value& config) { base::test::TestFuture<const std::string&, const std::string&> result; managed_network_configuration_handler()->CreateConfiguration( - kDeviceUserHash, config, result.GetCallback(), + kDeviceUserHash, config.GetDict(), result.GetCallback(), base::BindOnce(&PrintErrorAndFail)); ASSERT_TRUE(result.Wait()) << "Failed to configure " << config; } @@ -207,7 +207,7 @@ base::test::TestFuture<void> signal; managed_network_configuration_handler()->SetProperties( - network_state->path(), config, signal.GetCallback(), + network_state->path(), config.GetDict(), signal.GetCallback(), base::BindOnce(&PrintErrorAndFail)); ASSERT_TRUE(signal.Wait()) << "Failed to set " << config << " for " << guid; }
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc index 30a7072..ad1f543 100644 --- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc +++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
@@ -234,18 +234,18 @@ // Validate the ONC dictionary. We are liberal and ignore unknown field // names and ignore invalid field names in kRecommended arrays. chromeos::onc::Validator validator( - false, // Ignore unknown fields. - false, // Ignore invalid recommended field names. - true, // Fail on missing fields. - true, // Validate for managed ONC. - true); // Log warnings. + /*error_on_unknown_field=*/false, + /*error_on_wrong_recommended=*/false, + /*error_on_missing_field=*/true, + /*managed_onc=*/true, + /*log_warnings=*/true); validator.SetOncSource(onc_source_); // ONC policies are always unencrypted. chromeos::onc::Validator::Result validation_result; validator.ValidateAndRepairObject( - &chromeos::onc::kToplevelConfigurationSignature, - base::Value(std::move(*root_dict)), &validation_result); + &chromeos::onc::kToplevelConfigurationSignature, root_dict.value(), + &validation_result); // Pass error/warning message and non-localized debug_info to PolicyErrorMap. std::vector<base::StringPiece> messages; @@ -328,9 +328,9 @@ // Placeholder to insert in place of the filtered setting. const char kPlaceholder[] = "********"; - base::Value toplevel_dict = chromeos::onc::MaskCredentialsInOncObject( - chromeos::onc::kToplevelConfigurationSignature, - base::Value(std::move(*config_dict)), kPlaceholder); + base::Value::Dict toplevel_dict = chromeos::onc::MaskCredentialsInOncObject( + chromeos::onc::kToplevelConfigurationSignature, config_dict.value(), + kPlaceholder); std::string json_string; base::JSONWriter::WriteWithOptions(
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager_unittest.cc index b265ceb..ed580a8 100644 --- a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager_unittest.cc +++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_manager_unittest.cc
@@ -234,7 +234,7 @@ BuildReport(); EXPECT_CALL(cloud_policy_client_, - UploadAppInstallReport_(MatchEvents(&events_value_), _)) + UploadAppInstallReport(MatchEvents(&events_value_), _)) .WillOnce(MoveArg<1>(callback)); } @@ -248,9 +248,9 @@ BuildReport(); EXPECT_CALL(cloud_policy_client_, - UploadAppInstallReport_(MatchEvents(&events_value_), _)) - .WillOnce(Invoke([](base::Value::Dict&, - CloudPolicyClient::ResultCallback& callback) { + UploadAppInstallReport(MatchEvents(&events_value_), _)) + .WillOnce(Invoke([](base::Value::Dict, + CloudPolicyClient::ResultCallback callback) { std::move(callback).Run(CloudPolicyClient::Result(DM_STATUS_SUCCESS)); })); }
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc index fe31ecd..4a27f5e6 100644 --- a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc +++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc
@@ -110,7 +110,7 @@ } void CompleteSerialize() { - EXPECT_CALL(delegate_, SerializeForUpload_(_)) + EXPECT_CALL(delegate_, SerializeForUpload_) .WillOnce(WithArgs<0>(Invoke( [=](ArcAppInstallEventLogUploader::Delegate::SerializationCallback& callback) { std::move(callback).Run(&log_); }))); @@ -119,8 +119,7 @@ void CaptureSerialize( ArcAppInstallEventLogUploader::Delegate::SerializationCallback* callback) { - EXPECT_CALL(delegate_, SerializeForUpload_(_)) - .WillOnce(MoveArg<0>(callback)); + EXPECT_CALL(delegate_, SerializeForUpload_).WillOnce(MoveArg<0>(callback)); } void CompleteUpload(bool success) { @@ -130,9 +129,9 @@ value_report_ = RealtimeReportingJobConfiguration::BuildReport( std::move(events), std::move(context)); - EXPECT_CALL(client_, UploadAppInstallReport_(MatchValue(&value_report_), _)) - .WillOnce(WithArgs<1>( - Invoke([=](CloudPolicyClient::ResultCallback& callback) { + EXPECT_CALL(client_, UploadAppInstallReport(MatchValue(&value_report_), _)) + .WillOnce( + WithArgs<1>(Invoke([=](CloudPolicyClient::ResultCallback callback) { std::move(callback).Run(CloudPolicyClient::Result( success ? DM_STATUS_SUCCESS : DM_STATUS_TEMPORARY_UNAVAILABLE)); @@ -147,7 +146,7 @@ std::move(events), std::move(context)); CloudPolicyClient::StatusCallback status_callback; - EXPECT_CALL(client_, UploadAppInstallReport_(MatchValue(&value_report_), _)) + EXPECT_CALL(client_, UploadAppInstallReport(MatchValue(&value_report_), _)) .WillOnce(MoveArg<1>(callback)); } @@ -198,12 +197,12 @@ uploader_->RequestUpload(); Mock::VerifyAndClearExpectations(&delegate_); - EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0); + EXPECT_CALL(delegate_, SerializeForUpload_).Times(0); uploader_->RequestUpload(); Mock::VerifyAndClearExpectations(&delegate_); EXPECT_CALL(delegate_, OnUploadSuccess()); - EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0); + EXPECT_CALL(delegate_, SerializeForUpload_).Times(0); std::move(status_callback).Run(CloudPolicyClient::Result(DM_STATUS_SUCCESS)); } @@ -221,7 +220,7 @@ uploader_->RequestUpload(); Mock::VerifyAndClearExpectations(&delegate_); - EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0); + EXPECT_CALL(delegate_, SerializeForUpload_).Times(0); uploader_->RequestUpload(); Mock::VerifyAndClearExpectations(&delegate_); @@ -247,7 +246,7 @@ uploader_->CancelUpload(); Mock::VerifyAndClearExpectations(&client_); - EXPECT_CALL(client_, UploadAppInstallReport_(_, _)).Times(0); + EXPECT_CALL(client_, UploadAppInstallReport).Times(0); EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0); std::move(serialization_callback).Run(&log_); } @@ -342,7 +341,7 @@ TEST_F(ArcAppInstallEventLogUploaderTest, RequestRegisterSerializeAndUpload) { CreateUploader(); - EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0); + EXPECT_CALL(delegate_, SerializeForUpload_).Times(0); uploader_->RequestUpload(); Mock::VerifyAndClearExpectations(&delegate_); @@ -397,7 +396,7 @@ UnregisterClient(); Mock::VerifyAndClearExpectations(&client_); - EXPECT_CALL(client_, UploadAppInstallReport_(_, _)).Times(0); + EXPECT_CALL(client_, UploadAppInstallReport).Times(0); EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0); std::move(serialization_callback).Run(&log_); Mock::VerifyAndClearExpectations(&delegate_); @@ -436,7 +435,7 @@ CaptureSerialize(&serialization_callback_2); RegisterClient(); - EXPECT_CALL(client_, UploadAppInstallReport_(_, _)).Times(0); + EXPECT_CALL(client_, UploadAppInstallReport).Times(0); EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0); std::move(serialization_callback_1).Run(&log_); Mock::VerifyAndClearExpectations(&delegate_);
diff --git a/chrome/browser/ash/policy/uploading/heartbeat_scheduler_unittest.cc b/chrome/browser/ash/policy/uploading/heartbeat_scheduler_unittest.cc index 1f4deba..31ae9c1 100644 --- a/chrome/browser/ash/policy/uploading/heartbeat_scheduler_unittest.cc +++ b/chrome/browser/ash/policy/uploading/heartbeat_scheduler_unittest.cc
@@ -384,7 +384,7 @@ // Verifies that GCM id update request was sent after GCM registration. cloud_policy_client_.SetDMToken(kDMToken); CloudPolicyClient::StatusCallback callback; - EXPECT_CALL(cloud_policy_client_, UpdateGcmId_(kRegistrationId, _)) + EXPECT_CALL(cloud_policy_client_, UpdateGcmId(kRegistrationId, _)) .WillOnce(MoveArg<1>(&callback)); // Enable heartbeats. @@ -408,7 +408,7 @@ cloud_policy_client_.SetDMToken(kDMToken); EXPECT_CALL(gcm_driver_, RegisterImpl(kHeartbeatGCMAppID, _)) .Times(AnyNumber()); - EXPECT_CALL(cloud_policy_client_, UpdateGcmId_(kRegistrationId, _)); + EXPECT_CALL(cloud_policy_client_, UpdateGcmId(kRegistrationId, _)); // GCM connected event before the registration should be ignored. scoped_testing_cros_settings_.device_settings()->SetBoolean(
diff --git a/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc b/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc index 164de90..1355905 100644 --- a/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc +++ b/chrome/browser/ash/policy/uploading/status_uploader_unittest.cc
@@ -112,7 +112,7 @@ // Running the status collected callback should trigger // CloudPolicyClient::UploadDeviceStatus. CloudPolicyClient::ResultCallback callback; - EXPECT_CALL(client_, UploadDeviceStatus_).WillOnce(MoveArg<3>(&callback)); + EXPECT_CALL(client_, UploadDeviceStatus).WillOnce(MoveArg<3>(&callback)); // Send some "valid" (read: non-nullptr) device/session data to the // callback in order to simulate valid status data. @@ -260,7 +260,7 @@ // Running the status collected callback should trigger // CloudPolicyClient::UploadDeviceStatus. CloudPolicyClient::ResultCallback callback; - EXPECT_CALL(client_, UploadDeviceStatus_).WillOnce(MoveArg<3>(&callback)); + EXPECT_CALL(client_, UploadDeviceStatus).WillOnce(MoveArg<3>(&callback)); // Send some "valid" (read: non-nullptr) device/session data to the // callback in order to simulate valid status data.
diff --git a/chrome/browser/ash/policy/value_validation/onc_policy_value_validator_base.h b/chrome/browser/ash/policy/value_validation/onc_policy_value_validator_base.h index 2e340e2e..d5583b4 100644 --- a/chrome/browser/ash/policy/value_validation/onc_policy_value_validator_base.h +++ b/chrome/browser/ash/policy/value_validation/onc_policy_value_validator_base.h
@@ -50,16 +50,16 @@ } chromeos::onc::Validator validator( - false, // Ignore unknown fields. - false, // Ignore invalid recommended field names. - true, // Fail on missing fields. - true, // Validate for managed ONC. - true); // Log warnings. + /*error_on_unknown_field=*/false, + /*error_on_wrong_recommended=*/false, + /*error_on_missing_field=*/true, + /*managed_onc=*/true, + /*log_warnings=*/true); validator.SetOncSource(source_); chromeos::onc::Validator::Result validation_result; validator.ValidateAndRepairObject( - &chromeos::onc::kToplevelConfigurationSignature, - base::Value(std::move(*root_dict)), &validation_result); + &chromeos::onc::kToplevelConfigurationSignature, root_dict.value(), + &validation_result); bool error_found = false; for (const chromeos::onc::Validator::ValidationIssue& issue :
diff --git a/chrome/browser/ash/shutdown_policy_browsertest.cc b/chrome/browser/ash/shutdown_policy_browsertest.cc index 42e19b5..dd4daf9 100644 --- a/chrome/browser/ash/shutdown_policy_browsertest.cc +++ b/chrome/browser/ash/shutdown_policy_browsertest.cc
@@ -5,6 +5,7 @@ #include <memory> #include <string> +#include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/login_status.h" #include "ash/public/cpp/ash_view_ids.h" @@ -55,17 +56,17 @@ } // namespace -class ShutdownPolicyBaseTest - : public policy::DevicePolicyCrosBrowserTest, - public DeviceSettingsService::Observer { +class ShutdownPolicyBaseTest : public policy::DevicePolicyCrosBrowserTest, + public DeviceSettingsService::Observer { protected: ShutdownPolicyBaseTest() {} ~ShutdownPolicyBaseTest() override {} // DeviceSettingsService::Observer: void DeviceSettingsUpdated() override { - if (run_loop_) + if (run_loop_) { run_loop_->Quit(); + } } // policy::DevicePolicyCrosBrowserTest: @@ -99,8 +100,9 @@ ASSERT_TRUE(oobe_ui); base::RunLoop run_loop; const bool oobe_ui_ready = oobe_ui->IsJSReady(run_loop.QuitClosure()); - if (!oobe_ui_ready) + if (!oobe_ui_ready) { run_loop.Run(); + } } bool result_; @@ -108,8 +110,7 @@ std::unique_ptr<SystemTrayTestApi> tray_test_api_; }; -class ShutdownPolicyInSessionTest - : public ShutdownPolicyBaseTest { +class ShutdownPolicyInSessionTest : public ShutdownPolicyBaseTest { public: ShutdownPolicyInSessionTest(const ShutdownPolicyInSessionTest&) = delete; ShutdownPolicyInSessionTest& operator=(const ShutdownPolicyInSessionTest&) = @@ -135,6 +136,11 @@ // Tests that by default the shutdown button tooltip is "Shut down". IN_PROC_BROWSER_TEST_F(ShutdownPolicyInSessionTest, TestBasic) { + // TODO: (b/270609503) test the revapmped power button. + if (base::FeatureList::IsEnabled(ash::features::kQsRevamp)) { + return; + } + OpenSystemTrayMenu(); EXPECT_TRUE(HasShutdownButtonTooltip("Shut down")); CloseSystemTrayMenu();
diff --git a/chrome/browser/ash/system/tray_accessibility_browsertest.cc b/chrome/browser/ash/system/tray_accessibility_browsertest.cc index ef02ca20..8858807 100644 --- a/chrome/browser/ash/system/tray_accessibility_browsertest.cc +++ b/chrome/browser/ash/system/tray_accessibility_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/ash_view_ids.h" @@ -40,8 +41,8 @@ #include "ui/views/controls/label.h" #include "ui/views/widget/widget.h" -using testing::Return; using testing::_; +using testing::Return; using testing::WithParamInterface; namespace ash { @@ -79,8 +80,9 @@ void EnableDictation(bool enabled) { bool already_enabled = AccessibilityManager::Get()->IsDictationEnabled(); - if (enabled == already_enabled) + if (enabled == already_enabled) { return; + } AccessibilityManager::Get()->ToggleDictation(); base::RunLoop().RunUntilIdle(); } @@ -144,9 +146,8 @@ // Uses InProcessBrowserTest instead of OobeBaseTest because most of the tests // don't need to test the login screen. -class TrayAccessibilityTest - : public InProcessBrowserTest, - public WithParamInterface<PrefSettingMechanism> { +class TrayAccessibilityTest : public InProcessBrowserTest, + public WithParamInterface<PrefSettingMechanism> { public: TrayAccessibilityTest() : disable_animations_( @@ -570,6 +571,10 @@ } IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, KeepMenuVisibilityOnLockScreen) { + // TODO: (b/270609503) test the revapmped view. + if (base::FeatureList::IsEnabled(ash::features::kQsRevamp)) { + return; + } // Enables high contrast mode. EnableHighContrast(true); EXPECT_TRUE(IsMenuButtonVisible()); @@ -593,6 +598,10 @@ // Do not use a feature which requires an enable/disable confirmation dialog // here, as the dialogs change focus and close the detail menu. IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, DetailMenuRemainsOpen) { + // TODO: (b/270609503) test the revapmped view. + if (base::FeatureList::IsEnabled(ash::features::kQsRevamp)) { + return; + } CreateDetailedMenu(); ClickVirtualKeyboardOnDetailMenu(); @@ -631,6 +640,10 @@ IN_PROC_BROWSER_TEST_P(TrayAccessibilityLoginTest, ShowMenuWithShowOnLoginScreen) { + // TODO: (b/270609503) test the revapmped view. + if (base::FeatureList::IsEnabled(ash::features::kQsRevamp)) { + return; + } EXPECT_FALSE(user_manager::UserManager::Get()->IsUserLoggedIn()); // Confirms that the menu is visible.
diff --git a/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc b/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc new file mode 100644 index 0000000..1a84eea --- /dev/null +++ b/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc
@@ -0,0 +1,347 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/constants/ash_features.h" +#include "ash/shell.h" +#include "ash/system/status_area_widget_test_helper.h" +#include "ash/system/video_conference/video_conference_tray.h" +#include "base/run_loop.h" +#include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/test_timeouts.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings_types.h" +#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 "testing/gtest/include/gtest/gtest.h" + +namespace ash::video_conference { + +// Periodically checks the condition and move on with the rest of the code when +// the condition becomes true. Please tell me this is something you have been +// wanting for very long time. +#define WAIT_FOR_CONDITION(condition) \ + { \ + base::RunLoop run_loop; \ + CheckForConditionAndWaitMoreIfNeeded( \ + base::BindRepeating( \ + base::BindLambdaForTesting([&]() { return condition; })), \ + run_loop.QuitClosure()); \ + run_loop.Run(); \ + } + +// Periodically calls `condition` until it becomes true then calls +// `quit_closure`. +void CheckForConditionAndWaitMoreIfNeeded( + base::RepeatingCallback<bool()> condition, + base::OnceClosure quit_closure) { + if (condition.Run()) { + std::move(quit_closure).Run(); + return; + } + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&CheckForConditionAndWaitMoreIfNeeded, + std::move(condition), std::move(quit_closure)), + TestTimeouts::tiny_timeout()); +} + +// Helper for getting the VcTray. +ash::VideoConferenceTray* GetVcTray() { + return ash::StatusAreaWidgetTestHelper::GetStatusAreaWidget() + ->video_conference_tray(); +} + +class VideoConferenceIntegrationTest : public WebRtcTestBase { + public: + VideoConferenceIntegrationTest() = default; + ~VideoConferenceIntegrationTest() override = default; + + // Navigate to the url in a new tab. + content::WebContents* NavigateTo(const std::string& url_str) { + const GURL url(embedded_test_server()->GetURL(url_str)); + content::RenderFrameHost* main_rfh = ui_test_utils:: + NavigateToURLWithDispositionBlockUntilNavigationsComplete( + browser(), url, 1, WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB | + ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP); + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(main_rfh); + return web_contents; + } + + // Allows or disallow permissions for `web_contents`. + void SetPermission(content::WebContents* web_contents, + ContentSettingsType type, + ContentSetting result) { + HostContentSettingsMapFactory::GetForProfile(browser()->profile()) + ->SetContentSettingDefaultScope(web_contents->GetURL(), GURL(), type, + result); + } + + void StartCamera(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "startVideo();")); + } + + void StopCamera(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "stopVideo();")); + } + + void StartMicrophone(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "startAudio();")); + } + void StopMicrophone(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "stopAudio();")); + } + + void StartScreenSharing(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "startScreenSharing();")); + } + void StopScreenSharing(content::WebContents* web_contents) { + EXPECT_TRUE(content::ExecJs(web_contents, "stopScreenSharing();")); + } + + void SetUpOnMainThread() override { + // Used for bypassing tab capturing selection. + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kThisTabCaptureAutoAccept); + + WebRtcTestBase::SetUpOnMainThread(); + + ASSERT_TRUE(embedded_test_server()->Start()); + + camera_bt_ = GetVcTray()->camera_icon(); + mic_bt_ = GetVcTray()->audio_icon(); + share_bt_ = GetVcTray()->screen_share_icon(); + } + + protected: + VideoConferenceTrayButton* camera_bt_ = nullptr; + VideoConferenceTrayButton* mic_bt_ = nullptr; + VideoConferenceTrayButton* share_bt_ = nullptr; + + base::test::ScopedFeatureList scoped_feature_list_{ + ash::features::kVideoConference}; +}; + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + CaptureVideoShowsVcTray) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions as allow. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_ALLOW); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_ALLOW); + + // Start camera and wait for the tray to show. + StartCamera(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // camera_icon should be visible with green_dot. + EXPECT_TRUE(camera_bt_->GetVisible()); + EXPECT_TRUE(camera_bt_->is_capturing()); + EXPECT_TRUE(camera_bt_->show_privacy_indicator()); + + // audio_icon should be visible without green_dot. + EXPECT_TRUE(mic_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->is_capturing()); + EXPECT_FALSE(mic_bt_->show_privacy_indicator()); + + // screen_share_icon should be invisible. + EXPECT_FALSE(share_bt_->GetVisible()); + EXPECT_FALSE(share_bt_->is_capturing()); + EXPECT_FALSE(share_bt_->show_privacy_indicator()); + + // Stop camera and wait for is_capturing to populate. + StopCamera(web_contents); + WAIT_FOR_CONDITION(!GetVcTray()->camera_icon()->is_capturing()); + + // camera_icon should be visible without green_dot. + EXPECT_TRUE(camera_bt_->GetVisible()); + EXPECT_FALSE(camera_bt_->is_capturing()); + EXPECT_FALSE(camera_bt_->show_privacy_indicator()); + + // Close tab and wait for the tray to dispear. + web_contents->Close(); + WAIT_FOR_CONDITION(!GetVcTray()->GetVisible()); + // camera_icon should be invisible. + EXPECT_FALSE(camera_bt_->GetVisible()); + EXPECT_FALSE(camera_bt_->is_capturing()); + EXPECT_FALSE(camera_bt_->show_privacy_indicator()); +} + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + CaptureAudioShowsVcTray) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions as allow. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_ALLOW); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_ALLOW); + + // Start microphone and wait for the tray to show. + StartMicrophone(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // camera_icon should be visible without green_dot. + EXPECT_TRUE(camera_bt_->GetVisible()); + EXPECT_FALSE(camera_bt_->is_capturing()); + EXPECT_FALSE(camera_bt_->show_privacy_indicator()); + + // audio_icon should be visible with green_dot. + EXPECT_TRUE(mic_bt_->GetVisible()); + EXPECT_TRUE(mic_bt_->is_capturing()); + EXPECT_TRUE(mic_bt_->show_privacy_indicator()); + + // screen_share_icon should be invisible. + EXPECT_FALSE(share_bt_->GetVisible()); + EXPECT_FALSE(share_bt_->is_capturing()); + EXPECT_FALSE(share_bt_->show_privacy_indicator()); + + // Stop microphone and wait for is_capturing to populate. + StopMicrophone(web_contents); + WAIT_FOR_CONDITION(!GetVcTray()->audio_icon()->is_capturing()); + + // audio_icon should be visible without green_dot. + EXPECT_TRUE(mic_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->is_capturing()); + EXPECT_FALSE(mic_bt_->show_privacy_indicator()); + + // Close tab and wait for the tray to dispear. + web_contents->Close(); + WAIT_FOR_CONDITION(!GetVcTray()->GetVisible()); + // audio_icon should be invisible. + EXPECT_FALSE(mic_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->is_capturing()); + EXPECT_FALSE(mic_bt_->show_privacy_indicator()); +} + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + ScreenSharingShowsVcTray) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions as allow. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_ALLOW); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_ALLOW); + + // Start screen sharing and wait for the tray to show. + StartScreenSharing(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // camera_icon should be invisible. + EXPECT_TRUE(camera_bt_->GetVisible()); + EXPECT_FALSE(camera_bt_->is_capturing()); + EXPECT_FALSE(camera_bt_->show_privacy_indicator()); + + // audio_icon should be invisible with green_dot. + EXPECT_TRUE(mic_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->is_capturing()); + EXPECT_FALSE(mic_bt_->show_privacy_indicator()); + + // screen_share_icon should be visible. + EXPECT_TRUE(share_bt_->GetVisible()); + EXPECT_TRUE(share_bt_->is_capturing()); + EXPECT_TRUE(share_bt_->show_privacy_indicator()); + + // Stop microphone and wait for is_capturing to populate. + StopScreenSharing(web_contents); + WAIT_FOR_CONDITION(!GetVcTray()->screen_share_icon()->is_capturing()); + + EXPECT_FALSE(share_bt_->GetVisible()); + EXPECT_FALSE(share_bt_->is_capturing()); + EXPECT_FALSE(share_bt_->show_privacy_indicator()); + + // VcTray should be invisible. + EXPECT_TRUE(GetVcTray()->GetVisible()); + + web_contents->Close(); + WAIT_FOR_CONDITION(!GetVcTray()->GetVisible()); +} + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + MicWithoutPermissionShouldNotShow) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_ALLOW); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_BLOCK); + + // Start camera and wait for the tray to show. + StartCamera(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // Audio icon should not show because the permission is blocked. + EXPECT_TRUE(camera_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->GetVisible()); + EXPECT_FALSE(share_bt_->GetVisible()); +} + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + CameraWithoutPermissionShouldNotShow) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_BLOCK); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_ALLOW); + + // Start microphone and wait for the tray to show. + StartMicrophone(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // Camera icon should not show because the permission is blocked. + EXPECT_FALSE(camera_bt_->GetVisible()); + EXPECT_TRUE(mic_bt_->GetVisible()); + EXPECT_FALSE(share_bt_->GetVisible()); +} + +IN_PROC_BROWSER_TEST_F(VideoConferenceIntegrationTest, + CameraMicWithoutPermissionShouldNotShow) { + // Open a tab. + content::WebContents* web_contents = + NavigateTo("/video_conference_demo.html"); + + // Set permissions. + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_CAMERA, + CONTENT_SETTING_BLOCK); + SetPermission(web_contents, ContentSettingsType::MEDIASTREAM_MIC, + CONTENT_SETTING_BLOCK); + + // Start screen sharing and wait for the tray to show. + StartScreenSharing(web_contents); + WAIT_FOR_CONDITION(GetVcTray()->GetVisible()); + + // Both microphone and camera should not show. + EXPECT_FALSE(camera_bt_->GetVisible()); + EXPECT_FALSE(mic_bt_->GetVisible()); + EXPECT_TRUE(share_bt_->GetVisible()); +} + +} // namespace ash::video_conference
diff --git a/chrome/browser/autofill/autofill_image_fetcher_impl.cc b/chrome/browser/autofill/autofill_image_fetcher_impl.cc index 8e7f66b..6a6bece4 100644 --- a/chrome/browser/autofill/autofill_image_fetcher_impl.cc +++ b/chrome/browser/autofill/autofill_image_fetcher_impl.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/profiles/profile_key.h" #include "components/autofill/core/browser/data_model/credit_card_art_image.h" #include "components/autofill/core/browser/metrics/autofill_metrics.h" +#include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/autofill_tick_clock.h" #include "components/image_fetcher/core/cached_image_fetcher.h" #include "components/image_fetcher/core/image_fetcher_service.h" @@ -101,7 +102,10 @@ std::make_unique<CreditCardArtImage>(card_art_url, gfx::Image()); if (!card_art_image.IsEmpty()) { credit_card_art_image->card_art_image = - AutofillImageFetcherImpl::ApplyGreyOverlay(card_art_image); + base::FeatureList::IsEnabled( + features::kAutofillEnableNewCardArtAndNetworkImages) + ? card_art_image + : AutofillImageFetcherImpl::ApplyGreyOverlay(card_art_image); } std::move(barrier_callback).Run(std::move(credit_card_art_image));
diff --git a/chrome/browser/autofill/manual_filling_controller_impl.cc b/chrome/browser/autofill/manual_filling_controller_impl.cc index d063278..342d80f 100644 --- a/chrome/browser/autofill/manual_filling_controller_impl.cc +++ b/chrome/browser/autofill/manual_filling_controller_impl.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/password_manager/android/password_accessory_controller.h" #include "chrome/browser/password_manager/android/password_accessory_metrics_util.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" -#include "chrome/browser/profiles/profile.h" #include "components/autofill/core/browser/ui/accessory_sheet_data.h" #include "components/autofill/core/browser/ui/accessory_sheet_enums.h" #include "components/autofill/core/common/autofill_features.h"
diff --git a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java index 047a494..38b83783 100644 --- a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java +++ b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -385,6 +385,13 @@ } } + private void waitForBadgeStatus(Tab tab, int expectedValue) { + CriteriaHelper.pollUiThread(() -> { + return getAppBannerManager(tab.getWebContents()).getBadgeStatusForTesting() + == expectedValue; + }); + } + private void waitUntilBottomSheetStatus(ChromeActivityTestRule<? extends ChromeActivity> rule, @BottomSheetController.SheetState int status) { CriteriaHelper.pollUiThread(() -> { @@ -819,15 +826,18 @@ // Waiting two months shouldn't be long enough. AppBannerManager.setTimeDeltaForTesting(61); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); - InfoBarUtil.waitUntilNoInfoBarsExist(mTabbedActivityTestRule.getInfoBars()); + waitForBadgeStatus(tab, AmbientBadgeState.BLOCKED); + checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); AppBannerManager.setTimeDeltaForTesting(62); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); - InfoBarUtil.waitUntilNoInfoBarsExist(mTabbedActivityTestRule.getInfoBars()); + waitForBadgeStatus(tab, AmbientBadgeState.BLOCKED); + checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); // Waiting three months should allow the ambient badge to reappear. AppBannerManager.setTimeDeltaForTesting(91); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + waitForBadgeStatus(tab, AmbientBadgeState.SHOWING); waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); Assert.assertEquals( @@ -1260,15 +1270,11 @@ // As the page doesn't have service worker, we do not expect to // see an ambient badge. - checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); - - // Even after waiting for three months, there should not be no ambient badge. - AppBannerManager.setTimeDeltaForTesting(91); - navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, webBannerUrl); + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + waitForBadgeStatus(tab, AmbientBadgeState.PENDING_WORKER); checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); // Tap to trigger beforeinstallprompt.prompt, we expect to see the modal banner. - Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); tapAndWaitForModalBanner(tab); } @@ -1282,10 +1288,11 @@ resetEngagementForUrl(webBannerUrl, 10); navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, webBannerUrl); + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + waitForBadgeStatus(tab, AmbientBadgeState.SHOWING); waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); // Calls prompt() on the beforeinstallprompt event, we expect to see the modal banner. - Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); tapAndWaitForModalBanner(tab); } @@ -1370,4 +1377,82 @@ ContextUtils.initApplicationContextForTests(contextToRestore); } + + @Test + @SmallTest + @Feature({"AppBanners"}) + @CommandLineFlags.Add({"enable-features=AmbientBadgeSiteEngagement:minimal_engagement/100"}) + public void testAmbientBadgeInsufficientEngagement() throws Exception { + String url = WebappTestPage.getServiceWorkerUrlWithAction( + mTestServer, "call_stashed_prompt_on_click"); + // Set the engagement to trigger beforeinstall event but not ambient badge. + resetEngagementForUrl(url, 10); + + navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, url); + + assertAppBannerPipelineStatus(AppBannerManagerState.PENDING_PROMPT_NOT_CANCELED); + + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + waitForBadgeStatus(tab, AmbientBadgeState.PENDING_ENGAGEMENT); + checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); + + // Calls prompt() on the beforeinstallprompt event, we expect to see the modal banner. + tapAndWaitForModalBanner(tab); + } + + @Test + @SmallTest + @Feature({"AppBanners"}) + @CommandLineFlags.Add({"enable-features=AmbientBadgeSiteEngagement:minimal_engagement/100"}) + public void testAmbientBadgeSufficientEngagement() throws Exception { + String url = WebappTestPage.getServiceWorkerUrlWithAction( + mTestServer, "call_stashed_prompt_on_click"); + // Set the engagement big enough for ambient badge. + resetEngagementForUrl(url, 100); + + navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, url); + + assertAppBannerPipelineStatus(AppBannerManagerState.PENDING_PROMPT_NOT_CANCELED); + + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + waitForBadgeStatus(tab, AmbientBadgeState.SHOWING); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); + + // Calls prompt() on the beforeinstallprompt event, we expect to see the modal banner. + tapAndWaitForModalBanner(tab); + } + + @Test + @SmallTest + @Feature({"AppBanners"}) + @CommandLineFlags.Add({"enable-features=AmbientBadgeSuppressFirstVisit:period/7d"}) + public void testAmbientBadgeSuppressedOnFirstVisit() throws Exception { + String url = WebappTestPage.getServiceWorkerUrlWithAction( + mTestServer, "call_stashed_prompt_on_click"); + resetEngagementForUrl(url, 10); + + navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, url); + + assertAppBannerPipelineStatus(AppBannerManagerState.PENDING_PROMPT_NOT_CANCELED); + + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + waitForBadgeStatus(tab, AmbientBadgeState.PENDING_ENGAGEMENT); + + // Advance 3days and navigate to |url| again, ambient badge should show. + AppBannerManager.setTimeDeltaForTesting(3); + mTabbedActivityTestRule.loadUrl(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, url); + waitForBadgeStatus(tab, AmbientBadgeState.SHOWING); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); + + // Advance 8 more days and navigate to |url| again, no ambient badge. + AppBannerManager.setTimeDeltaForTesting(11); + mTabbedActivityTestRule.loadUrl(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); + navigateToUrlAndWaitForBannerManager(mTabbedActivityTestRule, url); + waitForBadgeStatus(tab, AmbientBadgeState.PENDING_ENGAGEMENT); + checkAmbientBadgePromptNotExist(mTabbedActivityTestRule); + + // Calls prompt() on the beforeinstallprompt event and wait for the banner. + tapAndWaitForModalBanner(tab); + } }
diff --git a/chrome/browser/cart/cart_discount_fetcher.cc b/chrome/browser/cart/cart_discount_fetcher.cc index b965a936..95fff83a 100644 --- a/chrome/browser/cart/cart_discount_fetcher.cc +++ b/chrome/browser/cart/cart_discount_fetcher.cc
@@ -12,7 +12,6 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/cart/cart_db.h" #include "chrome/browser/cart/cart_discount_metric_collector.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/grit/generated_resources.h" #include "components/commerce/core/commerce_feature_list.h" #include "components/commerce/core/proto/cart_db_content.pb.h"
diff --git a/chrome/browser/cart/cart_discount_link_fetcher.cc b/chrome/browser/cart/cart_discount_link_fetcher.cc index 6d0837a..9d79f906 100644 --- a/chrome/browser/cart/cart_discount_link_fetcher.cc +++ b/chrome/browser/cart/cart_discount_link_fetcher.cc
@@ -10,7 +10,6 @@ #include "base/sequence_checker.h" #include "chrome/browser/cart/cart_db.h" #include "chrome/browser/cart/cart_discount_metric_collector.h" -#include "chrome/browser/profiles/profile.h" #include "components/commerce/core/proto/cart_db_content.pb.h" #include "components/endpoint_fetcher/endpoint_fetcher.h" #include "net/traffic_annotation/network_traffic_annotation.h"
diff --git a/chrome/browser/chrome_for_testing/BUILD.gn b/chrome/browser/chrome_for_testing/BUILD.gn index bcc3d99a..051ca17 100644 --- a/chrome/browser/chrome_for_testing/BUILD.gn +++ b/chrome/browser/chrome_for_testing/BUILD.gn
@@ -4,6 +4,8 @@ import("//build/buildflag_header.gni") import("//build/config/chrome_build.gni") +import("//build/linux/strip_binary.gni") +import("//components/nacl/features.gni") buildflag_header("buildflags") { header = "buildflags.h" @@ -24,3 +26,52 @@ flags += [ "GOOGLE_CHROME_FOR_TESTING_BRANDING=0" ] } } + +if (is_linux && is_chrome_for_testing) { + strip_binary("strip_chrome_binary") { + binary_input = "$root_out_dir/chrome" + deps = [ "//chrome" ] + } + + strip_binary("strip_chrome_crashpad_handler") { + binary_input = "$root_out_dir/chrome_crashpad_handler" + deps = [ "//components/crash/core/app:chrome_crashpad_handler" ] + } + + strip_binary("strip_chrome_sandbox") { + binary_input = "$root_out_dir/chrome_sandbox" + deps = [ "//sandbox/linux:chrome_sandbox" ] + } + + strip_binary("strip_libEGL_shlib") { + binary_input = "$root_out_dir/libEGL.so" + deps = [ "//third_party/angle:libEGL" ] + } + + strip_binary("strip_libGLESv2_shlib") { + binary_input = "$root_out_dir/libGLESv2.so" + deps = [ "//third_party/angle:libGLESv2" ] + } + + strip_binary("strip_libvulkan_shlib") { + binary_input = "$root_out_dir/libvulkan.so.1" + deps = [ "//third_party/vulkan-deps/vulkan-loader/src:libvulkan" ] + } + + strip_binary("strip_libvk_swiftshader_shlib") { + binary_input = "$root_out_dir/libvk_swiftshader.so" + deps = [ "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan" ] + } + + if (enable_nacl) { + strip_binary("strip_nacl_helper") { + binary_input = "$root_out_dir/nacl_helper" + deps = [ "//components/nacl/loader:nacl_helper" ] + } + + strip_binary("strip_nacl_helper_bootstrap") { + binary_input = "$root_out_dir/nacl_helper_bootstrap" + deps = [ "//native_client/src/trusted/service_runtime/linux:bootstrap" ] + } + } +}
diff --git a/chrome/browser/chrome_process_singleton.cc b/chrome/browser/chrome_process_singleton.cc index b560d8bd..1010b92 100644 --- a/chrome/browser/chrome_process_singleton.cc +++ b/chrome/browser/chrome_process_singleton.cc
@@ -54,7 +54,7 @@ return false; // Enroll 50% of the population. - return base::Hash(machine_guid) % 2 == 0; + return base::Hash(machine_guid + "EarlyProcessSingleton") % 2 == 0; } #endif // BUILDFLAG(IS_WIN) @@ -142,7 +142,7 @@ // be generated from the metrics log that is open at the time of registration. ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial( "EarlyProcessSingleton", - g_is_early_singleton_feature_ ? "Enabled" : "Disabled", + g_is_early_singleton_feature_ ? "Enabled2" : "Disabled2", variations::SyntheticTrialAnnotationMode::kCurrentLog); }
diff --git a/chrome/browser/creator/android/java/res/layout/creator_privacy.xml b/chrome/browser/creator/android/java/res/layout/creator_privacy.xml index 12b2735..7d60c29a 100644 --- a/chrome/browser/creator/android/java/res/layout/creator_privacy.xml +++ b/chrome/browser/creator/android/java/res/layout/creator_privacy.xml
@@ -8,8 +8,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="28dp" - android:paddingBottom="12dp"> + android:paddingTop="32dp"> <TextView android:layout_height="wrap_content" android:layout_width="match_parent"
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_measurement.h b/chrome/browser/data_use_measurement/chrome_data_use_measurement.h index b8d9dc5..6844bea 100644 --- a/chrome/browser/data_use_measurement/chrome_data_use_measurement.h +++ b/chrome/browser/data_use_measurement/chrome_data_use_measurement.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_MEASUREMENT_H_ #define CHROME_BROWSER_DATA_USE_MEASUREMENT_CHROME_DATA_USE_MEASUREMENT_H_ +#include <cstdint> + #include "base/sequence_checker.h" class ChromeDataUseMeasurement {
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc index 2892982..032a6dc 100644 --- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc +++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -48,6 +48,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_switches.h" +#include "chrome/common/channel_info.h" +#include "components/version_info/version_info.h" +#include "third_party/cros_system_api/switches/chrome_switches.h" #endif using content::DevToolsAgentHost; @@ -181,6 +184,19 @@ content::WebContents* web_contents) { const extensions::Extension* extension = nullptr; if (web_contents) { +#if BUILDFLAG(IS_CHROMEOS_ASH) + GURL url = web_contents->GetLastCommittedURL(); + if ((url.SchemeIs("chrome") && url.host() != "inspect") || + url.SchemeIs("os")) { + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + if (chrome::GetChannel() != version_info::Channel::CANARY && + !command_line->HasSwitch(chromeos::switches::kSystemInDevMode) && + !command_line->HasSwitch(ash::switches::kForceDevToolsAvailable)) { + return false; + } + } +#endif + if (auto* process_manager = extensions::ProcessManager::Get( web_contents->GetBrowserContext())) { extension = process_manager->GetExtensionForWebContents(web_contents);
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc index cbd2718f..4dbdd11 100644 --- a/chrome/browser/devtools/devtools_browsertest.cc +++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -672,6 +672,21 @@ const base::FilePath test_extensions_dir_; }; +class DevToolsExtensionChromeUrlTest : public DevToolsExtensionTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + DevToolsExtensionTest::SetUpCommandLine(command_line); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // These tests use chrome:// URLs and are written on the assumption devtools + // are always available, so guarantee that assumption holds. Tests that + // check if devtools can be disabled should use a test fixture without the + // kForceDevToolsAvailable switch set. + command_line->AppendSwitch(ash::switches::kForceDevToolsAvailable); +#endif + } +}; + class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest { public: void SetUpCommandLine(base::CommandLine* command_line) override { @@ -996,7 +1011,7 @@ } // Tests that chrome.devtools extension is correctly exposed. -IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, TestExtensionOnNewTab) { +IN_PROC_BROWSER_TEST_F(DevToolsExtensionChromeUrlTest, TestExtensionOnNewTab) { // Install the dynamically-generated devtools extension. const Extension* devtools_extension = LoadExtensionForTest( "Devtools Extension", "panel_devtools_page.html", ""); @@ -2582,11 +2597,11 @@ " window.abc = 239;\n" " console.log(abc);\n" "</script>"); - test_factory.AddFactoryOverride(GURL("chrome://dummyurl").host(), + test_factory.AddFactoryOverride(GURL("https://a.com/dummyurl").host(), &mock_provider); ASSERT_TRUE( - ui_test_utils::NavigateToURL(browser(), GURL("chrome://dummyurl"))); + ui_test_utils::NavigateToURL(browser(), GURL("https://a.com/dummyurl"))); DevToolsWindow* window = DevToolsWindowTesting::OpenDevToolsWindowSync(GetInspectedTab(), true); chrome::DuplicateTab(browser());
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc index 12afef1..0a2095a6 100644 --- a/chrome/browser/devtools/devtools_file_helper.cc +++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -133,7 +133,7 @@ void WriteToFile(const base::FilePath& path, const std::string& content) { DCHECK(!path.empty()); - base::WriteFile(path, content.c_str(), content.length()); + base::WriteFile(path, content); } void AppendToFile(const base::FilePath& path, const std::string& content) {
diff --git a/chrome/browser/download/android/download_manager_service.cc b/chrome/browser/download/android/download_manager_service.cc index f012e01..daede616 100644 --- a/chrome/browser/download/android/download_manager_service.cc +++ b/chrome/browser/download/android/download_manager_service.cc
@@ -110,10 +110,7 @@ auto config = std::make_unique<download::AutoResumptionHandler::Config>(); config->auto_resumption_size_limit = DownloadUtils::GetAutoResumptionSizeLimit(); - // TODO(crbug.com/1414618): This flag should be removed and default to true. - config->is_auto_resumption_enabled_in_native = - chrome::android::IsJavaDrivenFeatureEnabled( - download::features::kDownloadAutoResumptionNative); + config->is_auto_resumption_enabled_in_native = true; download::AutoResumptionHandler::Create( std::move(network_listener), std::move(task_manager), std::move(config), base::DefaultClock::GetInstance());
diff --git a/chrome/browser/download/bubble/download_bubble_controller.cc b/chrome/browser/download/bubble/download_bubble_controller.cc index c8a6c38..731b2cf 100644 --- a/chrome/browser/download/bubble/download_bubble_controller.cc +++ b/chrome/browser/download/bubble/download_bubble_controller.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" +#include "components/download/public/common/download_danger_type.h" #include "components/download/public/common/download_item.h" #include "components/download/public/common/download_stats.h" #include "components/offline_items_collection/core/offline_content_aggregator.h" @@ -52,6 +53,12 @@ model->GetStartTime() > cutoff_time); } +bool IsPendingDeepScanning(const DownloadUIModel& model) { + return model.GetState() == download::DownloadItem::IN_PROGRESS && + model.GetDangerType() == + download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING; +} + using DownloadUIModelPtrList = std::list<DownloadUIModelPtr>; // Sorting order is 1) Active in-progress downloads, 2) Paused in-progress @@ -83,19 +90,15 @@ using SortedDownloadUIModelSet = std::multiset<DownloadUIModelPtrList::iterator, StartTimeComparator>; -bool AddModelIfRequired(DownloadUIModelPtr model, - base::Time cutoff_time, - std::vector<DownloadUIModelPtr>& models_aggregate) { +void MaybeAddModel(DownloadUIModelPtr model, + base::Time cutoff_time, + DownloadUIModelPtrList& models_aggregate, + SortedDownloadUIModelSet& sorted_ui_model_iters) { if (model->ShouldShowInBubble() && DownloadUIModelIsRecent(model.get(), cutoff_time)) { - models_aggregate.push_back(std::move(model)); - return true; + models_aggregate.push_front(std::move(model)); + sorted_ui_model_iters.insert(models_aggregate.begin()); } - return false; -} - -bool ShouldStopAddingModels(std::vector<DownloadUIModelPtr>& models_aggregate) { - return (models_aggregate.size() >= kMaxDownloadsToShow); } } // namespace @@ -201,31 +204,22 @@ void DownloadBubbleUIController::OnItemsAdded( const OfflineContentProvider::OfflineItemList& items) { bool any_new = false; - bool any_in_progress = false; for (const OfflineItem& item : items) { if (MaybeAddOfflineItem(item, /*is_new=*/true)) { - if (item.state == OfflineItemState::IN_PROGRESS) { - any_in_progress = true; - } any_new = true; } } if (any_new) { - display_controller_->OnNewItem( - /*show_details=*/( - any_in_progress && - (browser_ == chrome::FindLastActiveWithProfile(profile_.get()))), - /*show_animation=*/false); + display_controller_->OnNewItem(/*show_animation=*/false); } } void DownloadBubbleUIController::OnNewItem(download::DownloadItem* item, - bool show_details) { + bool may_show_animation) { auto model = std::make_unique<DownloadItemModel>(item); model->SetActionedOn(false); - display_controller_->OnNewItem( - (item->GetState() == download::DownloadItem::IN_PROGRESS) && show_details, - model->ShouldShowDownloadStartedAnimation()); + display_controller_->OnNewItem(may_show_animation && + model->ShouldShowDownloadStartedAnimation()); } bool DownloadBubbleUIController::ShouldShowIncognitoIcon( @@ -266,8 +260,9 @@ }), offline_items_.end()); bool was_added = MaybeAddOfflineItem(item, /*is_new=*/false); + OfflineItemModel model(offline_manager_, item); display_controller_->OnUpdatedItem( - std::make_unique<OfflineItemModel>(offline_manager_, item)->IsDone(), + model.IsDone(), IsPendingDeepScanning(model), was_added && (browser_ == chrome::FindLastActiveWithProfile(profile_.get()))); } @@ -277,15 +272,18 @@ download::DownloadItem* item) { // manager can be different from download_notifier_ when the current profile // is off the record. + DownloadItemModel model(item); if (manager != download_notifier_.GetManager()) { display_controller_->OnUpdatedItem(item->IsDone(), - /*show_details_if_done=*/false); + IsPendingDeepScanning(model), + /*may_show_details=*/false); return; } - bool show_details_if_done = - std::make_unique<DownloadItemModel>(item)->ShouldShowInBubble() && + bool may_show_details = + model.ShouldShowInBubble() && (browser_ == chrome::FindLastActiveWithProfile(profile_.get())); - display_controller_->OnUpdatedItem(item->IsDone(), show_details_if_done); + display_controller_->OnUpdatedItem( + item->IsDone(), IsPendingDeepScanning(model), may_show_details); } void DownloadBubbleUIController::PruneOfflineItems() { @@ -309,28 +307,47 @@ DownloadBubbleUIController::GetAllItemsToDisplay() { base::Time cutoff_time = base::Time::Now() - base::Days(kShowDownloadsInBubbleForNumDays); - std::vector<DownloadUIModelPtr> models_aggregate; + + // This list will contain all models, not limited to kMaxDownloadsToShow. + // Must use a list, not a vector, because we are storing iterators which must + // not be invalidated. + DownloadUIModelPtrList models_aggregate; + // Sort iterators into the above vector in a set, as a set does not allow + // move semantics over unique_ptr, preventing us from putting + // DownloadUIModelPtr directly in the set. + SortedDownloadUIModelSet sorted_ui_model_iters; for (const OfflineItem& item : GetOfflineItems()) { - if (AddModelIfRequired( - OfflineItemModel::Wrap( - offline_manager_, item, - std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()), - cutoff_time, models_aggregate) && - ShouldStopAddingModels(models_aggregate)) { - return models_aggregate; - } + DownloadUIModelPtr model = OfflineItemModel::Wrap( + offline_manager_, item, + std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()); + MaybeAddModel(std::move(model), cutoff_time, models_aggregate, + sorted_ui_model_iters); } for (download::DownloadItem* item : GetDownloadItems()) { - if (AddModelIfRequired( - DownloadItemModel::Wrap( - item, - std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()), - cutoff_time, models_aggregate) && - ShouldStopAddingModels(models_aggregate)) { - return models_aggregate; + DownloadUIModelPtr model = DownloadItemModel::Wrap( + item, std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()); + MaybeAddModel(std::move(model), cutoff_time, models_aggregate, + sorted_ui_model_iters); + } + + std::vector<DownloadUIModelPtr> items_to_display; + if (models_aggregate.empty()) { + return items_to_display; + } + + DCHECK(!sorted_ui_model_iters.empty()); + SortedDownloadUIModelSet::const_iterator sorted_it = + sorted_ui_model_iters.begin(); + for (size_t i = 0; i < kMaxDownloadsToShow; ++i) { + DownloadUIModelPtrList::iterator model_it = *sorted_it; + DCHECK(model_it != models_aggregate.end()); + items_to_display.push_back(std::move(*model_it)); + ++sorted_it; + if (sorted_it == sorted_ui_model_iters.end()) { + break; } } - return models_aggregate; + return items_to_display; } std::vector<DownloadUIModelPtr> DownloadBubbleUIController::GetDownloadUIModels( @@ -338,31 +355,19 @@ // Prune just to keep the list of offline entries small. PruneOfflineItems(); - // Aggregate downloads and offline items - std::vector<DownloadUIModelPtr> models_aggregate = GetAllItemsToDisplay(); - - // Store list of DownloadUIModelPtrs. Sort list iterators in a set, as a set - // does not allow move semantics over unique_ptr, preventing us from putting - // DownloadUIModelPtr directly in the set. - DownloadUIModelPtrList filtered_models_list; - SortedDownloadUIModelSet sorted_ui_model_iters; - for (auto& model : models_aggregate) { - // Partial view entries are removed if viewed on the main view. - if (is_main_view || !model->WasActionedOn()) { - if (is_main_view) { - model->SetActionedOn(true); - } - filtered_models_list.push_front(std::move(model)); - sorted_ui_model_iters.insert(filtered_models_list.begin()); + std::vector<DownloadUIModelPtr> all_items = GetAllItemsToDisplay(); + std::vector<DownloadUIModelPtr> items_to_return; + for (auto& model : all_items) { + if (!is_main_view && model->WasActionedOn()) { + continue; } + // Partial view entries are removed if viewed on the main view. + if (is_main_view) { + model->SetActionedOn(true); + } + items_to_return.push_back(std::move(model)); } - - // Convert set iterators to sorted vector. - std::vector<DownloadUIModelPtr> models_return_arr; - for (const auto& model_iter : sorted_ui_model_iters) { - models_return_arr.push_back(std::move((*model_iter))); - } - return models_return_arr; + return items_to_return; } std::vector<DownloadUIModelPtr> DownloadBubbleUIController::GetMainView() {
diff --git a/chrome/browser/download/bubble/download_bubble_controller.h b/chrome/browser/download/bubble/download_bubble_controller.h index 63d805d..03fb7fa 100644 --- a/chrome/browser/download/bubble/download_bubble_controller.h +++ b/chrome/browser/download/bubble/download_bubble_controller.h
@@ -70,8 +70,10 @@ bool is_main_view); // Notify when a new download is ready to be shown on UI, and if the window - // this controller belongs to should show the partial view. - void OnNewItem(download::DownloadItem* item, bool show_details); + // this controller belongs to may show the animation. (Whether the animation + // is actually shown may depend on the download and the device's graphics + // capabilities.) + void OnNewItem(download::DownloadItem* item, bool may_show_animation); // Notify when a download toolbar button (in any window) is pressed. void HandleButtonPressed();
diff --git a/chrome/browser/download/bubble/download_bubble_controller_unittest.cc b/chrome/browser/download/bubble/download_bubble_controller_unittest.cc index 0cb357b..30e3bb4 100644 --- a/chrome/browser/download/bubble/download_bubble_controller_unittest.cc +++ b/chrome/browser/download/bubble/download_bubble_controller_unittest.cc
@@ -5,7 +5,10 @@ #include "chrome/browser/download/bubble/download_bubble_controller.h" #include "base/command_line.h" +#include "base/files/file_path.h" #include "base/memory/raw_ptr.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "chrome/browser/download/bubble/download_display.h" #include "chrome/browser/download/bubble/download_display_controller.h" #include "chrome/browser/download/bubble/download_icon_state.h" @@ -21,6 +24,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "components/download/public/common/download_danger_type.h" #include "components/download/public/common/mock_download_item.h" #include "components/offline_items_collection/core/offline_item.h" #include "components/offline_items_collection/core/test_support/mock_offline_content_provider.h" @@ -39,6 +43,7 @@ namespace { using StrictMockDownloadItem = testing::StrictMock<download::MockDownloadItem>; +using DownloadDangerType = download::DownloadDangerType; using DownloadIconState = download::DownloadIconState; using DownloadState = download::DownloadItem::DownloadState; const char kProviderNamespace[] = "mock_namespace"; @@ -49,8 +54,8 @@ DownloadBubbleUIController* bubble_controller) : DownloadDisplayController(nullptr, browser, bubble_controller) {} void MaybeShowButtonWhenCreated() override {} - MOCK_METHOD2(OnNewItem, void(bool, bool)); - MOCK_METHOD2(OnUpdatedItem, void(bool, bool)); + MOCK_METHOD1(OnNewItem, void(bool)); + MOCK_METHOD3(OnUpdatedItem, void(bool, bool, bool)); MOCK_METHOD1(OnRemovedItem, void(const ContentId&)); }; @@ -158,10 +163,10 @@ void InitDownloadItem(const base::FilePath::CharType* path, DownloadState state, - std::string& id, + const std::string& id, bool is_transient = false, base::Time start_time = base::Time::Now(), - bool show_details = true) { + bool may_show_animation = true) { size_t index = items_.size(); items_.push_back(std::make_unique<StrictMockDownloadItem>()); EXPECT_CALL(item(index), GetId()) @@ -207,12 +212,15 @@ item(index).AddObserver(&controller().get_download_notifier_for_testing()); content::DownloadItemUtils::AttachInfoForTesting(&(item(index)), profile_, nullptr); - controller().OnNewItem(&item(index), show_details); + controller().OnNewItem(&item(index), may_show_animation); } - void UpdateDownloadItem(int item_index, - DownloadState state, - bool is_paused = false) { + void UpdateDownloadItem( + int item_index, + DownloadState state, + bool is_paused = false, + DownloadDangerType danger_type = + DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) { DCHECK_GT(items_.size(), static_cast<size_t>(item_index)); EXPECT_CALL(item(item_index), GetState()).WillRepeatedly(Return(state)); if (state == DownloadState::COMPLETE) { @@ -222,6 +230,12 @@ } else { EXPECT_CALL(item(item_index), IsDone()).WillRepeatedly(Return(false)); } + EXPECT_CALL(item(item_index), IsDangerous()) + .WillRepeatedly( + Return(danger_type != + DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); + EXPECT_CALL(item(item_index), GetDangerType()) + .WillRepeatedly(Return(danger_type)); EXPECT_CALL(item(item_index), IsPaused()).WillRepeatedly(Return(is_paused)); item(item_index).NotifyObserversDownloadUpdated(); } @@ -264,38 +278,48 @@ TEST_F(DownloadBubbleUIControllerTest, ProcessesNewItems) { std::vector<std::string> ids = {"Download 1", "Download 2", "Offline 1", - "Download 3"}; - EXPECT_CALL(display_controller(), OnNewItem(true, true)).Times(1); + "Download 3", "Offline 2"}; + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(2); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS, ids[0]); - EXPECT_CALL(display_controller(), OnNewItem(false, true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar2.pdf"), download::DownloadItem::COMPLETE, ids[1]); - EXPECT_CALL(display_controller(), OnNewItem(true, false)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(false)).Times(1); InitOfflineItem(OfflineItemState::IN_PROGRESS, ids[2]); - EXPECT_CALL(display_controller(), OnNewItem(false, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS, ids[3], - /*is_transient=*/false, base::Time::Now(), - /*show_details=*/false); + /*is_transient=*/false, base::Time::Now()); + EXPECT_CALL(display_controller(), OnNewItem(false)).Times(1); + InitOfflineItem(OfflineItemState::IN_PROGRESS, ids[4]); } TEST_F(DownloadBubbleUIControllerTest, ProcessesUpdatedItems) { std::vector<std::string> ids = {"Download 1", "Offline 1"}; - EXPECT_CALL(display_controller(), OnNewItem(true, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS, ids[0]); - EXPECT_CALL(display_controller(), OnUpdatedItem(false, true)).Times(1); + EXPECT_CALL(display_controller(), OnUpdatedItem(false, false, true)).Times(1); UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS); - EXPECT_CALL(display_controller(), OnUpdatedItem(true, true)).Times(1); + EXPECT_CALL(display_controller(), OnUpdatedItem(true, false, true)).Times(1); UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); - EXPECT_CALL(display_controller(), OnNewItem(true, false)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(false)).Times(1); InitOfflineItem(OfflineItemState::IN_PROGRESS, ids[1]); - EXPECT_CALL(display_controller(), OnUpdatedItem(true, true)).Times(1); + EXPECT_CALL(display_controller(), OnUpdatedItem(true, false, true)).Times(1); UpdateOfflineItem(/*item_index=*/0, OfflineItemState::COMPLETE); } +TEST_F(DownloadBubbleUIControllerTest, UpdatedItemIsPendingDeepScanning) { + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); + InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), + download::DownloadItem::IN_PROGRESS, "Download 1"); + EXPECT_CALL(display_controller(), OnUpdatedItem(false, true, true)).Times(1); + UpdateDownloadItem( + /*item_index=*/0, DownloadState::IN_PROGRESS, false, + DownloadDangerType::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING); +} + TEST_F(DownloadBubbleUIControllerTest, TransientDownloadShouldNotShow) { std::vector<std::string> ids = {"Download 1", "Download 2"}; InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), @@ -372,6 +396,43 @@ } } +// Tests that the list is limited to kMaxDownloadsToShow items, and that they +// are the most recent kMaxDownloadsToShow items. +TEST_F(DownloadBubbleUIControllerTest, ListIsCappedAndMostRecent) { + const size_t kMaxDownloadsToShow = 100; + const size_t kNumDownloads = kMaxDownloadsToShow + 1; + const base::Time kFirstStartTime = + base::Time::Now() - base::Seconds(kNumDownloads); + // Create 101 downloads in chronological order, such that the first 100 are + // *not* the 100 most recent. Note that DownloadManager does not guarantee + // any order on the items returned from GetAllDownloads(). We still want to + // ensure that the most recent ones are returned. + for (size_t i = 0; i < kNumDownloads; ++i) { + std::string id = base::NumberToString(i); + InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), + download::DownloadItem::IN_PROGRESS, id, + /*is_transient=*/false, + kFirstStartTime + base::Seconds(i)); + } + + std::vector<DownloadUIModelPtr> partial_view_models = + controller().GetPartialView(); + EXPECT_EQ(partial_view_models.size(), kMaxDownloadsToShow); + for (const DownloadUIModelPtr& model : partial_view_models) { + // Expect the oldest download, which started at kFirstStartTime, to be the 1 + // excluded, despite being the first returned from GetAllDownloads(). + EXPECT_GT(model->GetStartTime(), kFirstStartTime); + } + + std::vector<DownloadUIModelPtr> main_view_models = controller().GetMainView(); + EXPECT_EQ(main_view_models.size(), kMaxDownloadsToShow); + for (const DownloadUIModelPtr& model : main_view_models) { + // Expect the oldest download, which started at kFirstStartTime, to be the 1 + // excluded, despite being the first returned from GetAllDownloads(). + EXPECT_GT(model->GetStartTime(), kFirstStartTime); + } +} + TEST_F(DownloadBubbleUIControllerTest, OpeningMainViewRemovesEntryFromPartialView) { std::vector<std::string> ids = {"Download 1", "Offline 1"}; @@ -394,21 +455,21 @@ "Download 4"}; // First time showing the partial view should work. - EXPECT_CALL(display_controller(), OnNewItem(true, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar1.pdf"), download::DownloadItem::IN_PROGRESS, ids[0]); EXPECT_EQ(controller().GetPartialView().size(), 1u); // No items are returned for a partial view because it is too soon. task_environment_.FastForwardBy(base::Seconds(14)); - EXPECT_CALL(display_controller(), OnNewItem(false, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar2.pdf"), download::DownloadItem::COMPLETE, ids[1]); EXPECT_EQ(controller().GetPartialView().size(), 0u); // Partial view can now be shown, and contains all the items. task_environment_.FastForwardBy(base::Seconds(1)); - EXPECT_CALL(display_controller(), OnNewItem(false, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar3.pdf"), download::DownloadItem::COMPLETE, ids[1]); EXPECT_EQ(controller().GetPartialView().size(), 3u); @@ -420,7 +481,7 @@ // Main view resets the partial view time, so the partial view can now be // shown. - EXPECT_CALL(display_controller(), OnNewItem(true, true)).Times(1); + EXPECT_CALL(display_controller(), OnNewItem(true)).Times(1); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar4.pdf"), download::DownloadItem::IN_PROGRESS, ids[3]); EXPECT_EQ(controller().GetPartialView().size(), 1u); @@ -491,10 +552,12 @@ incognito_controller_->get_original_notifier_for_testing()); content::DownloadItemUtils::AttachInfoForTesting(&(item(0)), incognito_profile_, nullptr); - // `show_details_if_done` is false because the download is initiated from the + // `may_show_details` is false because the download is initiated from the // main profile. - EXPECT_CALL(*incognito_display_controller_, - OnUpdatedItem(/*is_done=*/true, /*show_details_if_done=*/false)) + EXPECT_CALL( + *incognito_display_controller_, + OnUpdatedItem(/*is_done=*/true, /*is_pending_deep_scanning=*/false, + /*may_show_details=*/false)) .Times(1); item(0).NotifyObserversDownloadUpdated(); }
diff --git a/chrome/browser/download/bubble/download_display_controller.cc b/chrome/browser/download/bubble/download_display_controller.cc index 1b84e59..f9511bb 100644 --- a/chrome/browser/download/bubble/download_display_controller.cc +++ b/chrome/browser/download/bubble/download_display_controller.cc
@@ -1,6 +1,7 @@ // 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 "chrome/browser/download/bubble/download_display_controller.h" #include "base/numerics/safe_conversions.h" @@ -22,6 +23,7 @@ #include "chrome/browser/ui/exclusive_access/exclusive_access_bubble_type.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" +#include "components/download/public/common/download_danger_type.h" #include "components/offline_items_collection/core/offline_item.h" #include "components/offline_items_collection/core/offline_item_state.h" @@ -38,64 +40,67 @@ // after user comes out of the full screen. constexpr base::TimeDelta kToolbarIconActiveTimeInterval = base::Minutes(1); -// From the button UI's perspective, whether the download is considered in -// progress. -bool IsModelInProgress(const DownloadUIModel* model) { - // Consider dangerous downloads as completed, because we don't want to - // encourage users to interact with them. However, consider downloads pending - // scanning as in progress, because we do want users to scan potential +// Information extracted from iterating over all models, to avoid having to do +// so multiple times. +struct AllDownloadUIModelsInfo { + // Whether there are any downloads actively doing deep scanning. + bool has_deep_scanning = false; + // Whether any downloads are unactioned. + bool has_unactioned = false; + // From the button UI's perspective, whether the download is considered in + // progress. Consider dangerous downloads as completed, because we don't want + // to encourage users to interact with them. However, consider downloads + // pending scanning as in progress, because we do want users to scan potential // dangerous downloads. - if (model->IsDangerous() && - model->GetDangerType() != - download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING) { + int in_progress_count = 0; + // Count of in-progress downloads (by the above definition) that are paused. + int paused_count = 0; + // Whether there are no more in-progress downloads (by the above definition) + // that are not paused or pending deep scanning, i.e., whether all actively + // downloading items are done. + bool all_done = true; +}; + +bool IsPendingDeepScanning(const DownloadUIModel* model) { + return model->GetState() == download::DownloadItem::IN_PROGRESS && + model->GetDangerType() == + download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING; +} + +bool IsModelInProgress(const DownloadUIModel* model) { + if (model->IsDangerous() && !IsPendingDeepScanning(model)) { return false; } return model->GetState() == download::DownloadItem::IN_PROGRESS; } -bool HasDeepScanningDownload( +AllDownloadUIModelsInfo GetAllModelsInfo( std::vector<std::unique_ptr<DownloadUIModel>>& all_models) { + AllDownloadUIModelsInfo info; for (const auto& model : all_models) { if (model->GetDangerType() == download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING && model->GetState() != download::DownloadItem::CANCELLED) { - return true; + info.has_deep_scanning = true; } - } - return false; -} - -int InProgressDownloadCount( - std::vector<std::unique_ptr<DownloadUIModel>>& all_models) { - int in_progress_count = 0; - for (const auto& model : all_models) { - if (IsModelInProgress(model.get())) { - in_progress_count++; - } - } - return in_progress_count; -} - -int PausedDownloadCount( - std::vector<std::unique_ptr<DownloadUIModel>>& all_models) { - int paused_count = 0; - for (const auto& model : all_models) { - if (IsModelInProgress(model.get()) && model->IsPaused()) { - paused_count++; - } - } - return paused_count; -} - -bool HasUnactionedDownload( - std::vector<std::unique_ptr<DownloadUIModel>>& all_models) { - for (const auto& model : all_models) { if (!model->WasActionedOn()) { - return true; + info.has_unactioned = true; + } + if (IsModelInProgress(model.get())) { + ++info.in_progress_count; + if (model->IsPaused()) { + ++info.paused_count; + } else if (!IsPendingDeepScanning(model.get())) { + // An in-progress download (by the above definition) is exactly one of + // actively downloading, paused, or pending deep scanning. If we got + // here, it is actively downloading and hence we are not all done. + info.all_done = false; + } } } - return false; + return info; } + } // namespace DownloadDisplayController::DownloadDisplayController( @@ -118,8 +123,7 @@ base::PowerMonitor::RemovePowerSuspendObserver(this); } -void DownloadDisplayController::OnNewItem(bool show_details, - bool show_animation) { +void DownloadDisplayController::OnNewItem(bool show_animation) { if (!download::ShouldShowDownloadBubble(browser_->profile())) { return; } @@ -127,9 +131,6 @@ std::vector<std::unique_ptr<DownloadUIModel>> all_models = bubble_controller_->GetAllItemsToDisplay(); UpdateToolbarButtonState(all_models); - if (!show_details) { - return; - } if (display_->IsFullscreenWithParentViewHidden()) { fullscreen_notification_shown_ = true; ExclusiveAccessContext* exclusive_access_context = @@ -143,26 +144,33 @@ /*force_update=*/true); } } else { - display_->ShowDetails(); display_->UpdateDownloadIcon(show_animation); } } void DownloadDisplayController::OnUpdatedItem(bool is_done, - bool show_details_if_done) { + bool is_deep_scanning, + bool may_show_details) { if (!download::ShouldShowDownloadBubble(browser_->profile())) { return; } - if (is_done) { - ScheduleToolbarDisappearance(kToolbarIconVisibilityTimeInterval); - if (show_details_if_done && display_->IsFullscreenWithParentViewHidden()) { - // Suppress the complete event for now because the parent view is - // hidden. - download_completed_while_fullscreen_ = true; - } - } std::vector<std::unique_ptr<DownloadUIModel>> all_models = bubble_controller_->GetAllItemsToDisplay(); + AllDownloadUIModelsInfo info = GetAllModelsInfo(all_models); + bool will_show_details = + may_show_details && ((is_done && info.all_done) || is_deep_scanning); + if (is_done) { + ScheduleToolbarDisappearance(kToolbarIconVisibilityTimeInterval); + } + if (will_show_details && display_->IsFullscreenWithParentViewHidden()) { + // Suppress the complete event for now because the parent view is + // hidden. + details_shown_while_fullscreen_ = true; + will_show_details = false; + } + if (will_show_details) { + display_->ShowDetails(); + } UpdateToolbarButtonState(all_models); } @@ -232,7 +240,7 @@ } void DownloadDisplayController::OnFullscreenStateChanged() { - if (!fullscreen_notification_shown_ || + if ((!fullscreen_notification_shown_ && !details_shown_while_fullscreen_) || display_->IsFullscreenWithParentViewHidden()) { return; } @@ -241,10 +249,10 @@ std::vector<std::unique_ptr<DownloadUIModel>> all_models = bubble_controller_->GetAllItemsToDisplay(); UpdateToolbarButtonState(all_models); - int in_progress_count = InProgressDownloadCount(all_models); - if (in_progress_count > 0 && - download::ShouldShowDownloadBubble(browser_->profile())) { + if (download::ShouldShowDownloadBubble(browser_->profile()) && + details_shown_while_fullscreen_) { display_->ShowDetails(); + details_shown_while_fullscreen_ = false; } } @@ -260,33 +268,31 @@ HideToolbarButton(); return; } - int in_progress_count = InProgressDownloadCount(all_models); - int paused_count = PausedDownloadCount(all_models); - bool has_deep_scanning_download = HasDeepScanningDownload(all_models); + AllDownloadUIModelsInfo info = GetAllModelsInfo(all_models); base::Time last_complete_time = GetLastCompleteTime(bubble_controller_->GetOfflineItems()); - if (in_progress_count > 0) { + if (info.in_progress_count > 0) { icon_info_.icon_state = DownloadIconState::kProgress; - icon_info_.is_active = paused_count >= in_progress_count ? false : true; + icon_info_.is_active = info.paused_count < info.in_progress_count; } else { icon_info_.icon_state = DownloadIconState::kComplete; - if (HasRecentCompleteDownload(kToolbarIconActiveTimeInterval, + bool complete_unactioned = + HasRecentCompleteDownload(kToolbarIconActiveTimeInterval, last_complete_time) && - HasUnactionedDownload(all_models)) { + info.has_unactioned; + bool exited_fullscreen_owed_details = + !display_->IsFullscreenWithParentViewHidden() && + details_shown_while_fullscreen_; + if (complete_unactioned || exited_fullscreen_owed_details) { icon_info_.is_active = true; ScheduleToolbarInactive(kToolbarIconActiveTimeInterval); - } else if (!display_->IsFullscreenWithParentViewHidden() && - download_completed_while_fullscreen_) { - icon_info_.is_active = true; - ScheduleToolbarInactive(kToolbarIconActiveTimeInterval); - download_completed_while_fullscreen_ = false; } else { icon_info_.is_active = false; } } - if (has_deep_scanning_download) { + if (info.has_deep_scanning) { icon_info_.icon_state = DownloadIconState::kDeepScanning; }
diff --git a/chrome/browser/download/bubble/download_display_controller.h b/chrome/browser/download/bubble/download_display_controller.h index a6e75fa..bee54f0b 100644 --- a/chrome/browser/download/bubble/download_display_controller.h +++ b/chrome/browser/download/bubble/download_display_controller.h
@@ -78,16 +78,21 @@ void HandleButtonPressed(); // Common methods for new downloads or new offline items. - // Called from bubble controller when new item(s) are added, with - // |show_details| as argument if the partial view should be shown. - // |show_animation| specifies whether a small animated arrow should be shown. // These methods are virtual so that they can be overridden for fake // controllers in testing. - virtual void OnNewItem(bool show_details, bool show_animation); + + // Called from bubble controller when new item(s) are added. + // |show_animation| specifies whether a small animated arrow should be shown. + virtual void OnNewItem(bool show_animation); // Called from bubble controller when an item is updated, with |is_done| - // indicating if it was marked done, and with - // |show_details_if_done| as argument if the partial view should be shown. - virtual void OnUpdatedItem(bool is_done, bool show_details_if_done); + // indicating if it was marked done, |is_pending_deep_scanning| indicating + // whether it is dangerous and pending deep scanning, and with + // |may_show_details| indicating whether the partial view can be shown. + // (Whether the partial view is actually shown may depend on the state of the + // other downloads.) + virtual void OnUpdatedItem(bool is_done, + bool is_pending_deep_scanning, + bool may_show_details); // Called from bubble controller when an item is deleted. virtual void OnRemovedItem(const ContentId& id); @@ -165,7 +170,7 @@ base::OneShotTimer icon_inactive_timer_; IconInfo icon_info_; bool fullscreen_notification_shown_ = false; - bool download_completed_while_fullscreen_ = false; + bool details_shown_while_fullscreen_ = false; // DownloadDisplayController and DownloadBubbleUIController have the same // lifetime. Both are owned, constructed together, and destructed together by // DownloadToolbarButtonView. If one is valid, so is the other.
diff --git a/chrome/browser/download/bubble/download_display_controller_unittest.cc b/chrome/browser/download/bubble/download_display_controller_unittest.cc index 651c119..bbdf836 100644 --- a/chrome/browser/download/bubble/download_display_controller_unittest.cc +++ b/chrome/browser/download/bubble/download_display_controller_unittest.cc
@@ -213,7 +213,6 @@ void InitDownloadItem(const base::FilePath::CharType* path, DownloadState state, - bool show_details = true, base::FilePath target_file_path = base::FilePath(FILE_PATH_LITERAL("foo"))) { size_t index = items_.size(); @@ -260,7 +259,6 @@ content::DownloadItemUtils::AttachInfoForTesting(&(item(index)), profile_, nullptr); controller().OnNewItem( - (state == download::DownloadItem::IN_PROGRESS) && show_details, /*show_animation=*/false); } @@ -268,23 +266,25 @@ OfflineItem item; item.state = state; bubble_controller().AddOfflineItem(item); - controller().OnNewItem(state == OfflineItemState::IN_PROGRESS, - /*show_animation=*/false); + controller().OnNewItem(/*show_animation=*/false); } - void UpdateOfflineItem(int item_index, OfflineItemState state) { + void UpdateOfflineItem(int item_index, + OfflineItemState state, + bool is_pending_deep_scanning) { if (state == OfflineItemState::COMPLETE) { bubble_controller().UpdateOfflineItem(item_index, state); } controller().OnUpdatedItem(state == OfflineItemState::COMPLETE, - /*show_details_if_done=*/false); + is_pending_deep_scanning, + /*may_show_details=*/true); } void UpdateDownloadItem(int item_index, DownloadState state, download::DownloadDangerType danger_type = download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - bool show_details_if_done = false) { + bool may_show_details = true) { DCHECK_GT(items_.size(), static_cast<size_t>(item_index)); EXPECT_CALL(item(item_index), GetState()).WillRepeatedly(Return(state)); @@ -300,8 +300,10 @@ } else { EXPECT_CALL(item(item_index), IsDone()).WillRepeatedly(Return(false)); } - controller().OnUpdatedItem(state == DownloadState::COMPLETE, - show_details_if_done); + controller().OnUpdatedItem( + state == DownloadState::COMPLETE, + danger_type == download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING, + may_show_details); } void OnRemovedItem(const ContentId& id) { controller().OnRemovedItem(id); } @@ -412,38 +414,50 @@ /*is_active=*/false)); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), - download::DownloadItem::IN_PROGRESS, - /*show_details=*/false); + download::DownloadItem::IN_PROGRESS); + // No details are shown on download initiation. EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + // No details are shown on download initiation. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); + // Pause download 0. EXPECT_CALL(item(0), IsPaused()).WillRepeatedly(Return(true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); + // Pause download 1. EXPECT_CALL(item(1), IsPaused()).WillRepeatedly(Return(true)); UpdateDownloadItem(/*item_index=*/1, DownloadState::IN_PROGRESS); // The download display is not active anymore, because all in progress - // downloads are paused. + // downloads are paused. Details are not shown because the updated download + // is not done. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + /*icon_state=*/DownloadIconState::kProgress, + /*is_active=*/false)); + // Unpause download 0. + EXPECT_CALL(item(0), IsPaused()).WillRepeatedly(Return(false)); + UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS); + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + /*icon_state=*/DownloadIconState::kProgress, + /*is_active=*/true)); + // Complete download 0. + UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); + // Details are shown because the only in-progress download is still paused. EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/false)); - EXPECT_CALL(item(0), IsPaused()).WillRepeatedly(Return(false)); - UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, - /*icon_state=*/DownloadIconState::kProgress, - /*is_active=*/true)); - UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); + // Complete download 1. UpdateDownloadItem(/*item_index=*/1, DownloadState::COMPLETE); + // Now details are shown because all downloads are complete. EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); @@ -477,56 +491,52 @@ InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); - // Reset details_shown before the second download starts. This can happen if - // the user clicks somewhere else to dismiss the download bubble. - display().HideDetails(); - InitDownloadItem(FILE_PATH_LITERAL("/foo/bar2.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); + UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); + // The download icon state is still kProgress because not all downloads are + // completed. details_shown is still false, because the details are only + // popped up when all in-progress downloads are complete. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + /*icon_state=*/DownloadIconState::kProgress, + /*is_active=*/true)); + + UpdateDownloadItem(/*item_index=*/1, DownloadState::COMPLETE); + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + /*icon_state=*/DownloadIconState::kComplete, + /*is_active=*/true)); + // Reset details_shown while the downloads are in progress. This can happen if // the user clicks somewhere else to dismiss the download bubble. display().HideDetails(); - UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); - // The download icon state is still kProgress because not all downloads are - // completed. details_shown is still false, because the details are only - // popped up when the download is created. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, - /*icon_state=*/DownloadIconState::kProgress, - /*is_active=*/true)); - - UpdateDownloadItem(/*item_index=*/1, DownloadState::COMPLETE); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, - /*icon_state=*/DownloadIconState::kComplete, - /*is_active=*/true)); - InitOfflineItem(OfflineItemState::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + // Do not show details because the offline item is not complete. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); - display().HideDetails(); - UpdateOfflineItem(/*item_index=*/0, OfflineItemState::COMPLETE); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + UpdateOfflineItem(/*item_index=*/0, OfflineItemState::COMPLETE, + /*is_pending_deep_scanning=*/false); + // Details are shown because all items are complete. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar3.pdf"), download::DownloadItem::IN_PROGRESS); - display().HideDetails(); - // Don't pop up the view on completed download. UpdateDownloadItem(/*item_index=*/2, DownloadState::COMPLETE, - download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - /*show_details_if_done=*/true); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); + // Pop up the partial view because all downloads are complete. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); } @@ -552,18 +562,31 @@ InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS, + download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING); + // Details are shown because the scan is pending. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + /*icon_state=*/DownloadIconState::kProgress, + /*is_active=*/true)); + + // Reset details_shown while the downloads are in progress. This can happen if + // the user clicks somewhere else to dismiss the download bubble. + display().HideDetails(); + + UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS, download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING); + // Details are not shown because the scan is ongoing. EXPECT_TRUE( - VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kDeepScanning, /*is_active=*/true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); + // Details are shown because all downloads are now complete. EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); @@ -575,7 +598,7 @@ /*is_active=*/false)); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), - download::DownloadItem::IN_PROGRESS, /*show_details=*/false, + download::DownloadItem::IN_PROGRESS, /*target_file_path=*/base::FilePath(FILE_PATH_LITERAL(""))); // Empty file path should not be reflected in the UI. EXPECT_TRUE(VerifyDisplayState(/*shown=*/false, /*detail_shown=*/false, @@ -585,8 +608,8 @@ EXPECT_CALL(item(0), GetTargetFilePath()) .WillRepeatedly( ReturnRefOfCopy(base::FilePath(FILE_PATH_LITERAL("bar.pdf")))); - controller().OnNewItem(/*show_details=*/true, /*show_animation=*/false); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + controller().OnNewItem(/*show_animation=*/false); + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); } @@ -599,22 +622,22 @@ InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); EXPECT_CALL(item(0), IsDangerous()).WillRepeatedly(Return(true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS, - download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST, - /*show_details_if_done=*/true); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST); + // Details are not shown for most dangerous reasons. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/false)); - // Downloads prompted for deep scanning should be considered in progress. + // Downloads prompted for deep scanning should be considered in progress and + // should display details. UpdateDownloadItem(/*item_index=*/0, DownloadState::IN_PROGRESS, - download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING, - /*show_details_if_done=*/true); + download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING); EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); @@ -629,8 +652,9 @@ OnRemovedItem(ContentId("LEGACY_DOWNLOAD", different_id)); // The download display is still shown, because the removed download is - // different. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + // different. Details are not shown because there is still a download in + // progress. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); @@ -653,9 +677,10 @@ EXPECT_CALL(item(1), GetGuid()).WillRepeatedly(ReturnRef(ids[1])); // The download display is still shown, because there are multiple downloads - // in the list. + // in the list. Details are not shown because there is still a download in + // progress. OnRemovedItem(ContentId("LEGACY_DOWNLOAD", ids[0])); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); @@ -670,11 +695,12 @@ UpdateToolbarButtonState_DownloadWasActionedOn) { InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE); + // Details are shown because the last in-progress download has completed. EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); @@ -689,18 +715,35 @@ TEST_F(DownloadDisplayControllerTest, UpdateToolbarButtonState_OnResume) { InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); EXPECT_CALL(item(0), IsPaused()).WillRepeatedly(Return(true)); controller().OnResume(); // is_active state should be updated after OnResume is called. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/false)); } +TEST_F(DownloadDisplayControllerTest, + UpdateToolbarButtonState_DontShowDetailsIfNotAllowed) { + InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), + download::DownloadItem::IN_PROGRESS); + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + /*icon_state=*/DownloadIconState::kProgress, + /*is_active=*/true)); + + UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + /*may_show_details=*/false); + // Details are not shown because may_show_details is false. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + /*icon_state=*/DownloadIconState::kComplete, + /*is_active=*/true)); +} + TEST_F(DownloadDisplayControllerTest, InitialState_OldLastDownload) { InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::COMPLETE); @@ -795,20 +838,20 @@ TEST_F(DownloadDisplayControllerTest, OnButtonPressed_IconStateInProgress) { InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); controller().OnButtonPressed(); // Keep is_active to true because the download is still in progress. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); } TEST_F(DownloadDisplayControllerTest, - Fullscreen_ShowsDetailsForInProgressOnExitFullscreen) { + Fullscreen_DoesNotShowDetailsForInProgressOnExitFullscreen) { display().SetIsFullscreen(true); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); @@ -819,14 +862,14 @@ display().SetIsFullscreen(false); controller().OnFullscreenStateChanged(); - // Show bubble for in-progress download when exiting full screen mode. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + // Do not show bubble for in-progress download when exiting full screen mode. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); } TEST_F(DownloadDisplayControllerTest, - Fullscreen_ShowsIconForCompletedOnExitFullscreen) { + Fullscreen_ShowsIconAndDetailsForCompletedOnExitFullscreen) { display().SetIsFullscreen(true); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); @@ -835,8 +878,7 @@ /*is_active=*/true)); UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE, - download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, - /*show_details_if_done=*/true); + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); // While the bubble does not pop up, and the toolbar not shown, the icon // state is still updated. So |is_active| should be true for one minute // after completed download. @@ -852,10 +894,12 @@ display().SetIsFullscreen(false); controller().OnFullscreenStateChanged(); - // On exiting full screen, show download icon as active for 1 minute. - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, + // On exiting full screen, show download icon as active for 1 minute and show + // details, as they were missed while in fullscreen. + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, /*icon_state=*/DownloadIconState::kComplete, /*is_active=*/true)); + display().HideDetails(); task_environment_.FastForwardBy(base::Minutes(1)); // The display is still showing but the state has changed to inactive. @@ -870,7 +914,11 @@ .WillRepeatedly(Return(true)); InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"), download::DownloadItem::IN_PROGRESS); - EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/false, /*icon_state=*/DownloadIconState::kProgress, /*is_active=*/true)); + UpdateDownloadItem(0, download::DownloadItem::COMPLETE); + EXPECT_TRUE(VerifyDisplayState(/*shown=*/true, /*detail_shown=*/true, + /*icon_state=*/DownloadIconState::kComplete, + /*is_active=*/true)); }
diff --git a/chrome/browser/download/download_ui_controller.cc b/chrome/browser/download/download_ui_controller.cc index 640de492..1b6d783d 100644 --- a/chrome/browser/download/download_ui_controller.cc +++ b/chrome/browser/download/download_ui_controller.cc
@@ -152,13 +152,14 @@ if (inspected) web_contents = inspected; } - Browser* browser_to_pop_bubble = + Browser* browser_to_show_animation = web_contents ? chrome::FindBrowserWithWebContents(web_contents) : nullptr; // As a last resort, use the last active browser for this profile. Not ideal, // but better than not showing the download at all. - if (browser_to_pop_bubble == nullptr) - browser_to_pop_bubble = chrome::FindLastActiveWithProfile(profile_); + if (browser_to_show_animation == nullptr) { + browser_to_show_animation = chrome::FindLastActiveWithProfile(profile_); + } BrowserList* browser_list = BrowserList::GetInstance(); if (!browser_list) @@ -168,7 +169,7 @@ if (browser && browser->window() && browser->window()->GetDownloadBubbleUIController()) { browser->window()->GetDownloadBubbleUIController()->OnNewItem( - item, /*show_details=*/(browser == browser_to_pop_bubble)); + item, /*may_show_animation=*/(browser == browser_to_show_animation)); } } }
diff --git a/chrome/browser/download/drag_download_item_aura.cc b/chrome/browser/download/drag_download_item_aura.cc index 3f9776e..0797295 100644 --- a/chrome/browser/download/drag_download_item_aura.cc +++ b/chrome/browser/download/drag_download_item_aura.cc
@@ -7,7 +7,6 @@ #include <string> #include "build/build_config.h" -#include "chrome/browser/profiles/profile.h" #include "components/download/public/common/download_item.h" #include "net/base/mime_util.h" #include "ui/aura/client/drag_drop_client.h"
diff --git a/chrome/browser/enterprise/connectors/interstitials/enterprise_block_page.cc b/chrome/browser/enterprise/connectors/interstitials/enterprise_block_page.cc index 581ed381..0efb9ef 100644 --- a/chrome/browser/enterprise/connectors/interstitials/enterprise_block_page.cc +++ b/chrome/browser/enterprise/connectors/interstitials/enterprise_block_page.cc
@@ -66,7 +66,9 @@ l10n_util::GetStringFUTF16( IDS_ENTERPRISE_BLOCK_PRIMARY_PARAGRAPH, security_interstitials::common_string_util::GetFormattedHostName( - request_url()))); + request_url()), + l10n_util::GetStringUTF16( + IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT))); load_time_data.Set("primaryButtonText", l10n_util::GetStringUTF16(IDS_ENTERPRISE_BLOCK_GO_BACK)); }
diff --git a/chrome/browser/enterprise/connectors/interstitials/enterprise_warn_page.cc b/chrome/browser/enterprise/connectors/interstitials/enterprise_warn_page.cc index 59c360e9..6d8bb701 100644 --- a/chrome/browser/enterprise/connectors/interstitials/enterprise_warn_page.cc +++ b/chrome/browser/enterprise/connectors/interstitials/enterprise_warn_page.cc
@@ -68,7 +68,9 @@ l10n_util::GetStringFUTF16( IDS_ENTERPRISE_WARN_PRIMARY_PARAGRAPH, security_interstitials::common_string_util::GetFormattedHostName( - request_url()))); + request_url()), + l10n_util::GetStringUTF16( + IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT))); load_time_data.Set( "proceedButtonText", l10n_util::GetStringUTF16(IDS_ENTERPRISE_WARN_CONTINUE_TO_SITE));
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc index e2b7e1a7..d57b3f2 100644 --- a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc +++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
@@ -154,6 +154,22 @@ return autofill_driver->autofill_manager(); } +autofill::AutofillProfile CreateNewAutofillProfile() { + if (!base::FeatureList::IsEnabled( + autofill::features::test:: + kAutofillCreateAccountProfilesFromSettings)) { + return autofill::AutofillProfile(base::GenerateGUID(), kSettingsOrigin); + } + autofill::AutofillProfile profile( + base::GenerateGUID(), kSettingsOrigin, + autofill::AutofillProfile::Source::kAccount); + profile.set_initial_creator_id( + autofill::AutofillProfile::kInitialCreatorOrModifierChrome); + profile.set_last_modifier_id( + autofill::AutofillProfile::kInitialCreatorOrModifierChrome); + return profile; +} + } // namespace namespace extensions { @@ -206,9 +222,7 @@ return RespondNow(Error(kErrorDataUnavailable)); } autofill::AutofillProfile profile = - existing_profile - ? *existing_profile - : autofill::AutofillProfile(base::GenerateGUID(), kSettingsOrigin); + existing_profile ? *existing_profile : CreateNewAutofillProfile(); if (address->full_names) { std::string full_name;
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc index f39b2da..fed61efb 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -871,7 +871,7 @@ // Create a temp file. base::FilePath temp_file; if (!base::CreateTemporaryFile(&temp_file) || - base::WriteFile(temp_file, data, length) != length) { + !base::WriteFile(temp_file, base::StringPiece(data, length))) { return false; } // Invoke the fileapi to copy it into the sandboxed filesystem. @@ -1237,7 +1237,7 @@ { base::ScopedAllowBlockingForTesting allow_blocking; - EXPECT_EQ(0, base::WriteFile(real_path, "", 0)); + EXPECT_TRUE(base::WriteFile(real_path, "")); ASSERT_TRUE(base::PathExists(real_path)); ASSERT_FALSE(base::PathExists(fake_path)); }
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc index 1daeb0b..bf62e292 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
@@ -316,8 +316,7 @@ return; } - base::WriteFile(tmp_path, reinterpret_cast<const char*>(data->data()), - data->size()); + base::WriteFile(tmp_path, *data); success = base::Move(tmp_path, data_file); } else { // Not passing a second parameter means clear the data sored under |id|.
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc index ba832fe..3340748 100644 --- a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc +++ b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -174,18 +174,14 @@ CHECK(base::CreateDirectory(root)); std::string data = "Can you see me?"; - CHECK(base::WriteFile(root.Append("open_existing.txt"), data.data(), - data.size())); - CHECK(base::WriteFile(root.Append("open_existing1.txt"), data.data(), - data.size())); - CHECK(base::WriteFile(root.Append("open_existing2.txt"), data.data(), - data.size())); - CHECK(base::WriteFile(root.Append("save_existing.txt"), data.data(), - data.size())); + CHECK(base::WriteFile(root.Append("open_existing.txt"), data)); + CHECK(base::WriteFile(root.Append("open_existing1.txt"), data)); + CHECK(base::WriteFile(root.Append("open_existing2.txt"), data)); + CHECK(base::WriteFile(root.Append("save_existing.txt"), data)); CHECK(base::CreateDirectory(root.Append("subdir"))); CHECK(base::WriteFile(root.Append("subdir").Append("open_existing.txt"), - data.data(), data.size())); + data)); } base::ScopedTempDir test_cache_root_;
diff --git a/chrome/browser/extensions/api/font_settings/font_settings_api.cc b/chrome/browser/extensions/api/font_settings/font_settings_api.cc index bcfd921..0f802117 100644 --- a/chrome/browser/extensions/api/font_settings/font_settings_api.cc +++ b/chrome/browser/extensions/api/font_settings/font_settings_api.cc
@@ -15,6 +15,7 @@ #include "base/functional/bind.h" #include "base/json/json_writer.h" #include "base/lazy_instance.h" +#include "base/memory/raw_ptr.h" #include "base/strings/string_util.h" #include "base/trace_event/trace_event.h" #include "base/values.h" @@ -22,15 +23,19 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/api/preference/preference_helpers.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/font_pref_change_notifier.h" #include "chrome/browser/font_pref_change_notifier_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/font_settings.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_names_util.h" +#include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h" #include "content/public/browser/font_list_async.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_source.h" +#include "extensions/browser/event_router.h" +#include "extensions/browser/extension_event_histogram_value.h" #include "extensions/browser/extension_prefs_helper.h" #include "extensions/browser/extension_prefs_helper_factory.h" #include "extensions/browser/extension_system.h" @@ -96,6 +101,57 @@ } // namespace +// This class observes pref changed events on a profile and dispatches the +// corresponding extension API events to extensions. +class FontSettingsEventRouter { + public: + // Constructor for observing pref changed events on `profile`. Stores a + // pointer to `profile` but does not take ownership. `profile` must be + // non-NULL and remain alive for the lifetime of the instance. + explicit FontSettingsEventRouter(Profile* profile); + + FontSettingsEventRouter(const FontSettingsEventRouter&) = delete; + FontSettingsEventRouter& operator=(const FontSettingsEventRouter&) = delete; + + virtual ~FontSettingsEventRouter(); + + private: + // Observes browser pref `pref_name`. When a change is observed, dispatches + // event `event_name` to extensions. A JavaScript object is passed to the + // extension event function with the new value of the pref in property `key`. + void AddPrefToObserve(const char* pref_name, + events::HistogramValue histogram_value, + const char* event_name, + const char* key); + + // Decodes a preference change for a font family map and invokes + // OnFontNamePrefChange with the right parameters. + void OnFontFamilyMapPrefChanged(const std::string& pref_name); + + // Dispatches a changed event for the font setting for `generic_family` and + // `script` to extensions. The new value of the setting is the value of + // browser pref `pref_name`. + void OnFontNamePrefChanged(const std::string& pref_name, + const std::string& generic_family, + const std::string& script); + + // Dispatches the setting changed event `event_name` to extensions. The new + // value of the setting is the value of browser pref `pref_name`. This value + // is passed in the JavaScript object argument to the extension event function + // under the key `key`. + void OnFontPrefChanged(events::HistogramValue histogram_value, + const std::string& event_name, + const std::string& key, + const std::string& pref_name); + + // Manages pref observation registration. + PrefChangeRegistrar registrar_; + FontPrefChangeNotifier::Registrar font_change_registrar_; + + // Weak, owns us (transitively via ExtensionService). + raw_ptr<Profile> profile_; +}; + FontSettingsEventRouter::FontSettingsEventRouter(Profile* profile) : profile_(profile) { TRACE_EVENT0("browser,startup", "FontSettingsEventRouter::ctor"); @@ -219,7 +275,7 @@ std::string pref_path = GetFontNamePrefPath(params->details.generic_family, params->details.script); - // Ensure |pref_path| really is for a registered per-script font pref. + // Ensure `pref_path` really is for a registered per-script font pref. EXTENSION_FUNCTION_VALIDATE(profile->GetPrefs()->FindPreference(pref_path)); ExtensionPrefsHelper::Get(profile)->RemoveExtensionControlledPref( @@ -273,7 +329,7 @@ std::string pref_path = GetFontNamePrefPath(params->details.generic_family, params->details.script); - // Ensure |pref_path| really is for a registered font pref. + // Ensure `pref_path` really is for a registered font pref. EXTENSION_FUNCTION_VALIDATE(profile->GetPrefs()->FindPreference(pref_path)); ExtensionPrefsHelper::Get(profile)->SetExtensionControlledPref(
diff --git a/chrome/browser/extensions/api/font_settings/font_settings_api.h b/chrome/browser/extensions/api/font_settings/font_settings_api.h index 06cbf72..ad15013 100644 --- a/chrome/browser/extensions/api/font_settings/font_settings_api.h +++ b/chrome/browser/extensions/api/font_settings/font_settings_api.h
@@ -13,72 +13,16 @@ #include "base/memory/raw_ptr.h" #include "base/values.h" -#include "chrome/browser/font_pref_change_notifier.h" -#include "components/prefs/pref_change_registrar.h" -#include "components/prefs/pref_service.h" #include "extensions/browser/browser_context_keyed_api_factory.h" -#include "extensions/browser/event_router.h" -#include "extensions/browser/extension_event_histogram_value.h" #include "extensions/browser/extension_function.h" -class Profile; - namespace content { class BrowserContext; } namespace extensions { -// This class observes pref changed events on a profile and dispatches the -// corresponding extension API events to extensions. -class FontSettingsEventRouter { - public: - // Constructor for observing pref changed events on |profile|. Stores a - // pointer to |profile| but does not take ownership. |profile| must be - // non-NULL and remain alive for the lifetime of the instance. - explicit FontSettingsEventRouter(Profile* profile); - - FontSettingsEventRouter(const FontSettingsEventRouter&) = delete; - FontSettingsEventRouter& operator=(const FontSettingsEventRouter&) = delete; - - virtual ~FontSettingsEventRouter(); - - private: - // Observes browser pref |pref_name|. When a change is observed, dispatches - // event |event_name| to extensions. A JavaScript object is passed to the - // extension event function with the new value of the pref in property |key|. - void AddPrefToObserve(const char* pref_name, - events::HistogramValue histogram_value, - const char* event_name, - const char* key); - - // Decodes a preference change for a font family map and invokes - // OnFontNamePrefChange with the right parameters. - void OnFontFamilyMapPrefChanged(const std::string& pref_name); - - // Dispatches a changed event for the font setting for |generic_family| and - // |script| to extensions. The new value of the setting is the value of - // browser pref |pref_name|. - void OnFontNamePrefChanged(const std::string& pref_name, - const std::string& generic_family, - const std::string& script); - - // Dispatches the setting changed event |event_name| to extensions. The new - // value of the setting is the value of browser pref |pref_name|. This value - // is passed in the JavaScript object argument to the extension event function - // under the key |key|. - void OnFontPrefChanged(events::HistogramValue histogram_value, - const std::string& event_name, - const std::string& key, - const std::string& pref_name); - - // Manages pref observation registration. - PrefChangeRegistrar registrar_; - FontPrefChangeNotifier::Registrar font_change_registrar_; - - // Weak, owns us (transitively via ExtensionService). - raw_ptr<Profile> profile_; -}; +class FontSettingsEventRouter; // The profile-keyed service that manages the font_settings extension API. // This is not an EventRouter::Observer (and does not lazily initialize) because
diff --git a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.cc b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.cc index b4ee903..b6fb954 100644 --- a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.cc +++ b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.cc
@@ -13,10 +13,14 @@ namespace extensions { namespace image_writer { +namespace { + // Number of bytes for the maximum partition table size. GUID partition tables // reside in the second sector of the disk. Disks can have up to 4k sectors. // See http://crbug.com/328246 for more information. -const int kPartitionTableSize = 2 * 4096; +constexpr size_t kPartitionTableSize = 2 * 4096; + +} // namespace DestroyPartitionsOperation::DestroyPartitionsOperation( base::WeakPtr<OperationManager> manager, @@ -37,11 +41,8 @@ return; } - std::unique_ptr<char[]> buffer(new char[kPartitionTableSize]); - memset(buffer.get(), 0, kPartitionTableSize); - - if (base::WriteFile(image_path_, buffer.get(), kPartitionTableSize) != - kPartitionTableSize) { + std::vector<uint8_t> buffer(kPartitionTableSize, 0); + if (!base::WriteFile(image_path_, buffer)) { Error(error::kTempFileError); return; }
diff --git a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.h b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.h index b9ad696..469d9bde 100644 --- a/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.h +++ b/chrome/browser/extensions/api/image_writer_private/destroy_partitions_operation.h
@@ -11,8 +11,6 @@ namespace extensions { namespace image_writer { -extern const int kPartitionTableSize; - // Encapsulates an operation for destroying partitions. This is achieved by // creating a dummy blank image which is then burned to the disk. class DestroyPartitionsOperation : public Operation {
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc index 87b3962..ece2c73 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
@@ -216,8 +216,8 @@ } static void FillFile(const base::FilePath& path, char pattern) { - const std::vector<char> fill(kTestFileSize, pattern); - EXPECT_TRUE(base::WriteFile(path, fill.data(), kTestFileSize)); + const std::string fill(kTestFileSize, pattern); + EXPECT_TRUE(base::WriteFile(path, fill)); } base::SequencedTaskRunner* CreateTaskRunner() {
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc index 0e720ab..cf512b0 100644 --- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc +++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -302,12 +302,10 @@ } bool ImageWriterTestUtils::FillFile(const base::FilePath& file, - const int pattern, - const int length) { - std::unique_ptr<char[]> buffer(new char[length]); - memset(buffer.get(), pattern, length); - - return base::WriteFile(file, buffer.get(), length) == length; + uint8_t pattern, + size_t length) { + std::vector<uint8_t> buffer(length, pattern); + return base::WriteFile(file, buffer); } ImageWriterUnitTestBase::ImageWriterUnitTestBase()
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.h b/chrome/browser/extensions/api/image_writer_private/test_utils.h index c548fbb..3a2180b 100644 --- a/chrome/browser/extensions/api/image_writer_private/test_utils.h +++ b/chrome/browser/extensions/api/image_writer_private/test_utils.h
@@ -39,9 +39,9 @@ // Default file size to use in tests. Currently 32kB. const int kTestFileSize = 32 * 1024; // Pattern to use in the image file. -const int kImagePattern = 0x55555555; // 01010101 +const uint8_t kImagePattern = 0x55; // 01010101 // Pattern to use in the device file. -const int kDevicePattern = 0xAAAAAAAA; // 10101010 +const uint8_t kDevicePattern = 0xAA; // 10101010 // Disk file system type const char kTestFileSystemType[] = "vfat"; @@ -165,9 +165,7 @@ // Fills |file| with |length| bytes of |pattern|, overwriting any existing // data. - bool FillFile(const base::FilePath& file, - const int pattern, - const int length); + bool FillFile(const base::FilePath& file, uint8_t pattern, size_t length); // Set up the test utils, creating temporary folders and such. virtual void SetUp();
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index e5713f4..c161ca3 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -92,6 +92,9 @@ triggered_rule.Set( extensions::SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleId, trigger.rule_id()); + triggered_rule.Set( + extensions::SafeBrowsingPrivateEventRouter::kKeyUrlCategory, + trigger.url_category()); triggered_rule_info.Append(std::move(triggered_rule)); }
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc index 5f195c81..0b1f4e82 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -193,6 +193,7 @@ rule->set_action(enterprise_connectors::TriggeredRule::BLOCK); rule->set_rule_name("fake rule"); rule->set_rule_id("12345"); + rule->set_url_category("test rule category"); SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) ->OnAnalysisConnectorResult( @@ -343,7 +344,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); @@ -381,7 +382,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ false); @@ -418,7 +419,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnPolicySpecifiedPasswordChangedEvent(); @@ -447,7 +448,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnDangerousDownloadOpenedEvent(); @@ -495,7 +496,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnSecurityInterstitialProceededEvent(); @@ -533,7 +534,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnSecurityInterstitialShownEvent(); @@ -571,7 +572,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnDangerousDownloadEvent(); @@ -609,7 +610,7 @@ event_router_->AddEventObserver(&event_observer); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnDangerousDownloadEventBypass(); @@ -645,7 +646,7 @@ api::safe_browsing_private::OnSecurityInterstitialShown::kEventName); event_router_->AddEventObserver(&event_observer); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnSecurityInterstitialShownEvent(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, event_observer.PassEventArgs().GetList().size()); @@ -653,7 +654,7 @@ // Now turn off policy. This time no report should be generated. SetReportingPolicy(false); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnSecurityInterstitialShownEvent(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, event_observer.PassEventArgs().GetList().size()); @@ -672,7 +673,7 @@ // Now turn on policy. SetReportingPolicy(true); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnSecurityInterstitialShownEvent(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, event_observer.PassEventArgs().GetList().size()); @@ -687,7 +688,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); base::RunLoop().RunUntilIdle(); @@ -703,7 +704,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnPolicySpecifiedPasswordChangedEvent(); base::RunLoop().RunUntilIdle(); @@ -720,7 +721,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnDangerousDownloadOpenedEvent(); base::RunLoop().RunUntilIdle(); @@ -737,7 +738,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnSecurityInterstitialProceededEvent(); base::RunLoop().RunUntilIdle(); @@ -754,7 +755,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnSecurityInterstitialShownEvent(); base::RunLoop().RunUntilIdle(); @@ -771,7 +772,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnDangerousDownloadEvent(); base::RunLoop().RunUntilIdle(); @@ -788,7 +789,7 @@ event_router_->AddEventObserver(&event_observer); base::Value report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); TriggerOnDangerousDownloadEventBypass(); base::RunLoop().RunUntilIdle(); @@ -981,7 +982,7 @@ SetUpRouters(/*authorized=*/true); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnSensitiveDataEvent(safe_browsing::EventResult::ALLOWED); @@ -1025,6 +1026,9 @@ EXPECT_EQ("fake rule", *triggered_rule.FindString( SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleName)); + EXPECT_EQ("test rule category", + *triggered_rule.FindString( + SafeBrowsingPrivateEventRouter::kKeyUrlCategory)); EXPECT_EQ("scan_id", *event->FindString(SafeBrowsingPrivateEventRouter::kKeyScanId)); } @@ -1033,7 +1037,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnSensitiveDataEvent(safe_browsing::EventResult::BLOCKED); @@ -1077,6 +1081,9 @@ EXPECT_EQ("fake rule", *triggered_rule.FindString( SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleName)); + EXPECT_EQ("test rule category", + *triggered_rule.FindString( + SafeBrowsingPrivateEventRouter::kKeyUrlCategory)); EXPECT_EQ("scan_id", *event->FindString(SafeBrowsingPrivateEventRouter::kKeyScanId)); } @@ -1086,7 +1093,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnUrlFilteringInterstitial("ENTERPRISE_BLOCKED_SEEN"); @@ -1125,7 +1132,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnUrlFilteringInterstitial("ENTERPRISE_WARNED_SEEN"); @@ -1164,7 +1171,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnUrlFilteringInterstitial("ENTERPRISE_WARNED_BYPASS"); @@ -1202,7 +1209,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnUnscannedFileEvent(safe_browsing::EventResult::ALLOWED); @@ -1246,7 +1253,7 @@ SetUpRouters(); base::Value::Dict report; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce(CaptureArg(&report)); TriggerOnUnscannedFileEvent(safe_browsing::EventResult::BLOCKED); @@ -1297,8 +1304,7 @@ ->SetIdentityManagerForTesting( identity_test_environment.identity_manager()); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) - .WillRepeatedly(Return()); + EXPECT_CALL(*client_, UploadSecurityEventReport).WillRepeatedly(Return()); // With no primary account, we should not set the username. TriggerOnSecurityInterstitialShownEvent(); @@ -1343,7 +1349,7 @@ api::safe_browsing_private::OnPolicySpecifiedPasswordChanged::kEventName); event_router_->AddEventObserver(&event_observer); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnPolicySpecifiedPasswordChangedEvent(); base::RunLoop().RunUntilIdle(); @@ -1367,7 +1373,7 @@ kEventName); event_router_->AddEventObserver(&event_observer); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); base::RunLoop().RunUntilIdle(); @@ -1390,7 +1396,7 @@ api::safe_browsing_private::OnDangerousDownloadOpened::kEventName); event_router_->AddEventObserver(&event_observer); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(3); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(3); TriggerOnDangerousDownloadEvent(); TriggerOnDangerousDownloadEventBypass(); TriggerOnDangerousDownloadOpenedEvent(); @@ -1418,7 +1424,7 @@ event_router_->AddEventObserver(&event_observer1); event_router_->AddEventObserver(&event_observer2); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(2); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(2); TriggerOnSecurityInterstitialShownEvent(); TriggerOnSecurityInterstitialProceededEvent(); base::RunLoop().RunUntilIdle(); @@ -1439,7 +1445,7 @@ SetUpRouters(/*authorized=*/true, /*realtime_reporting_enable=*/true, enabled_event_names); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnSensitiveDataEvent(safe_browsing::EventResult::BLOCKED); base::RunLoop().RunUntilIdle(); @@ -1455,7 +1461,7 @@ SetUpRouters(/*authorized=*/true, /*realtime_reporting_enable=*/true, enabled_event_names); - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); TriggerOnUnscannedFileEvent(safe_browsing::EventResult::ALLOWED); base::RunLoop().RunUntilIdle(); @@ -1538,13 +1544,13 @@ bool should_report = is_policy_enabled_ && is_authorized_; if (should_report) { - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(1); } else if (client_) { // Because the test will crate a |client_| object when the policy is // set, even if the feature flag or other conditions indicate that // reports should not be sent, it is possible that the pointer is not // null. In this case, make sure UploadSecurityEventReport() is not called. - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); } TriggerOnPolicySpecifiedPasswordChangedEvent(); @@ -1611,8 +1617,7 @@ event_router_->AddEventObserver(&event_observer5); // Only 1 of the 9 triggers should make it to an upload. - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) - .Times(num_triggers_); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(num_triggers_); TriggerOnPolicySpecifiedPasswordChangedEvent(); TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); TriggerOnDangerousDownloadOpenedEvent();
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index fc55ae53..59503c6 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -589,8 +589,8 @@ // Second, resolve, validate and convert them to GURLs. for (auto& url_string : url_strings) { - auto url = - ExtensionTabUtil::PrepareURLForNavigation(url_string, extension()); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + url_string, extension(), browser_context()); if (!url.has_value()) { return RespondNow(Error(std::move(url.error()))); } @@ -1597,7 +1597,8 @@ bool TabsUpdateFunction::UpdateURL(const std::string& url_string, int tab_id, std::string* error) { - auto url = ExtensionTabUtil::PrepareURLForNavigation(url_string, extension()); + auto url = ExtensionTabUtil::PrepareURLForNavigation(url_string, extension(), + browser_context()); if (!url.has_value()) { *error = std::move(url.error()); return false;
diff --git a/chrome/browser/extensions/api/test/apitest_apitest.cc b/chrome/browser/extensions/api/test/apitest_apitest.cc index 07461cb..7eda7bc 100644 --- a/chrome/browser/extensions/api/test/apitest_apitest.cc +++ b/chrome/browser/extensions/api/test/apitest_apitest.cc
@@ -184,6 +184,10 @@ chrome.test.assertNe(null, {}); chrome.test.succeed(); }, + function assertNeTestsWithErrorMessage() { + chrome.test.assertNe(3, 2, '3 does not equal 2'); + chrome.test.succeed(); + }, ]);)"; ASSERT_TRUE(LoadExtensionScriptWithContext(kBackgroundJs, GetParam())); EXPECT_TRUE(result_catcher.GetNextResult()); @@ -214,7 +218,7 @@ ResultCatcher result_catcher; static constexpr char kBackgroundJs[] = R"(chrome.test.runTests([ - function assertNeTestsWithPrimitiveTypes() { + function assertNeTestsWithObjectTypes() { chrome.test.assertNe({x: 42}, {x: 42}); }, ]);)"; @@ -223,6 +227,24 @@ EXPECT_EQ(kExpectedFailureMessage, result_catcher.message()); } +// Exercises chrome.test.assertNe() in failure cases (i.e., the passed values +// are equal). We can only test one case at a time since otherwise we'd be +// unable to determine which part of the test failed (since "failure" here is +// a successful assertNe() check). +IN_PROC_BROWSER_TEST_P(TestAPITestWithContextType, + AssertNe_Failure_AdditionalErrorMessage) { + ResultCatcher result_catcher; + static constexpr char kBackgroundJs[] = + R"(chrome.test.runTests([ + function assertNeTestsWithAdditionalErrorMessage() { + chrome.test.assertNe(2, 2, '2 does equal 2'); + }, + ]);)"; + ASSERT_TRUE(LoadExtensionScriptWithContext(kBackgroundJs, GetParam())); + EXPECT_FALSE(result_catcher.GetNextResult()); + EXPECT_EQ(kExpectedFailureMessage, result_catcher.message()); +} + // Verifies that chrome.test.assertPromiseRejects() succeeds using // promises that reject with the expected message. IN_PROC_BROWSER_TEST_F(TestAPITest, AssertPromiseRejects_Successful) {
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc index eb841e0..0cebafc 100644 --- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc +++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc
@@ -487,7 +487,7 @@ ASSERT_TRUE(WebAuthenticationProxyRemoteSessionStateChangeNotifier:: GetSessionStateChangeDir(&dir)); ASSERT_TRUE(base::CreateDirectory(dir)); - ASSERT_EQ(base::WriteFile(dir.AppendASCII(extension->id()), nullptr, 0), 0); + ASSERT_TRUE(base::WriteFile(dir.AppendASCII(extension->id()), "")); } EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message(); }
diff --git a/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc b/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc index 028e0197..8abe277 100644 --- a/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc +++ b/chrome/browser/extensions/api/webrtc_desktop_capture_private/webrtc_desktop_capture_private_api.cc
@@ -7,7 +7,6 @@ #include "base/command_line.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/api/tabs.h" #include "chrome/common/extensions/api/webrtc_desktop_capture_private.h"
diff --git a/chrome/browser/extensions/app_background_page_apitest.cc b/chrome/browser/extensions/app_background_page_apitest.cc index a8b4959..f1db61d5 100644 --- a/chrome/browser/extensions/app_background_page_apitest.cc +++ b/chrome/browser/extensions/app_background_page_apitest.cc
@@ -141,12 +141,8 @@ } base::FilePath manifest_path = app_dir_.GetPath().AppendASCII("manifest.json"); - int bytes_written = base::WriteFile(manifest_path, - app_manifest.data(), - app_manifest.size()); - if (bytes_written != static_cast<int>(app_manifest.size())) { - LOG(ERROR) << "Unable to write complete manifest to file. Return code=" - << bytes_written; + if (!base::WriteFile(manifest_path, app_manifest)) { + LOG(ERROR) << "Unable to write manifest to file."; return false; } *app_dir = app_dir_.GetPath();
diff --git a/chrome/browser/extensions/chrome_content_verifier_unittest.cc b/chrome/browser/extensions/chrome_content_verifier_unittest.cc index 11471e09..e9555e4 100644 --- a/chrome/browser/extensions/chrome_content_verifier_unittest.cc +++ b/chrome/browser/extensions/chrome_content_verifier_unittest.cc
@@ -223,9 +223,7 @@ constexpr char kTamperedContent[] = "// Evil content"; base::FilePath background_script_path = extension()->path().AppendASCII("d.js"); - ASSERT_EQ(static_cast<int>(sizeof(kTamperedContent)), - base::WriteFile(background_script_path, kTamperedContent, - sizeof(kTamperedContent))); + ASSERT_TRUE(base::WriteFile(background_script_path, kTamperedContent)); } AddExtensionToContentVerifier(extension(), &verifier_observer);
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc index ae85701..feb9b8d 100644 --- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc +++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -29,10 +29,8 @@ #include "chrome/browser/extensions/permissions_updater.h" #include "chrome/browser/extensions/scripting_permissions_modifier.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/toolbar/toolbar_actions_model.h" #include "chrome/common/extensions/api/context_menus.h" -#include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/test_browser_window.h" #include "chrome/test/base/testing_profile.h" @@ -1024,8 +1022,7 @@ // Change extension to run "on click". Since we are revoking permissions, we // need to automatically accept the reload page bubble. action_runner->accept_bubble_for_testing(true); - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(permissions_manager); menu.ExecuteCommand(kOnClick, 0); waiter.WaitForExtensionPermissionsUpdate(); EXPECT_TRUE(menu.IsCommandIdChecked(kOnClick)); @@ -1412,9 +1409,9 @@ // Navigate to a url that should have "customize by extension" site // permissions by default (which allows us to test the page access submenu). content::WebContents* web_contents = AddTab(kActiveUrl); - EXPECT_EQ(PermissionsManager::Get(profile())->GetUserSiteSetting( - url::Origin::Create(kActiveUrl)), - PermissionsManager::UserSiteSetting::kCustomizeByExtension); + EXPECT_EQ( + permissions_manager->GetUserSiteSetting(url::Origin::Create(kActiveUrl)), + PermissionsManager::UserSiteSetting::kCustomizeByExtension); // Verify the extension can run on all sites even though it // can't access the active url. @@ -1437,8 +1434,7 @@ // need to automatically accept the reload page bubble. ExtensionActionRunner::GetForWebContents(web_contents) ->accept_bubble_for_testing(true); - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(permissions_manager); menu.ExecuteCommand(kOnClick, 0); waiter.WaitForExtensionPermissionsUpdate(); EXPECT_TRUE(menu.IsCommandIdChecked(kOnClick)); @@ -1574,15 +1570,14 @@ menu.ExecuteCommand(kOnClick, 0); ExtensionActionRunner::GetForWebContents(web_contents) ->accept_bubble_for_testing(true); - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(permissions_manager); menu.ExecuteCommand(kOnClick, 0); waiter.WaitForExtensionPermissionsUpdate(); } { PermissionsManager::ExtensionSiteAccess site_access = - PermissionsManager::Get(profile())->GetSiteAccess(*extension, b_com); + permissions_manager->GetSiteAccess(*extension, b_com); EXPECT_FALSE(site_access.has_site_access); EXPECT_FALSE(site_access.withheld_site_access); } @@ -1630,8 +1625,7 @@ // page bubble. ExtensionActionRunner::GetForWebContents(web_contents) ->accept_bubble_for_testing(true); - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(permissions_manager); menu.ExecuteCommand(kOnClick, 0); waiter.WaitForExtensionPermissionsUpdate(); @@ -1642,7 +1636,7 @@ // revoke access on b.com. const GURL b_com("https://b.com"); PermissionsManager::ExtensionSiteAccess site_access = - PermissionsManager::Get(profile())->GetSiteAccess(*extension, b_com); + permissions_manager->GetSiteAccess(*extension, b_com); EXPECT_FALSE(site_access.has_site_access); EXPECT_TRUE(site_access.withheld_site_access); }
diff --git a/chrome/browser/extensions/extension_migrator_unittest.cc b/chrome/browser/extensions/extension_migrator_unittest.cc index 42d6f30..1cc3669 100644 --- a/chrome/browser/extensions/extension_migrator_unittest.cc +++ b/chrome/browser/extensions/extension_migrator_unittest.cc
@@ -44,8 +44,7 @@ params.is_first_run = false; // Create prefs file to make the profile not new. const char prefs[] = "{}"; - EXPECT_EQ(int(sizeof(prefs)), - base::WriteFile(params.pref_file, prefs, sizeof(prefs))); + EXPECT_TRUE(base::WriteFile(params.pref_file, prefs)); InitializeExtensionService(params); service()->Init(); AddMigratorProvider();
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index c55eff5..ed52a2e7 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -293,8 +293,7 @@ std::string data = "file_data"; for (const auto& file : file_paths) { - EXPECT_EQ(static_cast<int>(data.size()), - base::WriteFile(file, data.c_str(), data.size())); + EXPECT_TRUE(base::WriteFile(file, data)); } base::Value::Dict manifest = DictionaryBuilder() @@ -2249,10 +2248,8 @@ // Try packing with an invalid manifest. std::string invalid_manifest_content = "I am not a manifest."; - ASSERT_EQ(static_cast<int>(invalid_manifest_content.size()), - base::WriteFile(temp_dir2.GetPath().Append(kManifestFilename), - invalid_manifest_content.c_str(), - invalid_manifest_content.size())); + ASSERT_TRUE(base::WriteFile(temp_dir2.GetPath().Append(kManifestFilename), + invalid_manifest_content)); creator = std::make_unique<ExtensionCreator>(); ASSERT_FALSE(creator->Run(temp_dir2.GetPath(), crx_path, privkey_path, base::FilePath(), ExtensionCreator::kOverwriteCRX));
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc index c8c47f57..a714d5f 100644 --- a/chrome/browser/extensions/extension_tab_util.cc +++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -12,6 +12,7 @@ #include "base/containers/contains.h" #include "base/cxx17_backports.h" +#include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" @@ -21,6 +22,7 @@ #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/browser_extension_window_controller.h" #include "chrome/browser/extensions/chrome_extension_function_details.h" +#include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/platform_util.h" #include "chrome/browser/profiles/profile.h" @@ -71,6 +73,23 @@ namespace { +// This enum is used for counting schemes used via a navigation triggered by +// extensions. +enum class NavigationScheme { + // http: or https: scheme. + kHttpOrHttps = 0, + // chrome: scheme. + kChrome = 1, + // file: scheme where extension has access to local files. + kFileWithPermission = 2, + // file: scheme where extension does NOT have access to local files. + kFileWithoutPermission = 3, + // Everything else. + kOther = 4, + + kMaxValue = kOther, +}; + Browser* CreateBrowser(Profile* profile, bool user_gesture) { if (Browser::GetCreationStatusForProfile(profile) != Browser::CreationStatus::kOk) { @@ -147,6 +166,24 @@ return process_host->IsReady() && process_host->IsInitializedAndNotDead(); } +void RecordNavigationScheme(const GURL& url, + const Extension& extension, + content::BrowserContext* browser_context) { + NavigationScheme scheme = NavigationScheme::kOther; + + if (url.SchemeIsHTTPOrHTTPS()) { + scheme = NavigationScheme::kHttpOrHttps; + } else if (url.SchemeIs(content::kChromeUIScheme)) { + scheme = NavigationScheme::kChrome; + } else if (url.SchemeIsFile()) { + scheme = (util::AllowFileAccess(extension.id(), browser_context)) + ? NavigationScheme::kFileWithPermission + : NavigationScheme::kFileWithoutPermission; + } + + base::UmaHistogramEnumeration("Extensions.Navigation.Scheme", scheme); +} + } // namespace ExtensionTabUtil::OpenTabParams::OpenTabParams() = default; @@ -205,7 +242,7 @@ GURL url; if (params.url) { auto result = ExtensionTabUtil::PrepareURLForNavigation( - *params.url, function->extension()); + *params.url, function->extension(), function->browser_context()); if (!result.has_value()) { return base::unexpected(result.error()); } @@ -777,7 +814,8 @@ base::expected<GURL, std::string> ExtensionTabUtil::PrepareURLForNavigation( const std::string& url_string, - const Extension* extension) { + const Extension* extension, + content::BrowserContext* browser_context) { GURL url = ExtensionTabUtil::ResolvePossiblyRelativeURL(url_string, extension); @@ -816,6 +854,10 @@ return base::unexpected(tabs_constants::kCannotNavigateToChromeUntrusted); } + if (extension && browser_context) { + RecordNavigationScheme(url, *extension, browser_context); + } + return url; }
diff --git a/chrome/browser/extensions/extension_tab_util.h b/chrome/browser/extensions/extension_tab_util.h index 44d82c4..6d1e684 100644 --- a/chrome/browser/extensions/extension_tab_util.h +++ b/chrome/browser/extensions/extension_tab_util.h
@@ -212,7 +212,8 @@ // Returns the url if successful, otherwise returns an error string. static base::expected<GURL, std::string> PrepareURLForNavigation( const std::string& url_string, - const Extension* extension); + const Extension* extension, + content::BrowserContext* browser_context); // Opens a tab for the specified |web_contents|. static void CreateTab(std::unique_ptr<content::WebContents> web_contents,
diff --git a/chrome/browser/extensions/extension_tab_util_browsertest.cc b/chrome/browser/extensions/extension_tab_util_browsertest.cc index 19d07fa..ef59ffc 100644 --- a/chrome/browser/extensions/extension_tab_util_browsertest.cc +++ b/chrome/browser/extensions/extension_tab_util_browsertest.cc
@@ -2,9 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_tab_util.h" +#include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" @@ -13,6 +15,8 @@ #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/browser/test_extension_registry_observer.h" #include "extensions/common/manifest_handlers/options_page_info.h" namespace extensions { @@ -332,4 +336,51 @@ EXPECT_EQ(options_url, GetActiveUrl(regular)); } +IN_PROC_BROWSER_TEST_F(ExtensionTabUtilBrowserTest, RecordNavigationScheme) { + const std::string kHttpUrl("http://example.com"); + const std::string kHttpsUrl("https://example.com"); + const std::string kChromeUrl("chrome://settings"); + const std::string kFileUrl("file:///etc/passwd"); + const std::string kOtherUrl("data:,test"); + struct { + std::string url; + int expected_bucket; + } test_cases[] = { + {kHttpUrl, 0}, {kHttpsUrl, 0}, {kChromeUrl, 1}, + {kFileUrl, 3}, {kOtherUrl, 4}, + }; + std::string error; + GURL url; + + const Extension* extension = + LoadExtension(test_data_dir_.AppendASCII("simple_with_file")); + + for (const auto& test_case : test_cases) { + base::HistogramTester histogram_tester; + auto result_url = ExtensionTabUtil::PrepareURLForNavigation( + test_case.url, extension, profile()); + histogram_tester.ExpectBucketCount("Extensions.Navigation.Scheme", + test_case.expected_bucket, 1); + } + + // Allow file access. This will reload the extension, so we need to reset the + // extension pointer. + ExtensionId id = extension->id(); + TestExtensionRegistryObserver observer(ExtensionRegistry::Get(profile()), id); + util::SetAllowFileAccess(id, profile(), true); + extension = observer.WaitForExtensionLoaded().get(); + + // The extension has file access. Change expected result to + // NavigationScheme::kFileWithPermission. + test_cases[3].expected_bucket = 2; + + for (const auto& test_case : test_cases) { + base::HistogramTester histogram_tester; + auto result_url = ExtensionTabUtil::PrepareURLForNavigation( + test_case.url, extension, profile()); + histogram_tester.ExpectBucketCount("Extensions.Navigation.Scheme", + test_case.expected_bucket, 1); + } +} + } // namespace extensions
diff --git a/chrome/browser/extensions/extension_tab_util_unittest.cc b/chrome/browser/extensions/extension_tab_util_unittest.cc index cb7c376..ebc4792 100644 --- a/chrome/browser/extensions/extension_tab_util_unittest.cc +++ b/chrome/browser/extensions/extension_tab_util_unittest.cc
@@ -92,16 +92,16 @@ // A fully qualified URL should return the same URL. { const std::string kTestUrl("http://google.com"); - auto url = - ExtensionTabUtil::PrepareURLForNavigation(kTestUrl, extension.get()); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + kTestUrl, extension.get(), /*browser_context=*/nullptr); ASSERT_TRUE(url.has_value()); EXPECT_EQ(GURL(kTestUrl), *url); } // A relative path should return a URL relative to the extension's base URL. { const std::string kTestPath("foo"); - auto url = - ExtensionTabUtil::PrepareURLForNavigation(kTestPath, extension.get()); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + kTestPath, extension.get(), /*browser_context=*/nullptr); ASSERT_TRUE(url.has_value()); EXPECT_EQ(extension->GetResourceURL(kTestPath), *url); } @@ -109,8 +109,8 @@ // different potential kill URLs and this just checks one of them. { const std::string kKillURL("chrome://crash"); - auto url = - ExtensionTabUtil::PrepareURLForNavigation(kKillURL, extension.get()); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + kKillURL, extension.get(), /*browser_context=*/nullptr); ASSERT_FALSE(url.has_value()); EXPECT_EQ(tabs_constants::kNoCrashBrowserError, url.error()); } @@ -123,7 +123,8 @@ { auto no_permission_extension = ExtensionBuilder("none").Build(); auto url = ExtensionTabUtil::PrepareURLForNavigation( - kDevtoolsURL, no_permission_extension.get()); + kDevtoolsURL, no_permission_extension.get(), + /*browser_context=*/nullptr); ASSERT_FALSE(url.has_value()); EXPECT_EQ(tabs_constants::kCannotNavigateToDevtools, url.error()); } @@ -133,7 +134,7 @@ .SetManifestKey("devtools_page", "foo.html") .Build(); auto url = ExtensionTabUtil::PrepareURLForNavigation( - kDevtoolsURL, devtools_extension.get()); + kDevtoolsURL, devtools_extension.get(), /*browser_context=*/nullptr); ASSERT_TRUE(url.has_value()); EXPECT_EQ(kDevtoolsURL, *url); } @@ -142,7 +143,7 @@ auto debugger_extension = ExtensionBuilder("debugger").AddPermission("debugger").Build(); auto url = ExtensionTabUtil::PrepareURLForNavigation( - kDevtoolsURL, debugger_extension.get()); + kDevtoolsURL, debugger_extension.get(), /*browser_context=*/nullptr); ASSERT_TRUE(url.has_value()); EXPECT_EQ(kDevtoolsURL, *url); } @@ -151,8 +152,8 @@ TEST(ExtensionTabUtilTest, PrepareURLForNavigationOnChromeUntrusted) { const std::string kChromeUntrustedURL("chrome-untrusted://terminal/"); auto extension = ExtensionBuilder("none").Build(); - auto url = ExtensionTabUtil::PrepareURLForNavigation(kChromeUntrustedURL, - extension.get()); + auto url = ExtensionTabUtil::PrepareURLForNavigation( + kChromeUntrustedURL, extension.get(), /*browser_context=*/nullptr); ASSERT_FALSE(url.has_value()); EXPECT_EQ(tabs_constants::kCannotNavigateToChromeUntrusted, url.error()); }
diff --git a/chrome/browser/extensions/extension_user_script_loader_unittest.cc b/chrome/browser/extensions/extension_user_script_loader_unittest.cc index 61c7a29..2d2e7a1 100644 --- a/chrome/browser/extensions/extension_user_script_loader_unittest.cc +++ b/chrome/browser/extensions/extension_user_script_loader_unittest.cc
@@ -275,8 +275,7 @@ TEST_F(ExtensionUserScriptLoaderTest, SkipBOMAtTheBeginning) { base::FilePath path = temp_dir_.GetPath().AppendASCII("script.user.js"); const std::string content("\xEF\xBB\xBF alert('hello');"); - size_t written = base::WriteFile(path, content.c_str(), content.size()); - ASSERT_EQ(written, content.size()); + ASSERT_TRUE(base::WriteFile(path, content)); auto user_script = std::make_unique<UserScript>(); user_script->set_id("_generated"); @@ -310,8 +309,7 @@ TEST_F(ExtensionUserScriptLoaderTest, LeaveBOMNotAtTheBeginning) { base::FilePath path = temp_dir_.GetPath().AppendASCII("script.user.js"); const std::string content("alert('here's a BOOM: \xEF\xBB\xBF');"); - size_t written = base::WriteFile(path, content.c_str(), content.size()); - ASSERT_EQ(written, content.size()); + ASSERT_TRUE(base::WriteFile(path, content)); auto user_script = std::make_unique<UserScript>(); user_script->set_id("test"); @@ -380,19 +378,15 @@ TEST_F(ExtensionUserScriptLoaderTest, RecordScriptLengthUmas) { base::FilePath a_script_path = temp_dir_.GetPath().AppendASCII("a.script.js"); const std::string a_string(3200, 'a'); - size_t written = - base::WriteFile(a_script_path, a_string.c_str(), a_string.size()); - ASSERT_EQ(written, a_string.size()); + ASSERT_TRUE(base::WriteFile(a_script_path, a_string)); base::FilePath b_script_path = temp_dir_.GetPath().AppendASCII("b.script.js"); const std::string b_string(2200, 'b'); - written = base::WriteFile(b_script_path, b_string.c_str(), b_string.size()); - ASSERT_EQ(written, b_string.size()); + ASSERT_TRUE(base::WriteFile(b_script_path, b_string)); base::FilePath c_script_path = temp_dir_.GetPath().AppendASCII("c.script.js"); const std::string c_string(1200, 'c'); - written = base::WriteFile(c_script_path, c_string.c_str(), c_string.size()); - ASSERT_EQ(written, c_string.size()); + ASSERT_TRUE(base::WriteFile(c_script_path, c_string)); // Create a dynamic user script which specifies a 3kb and 2kb file. auto user_script_1 = std::make_unique<UserScript>();
diff --git a/chrome/browser/extensions/external_provider_impl_unittest.cc b/chrome/browser/extensions/external_provider_impl_unittest.cc index 391e7cb..17b443d 100644 --- a/chrome/browser/extensions/external_provider_impl_unittest.cc +++ b/chrome/browser/extensions/external_provider_impl_unittest.cc
@@ -173,8 +173,7 @@ params.autoupdate_enabled = true; // Create prefs file to make the profile not new. const char prefs[] = "{}"; - EXPECT_EQ(base::WriteFile(params.pref_file, prefs, sizeof(prefs)), - int(sizeof(prefs))); + EXPECT_TRUE(base::WriteFile(params.pref_file, prefs)); InitializeExtensionService(params); service_->updater()->Start(); content::RunAllTasksUntilIdle();
diff --git a/chrome/browser/extensions/launch_util.cc b/chrome/browser/extensions/launch_util.cc index bc675ae..5b33ccb 100644 --- a/chrome/browser/extensions/launch_util.cc +++ b/chrome/browser/extensions/launch_util.cc
@@ -10,7 +10,6 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/extensions/extension_sync_service.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/extensions/bookmark_app_util.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
diff --git a/chrome/browser/extensions/sync_bundle.cc b/chrome/browser/extensions/sync_bundle.cc index d7af80c..8cdd4a4 100644 --- a/chrome/browser/extensions/sync_bundle.cc +++ b/chrome/browser/extensions/sync_bundle.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/extensions/extension_sync_data.h" #include "chrome/browser/extensions/extension_sync_service.h" #include "chrome/browser/extensions/extension_util.h" -#include "chrome/browser/profiles/profile.h" #include "extensions/common/extension.h" namespace extensions {
diff --git a/chrome/browser/extensions/theme_installed_infobar_delegate.cc b/chrome/browser/extensions/theme_installed_infobar_delegate.cc index 099ee7a..a805242 100644 --- a/chrome/browser/extensions/theme_installed_infobar_delegate.cc +++ b/chrome/browser/extensions/theme_installed_infobar_delegate.cc
@@ -13,7 +13,6 @@ #include "build/build_config.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/infobars/confirm_infobar_creator.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc index 107cc74..ee0c6517 100644 --- a/chrome/browser/extensions/updater/extension_updater_unittest.cc +++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -1537,8 +1537,7 @@ size_t size, const base::Time& timestamp) { const std::string data(size, 0); - EXPECT_EQ(static_cast<int>(size), - base::WriteFile(file, data.data(), data.size())); + EXPECT_TRUE(base::WriteFile(file, data)); EXPECT_TRUE(base::TouchFile(file, timestamp, timestamp)); }
diff --git a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc index e014cdb..f07890f 100644 --- a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc +++ b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
@@ -69,8 +69,7 @@ size_t size, const base::Time& timestamp) { std::string data(size, 0); - EXPECT_EQ(base::WriteFile(file, data.data(), data.size()), - static_cast<int>(size)); + EXPECT_TRUE(base::WriteFile(file, data)); EXPECT_TRUE(base::TouchFile(file, timestamp, timestamp)); } @@ -94,8 +93,7 @@ GetExtensionFileName(dir, id, version, hex_hash); if (filename) *filename = file; - EXPECT_EQ(base::WriteFile(file, data.data(), data.size()), - static_cast<int>(size)); + EXPECT_TRUE(base::WriteFile(file, data)); EXPECT_TRUE(base::TouchFile(file, timestamp, timestamp)); return hex_hash;
diff --git a/chrome/browser/extensions/view_extension_source_browsertest.cc b/chrome/browser/extensions/view_extension_source_browsertest.cc index 774d3403..50630b5a 100644 --- a/chrome/browser/extensions/view_extension_source_browsertest.cc +++ b/chrome/browser/extensions/view_extension_source_browsertest.cc
@@ -17,7 +17,24 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "url/gurl.h" -typedef extensions::ExtensionBrowserTest ViewExtensionSourceTest; +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/constants/ash_switches.h" +#endif + +class ViewExtensionSourceTest : public extensions::ExtensionBrowserTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + extensions::ExtensionBrowserTest::SetUpCommandLine(command_line); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // These tests use chrome:// URLs and are written on the assumption devtools + // are always available, so guarantee that assumption holds. Tests that + // check if devtools can be disabled should use a test fixture without the + // kForceDevToolsAvailable switch set. + command_line->AppendSwitch(ash::switches::kForceDevToolsAvailable); +#endif + } +}; // Verify that restoring a view-source tab for a Chrome extension works // properly. See https://crbug.com/699428.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 07f17a5d..098f416 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -415,6 +415,11 @@ "expiry_milestone": 117 }, { + "name": "audio-ap-noise-cancellation", + "owners": ["aaronyu", "hunghsienchen", "chromeos-audio@google.com" ], + "expiry_milestone": 120 + }, + { "name": "audio-flexible-loopback", "owners": ["aaronyu", "htcheong", "chromeos-audio@google.com" ], "expiry_milestone": 120 @@ -2985,6 +2990,11 @@ "expiry_milestone": 108 }, { + "name": "enable-projector-server-side-speech-recognition", + "owners": ["yilkal", "cros-projector@google.com"], + "expiry_milestone": 115 + }, + { "name": "enable-pwas-default-offline-page", "owners": [ "finnur@google.com", "beverloo@google.com" ], "expiry_milestone": 120 @@ -3648,6 +3658,11 @@ "expiry_milestone": 86 }, { + "name": "extension-web-file-handlers", + "owners": [ "solomonkinard" ], + "expiry_milestone": 130 + }, + { "name": "extensions-menu-access-control", "owners": [ "emiliapaz" ], "expiry_milestone": 118 @@ -5782,6 +5797,11 @@ "expiry_milestone": 116 }, { + "name": "power-bookmark-backend", + "owners": [ "wylieb", "skym" ], + "expiry_milestone": 118 + }, + { "name": "power-bookmarks-side-panel", "owners": [ "emshack", "chrome-desktop-ui-sea" ], "expiry_milestone": 118 @@ -6029,11 +6049,6 @@ "expiry_milestone": 130 }, { - "name": "read-later", - "owners": [ "chrome-desktop-ui-sea@google.com", "corising", "wylieb", "chrome-collections@google.com" ], - "expiry_milestone": 112 - }, - { "name": "read-later-reminder-notification", "owners": [ "wylieb" ], "expiry_milestone": 110 @@ -6841,6 +6856,16 @@ "expiry_milestone": 118 }, { + "name": "time-of-day-screen-saver", + "owners": [ "esum", "jasontt", "assistive-eng@google.com" ], + "expiry_milestone": 120 + }, + { + "name": "time-of-day-wallpaper", + "owners": [ "esum", "jasontt", "assistive-eng@google.com" ], + "expiry_milestone": 120 + }, + { "name": "tint-composited-content", "owners": [ "chromeos-gfx@google.com" ], // This flag is used for QA & development on ChromeOS, which has no way to
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 045fbce7..2195834 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1129,11 +1129,6 @@ const char kExperimentalRgbKeyboardPatternsDescription[] = "Enable experimental RGB Keyboard patterns support on supported devices."; -const char kDownloadAutoResumptionNativeName[] = - "Enable download auto-resumption in native"; -const char kDownloadAutoResumptionNativeDescription[] = - "Enables download auto-resumption in native"; - const char kDownloadBubbleName[] = "Enable download bubble"; const char kDownloadBubbleDescription[] = "Enables the download bubble instead of the download shelf."; @@ -1464,7 +1459,16 @@ "usage within <webview>s. For enterprise, the " "ChromeAppsWebViewPermissiveBehaviorAllowed policy serves as an escape " "hatch during the roll out of this change."; -#endif + +#if BUILDFLAG(IS_CHROMEOS_ASH) +extern const char kExtensionWebFileHandlersName[] = + "Extensions Web File Handlers"; +extern const char kExtensionWebFileHandlersDescription[] = + "Enable Extension Web File Handlers, which allows extensions to operate on " + "the native file system. An extension can register to read and edit files, " + "specified in the manifest, by their file extension or mime type."; +#endif // IS_CHROMEOS_ASH +#endif // ENABLE_EXTENSIONS const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs"; const char kExtensionsOnChromeUrlsDescription[] = @@ -2513,6 +2517,10 @@ "to true, pointer movements wil not be affected by the underlying platform " "modications such as mouse accelaration."; +const char kPowerBookmarkBackendName[] = "Power bookmark backend"; +const char kPowerBookmarkBackendDescription[] = + "Enables storing additional metadata to support power bookmark features."; + const char kPowerBookmarksSidePanel[] = "Power bookmarks side panel"; const char kPowerBookmarksSidePanelDescription[] = "Enables the power bookmarks version of the bookmarks side panel content."; @@ -4857,6 +4865,10 @@ "Enable unified desktop mode which allows a window to span multiple " "displays."; +const char kAudioAPNoiseCancellationName[] = "Audio noise cancellation on AP"; +const char kAudioAPNoiseCancellationDescription[] = + "Enable noise cancellation on AP"; + const char kAudioFlexibleLoopbackName[] = "ChromeOS flexible loopback API support"; const char kAudioFlexibleLoopbackDescription[] = @@ -5891,6 +5903,11 @@ const char kProjectorAppDebugDescription[] = "Adds more informative error messages to the Projector app for debugging"; +const char kProjectorServerSideSpeechRecognitionName[] = + "Enable server side speech recognition for Projector"; +const char kProjectorServerSideSpeechRecognitionDescription[] = + "Adds server side speech recognition capability to Projector."; + const char kQsRevampName[] = "Quick Settings Revamp"; const char kQsRevampDescription[] = "Enable QS UI revamp with separated message center."; @@ -6025,6 +6042,15 @@ "Enables Instant Tethering. Instant Tethering allows your nearby Google " "phone to share its Internet connection with this device."; +const char kTimeOfDayScreenSaverName[] = "Time of Day Screen Saver"; +const char kTimeOfDayScreenSaverDescription[] = + "Enables Time of Day Screen Saver feature on supported devices. Requires " + "Time Of Day Wallpaper feature to be enabled."; + +const char kTimeOfDayWallpaperName[] = "Time of Day Wallpaper"; +const char kTimeOfDayWallpaperDescription[] = + "Enables Time of Day Wallpaper feature on supported devices."; + const char kTouchscreenCalibrationName[] = "Enable/disable touchscreen calibration option in material design settings"; const char kTouchscreenCalibrationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 28c273e..a7640cc 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -661,9 +661,6 @@ extern const char kMemlogStackModeNative[]; extern const char kMemlogStackModeNativeWithThreadNames[]; -extern const char kDownloadAutoResumptionNativeName[]; -extern const char kDownloadAutoResumptionNativeDescription[]; - extern const char kDownloadBubbleName[]; extern const char kDownloadBubbleDescription[]; @@ -804,7 +801,12 @@ extern const char kExtensionsMenuAccessControlDescription[]; extern const char kWebViewTagMPArchBehaviorName[]; extern const char kWebViewTagMPArchBehaviorDescription[]; -#endif + +#if BUILDFLAG(IS_CHROMEOS_ASH) +extern const char kExtensionWebFileHandlersName[]; +extern const char kExtensionWebFileHandlersDescription[]; +#endif // IS_CHROMEOS_ASH +#endif // ENABLE_EXTENSIONS extern const char kExtensionsOnChromeUrlsName[]; extern const char kExtensionsOnChromeUrlsDescription[]; @@ -1406,6 +1408,9 @@ extern const char kPointerLockOptionsName[]; extern const char kPointerLockOptionsDescription[]; +extern const char kPowerBookmarkBackendName[]; +extern const char kPowerBookmarkBackendDescription[]; + extern const char kPowerBookmarksSidePanel[]; extern const char kPowerBookmarksSidePanelDescription[]; @@ -2780,6 +2785,9 @@ extern const char kAshEnableUnifiedDesktopName[]; extern const char kAshEnableUnifiedDesktopDescription[]; +extern const char kAudioAPNoiseCancellationName[]; +extern const char kAudioAPNoiseCancellationDescription[]; + extern const char kAudioFlexibleLoopbackName[]; extern const char kAudioFlexibleLoopbackDescription[]; @@ -3378,6 +3386,9 @@ extern const char kProjectorAppDebugName[]; extern const char kProjectorAppDebugDescription[]; +extern const char kProjectorServerSideSpeechRecognitionName[]; +extern const char kProjectorServerSideSpeechRecognitionDescription[]; + extern const char kQsRevampName[]; extern const char kQsRevampDescription[]; @@ -3467,6 +3478,12 @@ extern const char kTetherName[]; extern const char kTetherDescription[]; +extern const char kTimeOfDayScreenSaverName[]; +extern const char kTimeOfDayScreenSaverDescription[]; + +extern const char kTimeOfDayWallpaperName[]; +extern const char kTimeOfDayWallpaperDescription[]; + extern const char kTouchscreenCalibrationName[]; extern const char kTouchscreenCalibrationDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index ff8ca4e..8f21ee3 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -110,7 +110,6 @@ &commerce::kShoppingList, &commerce::kShoppingPDPMetrics, &content_settings::kDarkenWebsitesCheckboxInThemesSetting, - &download::features::kDownloadAutoResumptionNative, &download::features::kSmartSuggestionForLargeDownloads, &download::features::kUseDownloadOfflineContentProvider, &features::kPWAsDefaultOfflinePage, @@ -352,11 +351,11 @@ &omnibox::kSuggestionAnswersColorReverse, &omnibox::kUpdatedConnectionSecurityIndicators, &optimization_guide::features::kPushNotifications, - &page_info::kPageInfoAboutThisSiteNewIcon, &page_info::kPageInfoAboutThisSiteEn, - &page_info::kPageInfoAboutThisSiteMoreInfo, - &page_info::kPageInfoAboutThisSiteNonEn, &page_info::kPageInfoAboutThisSiteImprovedBottomSheet, + &page_info::kPageInfoAboutThisSiteMoreInfo, + &page_info::kPageInfoAboutThisSiteNewIcon, + &page_info::kPageInfoAboutThisSiteNonEn, &password_manager::features::kBiometricTouchToFill, &password_manager::features::kEnablePasswordsAccountStorage, &password_manager::features::kLeakDetectionUnauthenticated, @@ -373,7 +372,6 @@ &query_tiles::features::kQueryTilesInNTP, &query_tiles::features::kQueryTilesOnStart, &query_tiles::features::kQueryTilesSegmentation, - &reading_list::switches::kReadLater, &segmentation_platform::features::kContextualPageActions, &segmentation_platform::features::kContextualPageActionPriceTracking, &segmentation_platform::features::kContextualPageActionReaderMode,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index 3557c92..6ce159a3 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -52,8 +52,6 @@ ImmutableMap.<String, String>builder() .put(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED, ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED) - .put(ChromeFeatureList.DOWNLOADS_AUTO_RESUMPTION_NATIVE, - ChromePreferenceKeys.FLAGS_CACHED_DOWNLOAD_AUTO_RESUMPTION_IN_NATIVE) .put(ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, ChromePreferenceKeys .FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT)
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 4d119d3..b15df8d9e 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
@@ -296,7 +296,6 @@ public static final String DISCO_FEED_ENDPOINT = "DiscoFeedEndpoint"; public static final String DNS_OVER_HTTPS = "DnsOverHttps"; public static final String DONT_AUTO_HIDE_BROWSER_CONTROLS = "DontAutoHideBrowserControls"; - public static final String DOWNLOADS_AUTO_RESUMPTION_NATIVE = "DownloadsAutoResumptionNative"; public static final String DOWNLOADS_FOREGROUND = "DownloadsForeground"; public static final String DOWNLOAD_OFFLINE_CONTENT_PROVIDER = "UseDownloadOfflineContentProvider"; @@ -397,13 +396,13 @@ public static final String OSK_RESIZES_VISUAL_VIEWPORT = "OSKResizesVisualViewportByDefault"; public static final String OVERLAY_NEW_LAYOUT = "OverlayNewLayout"; public static final String PAGE_ANNOTATIONS_SERVICE = "PageAnnotationsService"; - public static final String PAGE_INFO_ABOUT_THIS_SITE_NEW_ICON = "PageInfoAboutThisSiteNewIcon"; public static final String PAGE_INFO_ABOUT_THIS_SITE_EN = "PageInfoAboutThisSiteEn"; - public static final String PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO = - "PageInfoAboutThisSiteMoreInfo"; - public static final String PAGE_INFO_ABOUT_THIS_SITE_NON_EN = "PageInfoAboutThisSiteNonEn"; public static final String PAGE_INFO_ABOUT_THIS_SITE_IMPROVED_BOTTOMSHEET = "PageInfoAboutThisSiteImprovedBottomSheet"; + public static final String PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO = + "PageInfoAboutThisSiteMoreInfo"; + public static final String PAGE_INFO_ABOUT_THIS_SITE_NEW_ICON = "PageInfoAboutThisSiteNewIcon"; + public static final String PAGE_INFO_ABOUT_THIS_SITE_NON_EN = "PageInfoAboutThisSiteNonEn"; public static final String PAINT_PREVIEW_DEMO = "PaintPreviewDemo"; public static final String PAINT_PREVIEW_SHOW_ON_STARTUP = "PaintPreviewShowOnStartup"; public static final String PARTNER_HOMEPAGE_INITIAL_LOAD_IMPROVEMENT = @@ -440,7 +439,6 @@ public static final String QUIET_NOTIFICATION_PROMPTS = "QuietNotificationPrompts"; public static final String REACHED_CODE_PROFILER = "ReachedCodeProfiler"; public static final String READER_MODE_IN_CCT = "ReaderModeInCCT"; - public static final String READ_LATER = "ReadLater"; public static final String RECORD_SUPPRESSION_METRICS = "RecordSuppressionMetrics"; public static final String RECOVER_FROM_NEVER_SAVE_ANDROID = "RecoverFromNeverSaveAndroid"; public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification"; @@ -604,8 +602,6 @@ public static final CachedFlag sCriticalPersistedTabData = new CachedFlag(CRITICAL_PERSISTED_TAB_DATA, false); public static final CachedFlag sDiscoverMultiColumn = new CachedFlag(FEED_MULTI_COLUMN, false); - public static final CachedFlag sDownloadsAutoResumptionNative = - new CachedFlag(DOWNLOADS_AUTO_RESUMPTION_NATIVE, true); public static final CachedFlag sEarlyLibraryLoad = new CachedFlag(EARLY_LIBRARY_LOAD, true); public static final CachedFlag sExperimentsForAgsa = new CachedFlag(EXPERIMENTS_FOR_AGSA, true); public static final CachedFlag sFeedLoadingPlaceholder = @@ -643,7 +639,6 @@ new CachedFlag(PREFETCH_NOTIFICATION_SCHEDULING_INTEGRATION, false); public static final CachedFlag sQueryTiles = new CachedFlag(QUERY_TILES, false); public static final CachedFlag sQueryTilesOnStart = new CachedFlag(QUERY_TILES_ON_START, false); - public static final CachedFlag sReadLater = new CachedFlag(READ_LATER, false); public static final CachedFlag sShouldIgnoreIntentSkipInternalCheck = new CachedFlag(SHOULD_IGNORE_INTENT_SKIP_INTERNAL_CHECK, true); public static final CachedFlag sStartSurfaceAndroid =
diff --git a/chrome/browser/google/google_update_settings_posix.cc b/chrome/browser/google/google_update_settings_posix.cc index 72018db1..52e11a0 100644 --- a/chrome/browser/google/google_update_settings_posix.cc +++ b/chrome/browser/google/google_update_settings_posix.cc
@@ -97,12 +97,12 @@ if (base::PathExists(consent_file) && client_id.empty()) return true; - int size = client_id.size(); - bool write_success = - base::WriteFile(consent_file, client_id.c_str(), size) == size; - if (write_success) - SetConsentFilePermissionIfNeeded(consent_file); - return write_success; + if (!base::WriteFile(consent_file, client_id)) { + return false; + } + + SetConsentFilePermissionIfNeeded(consent_file); + return true; } // static
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc index 5db2e1b4..43ee73e 100644 --- a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc +++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc
@@ -10,7 +10,6 @@ #include "build/build_config.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/favicon/favicon_utils.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" #include "chrome/browser/ui/pdf/chrome_pdf_web_contents_helper_client.h" #include "components/guest_view/browser/guest_view_event.h"
diff --git a/chrome/browser/headless/headless_command_processor.cc b/chrome/browser/headless/headless_command_processor.cc index 5ef93ee..e8466df 100644 --- a/chrome/browser/headless/headless_command_processor.cc +++ b/chrome/browser/headless/headless_command_processor.cc
@@ -41,8 +41,12 @@ content::NavigationController::LoadURLParams load_url_params(handler_url); web_contents->GetController().LoadURLWithParams(load_url_params); + // Preserve web contents pointer so that the order of ProcessCommands + // arguments evaluation does not wipe out unique pointer before it's + // passed to command handler + content::WebContents* web_contents_ptr = web_contents.get(); HeadlessCommandHandler::ProcessCommands( - web_contents.get(), std::move(target_url), + web_contents_ptr, std::move(target_url), base::BindOnce( [](std::unique_ptr<content::WebContents> web_contents, base::OnceClosure done_callback) {
diff --git a/chrome/browser/image_service/image_service_factory.cc b/chrome/browser/image_service/image_service_factory.cc index 4160fdaa..78a6f0c 100644 --- a/chrome/browser/image_service/image_service_factory.cc +++ b/chrome/browser/image_service/image_service_factory.cc
@@ -6,6 +6,8 @@ #include "base/no_destructor.h" #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.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/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "components/image_service/image_service.h" @@ -27,6 +29,7 @@ ImageServiceFactory::ImageServiceFactory() : ProfileKeyedServiceFactory("ImageService") { + DependsOn(OptimizationGuideKeyedServiceFactory::GetInstance()); DependsOn(SyncServiceFactory::GetInstance()); } @@ -37,6 +40,7 @@ auto* profile = Profile::FromBrowserContext(context); return new ImageService( std::make_unique<ChromeAutocompleteProviderClient>(profile), + OptimizationGuideKeyedServiceFactory::GetForProfile(profile), SyncServiceFactory::GetForProfile(profile)); }
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc index 45d902c..28bdf3b 100644 --- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc +++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -1610,6 +1610,7 @@ av1_codecs(), SessionType::kTemporary, "HW_SECURE_ALL")); +#if BUILDFLAG(IS_WIN) EXPECT_WV(IsSupportedByKeySystem(kWidevineExperiment2, kVideoWebMMimeType, video_webm_codecs(), SessionType::kTemporary, "HW_SECURE_ALL")); @@ -1619,6 +1620,7 @@ EXPECT_WV_AV1(IsSupportedByKeySystem(kWidevineExperiment2, kVideoMP4MimeType, av1_codecs(), SessionType::kTemporary, "HW_SECURE_ALL")); +#endif } IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc index a696d51..de649b4 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc +++ b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc
@@ -19,7 +19,6 @@ #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/native_desktop_media_list.h" #include "chrome/browser/media/webrtc/tab_desktop_media_list.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/grit/chromium_strings.h"
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc index ce8902f1..86fe25c 100644 --- a/chrome/browser/media/webrtc/display_media_access_handler.cc +++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h" #include "chrome/browser/media/webrtc/native_desktop_media_list.h" #include "chrome/browser/media/webrtc/tab_desktop_media_list.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/user_interaction_observer.h" #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 11667f3..1dbaad1 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -235,6 +235,9 @@ kBrowserMetricsName); metrics::FileMetricsProvider::RegisterSourcePrefs( + registry, kDeferredBrowserMetricsName); + + metrics::FileMetricsProvider::RegisterSourcePrefs( registry, kCrashpadHistogramAllocatorName); #if BUILDFLAG(IS_WIN) @@ -295,6 +298,8 @@ base::FilePath browser_metrics_upload_dir = user_data_dir.AppendASCII(kBrowserMetricsName); + base::FilePath deferred_browser_metrics_upload_dir = + user_data_dir.AppendASCII(kDeferredBrowserMetricsName); if (metrics_reporting_enabled) { metrics::FileMetricsProvider::Params browser_metrics_params( browser_metrics_upload_dir, @@ -306,6 +311,14 @@ &ChromeMetricsServiceClient::FilterBrowserMetricsFiles); file_metrics_provider->RegisterSource(browser_metrics_params); + metrics::FileMetricsProvider::Params deferred_browser_metrics_params( + deferred_browser_metrics_upload_dir, + metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, + metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, + kDeferredBrowserMetricsName); + deferred_browser_metrics_params.max_dir_kib = kMaxHistogramStorageKiB; + file_metrics_provider->RegisterSource(deferred_browser_metrics_params); + base::FilePath crashpad_active_path = base::GlobalHistogramAllocator::ConstructFilePathForActiveFile( user_data_dir, kCrashpadHistogramAllocatorName); @@ -325,6 +338,12 @@ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, base::GetDeletePathRecursivelyCallback( std::move(browser_metrics_upload_dir))); + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::GetDeletePathRecursivelyCallback( + std::move(deferred_browser_metrics_upload_dir))); } }
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc index ff3c01ce..3bc8fef 100644 --- a/chrome/browser/metrics/process_memory_metrics_emitter.cc +++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -220,6 +220,8 @@ // of it being claimed by renderers. {"gpu/shared_images", "SharedImages", MetricSize::kLarge, kSize, EmitTo::kSizeInUmaOnly, nullptr}, + {"gpu/shared_images", "SharedImages.Purgeable", MetricSize::kLarge, + "purgeable_size", EmitTo::kSizeInUmaOnly, nullptr}, {"gpu/transfer_cache", "ServiceTransferCache", MetricSize::kCustom, kSize, EmitTo::kSizeInUmaOnly, nullptr, ImageSizeMetricRange}, {"gpu/transfer_cache", "ServiceTransferCache.AvgImageSize",
diff --git a/chrome/browser/new_tab_page/chrome_colors/generate_colors_info.cc b/chrome/browser/new_tab_page/chrome_colors/generate_colors_info.cc index 32491ae4..7042f10e 100644 --- a/chrome/browser/new_tab_page/chrome_colors/generate_colors_info.cc +++ b/chrome/browser/new_tab_page/chrome_colors/generate_colors_info.cc
@@ -84,8 +84,7 @@ if (!base::DirectoryExists(directory)) base::CreateDirectory(directory); - if (base::WriteFile(output_path, output.c_str(), - static_cast<uint32_t>(output.size())) <= 0) { + if (!base::WriteFile(output_path, output)) { LOG(ERROR) << "Failed to write output to " << output_path; } }
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc index 1c99ea8..b8e0e2e 100644 --- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc +++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
@@ -6,6 +6,9 @@ #include <vector> +#include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/string_split.h" #include "chrome/browser/history_clusters/history_clusters_service_factory.h" #include "chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom.h" #include "chrome/browser/profiles/profile.h" @@ -13,14 +16,66 @@ #include "components/history_clusters/core/history_cluster_type_utils.h" #include "components/history_clusters/core/history_clusters_service.h" #include "components/history_clusters/core/history_clusters_service_task.h" -#include "components/history_clusters/core/history_clusters_types.h" #include "components/history_clusters/public/mojom/history_cluster_types.mojom.h" +#include "components/search/ntp_features.h" + +namespace { + +base::flat_set<std::string> GetCategories() { + std::string categories_string = base::GetFieldTrialParamValueByFeature( + ntp_features::kNtpHistoryClustersModuleCategories, + ntp_features::kNtpHistoryClustersModuleCategoriesParam); + if (categories_string.empty()) { + return {}; + } + + auto categories = base::SplitString(categories_string, ",", + base::WhitespaceHandling::TRIM_WHITESPACE, + base::SplitResult::SPLIT_WANT_NONEMPTY); + + return categories.empty() ? base::flat_set<std::string>() + : base::flat_set<std::string>(categories.begin(), + categories.end()); +} + +int GetMinImagesToShow() { + static int min_images_to_show = base::GetFieldTrialParamByFeatureAsInt( + ntp_features::kNtpHistoryClustersModuleMinimumImagesRequired, + ntp_features::kNtpHistoryClustersModuleMinimumImagesRequiredParam, 2); + return min_images_to_show; +} + +history_clusters::QueryClustersFilterParams GetFilterParamsFromFeatureFlags() { + history_clusters::QueryClustersFilterParams filter_params; + filter_params.min_visits_with_images = GetMinImagesToShow(); + filter_params.categories = GetCategories(); + filter_params.is_search_initiated = true; + filter_params.has_related_searches = true; + filter_params.is_shown_on_prominent_ui_surfaces = true; + // TODO(b/265301665): Add max clusters param when actually showing in the UI. + return filter_params; +} + +base::Time GetBeginTime() { + static int hours_to_look_back = base::GetFieldTrialParamByFeatureAsInt( + ntp_features::kNtpHistoryClustersModuleBeginTimeDuration, + ntp_features::kNtpHistoryClustersModuleBeginTimeDurationHoursParam, 24); + if (hours_to_look_back <= 0) { + hours_to_look_back = 24; + } + + return base::Time::Now() - base::Hours(hours_to_look_back); +} + +} // namespace HistoryClustersPageHandler::HistoryClustersPageHandler( mojo::PendingReceiver<ntp::history_clusters::mojom::PageHandler> pending_receiver, Profile* profile) - : receiver_(this, std::move(pending_receiver)), profile_(profile) {} + : receiver_(this, std::move(pending_receiver)), + profile_(profile), + filter_params_(GetFilterParamsFromFeatureFlags()) {} HistoryClustersPageHandler::~HistoryClustersPageHandler() = default; @@ -28,6 +83,11 @@ GetClusterCallback callback, std::vector<history::Cluster> clusters, history_clusters::QueryClustersContinuationParams continuation_params) { + base::UmaHistogramBoolean("NewTabPage.HistoryClusters.HasClusterToShow", + !clusters.empty()); + base::UmaHistogramCounts100("NewTabPage.HistoryClusters.NumClusterCandidates", + clusters.size()); + if (clusters.empty()) { std::move(callback).Run(nullptr); return; @@ -41,17 +101,14 @@ void HistoryClustersPageHandler::GetCluster(GetClusterCallback callback) { auto* history_clusters_service = HistoryClustersServiceFactory::GetForBrowserContext(profile_); - // TODO(b/265301309): Add appropriate `continuation_params` and - // `filter_params`. history_clusters::QueryClustersContinuationParams continuation_params; - history_clusters::QueryClustersFilterParams filter_params; // TODO(b/244504329): The first call to QueryClusters may come back with // empty data though history clusters may exist. fetch_clusters_task_ = history_clusters_service->QueryClusters( - history_clusters::ClusteringRequestSource::kNewTabPage, - std::move(filter_params), - /*begin_time=*/base::Time(), continuation_params, /*recluster=*/false, + history_clusters::ClusteringRequestSource::kNewTabPage, filter_params_, + GetBeginTime(), continuation_params, + /*recluster=*/false, base::BindOnce(&HistoryClustersPageHandler::CallbackWithClusterData, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); }
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h index 140bdcf..1ba068e 100644 --- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h +++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom.h" #include "components/history/core/browser/history_types.h" +#include "components/history_clusters/core/history_clusters_types.h" #include "components/history_clusters/public/mojom/history_cluster_types.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -20,7 +21,6 @@ namespace history_clusters { class HistoryClustersServiceTask; -struct QueryClustersContinuationParams; } // namespace history_clusters class HistoryClustersPageHandler @@ -48,6 +48,9 @@ mojo::Receiver<ntp::history_clusters::mojom::PageHandler> receiver_; raw_ptr<Profile> profile_; + // The filtering parameters to use for all calls to fetch clusters. + history_clusters::QueryClustersFilterParams filter_params_; + // Tracks the current fetch clusters task. Will be `nullptr` or // `Done()` will be true if there is no ongoing task. std::unique_ptr<history_clusters::HistoryClustersServiceTask>
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc index cb1fbd0f..4dda521 100644 --- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc +++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/time/time.h" #include "chrome/browser/history_clusters/history_clusters_service_factory.h" @@ -16,6 +17,7 @@ #include "components/history_clusters/core/history_clusters_types.h" #include "components/history_clusters/core/test_history_clusters_service.h" #include "components/history_clusters/public/mojom/history_cluster_types.mojom.h" +#include "components/search/ntp_features.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -64,6 +66,8 @@ }; TEST_F(HistoryClustersPageHandlerTest, GetCluster) { + base::HistogramTester histogram_tester; + std::string kSampleLabel = "LabelOne"; std::string kSampleUrl = "www.google.com"; history::ClusterVisit kSampleVisit; @@ -92,4 +96,69 @@ ASSERT_EQ(kSampleLabel, cluster_mojom->label.value()); ASSERT_EQ(1u, cluster_mojom->visits.size()); ASSERT_EQ(kSampleUrl, cluster_mojom->visits[0]->url_for_display); + + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.HasClusterToShow", true, 1); + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.NumClusterCandidates", 1, 1); +} + +TEST_F(HistoryClustersPageHandlerTest, MultipleClusters) { + base::HistogramTester histogram_tester; + + std::string kSampleLabel = "LabelOne"; + std::string kSampleUrl = "www.google.com"; + history::ClusterVisit kSampleVisit; + kSampleVisit.url_for_display = base::UTF8ToUTF16(kSampleUrl); + const history::Cluster kSampleCluster = + history::Cluster(1, {kSampleVisit}, + {{u"apples", history::ClusterKeywordData()}, + {u"Red Oranges", history::ClusterKeywordData()}}, + /*should_show_on_prominent_ui_surfaces=*/false, + /*label=*/base::UTF8ToUTF16(kSampleLabel)); + + const std::vector<history::Cluster> kSampleClusters = {kSampleCluster, + kSampleCluster}; + test_history_clusters_service().SetClustersToReturn(kSampleClusters); + + history_clusters::mojom::ClusterPtr cluster_mojom; + base::MockCallback<HistoryClustersPageHandler::GetClusterCallback> callback; + EXPECT_CALL(callback, Run(testing::_)) + .Times(1) + .WillOnce(testing::Invoke( + [&cluster_mojom](history_clusters::mojom::ClusterPtr cluster_arg) { + cluster_mojom = std::move(cluster_arg); + })); + handler().GetCluster(callback.Get()); + ASSERT_TRUE(cluster_mojom); + ASSERT_EQ(1u, cluster_mojom->id); + ASSERT_EQ(kSampleLabel, cluster_mojom->label.value()); + ASSERT_EQ(1u, cluster_mojom->visits.size()); + ASSERT_EQ(kSampleUrl, cluster_mojom->visits[0]->url_for_display); + + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.HasClusterToShow", true, 1); + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.NumClusterCandidates", 2, 1); +} + +TEST_F(HistoryClustersPageHandlerTest, NoClusters) { + base::HistogramTester histogram_tester; + + history_clusters::mojom::ClusterPtr cluster_mojom; + base::MockCallback<HistoryClustersPageHandler::GetClusterCallback> callback; + EXPECT_CALL(callback, Run(testing::_)) + .Times(1) + .WillOnce(testing::Invoke( + [&cluster_mojom](history_clusters::mojom::ClusterPtr cluster_arg) { + cluster_mojom = std::move(cluster_arg); + })); + handler().GetCluster(callback.Get()); + // Callback should be invoked with a nullptr. + ASSERT_FALSE(cluster_mojom); + + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.HasClusterToShow", false, 1); + histogram_tester.ExpectUniqueSample( + "NewTabPage.HistoryClusters.NumClusterCandidates", 0, 1); }
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc index 5f45288..7d58e9cd 100644 --- a/chrome/browser/notifications/notification_platform_bridge_linux.cc +++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -268,8 +268,7 @@ return nullptr; auto resource_file = std::make_unique<ResourceFile>(file_path); - if (base::WriteFile(file_path, data->front_as<char>(), data_len) != - data_len) { + if (!base::WriteFile(file_path, *data)) { resource_file.reset(); } return resource_file;
diff --git a/chrome/browser/offline_pages/offline_page_bookmark_observer.cc b/chrome/browser/offline_pages/offline_page_bookmark_observer.cc index ad3383e1..b9e11a97 100644 --- a/chrome/browser/offline_pages/offline_page_bookmark_observer.cc +++ b/chrome/browser/offline_pages/offline_page_bookmark_observer.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/offline_pages/offline_page_bookmark_observer.h" #include "base/functional/bind.h" -#include "chrome/browser/profiles/profile.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/offline_pages/core/client_namespace_constants.h" #include "components/offline_pages/core/offline_page_model.h"
diff --git a/chrome/browser/optimization_guide/chrome_browser_main_extra_parts_optimization_guide.cc b/chrome/browser/optimization_guide/chrome_browser_main_extra_parts_optimization_guide.cc index c3b420e0..d0b3390 100644 --- a/chrome/browser/optimization_guide/chrome_browser_main_extra_parts_optimization_guide.cc +++ b/chrome/browser/optimization_guide/chrome_browser_main_extra_parts_optimization_guide.cc
@@ -9,7 +9,6 @@ #include "chrome/browser/browser_process.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/profiles/profile.h" #include "chrome/common/chrome_paths.h" #include "components/optimization_guide/core/optimization_guide_features.h" #include "components/optimization_guide/core/prediction_manager.h"
diff --git a/chrome/browser/page_load_metrics/integration_tests/sources.gni b/chrome/browser/page_load_metrics/integration_tests/sources.gni index 7743216..e43512b 100644 --- a/chrome/browser/page_load_metrics/integration_tests/sources.gni +++ b/chrome/browser/page_load_metrics/integration_tests/sources.gni
@@ -15,5 +15,6 @@ "//chrome/browser/page_load_metrics/integration_tests/render_blocking_browsertest.cc", "//chrome/browser/page_load_metrics/integration_tests/smoothness_metric_browsertest.cc", "//chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc", + "//chrome/browser/page_load_metrics/integration_tests/unused_preloads_browsertest.cc", "//chrome/browser/page_load_metrics/integration_tests/user_timing_browsertest.cc", ]
diff --git a/chrome/browser/page_load_metrics/integration_tests/unused_preloads_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/unused_preloads_browsertest.cc new file mode 100644 index 0000000..a954dfff --- /dev/null +++ b/chrome/browser/page_load_metrics/integration_tests/unused_preloads_browsertest.cc
@@ -0,0 +1,106 @@ +// 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/page_load_metrics/integration_tests/metric_integration_test.h" + +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/metrics/content/subprocess_metrics_provider.h" +#include "content/public/test/browser_test.h" + +namespace { + +std::unique_ptr<net::test_server::HttpResponse> ServePreloadHeader( + const std::string& request_path, + const net::test_server::HttpRequest& request) { + if (!base::StartsWith(request.relative_url, request_path, + base::CompareCase::SENSITIVE)) { + return nullptr; + } + + std::unique_ptr<net::test_server::BasicHttpResponse> http_response( + new net::test_server::BasicHttpResponse); + http_response->set_code(net::HTTP_FOUND); + http_response->AddCustomHeader("Link", + "</fonts/AD.woff>; rel=preload; as=font"); + return std::move(http_response); +} + +} // namespace + +IN_PROC_BROWSER_TEST_F(MetricIntegrationTest, UnusedHeaderFontPreload) { + embedded_test_server()->RegisterRequestHandler( + base::BindRepeating(&ServePreloadHeader, "/header_preload.html")); + ASSERT_TRUE(embedded_test_server()->Start()); + Load("/header_preload.html"); + + const std::string wait_for_warning = R"( + (async () => { + await new Promise( + resolve => { + if (document.readyState = "complete") { + setTimeout(resolve, 3500); + } else { + window.addEventListener("DOMContentLoaded", () => { + setTimeout(resolve, 3500); + }); + } + }); + })(); + )"; + ASSERT_TRUE(EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + wait_for_warning) + .error.empty()); + + // Finish session. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank"))); + + // Actually fetch the metrics. + content::FetchHistogramsFromChildProcesses(); + metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); + + int32_t unused_font_preloads = histogram_tester().GetBucketCount( + "Renderer.Preload.UnusedResource", /*ResourceType::kFont*/ 4); + int32_t unused_script_preloads = histogram_tester().GetBucketCount( + "Renderer.Preload.UnusedResource", /*ResourceType::kScript*/ 3); + ASSERT_EQ(unused_font_preloads, 1); + ASSERT_EQ(unused_script_preloads, 0); +} + +IN_PROC_BROWSER_TEST_F(MetricIntegrationTest, UnusedFontPreload) { + Start(); + Load("/render_blocking_resource_and_preloaded_font.html"); + + const std::string wait_for_warning = R"( + (async () => { + await new Promise( + resolve => { + if (document.readyState = "complete") { + setTimeout(resolve, 3500); + } else { + window.addEventListener("DOMContentLoaded", () => { + setTimeout(resolve, 3500); + }); + } + }); + })(); + )"; + ASSERT_TRUE(EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + wait_for_warning) + .error.empty()); + + // Finish session. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank"))); + + // Actually fetch the metrics. + content::FetchHistogramsFromChildProcesses(); + metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); + + int32_t unused_font_preloads = histogram_tester().GetBucketCount( + "Renderer.Preload.UnusedResource", /*ResourceType::kFont*/ 4); + int32_t unused_script_preloads = histogram_tester().GetBucketCount( + "Renderer.Preload.UnusedResource", /*ResourceType::kScript*/ 3); + ASSERT_EQ(unused_font_preloads, 1); + ASSERT_EQ(unused_script_preloads, 0); +}
diff --git a/chrome/browser/permissions/last_tab_standing_tracker.cc b/chrome/browser/permissions/last_tab_standing_tracker.cc index d8d51b1..1741dc9 100644 --- a/chrome/browser/permissions/last_tab_standing_tracker.cc +++ b/chrome/browser/permissions/last_tab_standing_tracker.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/permissions/last_tab_standing_tracker.h" #include "base/observer_list.h" -#include "chrome/browser/profiles/profile.h" #include "url/gurl.h" LastTabStandingTracker::LastTabStandingTracker() = default;
diff --git a/chrome/browser/policy/device_account_initializer.cc b/chrome/browser/policy/device_account_initializer.cc index a0b66e9..9d9ddc1 100644 --- a/chrome/browser/policy/device_account_initializer.cc +++ b/chrome/browser/policy/device_account_initializer.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/device_identity/device_oauth2_token_service.h" #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h" -#include "chrome/browser/profiles/profile.h" #include "components/policy/core/common/cloud/dm_auth.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_urls.h"
diff --git a/chrome/browser/predictors/loading_data_collector.cc b/chrome/browser/predictors/loading_data_collector.cc index 6d66464b..5228973 100644 --- a/chrome/browser/predictors/loading_data_collector.cc +++ b/chrome/browser/predictors/loading_data_collector.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/predictors/predictors_features.h" #include "chrome/browser/predictors/resource_prefetch_predictor.h" #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" -#include "chrome/browser/profiles/profile.h" #include "components/history/core/browser/history_service.h" #include "content/public/browser/browser_thread.h" #include "net/base/mime_util.h"
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 55847c6..038e363 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
@@ -347,12 +347,7 @@ */ public static final String FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED = "command_line_on_non_rooted_enabled"; - /** - * Whether or not the download auto-resumption is enabled in native. - * Default value is true. - */ - public static final String FLAGS_CACHED_DOWNLOAD_AUTO_RESUMPTION_IN_NATIVE = - "download_auto_resumption_in_native"; + /** * Whether or not the grid tab switcher is enabled. * Default value is false.
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java index cbeb37f1..90c2c91f 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
@@ -59,7 +59,6 @@ ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE, ChromePreferenceKeys.FLAGS_CACHED_ADAPTIVE_TOOLBAR_ENABLED, ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED, - ChromePreferenceKeys.FLAGS_CACHED_DOWNLOAD_AUTO_RESUMPTION_IN_NATIVE, ChromePreferenceKeys.FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED, ChromePreferenceKeys.FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED, ChromePreferenceKeys.FLAGS_CACHED_START_SURFACE_ENABLED,
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index acfa1a29..ff57c231 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -780,6 +780,8 @@ // Deprecated 02/2023. const char kClearPluginLSODataEnabled[] = "browser.clear_lso_data_enabled"; +const char kContentSettingsPluginAllowlist[] = + "profile.content_settings.plugin_whitelist"; const char kPepperFlashSettingsEnabled[] = "browser.pepper_flash_settings_enabled"; const char kPluginsAllowOutdated[] = "plugins.allow_outdated"; @@ -1052,6 +1054,7 @@ // Deprecated 02/2023. registry->RegisterBooleanPref(kClearPluginLSODataEnabled, false); + registry->RegisterDictionaryPref(kContentSettingsPluginAllowlist); registry->RegisterBooleanPref(kPepperFlashSettingsEnabled, false); registry->RegisterBooleanPref(kPluginsAllowOutdated, false); registry->RegisterFilePathPref(kPluginsLastInternalDirectory, @@ -2079,6 +2082,7 @@ // Added 02/2023. profile_prefs->ClearPref(kClearPluginLSODataEnabled); + profile_prefs->ClearPref(kContentSettingsPluginAllowlist); profile_prefs->ClearPref(kPepperFlashSettingsEnabled); profile_prefs->ClearPref(kPluginsAllowOutdated); profile_prefs->ClearPref(kPluginsLastInternalDirectory);
diff --git a/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.cc b/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.cc index 6e95156..32668e1 100644 --- a/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.cc +++ b/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.cc
@@ -11,7 +11,6 @@ #include "base/metrics/histogram_macros.h" #include "chrome/browser/prefetch/pref_names.h" #include "chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_params.h" -#include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc index cfd0ad48..3658aa56 100644 --- a/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc +++ b/chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/printing/print_backend_browsertest.cc b/chrome/browser/printing/print_backend_browsertest.cc index d707bce..5de5dbf 100644 --- a/chrome/browser/printing/print_backend_browsertest.cc +++ b/chrome/browser/printing/print_backend_browsertest.cc
@@ -509,7 +509,7 @@ EXPECT_EQ(settings->get_settings().dpi(), kPrintSettingsDefaultDpi); } -#if BUILDFLAG(IS_WIN) +#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG) IN_PROC_BROWSER_TEST_F(PrintBackendBrowserTest, AskUserForSettings) { LaunchService(); AddDefaultPrinter(); @@ -529,7 +529,7 @@ EXPECT_EQ(settings->get_settings().copies(), kPrintSettingsCopies); EXPECT_EQ(settings->get_settings().dpi(), kPrintSettingsDefaultDpi); } -#endif // BUILDFLAG(IS_WIN) +#endif // BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG) IN_PROC_BROWSER_TEST_F(PrintBackendBrowserTest, UpdatePrintSettings) { LaunchService();
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc index 87779facc..e097cc6d 100644 --- a/chrome/browser/printing/print_browsertest.cc +++ b/chrome/browser/printing/print_browsertest.cc
@@ -2663,6 +2663,10 @@ } // PrintViewManagerBase::Observer: + void OnRegisterSystemPrintClient(bool succeeded) override { + system_print_registration_succeeded_ = succeeded; + } + void OnDidPrintDocument() override { ++did_print_document_count_; CheckForQuit(); @@ -2716,7 +2720,7 @@ } #if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG) - void SystemPrintFromPreviewOnceReadyAndLoaded() { + void SystemPrintFromPreviewOnceReadyAndLoaded(bool wait_for_callback) { // First invoke the Print Preview dialog with `StartPrint()`. PrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true); StartPrint(browser()->tab_strip_model()->GetActiveWebContents(), @@ -2747,7 +2751,9 @@ // result, just ignore the error instead. Rely upon tests catching any // failure through the use of other expectation checks. std::ignore = content::ExecJs(preview_dialog, kPrintWithSystemDialogScript); - WaitUntilCallbackReceived(); + if (wait_for_callback) { + WaitUntilCallbackReceived(); + } } #endif // BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG) @@ -2808,6 +2814,10 @@ /*cause_errors=*/true); } + const absl::optional<bool> system_print_registration_succeeded() const { + return system_print_registration_succeeded_; + } + bool did_use_default_settings() const { return did_use_default_settings_; } bool did_get_settings_with_ui() const { return did_get_settings_with_ui_; } @@ -2968,6 +2978,7 @@ TestPrinterQuery::PrintCallbacks test_print_job_worker_callbacks_; TestPrintJobWorkerOop::PrintCallbacks test_print_job_worker_oop_callbacks_; CreatePrinterQueryCallback test_create_printer_query_callback_; + absl::optional<bool> system_print_registration_succeeded_; bool did_use_default_settings_ = false; bool did_get_settings_with_ui_ = false; bool print_backend_service_use_detected_ = false; @@ -3611,7 +3622,7 @@ // TODO(crbug.com/1393505) Fill in expected events once the printing stack // updates to support this scenario with out-of-process are in place. } - SystemPrintFromPreviewOnceReadyAndLoaded(); + SystemPrintFromPreviewOnceReadyAndLoaded(/*wait_for_callback=*/true); #if !BUILDFLAG(IS_WIN) if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) { @@ -3896,6 +3907,62 @@ PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id); } +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) +IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest, + SystemPrintFromPrintPreviewConcurrent) { + AddPrinter("printer1"); + SetPrinterNameForSubsequentContexts("printer1"); + + ASSERT_TRUE(embedded_test_server()->Started()); + GURL url(embedded_test_server()->GetURL("/printing/test3.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(web_contents); + SetUpPrintViewManager(web_contents); + + // Pretend that another tab has started a system print. + // TODO(crbug.com/809738) Improve on this test by using a persistent fake + // system print dialog. + absl::optional<PrintBackendServiceManager::ClientId> client_id = + PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient(); + ASSERT_TRUE(client_id.has_value()); + + // Now do a print preview which will try to switch to doing system print. +#if BUILDFLAG(IS_LINUX) + // The expected events for this are: + // 1. Start printing. + // 2. The document is rendered. + // 3. Receive document done notification. + // 4. Wait for the one print job to be destroyed, to ensure printing + // finished cleanly before completing the test. + SetNumExpectedMessages(/*num=*/4); + + constexpr bool kWaitForCallback = true; +#else + // Inability to support this should be detected immediately without needing + // to wait for callback. + constexpr bool kWaitForCallback = false; +#endif + + SystemPrintFromPreviewOnceReadyAndLoaded(kWaitForCallback); + + // With the exception of Linux, concurrent system print is not allowed. + ASSERT_TRUE(system_print_registration_succeeded().has_value()); +#if BUILDFLAG(IS_LINUX) + EXPECT_TRUE(*system_print_registration_succeeded()); +#else + // The denied concurrent print is silent without an error. + EXPECT_FALSE(*system_print_registration_succeeded()); + EXPECT_EQ(error_dialog_shown_count(), 0u); +#endif + + // Cleanup before test shutdown. + PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id); +} +#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) + IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest, StartBasicPrintUseDefaultFails) { PrimeForFailInUseDefaultSettings();
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index 2d8f3cd47..a2adc3c9 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -31,6 +31,7 @@ #include "chrome/browser/ui/webui/print_preview/printer_handler.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "components/device_event_log/device_event_log.h" #include "components/prefs/pref_service.h" #include "components/printing/browser/print_composite_client.h" #include "components/printing/browser/print_manager_utils.h" @@ -226,6 +227,18 @@ content::RenderFrameHost* rfh, PrinterHandler::PrintCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); +#if BUILDFLAG(ENABLE_OOP_PRINTING) + if (printing::features::kEnableOopPrintDriversJobPrint.Get() && + job_settings.FindBool(kSettingShowSystemDialog).value_or(false)) { + if (!RegisterSystemPrintClient()) { + // Platform unable to support system print dialog at this time, treat + // this as a cancel. + std::move(callback).Run( + base::Value("Concurrent system print not allowed")); + return; + } + } +#endif PrintSettingsCallback settings_callback = base::BindOnce(&PrintViewManagerBase::OnPrintSettingsDone, weak_ptr_factory_.GetWeakPtr(), print_data, @@ -284,8 +297,10 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(printer_query); - // Check if the job was cancelled. This should only happen on Windows when - // the system dialog is cancelled. + // Check if the job was cancelled. With out-of-process printing, this could + // happen if we detect that another system print dialog is already being + // displayed. Otherwise this should only happen on Windows when the system + // dialog is cancelled. if (printer_query->last_status() == mojom::ResultCode::kCanceled) { queue_->QueuePrinterQuery(std::move(printer_query)); #if BUILDFLAG(IS_WIN) @@ -1048,12 +1063,14 @@ DCHECK(!query_with_ui_client_id_.has_value()); query_with_ui_client_id_ = PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient(); - if (!query_with_ui_client_id_.has_value()) { - DVLOG(1) << "Multiple system print clients not allowed, skipping user " - "request."; - return false; + bool registered = query_with_ui_client_id_.has_value(); + if (!registered) { + PRINTER_LOG(DEBUG) << "Unable to initiate a concurrent system print dialog"; } - return true; + for (auto& observer : GetObservers()) { + observer.OnRegisterSystemPrintClient(registered); + } + return registered; } void PrintViewManagerBase::UnregisterSystemPrintClient() {
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h index c836c9c..e81de66 100644 --- a/chrome/browser/printing/print_view_manager_base.h +++ b/chrome/browser/printing/print_view_manager_base.h
@@ -60,6 +60,9 @@ // This method is never called unless `ENABLE_PRINT_PREVIEW`. virtual void OnPrintPreview(const content::RenderFrameHost* rfh) {} + // This method is never called unless `ENABLE_OOP_PRINTING`. + virtual void OnRegisterSystemPrintClient(bool succeeded) {} + virtual void OnDidPrintDocument() {} };
diff --git a/chrome/browser/privacy_budget/mesa_distribution.h b/chrome/browser/privacy_budget/mesa_distribution.h index 635d358..aa95f2c 100644 --- a/chrome/browser/privacy_budget/mesa_distribution.h +++ b/chrome/browser/privacy_budget/mesa_distribution.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_PRIVACY_BUDGET_MESA_DISTRIBUTION_H_ #define CHROME_BROWSER_PRIVACY_BUDGET_MESA_DISTRIBUTION_H_ +#include <cmath> #include <random> #include <set> #include <type_traits>
diff --git a/chrome/browser/reading_list/android/BUILD.gn b/chrome/browser/reading_list/android/BUILD.gn index 8d2e69a8..7f1ed9d 100644 --- a/chrome/browser/reading_list/android/BUILD.gn +++ b/chrome/browser/reading_list/android/BUILD.gn
@@ -12,8 +12,6 @@ source_set("reading_list") { sources = [ - "empty_reading_list_manager.cc", - "empty_reading_list_manager.h", "reading_list_manager.h", "reading_list_manager_impl.cc", "reading_list_manager_impl.h",
diff --git a/chrome/browser/reading_list/android/empty_reading_list_manager.cc b/chrome/browser/reading_list/android/empty_reading_list_manager.cc deleted file mode 100644 index 9e86b47..0000000 --- a/chrome/browser/reading_list/android/empty_reading_list_manager.cc +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/reading_list/android/empty_reading_list_manager.h" - -#include "base/logging.h" -#include "components/bookmarks/browser/bookmark_utils.h" - -EmptyReadingListManager::EmptyReadingListManager() = default; - -EmptyReadingListManager::~EmptyReadingListManager() = default; - -void EmptyReadingListManager::AddObserver(Observer* observer) {} - -void EmptyReadingListManager::RemoveObserver(Observer* observer) {} - -const bookmarks::BookmarkNode* EmptyReadingListManager::Add( - const GURL& url, - const std::string& title) { - LOG(ERROR) - << "Try to add reading list with empty reading list backend with title:" - << title; - return nullptr; -} - -const bookmarks::BookmarkNode* EmptyReadingListManager::Get( - const GURL& url) const { - return nullptr; -} - -const bookmarks::BookmarkNode* EmptyReadingListManager::GetNodeByID( - int64_t id) const { - return nullptr; -} - -void EmptyReadingListManager::GetMatchingNodes( - const bookmarks::QueryFields& query, - size_t max_count, - std::vector<const bookmarks::BookmarkNode*>* nodes) {} - -bool EmptyReadingListManager::IsReadingListBookmark( - const bookmarks::BookmarkNode* node) const { - return false; -} - -void EmptyReadingListManager::Delete(const GURL& url) {} - -const bookmarks::BookmarkNode* EmptyReadingListManager::GetRoot() const { - return nullptr; -} - -size_t EmptyReadingListManager::size() const { - return 0u; -} - -size_t EmptyReadingListManager::unread_size() const { - return 0u; -} - -void EmptyReadingListManager::SetTitle(const GURL& url, - const std::u16string& title) {} - -void EmptyReadingListManager::SetReadStatus(const GURL& url, bool read) {} - -bool EmptyReadingListManager::GetReadStatus( - const bookmarks::BookmarkNode* node) { - return false; -} - -bool EmptyReadingListManager::IsLoaded() const { - return true; -}
diff --git a/chrome/browser/reading_list/android/empty_reading_list_manager.h b/chrome/browser/reading_list/android/empty_reading_list_manager.h deleted file mode 100644 index 82c0523..0000000 --- a/chrome/browser/reading_list/android/empty_reading_list_manager.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_READING_LIST_ANDROID_EMPTY_READING_LIST_MANAGER_H_ -#define CHROME_BROWSER_READING_LIST_ANDROID_EMPTY_READING_LIST_MANAGER_H_ - -#include "chrome/browser/reading_list/android/reading_list_manager.h" - -// Empty implementation of ReadingListManager, used when the read later feature -// is disabled. -class EmptyReadingListManager : public ReadingListManager { - public: - EmptyReadingListManager(); - ~EmptyReadingListManager() override; - - private: - // ReadingListManager implementation. - void AddObserver(Observer* observer) override; - void RemoveObserver(Observer* observer) override; - const bookmarks::BookmarkNode* Add(const GURL& url, - const std::string& title) override; - const bookmarks::BookmarkNode* Get(const GURL& url) const override; - const bookmarks::BookmarkNode* GetNodeByID(int64_t id) const override; - void GetMatchingNodes( - const bookmarks::QueryFields& query, - size_t max_count, - std::vector<const bookmarks::BookmarkNode*>* nodes) override; - bool IsReadingListBookmark( - const bookmarks::BookmarkNode* node) const override; - void Delete(const GURL& url) override; - const bookmarks::BookmarkNode* GetRoot() const override; - size_t size() const override; - size_t unread_size() const override; - void SetTitle(const GURL& url, const std::u16string& title) override; - void SetReadStatus(const GURL& url, bool read) override; - bool GetReadStatus(const bookmarks::BookmarkNode* node) override; - bool IsLoaded() const override; -}; - -#endif // CHROME_BROWSER_READING_LIST_ANDROID_EMPTY_READING_LIST_MANAGER_H_
diff --git a/chrome/browser/reading_list/android/reading_list_notification_service.cc b/chrome/browser/reading_list/android/reading_list_notification_service.cc index caa5a8e0..04d432d 100644 --- a/chrome/browser/reading_list/android/reading_list_notification_service.cc +++ b/chrome/browser/reading_list/android/reading_list_notification_service.cc
@@ -26,9 +26,8 @@ // static bool ReadingListNotificationService::IsEnabled() { - return base::FeatureList::IsEnabled(reading_list::switches::kReadLater) && - base::FeatureList::IsEnabled( - reading_list::switches::kReadLaterReminderNotification); + return base::FeatureList::IsEnabled( + reading_list::switches::kReadLaterReminderNotification); } ReadingListNotificationServiceImpl::ReadingListNotificationServiceImpl(
diff --git a/chrome/browser/reading_list/android/reading_list_notification_service_unittest.cc b/chrome/browser/reading_list/android/reading_list_notification_service_unittest.cc index 7660eba..2626a90 100644 --- a/chrome/browser/reading_list/android/reading_list_notification_service_unittest.cc +++ b/chrome/browser/reading_list/android/reading_list_notification_service_unittest.cc
@@ -27,7 +27,6 @@ using notifications::ClientOverview; using notifications::SchedulerClientType; using notifications::test::MockNotificationScheduleService; -using reading_list::switches::kReadLater; using reading_list::switches::kReadLaterReminderNotification; using testing::_; using testing::Invoke; @@ -231,20 +230,12 @@ TEST_F(ReadingListNotificationServiceTest, IsEnabled) { { base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({kReadLater}, - {kReadLaterReminderNotification}); + feature_list.InitWithFeatures({}, {kReadLaterReminderNotification}); EXPECT_FALSE(ReadingListNotificationService::IsEnabled()); } { base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({}, - {kReadLater, kReadLaterReminderNotification}); - EXPECT_FALSE(ReadingListNotificationService::IsEnabled()); - } - { - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({kReadLater, kReadLaterReminderNotification}, - {}); + feature_list.InitWithFeatures({kReadLaterReminderNotification}, {}); EXPECT_TRUE(ReadingListNotificationService::IsEnabled()); } }
diff --git a/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc b/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc index 1d724b11..f35aa2d 100644 --- a/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc +++ b/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc
@@ -14,7 +14,6 @@ #include "build/chromeos_buildflags.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" #include "chromeos/components/quick_answers/public/cpp/controller/quick_answers_controller.h" #include "chromeos/components/quick_answers/public/cpp/quick_answers_state.h" #include "chromeos/components/quick_answers/quick_answers_model.h"
diff --git a/chrome/browser/resource_coordinator/tab_manager.cc b/chrome/browser/resource_coordinator/tab_manager.cc index d538ff0..4e7dbd3 100644 --- a/chrome/browser/resource_coordinator/tab_manager.cc +++ b/chrome/browser/resource_coordinator/tab_manager.cc
@@ -35,7 +35,6 @@ #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" #include "chrome/browser/memory/oom_memory_details.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/resource_coordinator/resource_coordinator_parts.h" #include "chrome/browser/resource_coordinator/tab_lifecycle_unit_external.h" #include "chrome/browser/resource_coordinator/tab_manager_features.h"
diff --git a/chrome/browser/resources/app_home/app_item.html b/chrome/browser/resources/app_home/app_item.html index a471f68..1bf97cac 100644 --- a/chrome/browser/resources/app_home/app_item.html +++ b/chrome/browser/resources/app_home/app_item.html
@@ -68,14 +68,16 @@ </style> -<div id="iconContainer"> - <img src="[[getIconUrl_(appInfo)]]" id="iconImage" - alt="[[appInfo.name]]" aria-hidden="true" draggable="false"></img> - <img id="deprecatedIcon" - src="chrome://resources/images/error_yellow900.svg" - hidden$="[[!appInfo.isDeprecatedApp]]"></img> +<div title="[[appInfo.name]]" aria-hidden="true"> + <div id="iconContainer"> + <img src="[[getIconUrl_(appInfo)]]" id="iconImage" + alt="[[appInfo.name]]" aria-hidden="true" draggable="false"></img> + <img id="deprecatedIcon" + src="chrome://resources/images/error_yellow900.svg" + hidden$="[[!appInfo.isDeprecatedApp]]"></img> + </div> + <div id="textContainer" aria-hidden="true">[[appInfo.name]]</div> </div> -<div id="textContainer" aria-hidden="true">[[appInfo.name]]</div> <cr-action-menu id="menu" on-mousedown="onMenuMousedown_" on-click="onMenuClick_">
diff --git a/chrome/browser/resources/app_home/app_list.html b/chrome/browser/resources/app_home/app_list.html index 4611784..9f02045e 100644 --- a/chrome/browser/resources/app_home/app_list.html +++ b/chrome/browser/resources/app_home/app_list.html
@@ -48,7 +48,7 @@ <div id="container"> <template is="dom-repeat" items="[[apps_]]"> <app-item class="item" id="[[item.id]]" app-info="[[item]]" - role="button" aria-label="[[item.name]]" title="[[item.name]]" + role="button" aria-label="[[item.name]]" tabindex="0"> </app-item> </template>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index fbaf90a..361827bb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -121,6 +121,7 @@ "background/range_automation_handler.js", "background/smart_sticky_mode.js", "background/tts_background.js", + "background/tts_interface.js", "background/user_action_monitor.js", "common/background_bridge.js", "common/braille/braille_command_data.js", @@ -152,7 +153,6 @@ "common/spannable.js", "common/settings_manager.js", "common/tree_dumper.js", - "common/tts_interface.js", "common/tts_types.js", "learn_mode/learn_mode.js", "log_page/log.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/abstract_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/abstract_tts.js index f07c48b..1452ac14 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/abstract_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/abstract_tts.js
@@ -9,9 +9,10 @@ import {Msgs} from '../common/msgs.js'; import {SettingsManager} from '../common/settings_manager.js'; -import {TtsInterface} from '../common/tts_interface.js'; import * as ttsTypes from '../common/tts_types.js'; +import {TtsInterface} from './tts_interface.js'; + /** * @typedef {{ * pitch: number,
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index 8c10bb4..02a50fb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -154,10 +154,7 @@ /** @override */ getCurrentRange() { - if (ChromeVoxRange.getCurrentRangeWithoutRecovery()?.isValid()) { - return ChromeVoxRange.getCurrentRangeWithoutRecovery(); - } - return null; + return ChromeVoxRange.current; } /** @override */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index e8c72d6..f46da7d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -1023,12 +1023,8 @@ </div> `; const root = await this.runWithLoadedTree(site); - const assertRangeHasText = function(text) { - return function() { - assertEquals( - text, ChromeVoxState.instance.getCurrentRange().start.node.name); - }; - }; + const assertRangeHasText = (text) => () => + assertEquals(text, ChromeVoxRange.current.start.node.name); mockFeedback.call(doCmd('nextEditText')) .expectSpeech('Top News Most Popular Sports') @@ -3520,11 +3516,9 @@ .expectSpeech('Click me') .call(doCmd('forceClickOnCurrentItem')) .expectSpeech('Focus me') - .call(() => { - assertEquals( - 'Focus me', - ChromeVoxState.instance.getCurrentRange().start.node.name); - }); + .call( + () => + assertEquals('Focus me', ChromeVoxRange.current.start.node.name)); await mockFeedback.replay(); });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox.js index 7246bebe..bf6d723 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox.js
@@ -10,10 +10,10 @@ import {BridgeConstants} from '../common/bridge_constants.js'; import {BridgeHelper} from '../common/bridge_helper.js'; import {Spannable} from '../common/spannable.js'; -import {TtsInterface} from '../common/tts_interface.js'; import {AbstractEarcons} from './abstract_earcons.js'; import {BrailleInterface} from './braille/braille_interface.js'; +import {TtsInterface} from './tts_interface.js'; export const ChromeVox = { /** @type {BrailleInterface} */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js index f3597b83..5869a56a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_range.js
@@ -80,8 +80,10 @@ /** @return {?CursorRange} */ static get current() { - // TODO(anastasi): Move ownership of currentRange to ChromeVoxRange. - return ChromeVoxState.instance.currentRange; + if (ChromeVoxRange.instance.current_?.isValid()) { + return ChromeVoxRange.instance.current_; + } + return null; } /** @return {?CursorRange} */ @@ -99,14 +101,21 @@ * @param {boolean=} opt_fromEditing */ static set(newRange, opt_fromEditing) { + ChromeVoxRange.instance.set_(...arguments); + } + + /** + * @param {?CursorRange} newRange + * @param {boolean=} opt_fromEditing + * @private + */ + set_(newRange, opt_fromEditing) { // Clear anything that was frozen on the braille display whenever // the user navigates. ChromeVox.braille.thaw(); // There's nothing to be updated in this case. - if ((!newRange && - !ChromeVoxState.instance.getCurrentRangeWithoutRecovery()) || - (newRange && !newRange.isValid())) { + if ((!newRange && !this.current_) || (newRange && !newRange.isValid())) { FocusBounds.set([]); return; } @@ -116,14 +125,12 @@ ChromeVoxState.ready().then( ChromeVoxRange.onCurrentRangeChanged(newRange, opt_fromEditing)); - const currentRange = - ChromeVoxState.instance.getCurrentRangeWithoutRecovery(); - if (!currentRange) { + if (!this.current_) { FocusBounds.set([]); return; } - const start = currentRange.start.node; + const start = this.current_.start.node; start.makeVisible(); start.setAccessibilityFocus();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index f8e76cc..1ca3617c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -56,6 +56,8 @@ const Dir = constants.Dir; const EventType = chrome.automation.EventType; const RoleType = chrome.automation.RoleType; +const SetNativeChromeVoxResponse = + chrome.accessibilityPrivate.SetNativeChromeVoxResponse; /** * @typedef {{ @@ -743,7 +745,7 @@ } else { bound = AutomationUtil.findNodePost( /** @type {!AutomationNode} */ (root), dir, - AutomationPredicate.leaf) || + AutomationPredicate.leaf) ?? bound; } node = AutomationUtil.findNextNode( @@ -752,7 +754,7 @@ if (node && !skipSync) { node = AutomationUtil.findNodePre( - node, Dir.FORWARD, AutomationPredicate.object) || + node, Dir.FORWARD, AutomationPredicate.object) ?? node; } @@ -833,11 +835,9 @@ * @private */ viewGraphicAsBraille_(currentRange) { - if (this.imageNode_) { - this.imageNode_.removeEventListener( - EventType.IMAGE_FRAME_UPDATED, this.onImageFrameUpdated_, false); - this.imageNode_ = null; - } + this.imageNode_?.removeEventListener( + EventType.IMAGE_FRAME_UPDATED, this.onImageFrameUpdated_, false); + this.imageNode_ = null; // Find the first node within the current range that supports image data. const imageNode = AutomationUtil.findNodePost( @@ -967,13 +967,12 @@ } // Keep moving past all nodes acting as labels or descriptions. - while (currentRange && currentRange.start && currentRange.start.node && - currentRange.start.node.role === RoleType.STATIC_TEXT) { + while (currentRange?.start?.node?.role === RoleType.STATIC_TEXT) { // We must scan upwards as any ancestor might have a label or description. let ancestor = currentRange.start.node; while (ancestor) { - if ((ancestor.labelFor && ancestor.labelFor.length > 0) || - (ancestor.descriptionFor && ancestor.descriptionFor.length > 0)) { + if (ancestor.labelFor?.length > 0 || + ancestor.descriptionFor?.length > 0) { break; } ancestor = ancestor.parent; @@ -1060,17 +1059,14 @@ disableChromeVoxArcSupportForCurrentApp_() { chrome.accessibilityPrivate.setNativeChromeVoxArcSupportForCurrentApp( false, response => { - if (response === - chrome.accessibilityPrivate.SetNativeChromeVoxResponse - .TALKBACK_NOT_INSTALLED) { + if (response === SetNativeChromeVoxResponse.TALKBACK_NOT_INSTALLED) { ChromeVox.braille.write( NavBraille.fromText(Msgs.getMsg('announce_install_talkback'))); ChromeVox.tts.speak( Msgs.getMsg('announce_install_talkback'), QueueMode.FLUSH); } else if ( response === - chrome.accessibilityPrivate.SetNativeChromeVoxResponse - .NEED_DEPRECATION_CONFIRMATION) { + SetNativeChromeVoxResponse.NEED_DEPRECATION_CONFIRMATION) { ChromeVox.braille.write(NavBraille.fromText( Msgs.getMsg('announce_talkback_deprecation'))); ChromeVox.tts.speak( @@ -1093,12 +1089,11 @@ let actionNode = ChromeVoxRange.current.start.node; // Scan for a clickable, which overrides the |actionNode|. let clickable = actionNode; - while (clickable && !clickable.clickable && - actionNode.root === clickable.root) { + while (!clickable?.clickable && actionNode.root === clickable?.root) { clickable = clickable.parent; } - if (clickable && actionNode.root === clickable.root) { - clickable.doDefault(); + if (actionNode.root === clickable?.root) { + clickable?.doDefault(); return; } @@ -1177,11 +1172,12 @@ * @private */ getNewRangeForJumpToTop_(node, currentRange) { - if (!currentRange.start.node || !currentRange.start.node.root) { + const root = currentRange.start.node?.root; + if (!root) { return {node, range: currentRange}; } const newNode = AutomationUtil.findNodePost( - currentRange.start.node.root, Dir.FORWARD, AutomationPredicate.object); + root, Dir.FORWARD, AutomationPredicate.object); if (newNode) { return {node: newNode, range: CursorRange.fromNode(newNode)}; } @@ -1224,7 +1220,7 @@ while (current && !current.details) { current = current.parent; } - if (current && current.details.length) { + if (current?.details.length) { // TODO currently can only jump to first detail. currentRange = CursorRange.fromNode(current.details[0]); } @@ -1281,7 +1277,7 @@ current = current.parent; } - const useNode = current || originalNode; + const useNode = current ?? originalNode; return AutomationPredicate.roles([current.role]); } @@ -1362,7 +1358,7 @@ */ nextOrPreviousPage_(command, currentRange) { const root = AutomationUtil.getTopLevelRoot(currentRange.start.node); - if (root && root.scrollY !== undefined) { + if (root?.scrollY !== undefined) { let page = Math.ceil(root.scrollY / root.location.height) || 1; page = command === Command.NEXT_PAGE ? page + 1 : page - 1; ChromeVox.tts.stop(); @@ -1381,7 +1377,7 @@ let firstWindow; let rootViewWindow; - if (target.root && target.root.role === RoleType.DESKTOP) { + if (target.root?.role === RoleType.DESKTOP) { // Search for the first container with a name. while (target && (!target.name || !AutomationPredicate.root(target))) { target = target.parent; @@ -1405,7 +1401,7 @@ } // Re-target with preference for the root. - target = rootViewWindow || firstWindow || target; + target = rootViewWindow ?? firstWindow ?? target; if (!target) { output.format('@no_title');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js index f143359..3147b21c5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js
@@ -5,11 +5,11 @@ /** * @fileoverview A composite TTS allows ChromeVox to use multiple TTS engines at * the same time. - * */ -import {TtsInterface} from '../common/tts_interface.js'; import {QueueMode, TtsSpeechProperties} from '../common/tts_types.js'; +import {TtsInterface} from './tts_interface.js'; + /** * A Composite Tts * @implements {TtsInterface}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js index 7d85aea7..c8c68d5b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js
@@ -6,11 +6,11 @@ * @fileoverview A TTS engine that writes to globalThis.console. */ import {SpeechLog} from '../common/log_types.js'; -import {TtsInterface} from '../common/tts_interface.js'; import {QueueMode, TtsCategory} from '../common/tts_types.js'; import {LogStore} from './logging/log_store.js'; import {ChromeVoxPrefs} from './prefs.js'; +import {TtsInterface} from './tts_interface.js'; /** @implements {TtsInterface} */ export class ConsoleTts {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js index feee1b44..87e9e73 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
@@ -18,8 +18,12 @@ /** @public {number} The output volume, as an amplification factor. */ this.outputVolume = 1.0; - /** @public {number} The base relative pitch adjustment, in half-steps. */ - this.basePitch = -4; + /** + * As notated below, all pitches are in the key of C. This can be set to + * transpose the key from C to another pitch. + * @public {!Note} + */ + this.transposeToKey = Note.B_FLAT3; /** @public {number} The click volume, as an amplification factor. */ this.clickVolume = 0.4; @@ -34,25 +38,25 @@ this.baseDelay = 0.045; /** @public {number} The base stereo panning, from -1 to 1. */ - this.basePan = EarconEngine.CENTER_PAN_; + this.basePan = CENTER_PAN; /** @public {number} The base reverb level as an amplification factor. */ this.baseReverb = 0.4; - /** - * @public {string} The choice of the reverb impulse response to use. - * Must be one of the strings from EarconEngine.REVERBS. - */ - this.reverbSound = 'small_room_2'; + /** @public {!Reverb} The choice of the reverb impulse response to use. */ + this.reverbSound = Reverb.SMALL_ROOM; - /** @public {number} The base pitch for the 'wrap' sound in half-steps. */ - this.wrapPitch = 0; + /** @public {!Note} The base pitch for the 'wrap' sound. */ + this.wrapPitch = Note.G_FLAT3; - /** @public {number} The base pitch for the 'alert' sound in half-steps. */ - this.alertPitch = 0; + /** @public {!Note} The base pitch for the 'alert' sound. */ + this.alertPitch = Note.G_FLAT3; + + /** @public {!Note} The default pitch. */ + this.defaultPitch = Note.G3; /** @public {string} The choice of base sound for most controls. */ - this.controlSound = 'control'; + this.controlSound = SoundFile.CONTROL; /** * @public {number} The delay between sounds in the on/off sweep effect, @@ -68,8 +72,8 @@ /** @public {number} The number of echos in the on/off sweep. */ this.sweepEchoCount = 3; - /** @public {number} The pitch offset of the on/off sweep, in half-steps. */ - this.sweepPitch = -7; + /** @public {!Note} The pitch offset of the on/off sweep. */ + this.sweepPitch = Note.C3; /** * @public {number} The final gain of the progress sound, as an @@ -125,12 +129,9 @@ this.currentTrackedEarcon_; // Initialization: load the base sound data files asynchronously. - const allSoundFilesToLoad = - EarconEngine.SOUNDS.concat(EarconEngine.REVERBS); - allSoundFilesToLoad.forEach(sound => { - const url = `${EarconEngine.BASE_URL}${sound}.wav`; - this.loadSound(sound, url); - }); + Object.values(SoundFile) + .concat(Object.values(Reverb)) + .forEach(sound => this.loadSound(sound, `${BASE_URL}${sound}.wav`)); } /** @@ -286,10 +287,7 @@ const first = gainNode; let last = gainNode; - let pan = this.basePan; - if (properties.pan !== undefined) { - pan = properties.pan; - } + const pan = properties.pan ?? this.basePan; if (pan !== 0) { const panNode = this.context_.createPanner(); panNode.setPosition(pan, 0, 0); @@ -298,10 +296,7 @@ last = panNode; } - let reverb = this.baseReverb; - if (properties.reverb !== undefined) { - reverb = properties.reverb; - } + const reverb = properties.reverb ?? this.baseReverb; if (reverb) { if (!this.reverbConvolver_) { this.reverbConvolver_ = this.context_.createConvolver(); @@ -346,23 +341,13 @@ * @return {AudioBufferSourceNode} The source node, so you can stop it * or set event handlers on it. */ - play(sound, opt_properties) { + play(sound, opt_properties = {}) { const source = this.context_.createBufferSource(); source.buffer = this.buffers_[sound]; - if (!opt_properties) { - // This typecast looks silly, but the Closure compiler doesn't support - // optional fields in record types very well so this is the shortest hack. - opt_properties = /** @type {undefined} */ ({}); - } - - let pitch = this.basePitch; - if (opt_properties.pitch) { - pitch += opt_properties.pitch; - } - if (pitch !== 0) { - source.playbackRate.value = Math.pow(EarconEngine.HALF_STEP, pitch); - } + const pitch = opt_properties.pitch ?? this.defaultPitch; + // Changes the playback rate of the sample – which also changes the pitch. + source.playbackRate.value = this.multiplierFor_(pitch); const destination = this.createCommonFilters(opt_properties); source.connect(destination); @@ -380,71 +365,75 @@ /** Play the static sound. */ onStatic() { - this.play('static', {gain: this.staticVolume}); + this.play(SoundFile.STATIC, {gain: this.staticVolume}); } /** Play the link sound. */ onLink() { - this.play('static', {gain: this.clickVolume}); - this.play(this.controlSound, {pitch: 12}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); + this.play(this.controlSound, {pitch: Note.G4}); } /** Play the button sound. */ onButton() { - this.play('static', {gain: this.clickVolume}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); this.play(this.controlSound); } /** Play the text field sound. */ onTextField() { - this.play('static', {gain: this.clickVolume}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); this.play( - 'static', {time: this.baseDelay * 1.5, gain: this.clickVolume * 0.5}); - this.play(this.controlSound, {pitch: 4}); + SoundFile.STATIC, + {time: this.baseDelay * 1.5, gain: this.clickVolume * 0.5}); + this.play(this.controlSound, {pitch: Note.B3}); this.play( - this.controlSound, {pitch: 4, time: this.baseDelay * 1.5, gain: 0.5}); + this.controlSound, + {pitch: Note.B3, time: this.baseDelay * 1.5, gain: 0.5}); } /** Play the pop up button sound. */ onPopUpButton() { - this.play('static', {gain: this.clickVolume}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); this.play(this.controlSound); this.play( - this.controlSound, {time: this.baseDelay * 3, gain: 0.2, pitch: 12}); + this.controlSound, + {time: this.baseDelay * 3, gain: 0.2, pitch: Note.G4}); this.play( - this.controlSound, {time: this.baseDelay * 4.5, gain: 0.2, pitch: 12}); + this.controlSound, + {time: this.baseDelay * 4.5, gain: 0.2, pitch: Note.G4}); } /** Play the check on sound. */ onCheckOn() { - this.play('static', {gain: this.clickVolume}); - this.play(this.controlSound, {pitch: -5}); - this.play(this.controlSound, {pitch: 7, time: this.baseDelay * 2}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); + this.play(this.controlSound, {pitch: Note.D3}); + this.play(this.controlSound, {pitch: Note.D4, time: this.baseDelay * 2}); } /** Play the check off sound. */ onCheckOff() { - this.play('static', {gain: this.clickVolume}); - this.play(this.controlSound, {pitch: 7}); - this.play(this.controlSound, {pitch: -5, time: this.baseDelay * 2}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); + this.play(this.controlSound, {pitch: Note.D4}); + this.play(this.controlSound, {pitch: Note.D3, time: this.baseDelay * 2}); } /** Play the smart sticky mode on sound. */ onSmartStickyModeOn() { - this.play('static', {gain: this.clickVolume * 0.5}); - this.play(this.controlSound, {pitch: 7}); + this.play(SoundFile.STATIC, {gain: this.clickVolume * 0.5}); + this.play(this.controlSound, {pitch: Note.D4}); } /** Play the smart sticky mode off sound. */ onSmartStickyModeOff() { - this.play('static', {gain: this.clickVolume * 0.5}); - this.play(this.controlSound, {pitch: -5}); + this.play(SoundFile.STATIC, {gain: this.clickVolume * 0.5}); + this.play(this.controlSound, {pitch: Note.D3}); } /** Play the select control sound. */ onSelect() { - this.play('static', {gain: this.clickVolume}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); this.play(this.controlSound); this.play(this.controlSound, {time: this.baseDelay}); this.play(this.controlSound, {time: this.baseDelay * 2}); @@ -452,35 +441,39 @@ /** Play the slider sound. */ onSlider() { - this.play('static', {gain: this.clickVolume}); + this.play(SoundFile.STATIC, {gain: this.clickVolume}); this.play(this.controlSound); - this.play(this.controlSound, {time: this.baseDelay, gain: 0.5, pitch: 2}); this.play( - this.controlSound, {time: this.baseDelay * 2, gain: 0.25, pitch: 4}); + this.controlSound, {time: this.baseDelay, gain: 0.5, pitch: Note.A3}); this.play( - this.controlSound, {time: this.baseDelay * 3, gain: 0.125, pitch: 6}); + this.controlSound, + {time: this.baseDelay * 2, gain: 0.25, pitch: Note.B3}); this.play( - this.controlSound, {time: this.baseDelay * 4, gain: 0.0625, pitch: 8}); + this.controlSound, + {time: this.baseDelay * 3, gain: 0.125, pitch: Note.D_FLAT4}); + this.play( + this.controlSound, + {time: this.baseDelay * 4, gain: 0.0625, pitch: Note.E_FLAT4}); } /** Play the skim sound. */ onSkim() { - this.play('skim'); + this.play(SoundFile.SKIM); } /** Play the selection sound. */ onSelection() { - this.play('selection'); + this.play(SoundFile.SELECTION); } /** Play the selection reverse sound. */ onSelectionReverse() { - this.play('selection_reverse'); + this.play(SoundFile.SELECTION_REVERSE); } onNoPointerAnchor() { - this.play('static', {gain: this.clickVolume * 0.2}); - const freq1 = 220 * Math.pow(EarconEngine.HALF_STEP, 13); + this.play(SoundFile.STATIC, {gain: this.clickVolume * 0.2}); + const freq1 = this.frequencyFor_(Note.A_FLAT4); this.generateSinusoidal({ attack: 0.00001, decay: 0.01, @@ -527,10 +520,7 @@ const envelopeNode = this.context_.createGain(); envelopeNode.connect(this.context_.destination); - let time = properties.time; - if (time === undefined) { - time = 0; - } + const time = properties.time ?? 0; // Generate an oscillator for the frequency corresponding to the specified // frequency, and then additional overtones at multiples of that frequency @@ -589,7 +579,17 @@ * @param {boolean} reverse Whether to play in the reverse direction. */ onChromeVoxSweep(reverse) { - const pitches = [-7, -5, 0, 5, 7, 12, 17, 19, 24]; + const pitches = [ + Note.C2, + Note.D3, + Note.G3, + Note.C3, + Note.D4, + Note.G4, + Note.C4, + Note.D5, + Note.G5, + ]; if (reverse) { pitches.reverse(); @@ -622,8 +622,8 @@ freqDecay = Math.pow(0.75, j); } const gain = overtoneGain * freqDecay; - const freq = (i + 1) * 220 * - Math.pow(EarconEngine.HALF_STEP, pitches[j] + this.sweepPitch); + const pitch = pitches[j] + this.sweepPitch; + const freq = (i + 1) * this.frequencyFor_(pitch); if (j === 0) { osc.frequency.setValueAtTime(freq, startTime); gainNode.gain.setValueAtTime(gain, startTime); @@ -660,8 +660,8 @@ /** Play an alert sound. */ onAlert() { - const freq1 = 220 * Math.pow(EarconEngine.HALF_STEP, this.alertPitch - 2); - const freq2 = 220 * Math.pow(EarconEngine.HALF_STEP, this.alertPitch - 3); + const freq1 = this.frequencyFor_(this.alertPitch - 2); + const freq2 = this.frequencyFor_(this.alertPitch - 3); this.generateSinusoidal({ attack: 0.02, decay: 0.07, @@ -686,9 +686,9 @@ /** Play a wrap sound. */ onWrap() { - this.play('static', {gain: this.clickVolume * 0.3}); - const freq1 = 220 * Math.pow(EarconEngine.HALF_STEP, this.wrapPitch - 8); - const freq2 = 220 * Math.pow(EarconEngine.HALF_STEP, this.wrapPitch + 8); + this.play(SoundFile.STATIC, {gain: this.clickVolume * 0.3}); + const freq1 = this.frequencyFor_(this.wrapPitch - 8); + const freq2 = this.frequencyFor_(this.wrapPitch + 8); this.generateSinusoidal({ attack: 0.01, decay: 0.1, @@ -711,12 +711,13 @@ let t = this.progressTime_ - this.context_.currentTime; this.progressSources_.push([ this.progressTime_, - this.play('static', {gain: 0.5 * this.progressGain_, time: t}), + this.play(SoundFile.STATIC, {gain: 0.5 * this.progressGain_, time: t}), ]); this.progressSources_.push([ this.progressTime_, this.play( - this.controlSound, {pitch: 20, time: t, gain: this.progressGain_}), + this.controlSound, + {pitch: Note.E_FLAT5, time: t, gain: this.progressGain_}), ]); if (this.progressGain_ > this.progressFinalGain) { @@ -726,12 +727,13 @@ this.progressSources_.push([ this.progressTime_, - this.play('static', {gain: 0.5 * this.progressGain_, time: t}), + this.play(SoundFile.STATIC, {gain: 0.5 * this.progressGain_, time: t}), ]); this.progressSources_.push([ this.progressTime_, this.play( - this.controlSound, {pitch: 8, time: t, gain: this.progressGain_}), + this.controlSound, + {pitch: Note.E_FLAT4, time: t, gain: this.progressGain_}), ]); if (this.progressGain_ > this.progressFinalGain) { @@ -827,32 +829,125 @@ // Map to between the negative maximum pan x position and the positive max x // pan position. - x = (2 * x - 1) * EarconEngine.MAX_PAN_ABS_X_POSITION; + x = (2 * x - 1) * MAX_PAN_ABS_X_POSITION; this.basePan = x; } /** Resets panning to default (centered). */ resetPan() { - this.basePan = EarconEngine.CENTER_PAN_; + this.basePan = CENTER_PAN; + } + + /** + * @param {!Note|number} note + * @return {number} + * @private + */ + multiplierFor_(note) { + const halfStepsFromA220 = note + HALF_STEPS_TO_C + this.transposeToKey; + return Math.pow(HALF_STEP, halfStepsFromA220); + } + + /** + * @param {!Note|number} note + * @return {number} + * @private + */ + frequencyFor_(note) { + return A3_HZ * this.multiplierFor_(note); } } -/* @const {Array<string>} The list of sound data files to load. */ -EarconEngine.SOUNDS = - ['control', 'selection', 'selection_reverse', 'skim', 'static']; +// Local to module. -/** @const {Array<string>} The list of reverb data files to load. */ -EarconEngine.REVERBS = ['small_room_2']; +/* @enum {string} The list of sound data files to load. */ +const SoundFile = { + CONTROL: 'control', + SELECTION: 'selection', + SELECTION_REVERSE: 'selection_reverse', + SKIM: 'skim', + STATIC: 'static', +}; + +/** @enum {string} The list of reverb data files to load. */ +const Reverb = { + SMALL_ROOM: 'small_room_2', +}; + +/** @enum {number} Pitch values for different notes. */ +const Note = { + C2: -24, + D_FLAT2: -23, + D2: -22, + E_FLAT2: -21, + E2: -20, + F2: -19, + G_FLAT2: -18, + G2: -17, + A_FLAT2: -16, + A2: -15, + B_FLAT2: -14, + B2: -13, + C3: -12, + D_FLAT3: -11, + D3: -10, + E_FLAT3: -9, + E3: -8, + F3: -7, + G_FLAT3: -6, + G3: -5, + A_FLAT3: -4, + A3: -3, + B_FLAT3: -2, + B3: -1, + C4: 0, + D_FLAT4: 1, + D4: 2, + E_FLAT4: 3, + E4: 4, + F4: 5, + G_FLAT4: 6, + G4: 7, + A_FLAT4: 8, + A4: 9, + B_FLAT4: 10, + B4: 11, + C5: 12, + D_FLAT5: 13, + D5: 14, + E_FLAT5: 15, + E5: 16, + F5: 17, + G_FLAT5: 18, + G5: 19, + A_FLAT5: 20, + A5: 21, + B_FLAT5: 22, + B5: 23, + C6: 24, +}; + +/** @const {number} The number of half-steps in an octave. */ +const HALF_STEPS_PER_OCTAVE = 12; + +/** + * The number of half-steps from the base pitch (A220Hz) to C4 (middle C). + * @const {number} + */ +const HALF_STEPS_TO_C = 3; /** @const {number} The scale factor for one half-step. */ -EarconEngine.HALF_STEP = Math.pow(2.0, 1.0 / 12.0); +const HALF_STEP = Math.pow(2.0, 1.0 / HALF_STEPS_PER_OCTAVE); + +/** @const {number} The frequency of the note A3, in Hertz. */ +const A3_HZ = 220; /** @const {string} The base url for earcon sound resources. */ -EarconEngine.BASE_URL = chrome.extension.getURL('chromevox/earcons/'); +const BASE_URL = chrome.extension.getURL('chromevox/earcons/'); -/** The maximum value to pass to PannerNode.setPosition. */ -EarconEngine.MAX_PAN_ABS_X_POSITION = 4; +/** @const {number} The maximum value to pass to PannerNode.setPosition. */ +const MAX_PAN_ABS_X_POSITION = 4; /** @const {number} Default (centered) pan position. */ -EarconEngine.CENTER_PAN_ = 0; +const CENTER_PAN = 0;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js index 998049f..ed498179 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js
@@ -19,6 +19,8 @@ import {EarconEngine} from './earcon_engine.js'; import {LogStore} from './logging/log_store.js'; +const DeviceType = chrome.audio.DeviceType; + export class Earcons extends AbstractEarcons { constructor() { super(); @@ -65,9 +67,9 @@ LogStore.instance.writeTextLog(earcon, LogType.EARCON); console.log('Earcon ' + earcon); } - if (ChromeVoxRange.current && ChromeVoxRange.current.isValid()) { + if (ChromeVoxRange.current?.isValid()) { const node = ChromeVoxRange.current.start.node; - const rect = opt_location || node.location; + const rect = opt_location ?? node.location; const container = node.root.location; if (this.shouldPan_) { this.engine_.setPositionForRect(rect, container); @@ -103,9 +105,8 @@ * @private */ updateShouldPanForDevices_(devices) { - this.shouldPan_ = !devices.some(device => { - return device.isActive && - device.deviceType === chrome.audio.DeviceType.INTERNAL_SPEAKER; - }); + this.shouldPan_ = !devices.some( + device => device.isActive && + device.deviceType === DeviceType.INTERNAL_SPEAKER); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js index 691c8e50..0be8c958 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -42,10 +42,10 @@ constructor(startNode, startIndex, endNode, endIndex, opt_baseLineOnStart) { /** @private {!Cursor} */ this.start_ = new Cursor(startNode, startIndex); - this.start_ = this.start_.deepEquivalent || this.start_; + this.start_ = this.start_.deepEquivalent ?? this.start_; /** @private {!Cursor} */ this.end_ = new Cursor(endNode, endIndex); - this.end_ = this.end_.deepEquivalent || this.end_; + this.end_ = this.end_.deepEquivalent ?? this.end_; /** @private {AutomationNode|undefined} */ this.endContainer_; @@ -119,7 +119,7 @@ nameLen = lineBase.node.name.length; } - this.value_ = new Spannable(lineBase.node.name || '', lineBase); + this.value_ = new Spannable(lineBase.node.name ?? '', lineBase); if (lineBase.node === lineExtend.node) { this.value_.setSpan(lineExtend, 0, nameLen); } @@ -130,8 +130,8 @@ } this.startContainerValue_ = this.startContainer_.role === RoleType.TEXT_FIELD ? - this.startContainer_.value || '' : - this.startContainer_.name || ''; + this.startContainer_.value ?? '' : + this.startContainer_.name ?? ''; this.endContainer_ = this.end_.node; if (this.endContainer_.role === RoleType.INLINE_TEXT_BOX) { this.endContainer_ = this.endContainer_.parent; @@ -228,7 +228,7 @@ (EditableLine.includeOffscreen || !finder.previousSibling.state[StateType.OFFSCREEN])) { finder = finder.previousSibling; - textCountBeforeLineStart += finder.name ? finder.name.length : 0; + textCountBeforeLineStart += finder.name?.length ?? 0; } return {lineStart, value, textCountBeforeLineStart}; @@ -279,7 +279,7 @@ (EditableLine.includeOffscreen || !finder.nextSibling.state[StateType.OFFSCREEN])) { finder = finder.nextSibling; - textCountAfterLineEnd += finder.name ? finder.name.length : 0; + textCountAfterLineEnd += finder.name?.length ?? 0; } return {lineEnd, value, textCountAfterLineEnd}; @@ -328,6 +328,7 @@ value.setSpan(parent, prevLen, len); } } catch (e) { + console.error(e); } } return value; @@ -341,14 +342,14 @@ getNextOnLine_(node) { const nextOnLine = node.nextOnLine; const nextSibling = node.nextSibling; - if (nextOnLine && nextOnLine.role) { + if (nextOnLine?.role) { // Ensure that there is a next-on-line node. The role can be undefined // for an object that has been destroyed since the object was first // cached. return nextOnLine; } - if (nextSibling && nextSibling.previousOnLine === node) { + if (nextSibling?.previousOnLine === node) { // Catches potential breaks in the chain of next-on-line nodes. return nextSibling.firstChild; } @@ -364,15 +365,14 @@ getPreviousOnLine_(node) { const previousLine = node.previousOnLine; const previousSibling = node.previousSibling; - if (previousLine && previousLine.role) { + if (previousLine?.role) { // Ensure that there is a previous-on-line node. The role can be undefined // for an object that has been destroyed since the object was first // cached. return previousLine; } - if (previousSibling && previousSibling.lastChild && - previousSibling.lastChild.nextOnLine === node) { + if (previousSibling?.lastChild?.nextOnLine === node) { // Catches potential breaks in the chain of previous-on-line nodes. return previousSibling.lastChild; } @@ -405,6 +405,7 @@ return this.value_.getSpanStart(this.end_) + (this.end_.index === CURSOR_NODE_INDEX ? 0 : this.end_.index); } catch (e) { + // When that happens, fall back to the end of this line. return this.value_.length; } } @@ -527,16 +528,23 @@ // Equality is intentionally loose here as any of the state nodes can be // invalidated at any time. We rely upon the start/anchor of the line // staying the same. - return (otherLine.lineStartContainer_ === this.lineStartContainer_ && - otherLine.localLineStartContainerOffset_ === - this.localLineStartContainerOffset_) || - (otherLine.lineEndContainer_ === this.lineEndContainer_ && - otherLine.localLineEndContainerOffset_ === - this.localLineEndContainerOffset_) || - (otherLine.lineStartContainerRecovery_.node === - this.lineStartContainerRecovery_.node && - otherLine.localLineStartContainerOffset_ === - this.localLineStartContainerOffset_); + const startNodeAndOffsetMatch = + otherLine.lineStartContainer_ === this.lineStartContainer_ && + otherLine.localLineStartContainerOffset_ === + this.localLineStartContainerOffset_; + const endNodeAndOffsetMatch = + otherLine.lineEndContainer_ === this.lineEndContainer_ && + otherLine.localLineEndContainerOffset_ === + this.localLineEndContainerOffset_; + const recoveryNodeAndOffsetMatch = + otherLine.lineStartContainerRecovery_.node === + this.lineStartContainerRecovery_.node && + otherLine.localLineStartContainerOffset_ === + this.localLineStartContainerOffset_; + + + return startNodeAndOffsetMatch || endNodeAndOffsetMatch || + recoveryNodeAndOffsetMatch; } /** @@ -584,8 +592,8 @@ this.lineStartContainer_, this.localLineStartContainerOffset_); const end = new Cursor( this.lineEndContainer_, this.localLineEndContainerOffset_ - 1); - const localStart = start.deepEquivalent || start; - const localEnd = end.deepEquivalent || end; + const localStart = start.deepEquivalent ?? start; + const localEnd = end.deepEquivalent ?? end; const localStartNode = localStart.node; const localEndNode = localEnd.node; @@ -598,11 +606,9 @@ } // Hack/workaround for broken *OnLine links. - if (testStartNode.nextOnLine && testStartNode.nextOnLine.role) { + if (testStartNode.nextOnLine?.role) { testStartNode = testStartNode.nextOnLine; - } else if ( - testStartNode.nextSibling && - testStartNode.nextSibling.previousOnLine === testStartNode) { + } else if (testStartNode.nextSibling?.previousOnLine === testStartNode) { testStartNode = testStartNode.nextSibling; } else { break; @@ -616,11 +622,9 @@ } // Hack/workaround for broken *OnLine links. - if (testEndNode.previousOnLine && testEndNode.previousOnLine.role) { + if (testEndNode.previousOnLine?.role) { testEndNode = testEndNode.previousOnLine; - } else if ( - testEndNode.previousSibling && - testEndNode.previousSibling.nextOnLine === testEndNode) { + } else if (testEndNode.previousSibling?.nextOnLine === testEndNode) { testEndNode = testEndNode.previousSibling; } else { break; @@ -641,9 +645,8 @@ // ancestors of line nodes. const isLineBreakingSpace = this.text === '\u00a0'; - const prev = (prevLine && prevLine.startContainer_.role) ? - prevLine.startContainer_ : - null; + const prev = + prevLine?.startContainer_.role ? prevLine.startContainer_ : null; const lineNodes = /** @type {Array<!AutomationNode>} */ (this.value_.getSpansInstanceOf( /** @type {function()} */ (this.startContainer_.constructor))); @@ -669,9 +672,7 @@ CursorRange.fromNode(cur), prev ? CursorRange.fromNode(prev) : CursorRange.fromNode(cur), OutputCustomEvent.NAVIGATE) - .onSpeechEnd(() => { - speakNodeAtIndex(++index, cur); - }); + .onSpeechEnd(() => speakNodeAtIndex(++index, cur)); // Ignore whitespace only output except if it is leading content on the // line.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js index e5d52bc..304d47c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js
@@ -15,9 +15,9 @@ */ import {LocalStorage} from '../../../common/local_storage.js'; import {Msgs} from '../../common/msgs.js'; -import {TtsInterface} from '../../common/tts_interface.js'; import {Personality, QueueMode, TtsCategory, TtsSpeechProperties} from '../../common/tts_types.js'; import {ChromeVoxState} from '../chromevox_state.js'; +import {TtsInterface} from '../tts_interface.js'; /** * A class containing the information needed to speak
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js index b44777e..61d4639 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js
@@ -8,10 +8,10 @@ import {AsyncUtil} from '../../common/async_util.js'; import {LocalStorage} from '../../common/local_storage.js'; import {SettingsManager} from '../common/settings_manager.js'; -import {TtsCapturingEventListener} from '../common/tts_interface.js'; import {BaseAutomationHandler} from './base_automation_handler.js'; import {ChromeVox} from './chromevox.js'; +import {TtsCapturingEventListener} from './tts_interface.js'; const AutomationEvent = chrome.automation.AutomationEvent; const AutomationNode = chrome.automation.AutomationNode;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/primary_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/primary_tts.js index 91e0e66..1993b9b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/primary_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/primary_tts.js
@@ -10,12 +10,12 @@ import {Msgs} from '../common/msgs.js'; import {PanelCommand, PanelCommandType} from '../common/panel_command.js'; import {SettingsManager} from '../common/settings_manager.js'; -import {TtsCapturingEventListener, TtsInterface} from '../common/tts_interface.js'; import * as ttsTypes from '../common/tts_types.js'; import {AbstractTts} from './abstract_tts.js'; import {ChromeVox} from './chromevox.js'; import {PhoneticData} from './phonetic_data.js'; +import {TtsCapturingEventListener, TtsInterface} from './tts_interface.js'; const Utterance = class { /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js index ec396b0f..4388697f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
@@ -12,7 +12,6 @@ import {BridgeHelper} from '../common/bridge_helper.js'; import {Msgs} from '../common/msgs.js'; import {SettingsManager} from '../common/settings_manager.js'; -import {TtsInterface} from '../common/tts_interface.js'; import {Personality, QueueMode, TtsSpeechProperties} from '../common/tts_types.js'; import {ChromeVox} from './chromevox.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_interface.js similarity index 96% rename from chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js rename to chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_interface.js index 2eaae0f..987b8a6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_interface.js
@@ -6,7 +6,7 @@ * @fileoverview Defines a Tts interface. * All TTS engines in ChromeVox conform to the this interface. */ -import {QueueMode, TtsSpeechProperties} from './tts_types.js'; +import {QueueMode, TtsSpeechProperties} from '../common/tts_types.js'; /** * An interface for clients who want to get notified when an utterance @@ -42,9 +42,7 @@ */ isSpeaking() {} - /** - * Stops speech. - */ + /** Stops speech. */ stop() {} /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js index c1de4e1..1b21d51 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js
@@ -15,7 +15,7 @@ // Alphabetical based on file path. await importModule( - 'ChromeVoxState', '/chromevox/background/chromevox_state.js'); + 'ChromeVoxRange', '/chromevox/background/chromevox_range.js'); await importModule( 'BackgroundKeyboardHandler', '/chromevox/background/keyboard_handler.js'); @@ -34,7 +34,7 @@ * @return {AutomationNode} */ getRangeStart() { - return ChromeVoxState.instance.getCurrentRange().start.node; + return ChromeVoxRange.current.start.node; } get simpleDoc() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js index 65c7496..3b0dd1e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
@@ -106,7 +106,8 @@ await importModule('ChromeVox', '/chromevox/background/chromevox.js'); await importModule( 'NavBraille', '/chromevox/common/braille/nav_braille.js'); - await importModule('TtsInterface', '/chromevox/common/tts_interface.js'); + await importModule( + 'TtsInterface', '/chromevox/background/tts_interface.js'); await importModule('QueueMode', '/chromevox/common/tts_types.js'); }
diff --git a/chrome/browser/resources/chromeos/drive_internals.html b/chrome/browser/resources/chromeos/drive_internals.html index 1e92411..af9dd66 100644 --- a/chrome/browser/resources/chromeos/drive_internals.html +++ b/chrome/browser/resources/chromeos/drive_internals.html
@@ -138,8 +138,12 @@ <td id="bulk-pinning-pinned-bytes">?</td> </tr> <tr> - <th>Skipped Files</th> - <td id="bulk-pinning-skipped-files">?</td> + <th>Listed Items</th> + <td id="bulk-pinning-listed-items">?</td> + </tr> + <tr> + <th>Skipped Items</th> + <td id="bulk-pinning-skipped-items">?</td> </tr> <tr> <th>Files To Pin</th>
diff --git a/chrome/browser/resources/chromeos/drive_internals.js b/chrome/browser/resources/chromeos/drive_internals.js index f46aeb8..5793391 100644 --- a/chrome/browser/resources/chromeos/drive_internals.js +++ b/chrome/browser/resources/chromeos/drive_internals.js
@@ -114,7 +114,8 @@ $('bulk-pinning-pinned-files').innerText = progress.pinned_files; $('bulk-pinning-failed-files').innerText = progress.failed_files; $('bulk-pinning-syncing-files').innerText = progress.syncing_files; - $('bulk-pinning-skipped-files').innerText = progress.skipped_files; + $('bulk-pinning-skipped-items').innerText = progress.skipped_items; + $('bulk-pinning-listed-items').innerText = progress.listed_items; } function updateStartupArguments(args) {
diff --git a/chrome/browser/resources/feedback/BUILD.gn b/chrome/browser/resources/feedback/BUILD.gn index ce31b6b..5ed7d0e 100644 --- a/chrome/browser/resources/feedback/BUILD.gn +++ b/chrome/browser/resources/feedback/BUILD.gn
@@ -12,11 +12,13 @@ grd_prefix = "feedback" static_files = [ + "css/autofill_metadata.css", "css/common.css", "css/feedback.css", "css/feedback_shared_styles.css", "css/feedback_shared_vars.css", "css/sys_info.css", + "html/autofill_metadata_info.html", "html/default.html", "html/sys_info.html", "images/2x/button_butter_bar_close_hover.png",
diff --git a/chrome/browser/resources/feedback/css/autofill_metadata.css b/chrome/browser/resources/feedback/css/autofill_metadata.css new file mode 100644 index 0000000..e484e23 --- /dev/null +++ b/chrome/browser/resources/feedback/css/autofill_metadata.css
@@ -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. */ + +html, +body { + overflow: visible; + user-select: auto; +}
diff --git a/chrome/browser/resources/feedback/html/autofill_metadata_info.html b/chrome/browser/resources/feedback/html/autofill_metadata_info.html new file mode 100644 index 0000000..dcc61c3 --- /dev/null +++ b/chrome/browser/resources/feedback/html/autofill_metadata_info.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html dir="$i18n{textdirection}" lang="$i18n{language}"> + +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <meta name="color-scheme" content="light dark"> + <title>$i18n{autofillMetadataPageTitle}</title> + <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> + <link rel="stylesheet" href="../css/about_sys.css"> + <link rel="stylesheet" href="../css/autofill_metadata.css"> + <link rel="stylesheet" href="../css/feedback_shared_styles.css"> +</head> + +<body> + <div id="header"> + <h1 id="title">$i18n{autofillMetadataPageTitle}</h1> + </div> + <div id="content"> + <!-- TODO(crbug.com/1407646): Implement page content.--> + </div> +</body> + +</html>
diff --git a/chrome/browser/resources/nearby_share/shared/BUILD.gn b/chrome/browser/resources/nearby_share/shared/BUILD.gn index d073426..3f20cbb 100644 --- a/chrome/browser/resources/nearby_share/shared/BUILD.gn +++ b/chrome/browser/resources/nearby_share/shared/BUILD.gn
@@ -10,7 +10,7 @@ assert(is_chromeos, "Nearby Share is CrOS only") preprocessed_dir = "$target_gen_dir/preprocessed" -os_settings_dir = "$root_gen_dir/chrome/browser/resources/settings/chromeos" +tsc_dir = "$target_gen_dir/tsc" # Grdp of JSON files for OS Settings. generate_grd("build_json_grdp") { @@ -25,6 +25,8 @@ ] } +# TODO(b/207087930) Consider moving these shared files to chrome://resources. +# b/207087942 provides context why chrome://resources did not work previously. generate_grd("build_v3_grdp") { grd_prefix = "nearby_share" out_grd = "$target_gen_dir/${grd_prefix}_resources_v3.grdp" @@ -98,7 +100,7 @@ ] root_dir = preprocessed_dir in_files = web_component_files + non_web_component_files + html_wrapper_files - out_dir = "$os_settings_dir/tsc_input/shared" + out_dir = tsc_dir definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] path_mappings = [ # Additional path mappings for Nearby share Mojo files
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 8ae90d4..5aa85d0 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -23,6 +23,10 @@ tsc_output_folder = "tsc" tsc_output_dir = "$target_gen_dir/$tsc_output_folder" +nearby_share_mojo_dir = "$root_gen_dir/chrome/browser/resources/nearby_share/preprocessed/mojom-webui/chrome/browser/ui/webui/nearby_share" +nearby_share_tsc_dir = + "$root_gen_dir/chrome/browser/resources/nearby_share/shared/tsc" + if (optimize_webui) { build_manifest_v3 = "build_v3_manifest.json" @@ -55,7 +59,10 @@ "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js", "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js", "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js", - "mojo/nearby_share.mojom-webui.js", + ] + external_paths = [ + "/mojo/|" + rebase_path(nearby_share_mojo_dir, root_build_dir), + "/shared/|" + rebase_path(nearby_share_tsc_dir, root_build_dir), ] } } @@ -85,15 +92,14 @@ "//chrome/browser/resources/nearby_share:generate_definitions", ] path_mappings = [ - # Additional path mappings for Nearby share Mojo files - "/mojo/nearby_share*|" + rebase_path( - "$root_gen_dir/chrome/browser/resources/nearby_share/preprocessed/mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share*", - target_gen_dir), + # Additional path mappings for Nearby share code + "/mojo/*|" + rebase_path("$nearby_share_mojo_dir/*", target_gen_dir), + "/shared/*|" + rebase_path("$nearby_share_tsc_dir/*", target_gen_dir), ] definitions = ts_definition_files root_dir = tsc_input_dir - in_files = src_ts_files + html_wrapper_files + css_wrapper_files + - mojom_webui_files + shared_nearby_share_files + in_files = + src_ts_files + html_wrapper_files + css_wrapper_files + mojom_webui_files out_dir = tsc_output_dir composite = true @@ -128,6 +134,7 @@ public_deps = [ ":copy_mojom_ts", ":generate_ash_search_mojo_webui", + ":generate_input_device_settings_mojom", ":generate_personalization_search_mojom", ":generate_settings_mojo_webui", ] @@ -146,6 +153,20 @@ outputs = [ "$tsc_input_dir/mojom-webui/{{source_file_part}}" ] } +copy("generate_input_device_settings_mojom") { + deps = [ + "//ash/public/mojom:input_device_settings_webui_js", + "//chrome/browser/ui/webui/settings/ash/input_device_settings:mojom_ts__generator", + "//ui//chromeos/events/mojom:mojom_webui_js", + ] + sources = [ + "$root_gen_dir/chrome/browser/ui/webui/settings/ash/input_device_settings/input_device_settings_provider.mojom-webui.ts", + "$root_gen_dir/mojom-webui/ash/public/mojom/input_device_settings.mojom-webui.js", + "$root_gen_dir/mojom-webui/ui/chromeos/events/mojom/modifier_key.mojom-webui.js", + ] + outputs = [ "$tsc_input_dir/mojom-webui/{{source_file_part}}" ] +} + copy("generate_settings_mojo_webui") { deps = [ "//chrome/browser/ui/webui/settings/chromeos/constants:mojom_webui_js" ] @@ -241,8 +262,8 @@ ] input_files_base_dir = rebase_path(".", "//") deps = [ - "../../nearby_share:build_mojo_grdp", - "../../nearby_share/shared:build_json_grdp", + "//chrome/browser/resources/nearby_share:build_mojo_grdp", + "//chrome/browser/resources/nearby_share/shared:build_json_grdp", ] grdp_files = [ "$root_gen_dir/chrome/browser/resources/nearby_share/nearby_share_mojo_resources.grdp", @@ -266,8 +287,8 @@ "//chrome/browser/resources/nearby_share/shared:build_v3_grdp", ] grdp_files += [ "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_resources_v3.grdp" ] - manifest_files += [ "$target_gen_dir/build_ts.manifest" ] - resource_path_rewrites += [ "chromeos/os_settings.html|os_settings.html" ] + manifest_files += + filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) } }
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse_subsection.html b/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse_subsection.html index 2b7f0e7..7dc55df 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse_subsection.html +++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_mouse_subsection.html
@@ -74,7 +74,7 @@ </localized-link> </div> <cr-toggle id="mouseReverseScroll" - checked="[[reverseScrollValue]]" + checked="{{reverseScrollValue}}" aria-labelledby="enableMouseReverseScrollingLabel"> </cr-toggle> </div>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.html b/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.html index 203542ff..782bdfc 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.html +++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.html
@@ -90,7 +90,7 @@ </div> </div> <cr-toggle id="touchpadHapticFeedbackToggle" - checked="[[hapticFeedbackValue]]" + checked="{{hapticFeedbackValue}}" aria-labelledby="touchpadHapticFeedbackRow"> </cr-toggle> </div> @@ -106,7 +106,7 @@ </localized-link> </div> <cr-toggle id="enableReverseScrollingToggle" - checked="[[reverseScrollValue]]" + checked="{{reverseScrollValue}}" aria-labelledby="enableReverseScrollingLabel"> </cr-toggle> </div>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.ts b/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.ts index f275bff..1dab7e9 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.ts +++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_touchpad_subsection.ts
@@ -23,7 +23,8 @@ import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Touchpad} from './input_device_settings_types.js'; +import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js'; +import {InputDeviceSettingsProviderInterface, Touchpad} from './input_device_settings_types.js'; import {getTemplate} from './per_device_touchpad_subsection.html.js'; export class SettingsPerDeviceTouchpadSubsectionElement extends PolymerElement { @@ -175,7 +176,8 @@ 'scrollAccelerationPref.value,' + 'scrollSensitivityPref.value,' + 'hapticClickSensitivityPref.value,' + - 'reverseScrollValue)', + 'reverseScrollValue,' + + 'hapticFeedbackValue)', 'updateSettingsToCurrentPrefs(touchpad)', ]; } @@ -191,6 +193,8 @@ private reverseScrollValue: boolean; private hapticFeedbackValue: boolean; private isInitialized: boolean = false; + private inputDeviceSettingsProvider: InputDeviceSettingsProviderInterface = + getInputDeviceSettingsProvider(); private updateSettingsToCurrentPrefs(): void { this.set( @@ -240,6 +244,20 @@ if (!this.isInitialized) { return; } + this.touchpad.settings = { + ...this.touchpad.settings, + tapToClickEnabled: this.enableTapToClickPref.value, + tapDraggingEnabled: this.enableTapDraggingPref.value, + accelerationEnabled: this.accelerationPref.value, + sensitivity: this.sensitivityPref.value, + scrollAcceleration: this.scrollAccelerationPref.value, + scrollSensitivity: this.scrollSensitivityPref.value, + hapticSensitivity: this.hapticClickSensitivityPref.value, + reverseScrolling: this.reverseScrollValue, + hapticEnabled: this.hapticFeedbackValue, + }; + this.inputDeviceSettingsProvider.setTouchpadSettings( + this.touchpad.id, this.touchpad.settings); } }
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts index 5d98ee7..146a915 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts
@@ -17,6 +17,7 @@ import './multidevice_permissions_setup_dialog.js'; import './multidevice_subpage.js'; +import {NearbyShareSettingsMixin} from '/shared/nearby_share_settings_mixin.js'; import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -24,7 +25,6 @@ import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {PrefsMixin} from '../../prefs/prefs_mixin.js'; -import {NearbyShareSettingsMixin} from '../../shared/nearby_share_settings_mixin.js'; import {DeepLinkingMixin} from '../deep_linking_mixin.js'; import {recordSettingChange} from '../metrics_recorder.js'; import {routes} from '../os_settings_routes.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts index beb503a..a639c76 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts
@@ -9,10 +9,10 @@ */ import 'chrome://resources/cr_elements/cr_lottie/cr_lottie.js'; -import '../../shared/nearby_page_template.js'; -import '../../shared/nearby_device.js'; -import '../../shared/nearby_preview.js'; -import '../../shared/nearby_progress.js'; +import '/shared/nearby_page_template.js'; +import '/shared/nearby_device.js'; +import '/shared/nearby_preview.js'; +import '/shared/nearby_progress.js'; import {ShareTarget, TransferStatus} from '/mojo/nearby_share.mojom-webui.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.ts index 1198843..e4fe3e1 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.ts
@@ -10,17 +10,16 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; -import '../../shared/nearby_contact_visibility.js'; -import '../../shared/nearby_onboarding_page.js'; -import '../../shared/nearby_visibility_page.js'; +import '/shared/nearby_contact_visibility.js'; +import '/shared/nearby_onboarding_page.js'; +import '/shared/nearby_visibility_page.js'; +import {NearbyContactVisibilityElement} from '/shared/nearby_contact_visibility.js'; +import {NearbySettings} from '/shared/nearby_share_settings_mixin.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.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 {NearbyContactVisibilityElement} from '../../shared/nearby_contact_visibility.js'; -import {NearbySettings} from '../../shared/nearby_share_settings_mixin.js'; - import {getTemplate} from './nearby_share_contact_visibility_dialog.html.js'; interface NearbyShareContactVisibilityDialogElement {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.ts index cd445304..60c8377 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.ts
@@ -13,13 +13,12 @@ import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js'; import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js'; +import {getNearbyShareSettings} from '/shared/nearby_share_settings.js'; +import {NearbySettings} from '/shared/nearby_share_settings_mixin.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js'; -import {NearbySettings} from '../../shared/nearby_share_settings_mixin.js'; - import {getTemplate} from './nearby_share_data_usage_dialog.html.js'; import {dataUsageStringToEnum, NearbyShareDataUsage} from './types.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.ts index da0cd8e..b08a014 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.ts
@@ -12,14 +12,13 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.js'; +import {getNearbyShareSettings} from '/shared/nearby_share_settings.js'; +import {NearbySettings} from '/shared/nearby_share_settings_mixin.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {DeviceNameValidationResult} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js'; -import {NearbySettings} from '../../shared/nearby_share_settings_mixin.js'; - import {getTemplate} from './nearby_share_device_name_dialog.html.js'; interface NearbyShareDeviceNameDialogElement {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts index b15aa72..5cb24092 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts
@@ -11,8 +11,8 @@ import 'chrome://resources/cr_elements/cr_lottie/cr_lottie.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/cr_components/localized_link/localized_link.js'; -import '../../shared/nearby_page_template.js'; -import '../../shared/nearby_shared_icons.html.js'; +import '/shared/nearby_page_template.js'; +import '/shared/nearby_shared_icons.html.js'; import {RegisterReceiveSurfaceResult} from '/mojo/nearby_share.mojom-webui.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts index 99502547..41207bb 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts
@@ -23,21 +23,20 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js'; import '../../prefs/prefs.js'; -import '../../shared/nearby_onboarding_one_page.js'; -import '../../shared/nearby_onboarding_page.js'; -import '../../shared/nearby_visibility_page.js'; +import '/shared/nearby_onboarding_one_page.js'; +import '/shared/nearby_onboarding_page.js'; +import '/shared/nearby_visibility_page.js'; import './nearby_share_confirm_page.js'; import './nearby_share_high_visibility_page.js'; import {ReceiveManagerInterface, ReceiveObserverReceiver, RegisterReceiveSurfaceResult, ShareTarget, TransferMetadata, TransferStatus} from '/mojo/nearby_share.mojom-webui.js'; +import {NearbySettings} from '/shared/nearby_share_settings_mixin.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js'; import {assert} from 'chrome://resources/js/assert_ts.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 {NearbySettings} from '../../shared/nearby_share_settings_mixin.js'; - import {getTemplate} from './nearby_share_receive_dialog.html.js'; import {getReceiveManager, observeReceiveManager} from './nearby_share_receive_manager.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts index ee35d6e..02aac1d 100644 --- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts +++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts
@@ -20,6 +20,8 @@ import './nearby_share_receive_dialog.js'; import {ReceiveObserverReceiver, ShareTarget, TransferMetadata} from '/mojo/nearby_share.mojom-webui.js'; +import {getContactManager} from '/shared/nearby_contact_manager.js'; +import {NearbySettings} from '/shared/nearby_share_settings_mixin.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -28,8 +30,6 @@ import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {PrefsMixin} from '../../prefs/prefs_mixin.js'; -import {getContactManager} from '../../shared/nearby_contact_manager.js'; -import {NearbySettings} from '../../shared/nearby_share_settings_mixin.js'; import {DeepLinkingMixin} from '../deep_linking_mixin.js'; import {routes} from '../os_settings_routes.js'; import {RouteObserverMixin} from '../route_observer_mixin.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index e7e1bd4..be5d341 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -421,6 +421,9 @@ mojom_webui_files = [ "mojom-webui/cros_audio_config.mojom-webui.ts", "mojom-webui/app_notification_handler.mojom-webui.ts", + "mojom-webui/input_device_settings_provider.mojom-webui.ts", + "mojom-webui/input_device_settings.mojom-webui.js", + "mojom-webui/modifier_key.mojom-webui.js", "mojom-webui/routes.mojom-webui.js", "mojom-webui/search/personalization_search.mojom-webui.ts", "mojom-webui/search/search.mojom-webui.js", @@ -429,37 +432,5 @@ "mojom-webui/setting.mojom-webui.js", ] -# TODO(b/207087930) Consider moving these shared files to chrome://resources -# Files below are from Nearby Share and shared with ChromeOS Settings -shared_nearby_share_files = [ - "shared/nearby_contact_visibility.js", - "shared/nearby_contact_visibility.html.js", - "shared/nearby_device_icon.js", - "shared/nearby_device_icon.html.js", - "shared/nearby_device.js", - "shared/nearby_device.html.js", - "shared/nearby_onboarding_one_page.js", - "shared/nearby_onboarding_one_page.html.js", - "shared/nearby_onboarding_page.js", - "shared/nearby_onboarding_page.html.js", - "shared/nearby_page_template.js", - "shared/nearby_page_template.html.js", - "shared/nearby_preview.js", - "shared/nearby_preview.html.js", - "shared/nearby_progress.js", - "shared/nearby_progress.html.js", - "shared/nearby_visibility_page.js", - "shared/nearby_visibility_page.html.js", - - "shared/nearby_contact_manager.js", - "shared/nearby_metrics_logger.js", - "shared/nearby_share_settings_mixin.js", - "shared/nearby_share_settings.js", - "shared/types.js", - - "shared/nearby_shared_icons.html.js", - "shared/nearby_shared_share_type_icons.html.js", -] - # Files sourced from their checked-in version under src src_ts_files = non_web_component_files + web_component_files
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.ts b/chrome/browser/resources/settings/chromeos/os_settings.ts index 08a3394..6502c6c 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings.ts
@@ -140,6 +140,9 @@ * into a single JS file. The exports below are necessary so they can be * imported into browser tests. */ +export {getContactManager, observeContactManager, setContactManagerForTesting} from '/shared/nearby_contact_manager.js'; +export {getNearbyShareSettings, observeNearbyShareSettings, setNearbyShareSettingsForTesting} from '/shared/nearby_share_settings.js'; +export {NearbySettings, NearbyShareSettingsMixin} from '/shared/nearby_share_settings_mixin.js'; export {PermissionType, TriState} from 'chrome://resources/cr_components/app_management/app_management.mojom-webui.js'; export {BrowserProxy as AppManagementComponentBrowserProxy} from 'chrome://resources/cr_components/app_management/browser_proxy.js'; export {PageType, WindowMode} from 'chrome://resources/cr_components/app_management/constants.js'; @@ -151,9 +154,6 @@ export {PageStatus, StatusAction, SyncBrowserProxyImpl} from '../people_page/sync_browser_proxy.js'; export {CrSettingsPrefs} from '../prefs/prefs_types.js'; export {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from '../privacy_page/privacy_page_browser_proxy.js'; -export {getContactManager, observeContactManager, setContactManagerForTesting} from '../shared/nearby_contact_manager.js'; -export {getNearbyShareSettings, observeNearbyShareSettings, setNearbyShareSettingsForTesting} from '../shared/nearby_share_settings.js'; -export {NearbySettings, NearbyShareSettingsMixin} from '../shared/nearby_share_settings_mixin.js'; export {setCrosAudioConfigForTesting} from './device_page/cros_audio_config.js'; export {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, IdleBehavior, LidClosedBehavior, NoteAppLockScreenSupport, setDisplayApiForTesting, StorageSpaceState} from './device_page/device_page_browser_proxy.js'; export {fakeKeyboards, fakeMice, fakePointingSticks, fakeTouchpads} from './device_page/fake_input_device_data.js';
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc index b3b7845..f842fca1 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
@@ -63,11 +63,11 @@ content_size_ = expected_content_size; results_[expected_filename] = expected_result; username_ = expected_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -103,12 +103,12 @@ unscanned_reason_ = expected_reason; content_size_ = expected_content_size; username_ = expected_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .Times(expected_filenames.size()) .WillRepeatedly( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); }); } @@ -139,11 +139,11 @@ if (expected_scan_id.has_value()) { scan_ids_[expected_filename] = expected_scan_id.value(); } - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -178,11 +178,11 @@ results_[expected_filename] = expected_result; username_ = expected_username; scan_ids_[expected_filename] = expected_scan_id; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -221,12 +221,12 @@ content_size_ = expected_content_size; username_ = expected_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .Times(expected_filenames.size()) .WillRepeatedly( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); }); } @@ -258,16 +258,16 @@ results_[expected_filename] = expected_result; username_ = expected_username; scan_ids_[expected_filename] = expected_scan_id; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); }) .WillOnce([this, expected_filename, expected_dlp_verdict]( content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { event_key_ = SafeBrowsingPrivateEventRouter::kKeySensitiveDataEvent; threat_type_ = absl::nullopt; @@ -307,16 +307,16 @@ dlp_verdicts_[expected_filename] = expected_dlp_verdict; username_ = expected_username; scan_ids_[expected_filename] = expected_scan_id; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); }) .WillOnce([this, expected_filename, expected_threat_type]( content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { event_key_ = SafeBrowsingPrivateEventRouter::kKeyDangerousDownloadEvent; threat_type_ = expected_threat_type; @@ -350,11 +350,11 @@ content_size_ = expected_content_size; results_[expected_filename] = expected_result; username_ = expected_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -375,11 +375,11 @@ federated_origin_ = expected_federated_origin; username_ = expected_profile_username; login_user_name_ = expected_login_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -397,11 +397,11 @@ trigger_ = expected_trigger; password_breach_identities_ = expected_identities; username_ = expected_username; - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + EXPECT_CALL(*client_, UploadSecurityEventReport) .WillOnce( [this](content::BrowserContext* context, bool include_device_info, - base::Value::Dict& report, - base::OnceCallback<void(policy::CloudPolicyClient::Result)>& + base::Value::Dict report, + base::OnceCallback<void(policy::CloudPolicyClient::Result)> callback) { ValidateReport(&report); if (!done_closure_.is_null()) { @@ -607,7 +607,7 @@ } void EventReportValidator::ExpectNoReport() { - EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); + EXPECT_CALL(*client_, UploadSecurityEventReport).Times(0); } void EventReportValidator::SetDoneClosure(base::RepeatingClosure closure) {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc index 100ae69..0f5eb5d0 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc
@@ -75,7 +75,7 @@ base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); base::FilePath file_path = temp_dir.GetPath().AppendASCII("normal.doc"); - base::WriteFile(file_path, file_contents.data(), file_contents.size()); + base::WriteFile(file_path, file_contents); auto request = MakeRequest(/*block_unsupported_types=*/false, file_path, @@ -316,7 +316,7 @@ std::string normal_contents = "Normal file contents"; base::FilePath file_path = temp_dir.GetPath().AppendASCII("normal.doc"); - base::WriteFile(file_path, normal_contents.data(), normal_contents.size()); + base::WriteFile(file_path, normal_contents); BinaryUploadService::Result async_result; BinaryUploadService::Request::Data async_data; @@ -366,7 +366,7 @@ std::string normal_contents = "Normal file contents"; base::FilePath file_path = temp_dir.GetPath().AppendASCII("normal.doc"); - base::WriteFile(file_path, normal_contents.data(), normal_contents.size()); + base::WriteFile(file_path, normal_contents); BinaryUploadService::Result result; BinaryUploadService::Request::Data data;
diff --git a/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc index c148ec0..dc59441 100644 --- a/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc
@@ -148,9 +148,7 @@ base::FilePath upload_file_path(temp_dir_.GetPath().AppendASCII( "test file " + base::NumberToString(n))); const std::string upload_file_data = "data"; - int wrote = base::WriteFile(upload_file_path, upload_file_data.data(), - upload_file_data.size()); - EXPECT_EQ(static_cast<int>(upload_file_data.size()), wrote); + EXPECT_TRUE(base::WriteFile(upload_file_path, upload_file_data)); return upload_file_path; }
diff --git a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc index 1e05126..e356b2b1 100644 --- a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc
@@ -112,9 +112,7 @@ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); upload_file_path_ = temp_dir_.GetPath().AppendASCII("test file"); upload_file_data_ = "data"; - ASSERT_EQ(static_cast<int>(upload_file_data_.size()), - base::WriteFile(upload_file_path_, upload_file_data_.data(), - upload_file_data_.size())); + ASSERT_TRUE(base::WriteFile(upload_file_path_, upload_file_data_)); TwoPhaseUploader::RegisterFactory(&two_phase_uploader_factory_); }
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc index 2580ce4..bc6e7cb 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -800,9 +800,7 @@ } std::string file_contents = "corrupt archive file"; - ASSERT_EQ( - static_cast<int>(file_contents.size()), - base::WriteFile(tmp_path_, file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile(tmp_path_, file_contents)); RunLoop run_loop; download_service_->CheckClientDownload( @@ -1521,10 +1519,9 @@ std::string file_contents = "dummy file"; { // In this case, it only contains a text file. - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile(zip_source_dir.GetPath().Append( - FILE_PATH_LITERAL("file.txt")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path_, false)); RunLoop run_loop; download_service_->CheckClientDownload( @@ -1539,10 +1536,9 @@ } { // Now check with an executable in the zip file as well. - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile(zip_source_dir.GetPath().Append( - FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path_, false)); EXPECT_CALL(*sb_service_->mock_database_manager(), MatchDownloadAllowlistUrl(_)) @@ -1588,10 +1584,9 @@ { // Repeat the test with an archive inside the zip file in addition to the // executable. - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile(zip_source_dir.GetPath().Append( - FILE_PATH_LITERAL("file.rar")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.rar")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path_, false)); RunLoop run_loop; download_service_->CheckClientDownload(
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc b/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc index be232142..e52555b 100644 --- a/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc
@@ -150,10 +150,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -204,10 +203,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.zip")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.zip")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -232,9 +230,7 @@ temp_dir_.GetPath().Append(FILE_PATH_LITERAL("tmp.crdownload")); std::string file_contents = "invalid contents"; - ASSERT_EQ( - static_cast<int>(file_contents.size()), - base::WriteFile(tmp_path, file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile(tmp_path, file_contents)); analyzer.Start( target_path, tmp_path, @@ -262,9 +258,7 @@ temp_dir_.GetPath().Append(FILE_PATH_LITERAL("tmp.crdownload")); std::string file_contents = "invalid contents"; - ASSERT_EQ( - static_cast<int>(file_contents.size()), - base::WriteFile(tmp_path, file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile(tmp_path, file_contents)); analyzer.Start( target_path, tmp_path, @@ -294,10 +288,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -323,9 +316,7 @@ temp_dir_.GetPath().Append(FILE_PATH_LITERAL("tmp.crdownload")); std::string file_contents = "invalid zip"; - ASSERT_EQ( - static_cast<int>(file_contents.size()), - base::WriteFile(tmp_path, file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile(tmp_path, file_contents)); analyzer.Start( target_path, tmp_path, @@ -351,10 +342,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -381,10 +371,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -411,10 +400,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.zip")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.zip")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -441,10 +429,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -471,14 +458,12 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.rar")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.rar")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -505,10 +490,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.txt")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -542,14 +526,12 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.rar")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.rar")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -766,10 +748,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -886,10 +867,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false)); @@ -920,10 +900,9 @@ base::ScopedTempDir zip_source_dir; ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); std::string file_contents = "dummy file"; - ASSERT_EQ(static_cast<int>(file_contents.size()), - base::WriteFile( - zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), - file_contents.data(), file_contents.size())); + ASSERT_TRUE(base::WriteFile( + zip_source_dir.GetPath().Append(FILE_PATH_LITERAL("file.exe")), + file_contents)); ASSERT_TRUE(zip::Zip(zip_source_dir.GetPath(), tmp_path, /* include_hidden_files= */ false));
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc index e4981c3..4e6ffb42 100644 --- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc +++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc
@@ -9,7 +9,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions_win.h" #include "base/values.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/extension_telemetry/extension_signal.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/proto/csd.pb.h"
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_file_processor_unittest.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_file_processor_unittest.cc index 6bf531d1..9a7d276 100644 --- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_file_processor_unittest.cc +++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_file_processor_unittest.cc
@@ -40,13 +40,12 @@ void WriteExtensionFile(const base::FilePath& path, const std::string& file_name, const std::string& content) { - ASSERT_TRUE(base::WriteFile(path.AppendASCII(file_name), content.data(), - static_cast<int>(content.size()))); + ASSERT_TRUE(base::WriteFile(path.AppendASCII(file_name), content)); } void WriteEmptyFile(const base::FilePath& path, const std::string& file_name) { base::FilePath file_path = path.AppendASCII(file_name); - base::WriteFile(file_path, nullptr, 0); + base::WriteFile(file_path, base::StringPiece()); int64_t file_size; EXPECT_TRUE(base::GetFileSize(file_path, &file_size));
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc index 5dd0d20..f9fb02ff5 100644 --- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc
@@ -140,8 +140,7 @@ void WriteTestMetadataFileForItem(uint32_t download_id) { std::string data; ASSERT_TRUE(GetTestMetadata(download_id)->SerializeToString(&data)); - ASSERT_EQ(static_cast<int>(data.size()), - base::WriteFile(GetMetadataPath(), data.data(), data.size())); + ASSERT_TRUE(base::WriteFile(GetMetadataPath(), data)); } // Writes a test DownloadMetadata file for kTestDownloadId to the test profile
diff --git a/chrome/browser/search/background/ntp_custom_background_service_unittest.cc b/chrome/browser/search/background/ntp_custom_background_service_unittest.cc index f0b0859..e8553cea 100644 --- a/chrome/browser/search/background/ntp_custom_background_service_unittest.cc +++ b/chrome/browser/search/background/ntp_custom_background_service_unittest.cc
@@ -160,7 +160,7 @@ base::FilePath copy_path(profile_path.AppendASCII( chrome::kChromeUIUntrustedNewTabPageBackgroundFilename)); - base::WriteFile(path, "background_image", 16); + base::WriteFile(path, "background_image"); custom_background_service_->SelectLocalBackgroundImage(path); @@ -186,7 +186,7 @@ base::FilePath path(profile_path.AppendASCII( chrome::kChromeUIUntrustedNewTabPageBackgroundFilename)); - base::WriteFile(path, "background_image", 16); + base::WriteFile(path, "background_image"); custom_background_service_->AddValidBackdropUrlForTesting(kUrl); custom_background_service_->SetCustomBackgroundInfo(kUrl, GURL(), "", "", @@ -240,7 +240,7 @@ base::FilePath profile_path = profile_.GetPath(); base::FilePath path(profile_path.AppendASCII( chrome::kChromeUIUntrustedNewTabPageBackgroundFilename)); - base::WriteFile(path, "background_image", 16); + base::WriteFile(path, "background_image"); base::ThreadPoolInstance::Get()->FlushForTesting(); custom_background_service_->SelectLocalBackgroundImage(path); @@ -268,7 +268,7 @@ base::FilePath profile_path = profile_.GetPath(); base::FilePath path(profile_path.AppendASCII( chrome::kChromeUIUntrustedNewTabPageBackgroundFilename)); - base::WriteFile(path, "background_image", 16); + base::WriteFile(path, "background_image"); base::ThreadPoolInstance::Get()->FlushForTesting(); custom_background_service_->SelectLocalBackgroundImage(path); @@ -354,7 +354,7 @@ base::FilePath profile_path = profile_.GetPath(); base::FilePath path(profile_path.AppendASCII( chrome::kChromeUIUntrustedNewTabPageBackgroundFilename)); - base::WriteFile(path, "background_image", 16); + base::WriteFile(path, "background_image"); base::ThreadPoolInstance::Get()->FlushForTesting(); custom_background_service_->SelectLocalBackgroundImage(path);
diff --git a/chrome/browser/search_engines/ui_thread_search_terms_data.cc b/chrome/browser/search_engines/ui_thread_search_terms_data.cc index ac093e7..1344991 100644 --- a/chrome/browser/search_engines/ui_thread_search_terms_data.cc +++ b/chrome/browser/search_engines/ui_thread_search_terms_data.cc
@@ -9,7 +9,6 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/google/google_brand.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_switches.h" #include "components/google/core/common/google_util.h"
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java index 48e8ac5..b1c014b 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -35,8 +35,6 @@ import org.chromium.chrome.modules.image_editor.ImageEditorModuleProvider; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; -import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState; -import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver; import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; import org.chromium.components.browser_ui.share.ShareParams; @@ -132,15 +130,6 @@ ShareSheetCoordinator.this::onLayoutChange); } } - - @Override - public void onSheetStateChanged(@SheetState int state, @StateChangeReason int reason) { - if (state == SheetState.HIDDEN) { - RecordHistogram.recordEnumeratedHistogram( - "Sharing.SharingHubAndroid.CloseReason", reason, - StateChangeReason.MAX_VALUE + 1); - } - } }; mBottomSheetController.addObserver(mBottomSheetObserver); mIconBridge = iconBridge;
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc index 6676c555..e0e1f04f 100644 --- a/chrome/browser/speech/speech_recognition_service_browsertest.cc +++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -517,7 +517,7 @@ ASSERT_TRUE(base::PathExists(config_dir)); base::FilePath config_file_path = config_dir.Append(FILE_PATH_LITERAL("config_file")); - ASSERT_EQ(base::WriteFile(config_file_path, nullptr, 0), 0); + ASSERT_TRUE(base::WriteFile(config_file_path, base::StringPiece())); ASSERT_TRUE(base::PathExists(config_file_path)); g_browser_process->local_state()->SetFilePath(prefs::kSodaEnUsConfigPath, config_file_path);
diff --git a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc index 9b05fc16..52571c6 100644 --- a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc +++ b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc
@@ -16,6 +16,8 @@ #include "chrome/browser/net/stub_resolver_config_reader.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_preferences_util.h" +#include "chrome/browser/safe_browsing/advanced_protection_status_manager.h" +#include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h" #include "chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h" #include "chrome/browser/ssl/https_only_mode_controller_client.h" #include "chrome/browser/ssl/insecure_form/insecure_form_controller_client.h" @@ -309,9 +311,18 @@ std::unique_ptr<HttpsOnlyModeControllerClient> client = std::make_unique<HttpsOnlyModeControllerClient>(web_contents, request_url); + + Profile* profile = + Profile::FromBrowserContext(web_contents->GetBrowserContext()); + bool is_under_advanced_protection = + profile && + safe_browsing::AdvancedProtectionStatusManagerFactory::GetForProfile( + profile) + ->IsUnderAdvancedProtection(); auto page = std::make_unique<security_interstitials::HttpsOnlyModeBlockingPage>( - web_contents, request_url, std::move(client)); + web_contents, request_url, std::move(client), + is_under_advanced_protection); return page; }
diff --git a/chrome/browser/ssl/https_only_mode_browsertest.cc b/chrome/browser/ssl/https_only_mode_browsertest.cc index 113598d..fc456620 100644 --- a/chrome/browser/ssl/https_only_mode_browsertest.cc +++ b/chrome/browser/ssl/https_only_mode_browsertest.cc
@@ -54,7 +54,9 @@ ~HttpsOnlyModeBrowserTest() override = default; void SetUp() override { - feature_list_.InitAndEnableFeature(features::kHttpsOnlyMode); + feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kHttpsOnlyMode}, + /*disabled_features=*/{features::kHttpsFirstModeV2}); InProcessBrowserTest::SetUp(); } @@ -1104,8 +1106,19 @@ InProcessBrowserTest::SetUp(); } + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + http_server_.AddDefaultHandlers(GetChromeTestDataDir()); + ASSERT_TRUE(http_server_.Start()); + } + protected: bool is_enabled_for_advanced_protection() const { return GetParam(); } + + net::EmbeddedTestServer* http_server() { return &http_server_; } + + private: + net::EmbeddedTestServer http_server_{net::EmbeddedTestServer::TYPE_HTTP}; }; INSTANTIATE_TEST_SUITE_P( @@ -1123,12 +1136,23 @@ EXPECT_FALSE(ap_manager->IsUnderAdvancedProtection()); EXPECT_FALSE(GetPref()); + GURL http_url = http_server()->GetURL("foo.test", "/simple.html"); + auto* contents = browser()->tab_strip_model()->GetActiveWebContents(); + ap_manager->SetAdvancedProtectionStatusForTesting(true); if (is_enabled_for_advanced_protection()) { EXPECT_TRUE(GetPref()); + + EXPECT_FALSE(content::NavigateToURL(contents, http_url)); + EXPECT_TRUE(chrome_browser_interstitials::IsShowingInterstitial(contents)); + EXPECT_TRUE(chrome_browser_interstitials::IsInterstitialDisplayingText( + contents->GetPrimaryMainFrame(), "Advanced Protection")); } else { EXPECT_FALSE(GetPref()); - } - // TODO(crbug.com/1414633): Check that the HFM UI setting is locked. + EXPECT_TRUE(content::NavigateToURL(contents, http_url)); + EXPECT_FALSE( + chrome_browser_interstitials::IsShowingHttpsFirstModeInterstitial( + contents)); + } }
diff --git a/chrome/browser/ssl/https_upgrades_navigation_throttle.cc b/chrome/browser/ssl/https_upgrades_navigation_throttle.cc index 563e171e..a84631c 100644 --- a/chrome/browser/ssl/https_upgrades_navigation_throttle.cc +++ b/chrome/browser/ssl/https_upgrades_navigation_throttle.cc
@@ -9,7 +9,6 @@ #include "base/metrics/histogram_functions.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/https_only_mode_tab_helper.h" #include "chrome/browser/ssl/https_upgrades_navigation_throttle.h" #include "chrome/common/chrome_features.h"
diff --git a/chrome/browser/storage/storage_notification_service_impl.cc b/chrome/browser/storage/storage_notification_service_impl.cc index 8e5b1f6..42d1b65 100644 --- a/chrome/browser/storage/storage_notification_service_impl.cc +++ b/chrome/browser/storage/storage_notification_service_impl.cc
@@ -8,7 +8,6 @@ #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "build/build_config.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc index f22f677..1e087b12 100644 --- a/chrome/browser/storage_access_api/api_browsertest.cc +++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -246,13 +246,16 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); // Navigate iframe to a cross-site, cookie-reading endpoint, and verify that - // the cookie is sent: + // the cookie is not sent: NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); // Navigate iframe to c.test and verify that the cookie is not sent. NavigateFrameTo(kHostC, "/echoheader?cookie"); @@ -261,13 +264,19 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); // Navigate iframe to a cross-site frame with a frame, and navigate _that_ - // frame to a cross-site page that echos the cookie header, and verify that - // the cookie is sent: + // frame to the same cross-site page that echos the cookie header, and verify + // that allowing storage access for the iframe does not enable cookie access + // from the nested iframe. NavigateFrameTo(kHostB, "/iframe.html"); NavigateNestedFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetNestedFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); + EXPECT_EQ(GetNestedFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), ""); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); + EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); + EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); + EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), ""); + // Navigate nested iframe to c.test and verify that the cookie is not // sent. NavigateNestedFrameTo(kHostC, "/echoheader?cookie"); @@ -277,15 +286,9 @@ // Navigate iframe to a cross-site frame with a frame, and navigate _that_ // frame to a distinct cross-site page that echos the cookie header, and - // verify that the cookie is sent: + // verify that the cookie is not sent: NavigateFrameTo(kHostC, "/iframe.html"); NavigateNestedFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetNestedFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); - // Navigate nested iframe to c.test and verify that the cookie is not - // sent. - NavigateNestedFrameTo(kHostC, "/echoheader?cookie"); EXPECT_EQ(GetNestedFrameContent(), "None"); EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), ""); EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); @@ -355,13 +358,18 @@ // Block all cookies with a user setting for kHostB. CookieSettingsFactory::GetForProfile(browser()->profile()) ->SetCookieSetting(GetURL(kHostB), ContentSetting::CONTENT_SETTING_BLOCK); - EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); + + // This is the expected behavior when we've gotten the permission but user + // settings block cookie access. + EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); // Navigate iframe to a cross-site, cookie-reading endpoint, and verify that // the cookie is blocked: NavigateFrameTo(kHostB, "/echoheader?cookie"); EXPECT_EQ(GetFrameContent(), "None"); EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); // Navigate iframe to a cross-site frame with a frame, and navigate _that_ @@ -396,22 +404,20 @@ NavigateToPageWithFrame(kHostA); NavigateFrameTo(kHostB, "/echoheader?cookie"); + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); - - // Navigate iframe to a cross-site, cookie-reading endpoint, and verify that - // the cookie is sent: - NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), "thirdparty=1"); EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "thirdparty=1"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); // Manually delete all our grants. HostContentSettingsMap* settings_map = HostContentSettingsMapFactory::GetForProfile(browser()->profile()); settings_map->ClearSettingsForOneType(ContentSettingsType::STORAGE_ACCESS); + // Verify cookie cannot be accessed. + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); NavigateFrameTo(kHostB, "/echoheader?cookie"); EXPECT_EQ(GetFrameContent(), "None"); @@ -463,9 +469,9 @@ EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); } -// Validates that expiry data is transferred over IPC to the Network Service. -IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, - ThirdPartyGrantsExpireOverIPC) { +// Validates that expired grants don't get reused. +IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, ThirdPartyGrantsExpiry) { + base::HistogramTester histogram_tester; SetBlockThirdPartyCookies(true); // Set a cookie on `kHostB` and `kHostC`. @@ -484,7 +490,8 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); - // Manually create a pre-expired grant and ensure it doesn't grant access. + // Manually create a pre-expired grant and ensure it doesn't grant access for + // HostB. base::Time expiration_time = base::Time::Now() - base::Minutes(5); HostContentSettingsMap* settings_map = HostContentSettingsMapFactory::GetForProfile(browser()->profile()); @@ -494,39 +501,35 @@ {expiration_time, content_settings::SessionModel::UserSession}); settings_map->SetContentSettingDefaultScope( GetURL(kHostC), GetURL(kHostA), ContentSettingsType::STORAGE_ACCESS, - CONTENT_SETTING_ALLOW, - {expiration_time, content_settings::SessionModel::UserSession}); + CONTENT_SETTING_ALLOW); - // Manually send our expired setting. This needs to be done manually because - // normally this expired value would be filtered out before sending and time - // cannot be properly mocked in a browser test. - ContentSettingsForOneType settings; - settings.push_back(ContentSettingPatternSource( - ContentSettingsPattern::FromURLNoWildcard(GetURL(kHostB)), - ContentSettingsPattern::FromURLNoWildcard(GetURL(kHostA)), - base::Value(CONTENT_SETTING_ALLOW), "preference", - /*incognito=*/false, {.expiration = expiration_time})); - settings.emplace_back( - ContentSettingsPattern::FromURLNoWildcard(GetURL(kHostC)), - ContentSettingsPattern::FromURLNoWildcard(GetURL(kHostA)), - base::Value(CONTENT_SETTING_ALLOW), "preference", - /*incognito=*/false); + // The iframe should request for new grant since the existing one is expired. + EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); + EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); - browser() - ->profile() - ->GetDefaultStoragePartition() - ->GetCookieManagerForBrowserProcess() - ->SetStorageAccessGrantSettings(settings, base::DoNothing()); + // Validate that only one permission was newly granted. + histogram_tester.ExpectTotalCount(kRequestOutcomeHistogram, 1); + EXPECT_THAT( + histogram_tester.GetBucketCount(kRequestOutcomeHistogram, + RequestOutcome::kGrantedByAllowance), + 1); - EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); + // The nested iframe reuses the existing grant without requesting. + EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetNestedFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), "thirdparty=c"); + // We don't get to record a sample for the "reuse" case, so that histogram + // still only has 1 sample in total. + histogram_tester.ExpectTotalCount(kRequestOutcomeHistogram, 1); NavigateFrameTo(kHostB, "/iframe.html"); NavigateNestedFrameTo(kHostC, "/echoheader?cookie"); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); - EXPECT_EQ(GetNestedFrameContent(), "thirdparty=c"); - EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), "thirdparty=c"); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); + EXPECT_EQ(GetNestedFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetNestedFrame()), ""); } IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, @@ -546,21 +549,15 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); // Navigate iframe to a cross-site, cookie-reading endpoint, and verify that - // the cookie is sent: - NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); - + // the cookie is not sent due to per-frame storage access: NavigateToPageWithFrame(kHostASubdomain); NavigateFrameTo(kHostB, "/echoheader?cookie"); - // Similar to the rsaFor equivalent, scoping may or may not allow access for - // the subdomain, depending on the setting. - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); } IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, @@ -580,21 +577,23 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); // Navigate iframe to a cross-site, cookie-reading endpoint, and verify that - // the cookie is sent: + // the cookie is not sent due to per-frame storage access: NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); NavigateToPageWithFrame(kHostA); NavigateFrameTo(kHostB, "/echoheader?cookie"); - // Similar to the rsaFor equivalent, scoping may or may not allow access for - // the subdomain, depending on the setting. - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + // Verify that the cookie is not sent due to per-frame storage access: + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); } IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, @@ -612,6 +611,7 @@ EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=a.test"); // Regardless of the top-level site or origin scoping, the embedded origin // should be used. @@ -687,7 +687,7 @@ NavigateToPageWithFrame(kHostA); NavigateFrameTo(kHostB, "/browsing_data/site_data.html"); ExpectStorage(GetFrame(), DoesPermissionGrantStorage()); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); } IN_PROC_BROWSER_TEST_P(StorageAccessAPIStorageBrowserTest, @@ -716,7 +716,7 @@ NavigateFrameTo(kHostB, "/iframe.html"); NavigateNestedFrameTo(kHostC, "/browsing_data/site_data.html"); ExpectStorage(GetNestedFrame(), DoesPermissionGrantStorage()); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame())); } // Test third-party cookie blocking of features that allow to communicate @@ -734,7 +734,7 @@ NavigateToNewTabWithFrame(kHostA); NavigateFrameTo(kHostB, "/browsing_data/site_data.html"); storage::test::ExpectCrossTabInfoForFrame(GetFrame(), true); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); SetBlockThirdPartyCookies(true); @@ -752,7 +752,7 @@ NavigateFrameTo(kHostB, "/browsing_data/site_data.html"); storage::test::ExpectCrossTabInfoForFrame(GetFrame(), DoesPermissionGrantStorage()); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); } INSTANTIATE_TEST_SUITE_P(/*no prefix*/, @@ -809,13 +809,15 @@ EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); - // When the frame subsequently navigates to an endpoint on kHostB, - // kHostB's cookies are sent, and the iframe retains storage - // access. + // When the frame subsequently navigates to an endpoint on kHostB, the frame + // obtained storage access is not carried over since this navigation is not + // made by the frame itself, so that kHostB's cookies are not sent: NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), "cross-site=b.test"); - EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + EXPECT_EQ(GetFrameContent(), "None"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), ""); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); content::FetchHistogramsFromChildProcesses(); @@ -979,19 +981,21 @@ EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); // kHostB can request storage access, and it is granted (by an implicit - // grant): + // grant), kHostB's unpartitioned and partitioned cookies are sent: EXPECT_TRUE(storage::test::RequestStorageAccessForFrame(GetFrame())); EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); - - // When the frame subsequently navigates to an endpoint on kHostB, kHostB's - // unpartitioned and partitioned cookies are sent, and the iframe retains - // storage access. - NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(GetFrameContent(), - "cross-site=b.test; cross-site=b.test(partitioned)"); EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test; cross-site=b.test(partitioned)"); - EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame())); + + // When the frame subsequently navigates to an endpoint on kHostB, the frame + // obtained storage access is not carried over since this navigation is not + // made by the frame itself, only kHostB's partitioned cookies are sent: + NavigateFrameTo(kHostB, "/echoheader?cookie"); + EXPECT_EQ(GetFrameContent(), "cross-site=b.test(partitioned)"); + EXPECT_EQ(ReadCookiesViaJS(GetFrame()), "cross-site=b.test(partitioned)"); + // Only when the initiator is the frame that's been navigated can inherit + // per-frame storage access. + EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame())); } } // namespace
diff --git a/chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.cc b/chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.cc index 305253b..6532bab 100644 --- a/chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.cc +++ b/chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.cc
@@ -328,8 +328,7 @@ const std::string& content) { base::FilePath temp_file; EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir_, &temp_file)); - EXPECT_EQ(static_cast<int>(content.size()), - base::WriteFile(temp_file, content.data(), content.size())); + EXPECT_TRUE(base::WriteFile(temp_file, content)); return temp_file; }
diff --git a/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc b/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc index df5c348..0c5a082 100644 --- a/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc +++ b/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc
@@ -804,13 +804,13 @@ const FileSystemURL kFile2(file_system.URL("file2")); const FileSystemURL kDir(file_system.URL("dir")); - const char kTestFileData0[] = "0123456789"; - const char kTestFileData1[] = "Lorem ipsum!"; - const char kTestFileData2[] = "This is sample test data."; + const std::string kTestFileData0 = "0123456789"; + const std::string kTestFileData1 = "Lorem ipsum!"; + const std::string kTestFileData2 = "This is sample test data."; // Create kFile1 and populate it with kTestFileData0. EXPECT_EQ(base::File::FILE_OK, file_system.CreateFile(kFile1)); - EXPECT_EQ(static_cast<int64_t>(std::size(kTestFileData0) - 1), + EXPECT_EQ(static_cast<int>(kTestFileData0.size()), file_system.WriteString(kFile1, kTestFileData0)); // kFile2 and kDir are not there yet. @@ -830,12 +830,8 @@ const base::FilePath kFilePath1(temp_dir.GetPath().Append(FPL("file1"))); const base::FilePath kFilePath2(temp_dir.GetPath().Append(FPL("file2"))); - ASSERT_EQ(static_cast<int>(std::size(kTestFileData1) - 1), - base::WriteFile(kFilePath1, kTestFileData1, - std::size(kTestFileData1) - 1)); - ASSERT_EQ(static_cast<int>(std::size(kTestFileData2) - 1), - base::WriteFile(kFilePath2, kTestFileData2, - std::size(kTestFileData2) - 1)); + ASSERT_TRUE(base::WriteFile(kFilePath1, kTestFileData1)); + ASSERT_TRUE(base::WriteFile(kFilePath2, kTestFileData2)); // Record the usage. int64_t usage = -1, new_usage = -1; @@ -865,8 +861,7 @@ SYNC_FILE_TYPE_FILE)); // Check if the usage has been increased by (kTestFileData1 - kTestFileData0). - const int updated_size = - std::size(kTestFileData1) - std::size(kTestFileData0); + const int updated_size = kTestFileData1.size() - kTestFileData0.size(); EXPECT_EQ(blink::mojom::QuotaStatusCode::kOk, file_system.GetUsageAndQuota(&new_usage, "a)); EXPECT_EQ(updated_size, new_usage - usage); @@ -916,8 +911,7 @@ new_usage = usage; EXPECT_EQ(blink::mojom::QuotaStatusCode::kOk, file_system.GetUsageAndQuota(&new_usage, "a)); - EXPECT_GT(new_usage, - static_cast<int64_t>(usage + std::size(kTestFileData2) - 1)); + EXPECT_GT(new_usage, static_cast<int64_t>(usage + kTestFileData2.size())); // The changes applied by ApplyRemoteChange should not be recorded in // the change tracker. @@ -951,7 +945,7 @@ file_system.MaybeInitializeFileSystemContext(sync_context_.get())); ASSERT_EQ(base::File::FILE_OK, file_system.OpenFileSystem()); - const char kTestFileData[] = "Lorem ipsum!"; + constexpr base::StringPiece kTestFileData = "Lorem ipsum!"; const FileSystemURL kDir(file_system.URL("dir")); const FileSystemURL kFile(file_system.URL("dir/file")); @@ -961,9 +955,7 @@ // Prepare a temporary file which represents remote file data. const base::FilePath kFilePath(temp_dir.GetPath().Append(FPL("file"))); - ASSERT_EQ( - static_cast<int>(std::size(kTestFileData) - 1), - base::WriteFile(kFilePath, kTestFileData, std::size(kTestFileData) - 1)); + ASSERT_TRUE(base::WriteFile(kFilePath, kTestFileData)); // Calling ApplyChange's with kFilePath should create // kFile along with kDir.
diff --git a/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc b/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc index 6f3ff38f..b1161ee 100644 --- a/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc +++ b/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc
@@ -234,13 +234,11 @@ TEST_F(LocalFileSyncServiceTest, RemoteSyncStepsSimple) { const FileSystemURL kFile(file_system_->URL("file")); const FileSystemURL kDir(file_system_->URL("dir")); - const char kTestFileData[] = "0123456789"; - const int kTestFileDataSize = static_cast<int>(std::size(kTestFileData) - 1); + const std::string kTestFileData = "0123456789"; base::FilePath local_path; ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &local_path)); - ASSERT_EQ(kTestFileDataSize, - base::WriteFile(local_path, kTestFileData, kTestFileDataSize)); + ASSERT_TRUE(base::WriteFile(local_path, kTestFileData)); // Run PrepareForProcessRemoteChange for kFile. SyncFileMetadata expected_metadata;
diff --git a/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc b/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc index 7b461f3..f1fd6f87f 100644 --- a/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc +++ b/chrome/browser/sync_file_system/local/syncable_file_operation_runner_unittest.cc
@@ -369,9 +369,7 @@ base::FilePath temp_path; ASSERT_TRUE(CreateTempFile(&temp_path)); - ASSERT_EQ(static_cast<int>(kTestData.size()), - base::WriteFile( - temp_path, kTestData.data(), kTestData.size())); + ASSERT_TRUE(base::WriteFile(temp_path, kTestData)); sync_status()->StartSyncing(URL(kFile)); ASSERT_FALSE(sync_status()->IsWritable(URL(kFile)));
diff --git a/chrome/browser/tab_contents/view_source_browsertest.cc b/chrome/browser/tab_contents/view_source_browsertest.cc index 38631dbc..8c3ecf1 100644 --- a/chrome/browser/tab_contents/view_source_browsertest.cc +++ b/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -203,7 +203,7 @@ // the original tab is navigated cross-process. This is required for the // original bug to reproduce. { - GURL url = embedded_test_server()->GetURL("/title1.html"); + GURL url = embedded_test_server()->GetURL("a.com", "/title1.html"); ui_test_utils::UrlLoadObserver load_complete( url, content::NotificationService::AllSources()); EXPECT_TRUE(content::ExecuteScript( @@ -217,8 +217,8 @@ browser()->tab_strip_model()->ActivateTabAt( 0, TabStripUserGestureDetails( TabStripUserGestureDetails::GestureType::kOther)); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL(chrome::kChromeUIVersionURL))); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("b.com", "/title1.html"))); EXPECT_TRUE(chrome::CanViewSource(browser())); // Navigate back in session history to ensure view-source mode is still
diff --git a/chrome/browser/touch_to_fill/payments/android/internal/java/res/layout/touch_to_fill_credit_card_footer_item.xml b/chrome/browser/touch_to_fill/payments/android/internal/java/res/layout/touch_to_fill_credit_card_footer_item.xml index 1f3286459..2602f3c 100644 --- a/chrome/browser/touch_to_fill/payments/android/internal/java/res/layout/touch_to_fill_credit_card_footer_item.xml +++ b/chrome/browser/touch_to_fill/payments/android/internal/java/res/layout/touch_to_fill_credit_card_footer_item.xml
@@ -33,7 +33,7 @@ android:text="@string/autofill_scan_credit_card" android:visibility="gone" app:drawableStartCompat="@drawable/ic_photo_camera" - app:drawableTint="@color/default_icon_color_tint_list" + app:drawableTint="@color/default_icon_color_secondary_tint_list" android:background="?android:attr/selectableItemBackground" android:textDirection="locale" android:textAlignment="viewStart"/> @@ -49,7 +49,7 @@ android:textAppearance="@style/TextAppearance.TextMedium.Primary" android:text="@string/autofill_bottom_sheet_manage_payment_methods" app:drawableStartCompat="@drawable/infobar_chrome" - app:drawableTint="@color/default_icon_color_tint_list" + app:drawableTint="@color/default_icon_color_secondary_tint_list" android:background="?android:attr/selectableItemBackground" android:textDirection="locale" android:textAlignment="viewStart"/>
diff --git a/chrome/browser/touch_to_fill/payments/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillCreditCardRenderTest.java b/chrome/browser/touch_to_fill/payments/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillCreditCardRenderTest.java index 8d6392f7..6c53d86 100644 --- a/chrome/browser/touch_to_fill/payments/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillCreditCardRenderTest.java +++ b/chrome/browser/touch_to_fill/payments/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillCreditCardRenderTest.java
@@ -67,7 +67,7 @@ @Rule public final ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(10) + .setRevision(11) .setBugComponent(Component.UI_BROWSER_AUTOFILL) .build();
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 94f900f..ebcda2eb 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3808,8 +3808,6 @@ "cocoa/applescript/element_applescript.mm", "cocoa/applescript/error_applescript.h", "cocoa/applescript/error_applescript.mm", - "cocoa/applescript/metrics_applescript.h", - "cocoa/applescript/metrics_applescript.mm", "cocoa/applescript/tab_applescript.h", "cocoa/applescript/tab_applescript.mm", "cocoa/applescript/window_applescript.h", @@ -4508,6 +4506,8 @@ "views/controls/hover_button.h", "views/controls/md_text_button_with_down_arrow.cc", "views/controls/md_text_button_with_down_arrow.h", + "views/controls/obscurable_label_with_toggle_button.cc", + "views/controls/obscurable_label_with_toggle_button.h", "views/controls/page_switcher_view.cc", "views/controls/page_switcher_view.h", "views/controls/rich_hover_button.cc",
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index 638b011..88966c9 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -29,6 +29,7 @@ "java/src/org/chromium/chrome/browser/omnibox/OmniboxFocusReason.java", "java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java", "java/src/org/chromium/chrome/browser/omnibox/OmniboxStub.java", + "java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java", "java/src/org/chromium/chrome/browser/omnibox/OmniboxViewUtil.java", "java/src/org/chromium/chrome/browser/omnibox/OverrideUrlLoadingDelegate.java", "java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java", @@ -395,6 +396,7 @@ "java/src/org/chromium/chrome/browser/omnibox/AutocompleteStateUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/KeyboardHideHelperUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java", + "java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java", "java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/ShadowUrlBarData.java", "java/src/org/chromium/chrome/browser/omnibox/SpannableAutocompleteEditTextModelUnitTest.java",
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index 03b1a9d..d39cfd6 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -12,7 +12,6 @@ <dimen name="toolbar_progress_bar_height">2dp</dimen> <dimen name="toolbar_button_width">48dp</dimen> <dimen name="toolbar_identity_disc_size">24dp</dimen> - <dimen name="toolbar_identity_disc_size_duet">32dp</dimen> <dimen name="toolbar_url_focus_translation_x">10dp</dimen> <dimen name="toolbar_url_focus_height_increase_active_color">8dp</dimen> <dimen name="toolbar_url_focus_height_increase_no_active_color">10dp</dimen>
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java index bada2fc..fe101a59 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -38,7 +38,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteDelegate; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxPedalDelegate; -import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownScrollListener; import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor.BookmarkState; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; @@ -72,9 +71,10 @@ * <p>The coordinator creates and owns elements within this component. */ -public class LocationBarCoordinator implements LocationBar, NativeInitObserver, - OmniboxSuggestionsDropdownEmbedder, - AutocompleteDelegate { +public class LocationBarCoordinator + implements LocationBar, NativeInitObserver, AutocompleteDelegate { + private final OmniboxSuggestionsDropdownEmbedderImpl mOmniboxDropdownEmbedderImpl; + /** Identifies coordinators with methods specific to a device type. */ public interface SubCoordinator { /** Destroys SubCoordinator. */ @@ -181,6 +181,8 @@ Context context = mLocationBarLayout.getContext(); OneshotSupplierImpl<TemplateUrlService> templateUrlServiceSupplier = new OneshotSupplierImpl<>(); + mOmniboxDropdownEmbedderImpl = new OmniboxSuggestionsDropdownEmbedderImpl( + mWindowAndroid, mWindowDelegate, autocompleteAnchorView, mLocationBarLayout); mUrlBar = mLocationBarLayout.findViewById(R.id.url_bar); // TODO(crbug.com/1151513): Inject LocaleManager instance to LocationBarCoordinator instead @@ -188,7 +190,7 @@ mLocationBarMediator = new LocationBarMediator(context, mLocationBarLayout, locationBarDataProvider, profileObservableSupplier, privacyPreferencesManager, overrideUrlLoadingDelegate, LocaleManager.getInstance(), templateUrlServiceSupplier, - backKeyBehavior, windowAndroid, isTablet() && isTabletLayout(), + backKeyBehavior, windowAndroid, isTabletWindow() && isTabletLayout(), searchEngineLogoUtils, LensController.getInstance(), launchAssistanceSettingsAction, saveOfflineButtonState, omniboxUma, isToolbarMicEnabledSupplier); if (backPressManager != null && BackPressManager.isEnabled()) { @@ -202,13 +204,14 @@ mLocationBarMediator, windowAndroid.getKeyboardDelegate(), isIncognito, reportExceptionCallback); mAutocompleteCoordinator = new AutocompleteCoordinator(mLocationBarLayout, - AutocompleteControllerProvider.from(windowAndroid), this, this, mUrlCoordinator, - modalDialogManagerSupplier, activityTabSupplier, shareDelegateSupplier, - locationBarDataProvider, profileObservableSupplier, bringTabToFrontCallback, - tabWindowManagerSupplier, bookmarkState, jankTracker, omniboxPedalDelegate, + AutocompleteControllerProvider.from(windowAndroid), this, + mOmniboxDropdownEmbedderImpl, mUrlCoordinator, modalDialogManagerSupplier, + activityTabSupplier, shareDelegateSupplier, locationBarDataProvider, + profileObservableSupplier, bringTabToFrontCallback, tabWindowManagerSupplier, + bookmarkState, jankTracker, omniboxPedalDelegate, omniboxSuggestionsDropdownScrollListener); StatusView statusView = mLocationBarLayout.findViewById(R.id.location_bar_status); - mStatusCoordinator = new StatusCoordinator(isTablet(), statusView, mUrlCoordinator, + mStatusCoordinator = new StatusCoordinator(isTabletWindow(), statusView, mUrlCoordinator, locationBarDataProvider, templateUrlServiceSupplier, searchEngineLogoUtils, profileObservableSupplier, windowAndroid, pageInfoAction, merchantTrustSignalsCoordinatorSupplier, browserControlsVisibilityDelegate); @@ -399,29 +402,7 @@ return mUrlCoordinator.getUrlBarData(); } - // OmniboxSuggestionsDropdownEmbedder implementation - @Override - public boolean isTablet() { - return DeviceFormFactor.isWindowOnTablet(mWindowAndroid); - } - - @Override - public WindowDelegate getWindowDelegate() { - return mWindowDelegate; - } - - @Override - public View getAnchorView() { - return mAutocompleteAnchorView; - } - - @Override - public View getAlignmentView() { - return isTablet() ? mLocationBarLayout : mAutocompleteAnchorView; - } - // AutocompleteDelegate implementation. - @Override public void onUrlTextChanged() { mLocationBarMediator.onUrlTextChanged(); @@ -617,7 +598,7 @@ * @param button The {@link View} of the button to hide. */ public ObjectAnimator createHideButtonAnimatorForTablet(View button) { - assert isTablet(); + assert isTabletWindow(); return mLocationBarMediator.createHideButtonAnimatorForTablet(button); } @@ -628,7 +609,7 @@ * @param button The {@link View} of the button to show. */ public ObjectAnimator createShowButtonAnimatorForTablet(View button) { - assert isTablet(); + assert isTabletWindow(); return mLocationBarMediator.createShowButtonAnimatorForTablet(button); } @@ -643,7 +624,7 @@ */ public List<Animator> getHideButtonsWhenUnfocusedAnimatorsForTablet( int toolbarStartPaddingDifference) { - assert isTablet(); + assert isTabletWindow(); return mLocationBarMediator.getHideButtonsWhenUnfocusedAnimatorsForTablet( toolbarStartPaddingDifference); } @@ -659,14 +640,14 @@ */ public List<Animator> getShowButtonsWhenUnfocusedAnimatorsForTablet( int toolbarStartPaddingDifference) { - assert isTablet(); + assert isTabletWindow(); return mLocationBarMediator.getShowButtonsWhenUnfocusedAnimatorsForTablet( toolbarStartPaddingDifference); } /** Toggles whether buttons should be displayed in the URL bar when it's not focused. */ public void setShouldShowButtonsWhenUnfocusedForTablet(boolean shouldShowButtons) { - assert isTablet(); + assert isTabletWindow(); mLocationBarMediator.setShouldShowButtonsWhenUnfocusedForTablet(shouldShowButtons); } @@ -693,6 +674,10 @@ return mLocationBarLayout instanceof LocationBarTablet; } + private boolean isTabletWindow() { + return DeviceFormFactor.isWindowOnTablet(mWindowAndroid); + } + /* package */ LocationBarMediator getMediatorForTesting() { return mLocationBarMediator; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java new file mode 100644 index 0000000..07bb0cd --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java
@@ -0,0 +1,180 @@ +// 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.omnibox; + +import android.view.View; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.view.WindowInsets; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.WindowInsetsCompat; + +import org.chromium.base.Callback; +import org.chromium.base.supplier.ObservableSupplierImpl; +import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.base.ViewUtils; +import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.base.WindowDelegate; + +/** + * Implementation of {@link OmniboxSuggestionsDropdownEmbedder} that positions it using an "anchor" + * and "horizontal alignment" view. It aligns the omnibox dropdown as follows: + * - The top of the dropdown is the bottom of the anchor view. + * - The width of the dropdown is equal to the anchor view's width. + * - The horizontal padding of the dropdown is calculated so that its contents are in line with the + * horizontal alignment view if the alignment view's width is smaller than the anchor view. + * */ +class OmniboxSuggestionsDropdownEmbedderImpl implements OmniboxSuggestionsDropdownEmbedder, + View.OnLayoutChangeListener, + OnGlobalLayoutListener { + private final ObservableSupplierImpl<OmniboxAlignment> mOmniboxAlignmentSupplier = + new ObservableSupplierImpl<>(); + private final @NonNull WindowAndroid mWindowAndroid; + private final @NonNull WindowDelegate mWindowDelegate; + private final @NonNull View mAnchorView; + private final @NonNull View mHorizontalAlignmentView; + // Reusable int array to pass to positioning methods that operate on a two element int array. + // Keeping it as a member lets us avoid allocating a temp array every time. + private final int[] mPositionArray = new int[2]; + private int mVerticalOffsetInWindow; + private WindowInsetsCompat mWindowInsetsCompat; + + /** + * + * @param windowAndroid Window object in which the dropdown will be displayed. + * @param windowDelegate Delegate object for performing window operations. + * @param anchorView View to which the dropdown should be "anchored" i.e. vertically positioned + * next to and matching the width of. This must be a descendant of the top-level content + * (android.R.id.content) view. + * @param horizontalAlignmentView View to which the dropdown should be horizontally aligned when + * its width is smaller than the anchor view. This must be a descendant of the anchor + * view. + */ + OmniboxSuggestionsDropdownEmbedderImpl(@NonNull WindowAndroid windowAndroid, + @NonNull WindowDelegate windowDelegate, @NonNull View anchorView, + @NonNull View horizontalAlignmentView) { + mWindowAndroid = windowAndroid; + mWindowDelegate = windowDelegate; + mAnchorView = anchorView; + mHorizontalAlignmentView = horizontalAlignmentView; + recalculateOmniboxAlignment(); + } + + @Override + public OmniboxAlignment addAlignmentObserver(Callback<OmniboxAlignment> obs) { + return mOmniboxAlignmentSupplier.addObserver(obs); + } + + @Override + public void removeAlignmentObserver(Callback<OmniboxAlignment> obs) { + mOmniboxAlignmentSupplier.removeObserver(obs); + } + + @Nullable + @Override + public OmniboxAlignment getCurrentAlignment() { + return mOmniboxAlignmentSupplier.get(); + } + + @Override + public boolean isTablet() { + return DeviceFormFactor.isWindowOnTablet(mWindowAndroid); + } + + @Override + public void onAttachedToWindow() { + mAnchorView.addOnLayoutChangeListener(this); + mHorizontalAlignmentView.addOnLayoutChangeListener(this); + mAnchorView.getViewTreeObserver().addOnGlobalLayoutListener(this); + recalculateOmniboxAlignment(); + } + + @Override + public void onDetachedFromWindow() { + mAnchorView.removeOnLayoutChangeListener(this); + mHorizontalAlignmentView.removeOnLayoutChangeListener(this); + mAnchorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + + @Override + @NonNull + public WindowDelegate getWindowDelegate() { + return mWindowDelegate; + } + + // View.OnLayoutChangeListener + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, + int oldTop, int oldRight, int oldBottom) { + recalculateOmniboxAlignment(); + } + + // OnGlobalLayoutListener + @Override + public void onGlobalLayout() { + if (offsetInWindowChanged(mAnchorView) || insetsHaveChanged(mAnchorView)) { + recalculateOmniboxAlignment(); + } + } + + /** + * Recalculates the desired alignment of the omnibox and sends the updated alignment data to + * any observers. Currently will send an update message unconditionally. This method is called + * during layout and should avoid memory allocations other than the necessary new + * OmniboxAlignment(). + */ + void recalculateOmniboxAlignment() { + int left = 0; + View contentView = mAnchorView.getRootView().findViewById(android.R.id.content); + ViewUtils.getRelativeLayoutPosition(contentView, mAnchorView, mPositionArray); + int top = mPositionArray[1] + mAnchorView.getMeasuredHeight(); + int width = mAnchorView.getMeasuredWidth(); + int paddingLeft; + int paddingRight; + if (isTablet()) { + ViewUtils.getRelativeLayoutPosition( + mAnchorView, mHorizontalAlignmentView, mPositionArray); + paddingLeft = mPositionArray[0]; + paddingRight = mAnchorView.getMeasuredWidth() + - mHorizontalAlignmentView.getMeasuredWidth() - mPositionArray[0]; + } else { + paddingLeft = 0; + paddingRight = 0; + } + + // TODO(pnoland@, https://crbug.com/1416985): calculate height as well and avoid pushing + // changes that are identical to the previous alignment value. + OmniboxAlignment omniboxAlignment = + new OmniboxAlignment(left, top, width, paddingLeft, paddingRight); + mOmniboxAlignmentSupplier.set(omniboxAlignment); + } + + /** + * Returns whether the given view's position in the window has changed since the last call to + * offsetInWindowChanged(). + */ + private boolean offsetInWindowChanged(View view) { + view.getLocationInWindow(mPositionArray); + boolean result = mVerticalOffsetInWindow != mPositionArray[1]; + mVerticalOffsetInWindow = mPositionArray[1]; + return result; + } + + /** + * Returns whether the window insets corresponding to the given view have changed since the + * last call to insetsHaveChanged(). + */ + private boolean insetsHaveChanged(View view) { + WindowInsets rootWindowInsets = view.getRootWindowInsets(); + if (rootWindowInsets == null) return false; + WindowInsetsCompat windowInsetsCompat = + WindowInsetsCompat.toWindowInsetsCompat(view.getRootWindowInsets(), view); + boolean result = !windowInsetsCompat.equals(mWindowInsetsCompat); + mWindowInsetsCompat = windowInsetsCompat; + return result; + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java new file mode 100644 index 0000000..83b34a5 --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
@@ -0,0 +1,117 @@ +// 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.omnibox; + +import static junit.framework.Assert.assertEquals; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.annotation.Config; + +import org.chromium.base.ContextUtils; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder.OmniboxAlignment; +import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.base.WindowDelegate; + +import java.lang.ref.WeakReference; + +/** + * Unit tests for {@link OmniboxSuggestionsDropdownEmbedderImpl}. + */ +@RunWith(BaseRobolectricTestRunner.class) +public class OmniboxSuggestionsDropdownEmbedderImplTest { + private static final int ANCHOR_WIDTH = 600; + private static final int ANCHOR_HEIGHT = 80; + private static final int ANCHOR_TOP = 31; + private static final int ALIGNMENT_WIDTH = 400; + // Sentinel value for mistaken use of alignment view top instead of left. If you see a 43, it's + // probably because you used position[1] instead of position[0]. + private static final int ALIGNMENT_TOP = 43; + + public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private @Mock WindowAndroid mWindowAndroid; + private @Mock WindowDelegate mWindowDelegate; + private @Mock ViewTreeObserver mViewTreeObserver; + private @Mock ViewGroup mContentView; + private @Mock ViewGroup mAnchorView; + private @Mock View mHorizontalAlignmentView; + + private OmniboxSuggestionsDropdownEmbedderImpl mImpl; + private WeakReference<Context> mContextWeakRef; + + @Before + public void setUp() { + mContextWeakRef = new WeakReference<>(ContextUtils.getApplicationContext()); + doReturn(mContextWeakRef).when(mWindowAndroid).getContext(); + doReturn(mViewTreeObserver).when(mAnchorView).getViewTreeObserver(); + doReturn(mContentView).when(mAnchorView).getRootView(); + doReturn(mContentView).when(mContentView).findViewById(android.R.id.content); + doReturn(mContentView).when(mAnchorView).getParent(); + doReturn(ANCHOR_WIDTH).when(mAnchorView).getMeasuredWidth(); + doReturn(ALIGNMENT_WIDTH).when(mHorizontalAlignmentView).getMeasuredWidth(); + doReturn(ANCHOR_HEIGHT).when(mAnchorView).getMeasuredHeight(); + doReturn(ANCHOR_TOP).when(mAnchorView).getTop(); + doReturn(ALIGNMENT_TOP).when(mHorizontalAlignmentView).getTop(); + mImpl = new OmniboxSuggestionsDropdownEmbedderImpl( + mWindowAndroid, mWindowDelegate, mAnchorView, mHorizontalAlignmentView); + } + + @Test + public void testWindowAttachment() { + verify(mAnchorView, never()).addOnLayoutChangeListener(mImpl); + verify(mHorizontalAlignmentView, never()).addOnLayoutChangeListener(mImpl); + verify(mAnchorView, never()).getViewTreeObserver(); + + mImpl.onAttachedToWindow(); + + verify(mAnchorView).addOnLayoutChangeListener(mImpl); + verify(mHorizontalAlignmentView).addOnLayoutChangeListener(mImpl); + verify(mViewTreeObserver).addOnGlobalLayoutListener(mImpl); + + mImpl.onDetachedFromWindow(); + verify(mAnchorView).removeOnLayoutChangeListener(mImpl); + verify(mHorizontalAlignmentView).removeOnLayoutChangeListener(mImpl); + verify(mViewTreeObserver).removeOnGlobalLayoutListener(mImpl); + } + + @Test + public void testRecalculateOmniboxAlignment_phone() { + doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent(); + doReturn(40).when(mHorizontalAlignmentView).getLeft(); + doReturn(60).when(mHorizontalAlignmentView).getTop(); + mImpl.recalculateOmniboxAlignment(); + OmniboxAlignment alignment = mImpl.getCurrentAlignment(); + assertEquals( + new OmniboxAlignment(0, ANCHOR_HEIGHT + ANCHOR_TOP, ANCHOR_WIDTH, 0, 0), alignment); + } + + @Test + @Config(qualifiers = "w600dp-h820dp") + public void testRecalculateOmniboxAlignment_tablet() { + doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent(); + doReturn(40).when(mHorizontalAlignmentView).getLeft(); + mImpl.recalculateOmniboxAlignment(); + OmniboxAlignment alignment = mImpl.getCurrentAlignment(); + assertEquals(new OmniboxAlignment(0, ANCHOR_HEIGHT + ANCHOR_TOP, ANCHOR_WIDTH, 40, + ANCHOR_WIDTH - ALIGNMENT_WIDTH - 40), + alignment); + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index 9a45760e..b5856ec 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -9,15 +9,11 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; -import android.os.Build; import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.view.WindowInsets; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -34,6 +30,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.OmniboxFeatures; import org.chromium.chrome.browser.omnibox.R; +import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder.OmniboxAlignment; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.browser_ui.styles.ChromeColors; @@ -67,13 +64,11 @@ private @Nullable Callback<Integer> mHeightChangeListener; private @Nullable Runnable mSuggestionDropdownScrollListener; private @Nullable Runnable mSuggestionDropdownOverscrolledToTopListener; - private @Nullable View mAnchorView; - private @Nullable View mAlignmentView; - private @Nullable OnGlobalLayoutListener mAnchorViewLayoutListener; - private @Nullable View.OnLayoutChangeListener mAlignmentViewLayoutListener; + private @NonNull OmniboxAlignment mOmniboxAlignment = OmniboxAlignment.UNSPECIFIED; private int mListViewMaxHeight; private int mLastBroadcastedListViewMaxHeight; + private @Nullable Callback<OmniboxAlignment> mOmniboxAlignmentObserver; @IntDef({InitialResizeState.WAITING_FOR_FIRST_MEASURE, InitialResizeState.WAITING_FOR_SHRINKING, InitialResizeState.IGNORING_SHRINKING, InitialResizeState.HANDLED_INITIAL_SIZING}) @@ -289,13 +284,6 @@ mHeightChangeListener = null; mSuggestionDropdownScrollListener = null; mSuggestionDropdownOverscrolledToTopListener = null; - - mAnchorView.getViewTreeObserver().removeOnGlobalLayoutListener(mAnchorViewLayoutListener); - if (mAlignmentView != null) { - mAlignmentView.removeOnLayoutChangeListener(mAlignmentViewLayoutListener); - } - mAlignmentView = null; - mAlignmentViewLayoutListener = null; } /** @@ -405,12 +393,10 @@ @Override public void onAttachedToWindow() { super.onAttachedToWindow(); + mEmbedder.onAttachedToWindow(); mInitialResizeState = InitialResizeState.WAITING_FOR_FIRST_MEASURE; - mAnchorView.getViewTreeObserver().addOnGlobalLayoutListener(mAnchorViewLayoutListener); - if (mAlignmentView != null) { - adjustSidePadding(); - mAlignmentView.addOnLayoutChangeListener(mAlignmentViewLayoutListener); - } + mOmniboxAlignmentObserver = this::onOmniboxAlignmentChanged; + mOmniboxAlignment = mEmbedder.addAlignmentObserver(mOmniboxAlignmentObserver); if (OmniboxFeatures.shouldRemoveExcessiveRecycledViewClearCalls()) { resetSelection(); @@ -420,24 +406,22 @@ @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + mEmbedder.onDetachedFromWindow(); + mOmniboxAlignment = OmniboxAlignment.UNSPECIFIED; getRecycledViewPool().clear(); mAdapter.recordSessionMetrics(); - mAnchorView.getViewTreeObserver().removeOnGlobalLayoutListener(mAnchorViewLayoutListener); - if (mAlignmentView != null) { - mAlignmentView.removeOnLayoutChangeListener(mAlignmentViewLayoutListener); - } + mEmbedder.removeAlignmentObserver(mOmniboxAlignmentObserver); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { try (TraceEvent tracing = TraceEvent.scoped("OmniboxSuggestionsList.Measure"); TimingMetric metric = SuggestionsMetrics.recordSuggestionListMeasureTime()) { - int anchorBottomRelativeToContent = calculateAnchorBottomRelativeToContent(); - maybeUpdateLayoutParams(anchorBottomRelativeToContent); - - int availableViewportHeight = - calculateAvailableViewportHeight(anchorBottomRelativeToContent); - int desiredWidth = mAnchorView.getMeasuredWidth(); + OmniboxAlignment omniboxAlignment = mEmbedder.getCurrentAlignment(); + maybeUpdateLayoutParams(omniboxAlignment.top); + int availableViewportHeight = calculateAvailableViewportHeight() - omniboxAlignment.top; + int desiredWidth = omniboxAlignment.width; + adjustHorizontalPosition(); // Suppress the initial requests to shrink the viewport of the omnibox suggestion // dropdown. The viewport will decrease when the keyboard is triggered, but the request // to resize happens when the keyboard starts showing before it has had the chance to @@ -483,14 +467,6 @@ } } - private int calculateAnchorBottomRelativeToContent() { - View contentView = - mEmbedder.getAnchorView().getRootView().findViewById(android.R.id.content); - ViewUtils.getRelativeLayoutPosition(contentView, mAnchorView, mTempPosition); - int anchorY = mTempPosition[1]; - return anchorY + mAnchorView.getMeasuredHeight(); - } - private void maybeUpdateLayoutParams(int topMargin) { // Update the layout params to ensure the parent correctly positions the suggestions // under the anchor view. @@ -500,9 +476,9 @@ } } - private int calculateAvailableViewportHeight(int anchorBottomRelativeToContent) { + private int calculateAvailableViewportHeight() { mEmbedder.getWindowDelegate().getWindowVisibleDisplayFrame(mTempRect); - return mTempRect.height() - anchorBottomRelativeToContent; + return mTempRect.height(); } private void notifyObserversIfViewportHeightChanged(int availableViewportHeight) { @@ -584,62 +560,24 @@ public void setEmbedder(@NonNull OmniboxSuggestionsDropdownEmbedder embedder) { assert mEmbedder == null; mEmbedder = embedder; - mAnchorView = mEmbedder.getAnchorView(); - // Prior to Android M, the contextual actions associated with the omnibox were anchored - // to the top of the screen and not a floating copy/paste menu like on newer versions. - // As a result of this, the toolbar is pushed down in these Android versions and we need - // to montior those changes to update the positioning of the list. - mAnchorViewLayoutListener = new OnGlobalLayoutListener() { - private int mOffsetInWindow; - private WindowInsets mWindowInsets; - private final Rect mWindowRect = new Rect(); + mOmniboxAlignment = mEmbedder.getCurrentAlignment(); + } - @Override - public void onGlobalLayout() { - if (offsetInWindowChanged() || insetsHaveChanged()) { - ViewUtils.requestLayout(OmniboxSuggestionsDropdown.this, - "OmniboxSuggestionsDropdown.setEmbedder.OnGlobalLayoutListener.onGlobalLayout"); - } - } + private void onOmniboxAlignmentChanged(@NonNull OmniboxAlignment omniboxAlignment) { + boolean isOnlyHorizontalDifference = + omniboxAlignment.isOnlyHorizontalDifference(mOmniboxAlignment); + mOmniboxAlignment = omniboxAlignment; + if (isOnlyHorizontalDifference) { + adjustHorizontalPosition(); + } else { + ViewUtils.requestLayout(OmniboxSuggestionsDropdown.this, + "OmniboxSuggestionsDropdown.onOmniboxAlignmentChanged"); + } + } - private boolean offsetInWindowChanged() { - int offsetInWindow = 0; - View currentView = mAnchorView; - while (true) { - offsetInWindow += currentView.getTop(); - ViewParent parent = currentView.getParent(); - if (parent == null || !(parent instanceof View)) break; - currentView = (View) parent; - } - boolean result = mOffsetInWindow != offsetInWindow; - mOffsetInWindow = offsetInWindow; - return result; - } - - private boolean insetsHaveChanged() { - boolean result = false; - WindowInsets currentInsets = null; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - currentInsets = mAnchorView.getRootWindowInsets(); - result = !currentInsets.equals(mWindowInsets); - mWindowInsets = currentInsets; - } else { - mEmbedder.getWindowDelegate().getWindowVisibleDisplayFrame(mTempRect); - result = !mTempRect.equals(mWindowRect); - mWindowRect.set(mTempRect); - } - return result; - } - }; - - mAlignmentView = mEmbedder.getAlignmentView(); - mAlignmentViewLayoutListener = new View.OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - adjustSidePadding(); - } - }; + private void adjustHorizontalPosition() { + setPadding(mOmniboxAlignment.paddingLeft, getPaddingTop(), mOmniboxAlignment.paddingRight, + getPaddingBottom()); } public void emitWindowContentChanged() { @@ -649,15 +587,6 @@ }, LIST_COMPOSITION_ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS); } - private void adjustSidePadding() { - if (mAlignmentView == null) return; - - ViewUtils.getRelativeLayoutPosition(mAnchorView, mAlignmentView, mTempPosition); - setPadding(mTempPosition[0], getPaddingTop(), - mAnchorView.getWidth() - mAlignmentView.getWidth() - mTempPosition[0], - getPaddingBottom()); - } - @VisibleForTesting public int getStandardBgColor() { return mStandardBgColor;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java index 4aea015..d2b4771 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java
@@ -4,24 +4,82 @@ package org.chromium.chrome.browser.omnibox.suggestions; -import android.view.View; - import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import org.chromium.base.Callback; import org.chromium.ui.base.WindowDelegate; +import java.util.Objects; + /** Provider of capabilities required to embed the omnibox suggestion list into the UI. */ public interface OmniboxSuggestionsDropdownEmbedder { - /** Return the anchor view the suggestion list should be drawn below. */ - @NonNull - View getAnchorView(); + /** + * POD type that encapsulates the "alignment" (position, width, padding) of the omnibox + * dropdown. + */ + class OmniboxAlignment { + public static final OmniboxAlignment UNSPECIFIED = new OmniboxAlignment(-1, -1, -1, -1, -1); + public final int left; + public final int top; + public final int width; + public final int paddingLeft; + public final int paddingRight; + + public OmniboxAlignment(int left, int top, int width, int paddingLeft, int paddingRight) { + this.left = left; + this.top = top; + this.width = width; + this.paddingLeft = paddingLeft; + this.paddingRight = paddingRight; + } + + @Override + public int hashCode() { + return Objects.hash(left, top, width, paddingLeft, paddingRight); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (!(obj instanceof OmniboxAlignment)) return false; + OmniboxAlignment other = (OmniboxAlignment) obj; + return other.left == this.left && other.top == this.top && other.width == this.width + && other.paddingLeft == this.paddingLeft + && other.paddingRight == this.paddingRight; + } + + /** + * Returns whether the difference from the given alignment object is solely in terms of + * left or padding. + */ + public boolean isOnlyHorizontalDifference(@NonNull OmniboxAlignment other) { + if (other == null) return false; + return (this.left != other.left + || this.paddingLeft != other.paddingLeft + && this.paddingRight != other.paddingRight) + && (this.top == other.top && this.width == other.width); + } + } /** - * Return the view that the omnibox suggestions should be aligned horizontally to. The - * view must be a descendant of {@link #getAnchorView()} or the anchor view itself. + * Adds an observer of alignment changes. The supplied callback will be invoked when alignment + * is recalculated. */ + OmniboxAlignment addAlignmentObserver(Callback<OmniboxAlignment> obs); + + /** + * Remove an observer of alignment changes. The supplied callback will be no longer invoked + * when alignment is recalculated. + */ + void removeAlignmentObserver(Callback<OmniboxAlignment> obs); + @NonNull - View getAlignmentView(); + /** + Returns the current alignment values, but does not recalculate them. Will not return null + but may return {@link OmniboxAlignment.UNSPECIFIED} if there is not a currently valid + alignment. + */ + OmniboxAlignment getCurrentAlignment(); /** Return the delegate used to interact with the Window. */ @NonNull @@ -29,4 +87,17 @@ /** Return whether the suggestions are being rendered in the tablet UI. */ boolean isTablet(); + + /** + * The dropdown must call this when it is attached to the window to start the process of + * alignment recalculation. Updates are skipped prior to this point to avoid repeated, unused + * calculation of alignment values. + */ + void onAttachedToWindow(); + + /** + * The dropdown should call this when it is detached from the window to pause the process of + * alignment recalculation. + */ + void onDetachedFromWindow(); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java index fccd9ac..501a6f89 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java
@@ -5,14 +5,26 @@ package org.chromium.chrome.browser.omnibox.suggestions; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import android.content.Context; +import android.graphics.Rect; import android.view.ContextThemeWrapper; +import android.view.View.MeasureSpec; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView.LayoutParams; import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; @@ -25,16 +37,21 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import org.robolectric.shadows.ShadowLooper; +import org.chromium.base.Callback; +import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder.OmniboxAlignment; import org.chromium.chrome.browser.omnibox.test.R; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.styles.ChromeColors; +import org.chromium.ui.base.WindowDelegate; /** * Unit tests for {@link OmniboxSuggestionsDropdown}. @@ -45,17 +62,64 @@ public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); private @Mock Runnable mDropdownScrollListener; private @Mock Runnable mDropdownScrollToTopListener; + private @Mock WindowDelegate mWindowDelegate; + private @Mock OmniboxSuggestionsDropdownAdapter mAdapter; private Context mContext; private OmniboxSuggestionsDropdown mDropdown; private OmniboxSuggestionsDropdown.SuggestionLayoutScrollListener mListener; + private OmniboxAlignment mOmniboxAlignment; + private ObservableSupplierImpl<OmniboxAlignment> mOmniboxAlignmentSupplier = + new ObservableSupplierImpl<>(); + private boolean mIsTablet; + private boolean mAttachedToWindow; + private OmniboxSuggestionsDropdownEmbedder mEmbedder = + new OmniboxSuggestionsDropdownEmbedder() { + @NonNull + @Override + public WindowDelegate getWindowDelegate() { + return mWindowDelegate; + } + + @Override + public boolean isTablet() { + return mIsTablet; + } + + @Override + public void onAttachedToWindow() { + mAttachedToWindow = true; + } + + @Override + public void onDetachedFromWindow() { + mAttachedToWindow = false; + } + + @Override + public OmniboxAlignment addAlignmentObserver(Callback<OmniboxAlignment> obs) { + return mOmniboxAlignmentSupplier.addObserver(obs); + } + + @Override + public void removeAlignmentObserver(Callback<OmniboxAlignment> obs) { + mOmniboxAlignmentSupplier.removeObserver(obs); + } + + @Nullable + @Override + public OmniboxAlignment getCurrentAlignment() { + return mOmniboxAlignmentSupplier.get(); + } + }; @Before public void setUp() { mContext = new ContextThemeWrapper( ApplicationProvider.getApplicationContext(), R.style.Theme_BrowserUI_DayNight); mDropdown = new OmniboxSuggestionsDropdown(mContext); + mDropdown.setAdapter(mAdapter); mListener = mDropdown.getLayoutScrollListener(); } @@ -221,4 +285,99 @@ verifyNoMoreInteractions(mDropdownScrollListener); verifyNoMoreInteractions(mDropdownScrollToTopListener); } + + @Test + @SmallTest + public void testAlignmentProvider_windowAttachment() { + mDropdown.setEmbedder(mEmbedder); + assertFalse(mAttachedToWindow); + + mDropdown.onAttachedToWindow(); + assertTrue(mAttachedToWindow); + + mDropdown.onDetachedFromWindow(); + assertFalse(mAttachedToWindow); + } + + @Test + @SmallTest + public void testAlignmentProvider_paddingChange() { + assertEquals(0, mDropdown.getMeasuredWidth()); + + mDropdown.setEmbedder(mEmbedder); + mDropdown.onAttachedToWindow(); + mOmniboxAlignment = new OmniboxAlignment(0, 100, 600, 10, 10); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + layoutDropdown(600, 800); + assertEquals(600, mDropdown.getMeasuredWidth()); + assertEquals(10, mDropdown.getPaddingLeft()); + assertEquals(10, mDropdown.getPaddingRight()); + + mOmniboxAlignment = new OmniboxAlignment(0, 100, 600, 50, 50); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + ShadowLooper.runUiThreadTasks(); + + assertEquals(50, mDropdown.getPaddingLeft()); + assertEquals(50, mDropdown.getPaddingRight()); + } + + @Test + @SmallTest + public void testAlignmentProvider_widthChange() { + mDropdown.setEmbedder(mEmbedder); + mDropdown.onAttachedToWindow(); + mOmniboxAlignment = new OmniboxAlignment(0, 100, 600, 10, 10); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + layoutDropdown(600, 800); + assertEquals(600, mDropdown.getMeasuredWidth()); + + mOmniboxAlignment = new OmniboxAlignment(0, 100, 400, 10, 10); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + ShadowLooper.runUiThreadTasks(); + assertTrue(mDropdown.isLayoutRequested()); + + layoutDropdown(600, 800); + assertEquals(400, mDropdown.getMeasuredWidth()); + assertFalse(mDropdown.isLayoutRequested()); + } + + @Test + @SmallTest + public void testAlignmentProvider_topChange() { + mDropdown.setEmbedder(mEmbedder); + mDropdown.onAttachedToWindow(); + mDropdown.setLayoutParams(new LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + mOmniboxAlignment = new OmniboxAlignment(0, 100, 600, 10, 10); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + layoutDropdown(600, 800); + + MarginLayoutParams layoutParams = (MarginLayoutParams) mDropdown.getLayoutParams(); + assertNotNull(layoutParams); + assertEquals(100, layoutParams.topMargin); + assertEquals(800 - 100, mDropdown.getMeasuredHeight()); + + mOmniboxAlignment = new OmniboxAlignment(0, 54, 600, 10, 10); + mOmniboxAlignmentSupplier.set(mOmniboxAlignment); + layoutDropdown(600, 800); + + layoutParams = (MarginLayoutParams) mDropdown.getLayoutParams(); + assertNotNull(layoutParams); + assertEquals(54, layoutParams.topMargin); + assertEquals(800 - 54, mDropdown.getMeasuredHeight()); + } + + private void layoutDropdown(int width, int height) { + doAnswer((invocation) -> { + Rect r = invocation.getArgument(0); + r.set(0, 0, 0, height); + return true; + }) + .when(mWindowDelegate) + .getWindowVisibleDisplayFrame(any(Rect.class)); + int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST); + int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); + mDropdown.measure(widthSpec, heightSpec); + mDropdown.layout(0, 0, mDropdown.getMeasuredWidth(), mDropdown.getMeasuredHeight()); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java index 023c33a..321d52d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java
@@ -8,6 +8,7 @@ import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.view.View; import android.view.View.AccessibilityDelegate; @@ -18,8 +19,8 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.ImageView; -import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; +import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.view.ViewCompat; import androidx.core.widget.ImageViewCompat; @@ -36,6 +37,7 @@ import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor.ViewBinder; +import org.chromium.ui.util.ColorUtils; import java.util.List; @@ -49,6 +51,10 @@ */ public final class BaseSuggestionViewBinder<T extends View> implements ViewBinder<PropertyModel, BaseSuggestionView<T>, PropertyKey> { + /** Drawable ConstantState used to expedite creation of Focus ripples. */ + private static Drawable.ConstantState sFocusableDrawableState; + private static @BrandedColorScheme int sFocusableDrawableStateTheme; + private static boolean sFocusableDrawableStateInNightMode; private final ViewBinder<PropertyModel, T, PropertyKey> mContentBinder; public BaseSuggestionViewBinder(ViewBinder<PropertyModel, T, PropertyKey> contentBinder) { @@ -74,7 +80,6 @@ roundSuggestionViewCorners(model, view); } else if (DropdownCommonProperties.BG_TOP_CORNER_ROUNDED == propertyKey) { roundSuggestionViewCorners(model, view); - updateBackground(model, view); } else if (DropdownCommonProperties.TOP_MARGIN == propertyKey) { updateMargin(model, view); } else if (BaseSuggestionViewProperties.ACTIONS == propertyKey) { @@ -109,14 +114,13 @@ view.setActionButtonsCount(actionCount); // Drawable retrieved once here (expensive) and will be copied multiple times (cheap). - Drawable foregroundDrawable = getForegroundDrawable(model, view); final List<ImageView> actionViews = view.getActionButtons(); for (int index = 0; index < actionCount; index++) { final ImageView actionView = actionViews.get(index); final Action action = actions.get(index); actionView.setOnClickListener(v -> action.callback.run()); actionView.setContentDescription(action.accessibilityDescription); - actionView.setForeground(copyDrawable(foregroundDrawable)); + applySelectableBackground(model, actionView); updateIcon(actionView, action.icon, ChromeColors.getPrimaryIconTintRes(isIncognito(model))); @@ -144,9 +148,9 @@ /** Update visual theme to reflect dark mode UI theme update. */ private static <T extends View> void updateColorScheme( PropertyModel model, BaseSuggestionView<T> view) { + maybeResetCachedFocusableDrawableState(model, view); updateSuggestionIcon(model, view); - Drawable foregroundDrawable = getForegroundDrawable(model, view); - view.getDecoratedSuggestionView().setForeground(foregroundDrawable); + applySelectableBackground(model, view.getDecoratedSuggestionView()); final List<Action> actions = model.get(BaseSuggestionViewProperties.ACTIONS); // Setting ACTIONS and updating actionViews can happen later. Appropriate color scheme will @@ -156,7 +160,7 @@ final List<ImageView> actionViews = view.getActionButtons(); for (int index = 0; index < actionViews.size(); index++) { ImageView actionView = actionViews.get(index); - actionView.setForeground(copyDrawable(foregroundDrawable)); + applySelectableBackground(model, actionView); updateIcon(actionView, actions.get(index).icon, ChromeColors.getPrimaryIconTintRes(isIncognito(model))); } @@ -247,36 +251,62 @@ } /** - * Retrieves selectable drawable from resources to be applied as Foreground. + * Applies selectable drawable from cache (where possible) or resources (otherwise). * - * Depending on the intended outcome, there are two different ways to apply these drawables: - * 1. If the intention is to _expand the existing_ focus area of the suggestion, the exact - * same copy should be applied to all of the related UI elements. - * 2. If the intention is to _define a new_ focus area, a new copy should be applied. + * The method internally stores the ConstantState for the drawable to be returned to + * accelerate creation of subsequent objects. * - * Wherever possible, use {@link #copyDrawable(Drawable)} to create new copies of this drawable, - * as it offers an order of magnitude better performance in incognito. - * The drawable should be used only once, all other uses should make a copy. - * - * @param view A view that provides context. * @param model A property model to look up relevant properties. - * @return A selectable (foreground) drawable. + * @param view A view that receives background. */ - public static Drawable getForegroundDrawable(PropertyModel model, View view) { - return OmniboxResourceProvider.resolveAttributeToDrawable(view.getContext(), + public static void applySelectableBackground(PropertyModel model, View view) { + if (sFocusableDrawableState != null) { + view.setBackground(sFocusableDrawableState.newDrawable()); + return; + } + + // Background color to be used for suggestions + var ctx = view.getContext(); + var background = new ColorDrawable(isIncognito(model) + ? ctx.getColor(R.color.omnibox_suggestion_bg_incognito) + : ChromeColors.getSurfaceColor( + ctx, R.dimen.omnibox_suggestion_bg_elevation)); + // Ripple effect to use when the user interacts with the suggestion. + var ripple = OmniboxResourceProvider.resolveAttributeToDrawable(ctx, model.get(SuggestionCommonProperties.COLOR_SCHEME), R.attr.selectableItemBackground); + + var layer = new LayerDrawable(new Drawable[] {background, ripple}); + + // Cache the drawable state for faster retrieval. + // See go/omnibox:drawables for more details. + sFocusableDrawableState = layer.getConstantState(); + view.setBackground(layer); } /** - * Creates a copy of the drawable. The drawable should be used only once, all other uses should - * make a copy. + * Checks whether cached FocusableDrawableState should be reset. * - * @param original Original drawable to be copied. - * @return Copied drawable. + * TODO(ender): Relocate this to appropriate OmniboxResourceManager class. + * + * @param model The model to supply app-driven changes. + * @param view The view to supply additional information, such as UI configuration. */ - private static Drawable copyDrawable(Drawable original) { - return original.getConstantState().newDrawable(); + @VisibleForTesting + public static void maybeResetCachedFocusableDrawableState(PropertyModel model, View view) { + // The color theme has changed, or the user opened Incognito window. + // Reset the cached drawable state to prevent using old colors. + var theme = model.get(SuggestionCommonProperties.COLOR_SCHEME); + // The theme change may also originate from the system. + // Be sure we respond to these changes as well. + // This aspect should only be relevant when the theme is APP_DEFAULT. + var isInNightMode = ColorUtils.inNightMode(view.getContext()); + if (theme != sFocusableDrawableStateTheme + || isInNightMode != sFocusableDrawableStateInNightMode) { + sFocusableDrawableState = null; + sFocusableDrawableStateTheme = theme; + sFocusableDrawableStateInNightMode = isInNightMode; + } } /** Update image view using supplied drawable state object. */ @@ -299,16 +329,6 @@ } /** - * Update the background for the view, also add the margin for the view. - * - * @param model A property model to look up relevant properties. - * @param view A view that need to be updated. - */ - public static void updateBackground(PropertyModel model, View view) { - view.setBackground(getBackgroundDrawable(model, view)); - } - - /** * Update the margin for the view. * * @param model A property model to look up relevant properties. @@ -333,17 +353,6 @@ } /** - * Retrieves background drawable for the view. - * - * @param model A property model to look up relevant properties. - * @param view A view that provides context. - * @return The suggestion background drawable. - */ - public static Drawable getBackgroundDrawable(PropertyModel model, View view) { - return new ColorDrawable(getBackgroundDrawableColor(isIncognito(model), view)); - } - - /** * Round top/bottom suggestion view corners to mark suggestions that begin or end section -- or * are standalone suggestions. * @@ -375,17 +384,9 @@ view.setClipToOutline(true); } - /** - * Retrieves color for background gradient based on identifying incognito mode. - * - * @param isIncognito whether the view is in incognito mode. - * @param view A view that provides context. - * @return The color for suggestion background drawable. - - */ - static @ColorInt int getBackgroundDrawableColor(boolean isIncognito, View view) { - return isIncognito ? view.getContext().getColor(R.color.omnibox_suggestion_bg_incognito) - : ChromeColors.getSurfaceColor( - view.getContext(), R.dimen.omnibox_suggestion_bg_elevation); + /** @return Cached ConstantState for testing. */ + @VisibleForTesting + public static Drawable.ConstantState getFocusableDrawableStateForTesting() { + return sFocusableDrawableState; } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java index dd884e1..6aac705 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java
@@ -6,6 +6,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -16,11 +17,12 @@ import android.app.Activity; import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.LayerDrawable; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; import android.widget.ImageView; -import androidx.annotation.ColorInt; import androidx.test.ext.junit.rules.ActivityScenarioRule; import org.junit.Assert; @@ -28,9 +30,11 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -59,9 +63,6 @@ new ActivityScenarioRule<>(TestActivity.class); @Mock - BaseSuggestionView mBaseView; - - @Mock DecoratedSuggestionView mDecoratedView; @Mock @@ -73,6 +74,7 @@ private Activity mActivity; private Resources mResources; private PropertyModel mModel; + private BaseSuggestionView mBaseView; @Before public void setUp() { @@ -82,6 +84,7 @@ mResources = mActivity.getResources(); when(mContentView.getContext()).thenReturn(mActivity); + when(mDecoratedView.getContext()).thenReturn(mActivity); mBaseView = spy(new BaseSuggestionView(mContentView)); @@ -148,7 +151,7 @@ Assert.assertEquals(1, actionButtons.size()); Assert.assertEquals(View.VISIBLE, actionButtons.get(0).getVisibility()); Assert.assertEquals(list.get(0).icon.drawable, actionButtons.get(0).getDrawable()); - Assert.assertNotNull(actionButtons.get(0).getForeground()); + Assert.assertNotNull(actionButtons.get(0).getBackground()); verify(mBaseView, times(1)).addView(actionButtons.get(0)); Assert.assertTrue(actionButtons.get(0).performClick()); @@ -334,24 +337,126 @@ } @Test - public void getBackgroundDrawableColor_incognito() { - final @ColorInt int expectedColor = - mBaseView.getContext().getColor(R.color.omnibox_suggestion_bg_incognito); - final boolean isIncognito = true; + public void applySelectableBackground_incognito() { + // This is a whitebox test. It currently assumes that the Suggestion background is a + // LayerDrawable, whose bottom element represents the color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.INCOGNITO); - Assert.assertEquals( - BaseSuggestionViewBinder.getBackgroundDrawableColor(isIncognito, mBaseView), - expectedColor); + var backgroundCaptor = ArgumentCaptor.forClass(LayerDrawable.class); + verify(mDecoratedView).setBackground(backgroundCaptor.capture()); + + Assert.assertEquals(mActivity.getColor(R.color.omnibox_suggestion_bg_incognito), + ((ColorDrawable) backgroundCaptor.getValue().getDrawable(0)).getColor()); } @Test - public void getBackgroundDrawableColor_notIncognito() { - final @ColorInt int expectedColor = ChromeColors.getSurfaceColor( - mBaseView.getContext(), R.dimen.omnibox_suggestion_bg_elevation); - final boolean isIncognito = false; + public void applySelectableBackground_nonIncognito() { + // This is a whitebox test. It currently assumes that the Suggestion background is a + // LayerDrawable, whose bottom element represents the color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.LIGHT_BRANDED_THEME); - Assert.assertEquals( - BaseSuggestionViewBinder.getBackgroundDrawableColor(isIncognito, mBaseView), - expectedColor); + var backgroundCaptor = ArgumentCaptor.forClass(LayerDrawable.class); + verify(mDecoratedView).setBackground(backgroundCaptor.capture()); + + Assert.assertEquals(ChromeColors.getSurfaceColor(mBaseView.getContext(), + R.dimen.omnibox_suggestion_bg_elevation), + ((ColorDrawable) backgroundCaptor.getValue().getDrawable(0)).getColor()); + } + + @Test + public void applySelectableBackground_reuseConstantState() { + // This is a whitebox test. It currently assumes that the Suggestion background is a + // LayerDrawable, whose bottom element represents the color. + var bgCaptor1 = ArgumentCaptor.forClass(LayerDrawable.class); + var bgCaptor2 = ArgumentCaptor.forClass(LayerDrawable.class); + + // First call should instantiate incognito color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.INCOGNITO); + verify(mDecoratedView).setBackground(bgCaptor1.capture()); + + // Attempt to re-use the background color. + // We do this by instantiating a fully dummy mock which does not deliver Context. + // This must not crash. + var viewWithNoContext = mock(View.class); + BaseSuggestionViewBinder.applySelectableBackground(mModel, viewWithNoContext); + verify(viewWithNoContext).setBackground(bgCaptor2.capture()); + + var color1 = ((ColorDrawable) bgCaptor1.getValue().getDrawable(0)).getColor(); + var color2 = ((ColorDrawable) bgCaptor2.getValue().getDrawable(0)).getColor(); + + Assert.assertEquals(color1, color2); + } + + @Test + public void applySelectableBackground_clearConstantStateWhenClientColorSchemeChanges() { + // This is a whitebox test. It currently assumes that the Suggestion background is a + // LayerDrawable, whose bottom element represents the color. + var incognitoBgCaptor = ArgumentCaptor.forClass(LayerDrawable.class); + var lightBgCaptor = ArgumentCaptor.forClass(LayerDrawable.class); + + // First call should instantiate incognito color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.INCOGNITO); + verify(mDecoratedView).setBackground(incognitoBgCaptor.capture()); + clearInvocations(mDecoratedView); + + // Second call should instantiate regular color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.LIGHT_BRANDED_THEME); + verify(mDecoratedView).setBackground(lightBgCaptor.capture()); + clearInvocations(mDecoratedView); + + var incognitoColor = + ((ColorDrawable) incognitoBgCaptor.getValue().getDrawable(0)).getColor(); + var lightColor = ((ColorDrawable) lightBgCaptor.getValue().getDrawable(0)).getColor(); + + Assert.assertNotEquals(incognitoColor, lightColor); + } + + @Test + public void applySelectableBackground_clearConstantStateWhenSystemColorSchemeChanges() { + // This is a whitebox test. It currently assumes that the Suggestion background is a + // LayerDrawable, whose bottom element represents the color. + + // First call should instantiate incognito color. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.APP_DEFAULT); + Assert.assertNotNull(BaseSuggestionViewBinder.getFocusableDrawableStateForTesting()); + + // Check that we're not resetting the state if neither Client nor System properties change. + BaseSuggestionViewBinder.maybeResetCachedFocusableDrawableState(mModel, mDecoratedView); + Assert.assertNotNull(BaseSuggestionViewBinder.getFocusableDrawableStateForTesting()); + + // Second call should instantiate regular color. + // Configuration change refreshes all of Chrome. + // https://robolectric.org/device-configuration + RuntimeEnvironment.setQualifiers("+night"); + + // We've enabled night theme. Confirm that the cached state is invalidated. + BaseSuggestionViewBinder.maybeResetCachedFocusableDrawableState(mModel, mBaseView); + Assert.assertNull(BaseSuggestionViewBinder.getFocusableDrawableStateForTesting()); + } + + @Test + public void applySelectableBackground_reuseConstantStateAcrossViews() { + // This test validates, that we don't drop the cached StateDrawable whenever we create a new + // view that declares all the same set of properties (including COLOR_SCHEME) from scratch. + // In the event the newly created PropertyModel declares the same COLOR_SCHEME as ones + // already built, we want to continue using the cached ConstantState. + + // First call should cache the ConstantState for the background. + mModel.set(SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.LIGHT_BRANDED_THEME); + var state1 = BaseSuggestionViewBinder.getFocusableDrawableStateForTesting(); + + // Create a second MVP setup. + var newModel = new PropertyModel(BaseSuggestionViewProperties.ALL_KEYS); + var viewWithNoContext = spy(new BaseSuggestionView(mContentView)); + PropertyModelChangeProcessor.create( + newModel, viewWithNoContext, new BaseSuggestionViewBinder((m, v, p) -> {})); + + // Apply the same color scheme to the new model. + // Observe that we don't crash. + newModel.set( + SuggestionCommonProperties.COLOR_SCHEME, BrandedColorScheme.LIGHT_BRANDED_THEME); + var state2 = BaseSuggestionViewBinder.getFocusableDrawableStateForTesting(); + + Assert.assertEquals(state1, state2); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java index d66b8d3..d9a572a8 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java
@@ -68,13 +68,10 @@ view.getPedalChipView().setOnClickListener( omniboxPedalListItem.model.get(PedalViewProperties.ON_PEDAL_CLICK)); } else if (SuggestionCommonProperties.COLOR_SCHEME == propertyKey) { - view.getPedalView().setForeground( - BaseSuggestionViewBinder.getForegroundDrawable(model, view)); + BaseSuggestionViewBinder.applySelectableBackground(model, view.getPedalView()); } else if (SuggestionCommonProperties.LAYOUT_DIRECTION == propertyKey) { ViewCompat.setLayoutDirection( view.getPedalView(), model.get(SuggestionCommonProperties.LAYOUT_DIRECTION)); - } else if (DropdownCommonProperties.BG_TOP_CORNER_ROUNDED == propertyKey) { - BaseSuggestionViewBinder.updateBackground(model, view); } else if (DropdownCommonProperties.TOP_MARGIN == propertyKey) { BaseSuggestionViewBinder.updateMargin(model, view); }
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 f194bd7a..b1ed125 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
@@ -1226,6 +1226,7 @@ <translation id="7596558890252710462">نظام التشغيل</translation> <translation id="7605594153474022051">المزامنة لا تعمل</translation> <translation id="7612619742409846846">أنت مسجّل الدخول إلى Google باستخدام</translation> +<translation id="7612989789287281429">جارٍ تسجيل الدخول…</translation> <translation id="7616551326690708776">اختَر نموذجًا للنص المحدَّد.</translation> <translation id="7619072057915878432">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب إخفاقات الشبكة.</translation> <translation id="7626032353295482388">مرحبًا بك في Chrome</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 a48237b..c68c13c7 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Аперацыйная сістэма</translation> <translation id="7605594153474022051">Сінхранізацыя не працуе</translation> <translation id="7612619742409846846">Уваход у Google выкананы ад імя</translation> +<translation id="7612989789287281429">Выконваецца ўваход…</translation> <translation id="7616551326690708776">Выберыце шаблон для вылучанага тэксту.</translation> <translation id="7619072057915878432">Не ўдалося спампаваць файл "<ph name="FILE_NAME" />" з-за збояў сеткі.</translation> <translation id="7626032353295482388">Вас вітае Chrome</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 ff45104..7f71a82 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Операционна система</translation> <translation id="7605594153474022051">Синхронизирането не работи</translation> <translation id="7612619742409846846">Влезли сте в Google като</translation> +<translation id="7612989789287281429">Влизате в профила си…</translation> <translation id="7616551326690708776">Изберете шаблон за открояването.</translation> <translation id="7619072057915878432">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради грешки в мрежата.</translation> <translation id="7626032353295482388">Добре дошли в Chrome</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 2461898..64b4446 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Dodajte stranice na listu za čitanje za kasnije</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> nepročitana stranica}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitana stranica}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitane stranice}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitanih stranica}}</translation> <translation id="2961210776189273067">Titula</translation> +<translation id="296370266220139811">Uštedite vrijeme i pišite manje</translation> <translation id="2979025552038692506">Odabrana je anonimna kartica</translation> <translation id="2979639724566107830">Otvori u novom prozoru</translation> <translation id="2981364137500752533">Možete imati do 5 prozora.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Pomozite web lokacijama da se bore protiv prevara i da razlikuju botove od stvarnih osoba</translation> <translation id="3587482841069643663">Sve</translation> <translation id="3587596251841506391">Poboljšajte sigurnost na webu</translation> +<translation id="3597179440835065298">Dobijajte bolje prijedloge</translation> <translation id="3602290021589620013">Pregled</translation> <translation id="3616113530831147358">Zvuk</translation> <translation id="3622349720008044802">Upravljajte prozorima</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Kopiranje lozinke</translation> <translation id="5011311129201317034"><ph name="SITE" /> se želi povezati</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Posljednjih 15 minuta</translation> <translation id="5032430150487044192">Nije moguće kreirati QR kôd</translation> <translation id="5039804452771397117">Dozvoli</translation> <translation id="5040262127954254034">Privatnost</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Ovim preglednikom upravljaju <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Unesite tekst ovdje ili dodirnite ikonu mikrofona da započnete</translation> <translation id="5814749351757353073">Nastavite pratiti omiljene web lokacije</translation> +<translation id="5822875253699806474">Da se brzo vratite na web lokacije koje ste posjetili, sinhronizirajte kartice i historiju</translation> <translation id="583281660410589416">Nepoznato</translation> <translation id="5833984609253377421">Dijeli link</translation> <translation id="5834764604050996579">Da skenirate QR kôd, dozvolite Chromeu da koristi kameru</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7105047059074518658">Prijavite se da lakše pregledate na svim uređajima</translation> <translation id="7106762743910369165">Preglednikom upravlja vaša organizacija</translation> +<translation id="7116588989735740310">Za povratak na web lokacije posjećene na drugim uređajima sinhronizirajte kartice i historiju</translation> <translation id="7130504491556983216">Lista interesovanja će se pojaviti ovdje dok pregledate web lokacije</translation> <translation id="7138678301420049075">Drugo</translation> <translation id="7146622961999026732">Čini se da su vam ove web lokacije i aplikacije važne:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Greška prilikom povezivanja s web lokacijom</translation> <translation id="752220631458524187">Prekinite vezu kada završite</translation> <translation id="7523960634226602883">Pretražujte kamerom pomoću Google Objektiva</translation> +<translation id="7539698981064401140">Sinhronizirajte kartice i historiju</translation> <translation id="7562080006725997899">Brisanje podataka pregledanja</translation> <translation id="756809126120519699">Chromeovi podaci su obrisani</translation> <translation id="7577900504646297215">Upravljajte interesovanjima</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Šifrirajte sinhronizirane podatke svojim pristupnim izrazom</translation> <translation id="8466613982764129868">Provjerite je li uređaj <ph name="TARGET_DEVICE_NAME" /> povezan na internet</translation> <translation id="8473863474539038330">Adrese i još mnogo toga</translation> +<translation id="847433688444405067">Pregledajte na uređajima</translation> <translation id="8481980314595922412">Funkcije probnog perioda su uključene</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Otvori stranicu sa historijom</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Razumijem</translation> <translation id="8725066075913043281">Pokušaj ponovo</translation> <translation id="8746155870861185046">Dijeli istaknutu stavku</translation> +<translation id="874726034427945498">Da vam se prikazuju bolji prijedlozi na traci za adresu, sinhronizirajte kartice i historiju</translation> <translation id="8748850008226585750">Sadržaj je sakriven</translation> <translation id="8756969031206844760">Ažurirati lozinku?</translation> <translation id="8765470054473112089">Kad pišete u traci za adresu ili u okviru za pretraživanje, Chrome šalje ono što upišete zadanom pretraživaču radi dobijanja boljih prijedloga. Ovo je isključeno u anonimnom načinu rada.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Pokretanje glasovnog pretraživanja</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Web lokacije koje posjećujete se ne pohranjuju u anonimnom načinu rada</translation> +<translation id="9084103763810123431">Da nastavite pregledati na drugom uređaju, sinhronizirajte kartice i historiju</translation> <translation id="9086302186042011942">Sinhroniziranje</translation> <translation id="9086455579313502267">Nije moguće pristupiti mreži</translation> <translation id="9099220545925418560">Na osnovu vaše historije pregledanja. Postavka je isključena.</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 35ba4a8f..3b1b9ae 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Sistema operatiu</translation> <translation id="7605594153474022051">La sincronització no funciona</translation> <translation id="7612619742409846846">Has iniciat la sessió a Google com a</translation> +<translation id="7612989789287281429">S'està iniciant la sessió…</translation> <translation id="7616551326690708776">Selecciona una plantilla per a la marca.</translation> <translation id="7619072057915878432">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa d'errors a la xarxa.</translation> <translation id="7626032353295482388">Et donem la benvinguda a Chrome</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 8f647af..8e78662 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Sistema operativo</translation> <translation id="7605594153474022051">La sincronización no funciona</translation> <translation id="7612619742409846846">Accediste a Google como</translation> +<translation id="7612989789287281429">Accediendo…</translation> <translation id="7616551326690708776">Selecciona una plantilla para el texto destacado.</translation> <translation id="7619072057915878432"><ph name="FILE_NAME" /> no se pudo descargar debido a fallas en la red.</translation> <translation id="7626032353295482388">Te damos la bienvenida a Chrome</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 cb28026..9c2f00f0 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Sistema operativo</translation> <translation id="7605594153474022051">La sincronización no funciona</translation> <translation id="7612619742409846846">Has iniciado sesión en Google como</translation> +<translation id="7612989789287281429">Iniciando sesión…</translation> <translation id="7616551326690708776">Selecciona una plantilla para tu texto destacado.</translation> <translation id="7619072057915878432">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas de la red.</translation> <translation id="7626032353295482388">Te damos la bienvenida a Chrome</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 eabaa10..dfa9a8a4 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Sistema eragilea</translation> <translation id="7605594153474022051">Sinkronizazioa ez dabil.</translation> <translation id="7612619742409846846">Kontu honekin hasi duzu saioa Google-n:</translation> +<translation id="7612989789287281429">Saioa hasten…</translation> <translation id="7616551326690708776">Hautatu txantiloi bat nabarmendutako zatirako.</translation> <translation id="7619072057915878432">Ezin izan da deskargatu <ph name="FILE_NAME" />, sareak huts egin duelako.</translation> <translation id="7626032353295482388">Ongi etorri Chrome-ra</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 75c0495..abe32536 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">ઓપરેટિંગ સિસ્ટમ</translation> <translation id="7605594153474022051">સમન્વયન કામ કરતું નથી</translation> <translation id="7612619742409846846">Google પર આ તરીકે સાઇન ઇન કરો</translation> +<translation id="7612989789287281429">તમને સાઇન ઇન કરી રહ્યાં છીએ…</translation> <translation id="7616551326690708776">તમારી હાઇલાઇટ માટે કોઈ નમૂનો પસંદ કરો.</translation> <translation id="7619072057915878432">નેટવર્ક નિષ્ફળતાને કારણે <ph name="FILE_NAME" /> ડાઉનલોડ નિષ્ફળ થયું.</translation> <translation id="7626032353295482388">Chrome પર આપનું સ્વાગત છે</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 de9ba321..41a4e37b 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Dodajte stranice na popis za čitanje za poslije</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> nepročitana stranica}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitana stranica}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitane stranice}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nepročitanih stranica}}</translation> <translation id="2961210776189273067">Titula</translation> +<translation id="296370266220139811">Uštedite vrijeme i pišite manje</translation> <translation id="2979025552038692506">Odabrana anonimna kartica</translation> <translation id="2979639724566107830">Otvori u novom prozoru</translation> <translation id="2981364137500752533">Možete imati do pet prozora.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Pomozite web-lokacijama da se bore protiv prijevare i razlikuju botove od osoba</translation> <translation id="3587482841069643663">Sve</translation> <translation id="3587596251841506391">Za bolju sigurnost na webu</translation> +<translation id="3597179440835065298">Bolji prijedlozi</translation> <translation id="3602290021589620013">Pregled</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3622349720008044802">Upravljanje prozorima</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Kopiranje zaporke</translation> <translation id="5011311129201317034">Web-lokacija <ph name="SITE" /> želi se povezati</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Posljednjih 15 minuta</translation> <translation id="5032430150487044192">Izrada QR koda nije uspjela</translation> <translation id="5039804452771397117">Dopusti</translation> <translation id="5040262127954254034">Privatnost</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Preglednikom upravljaju <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Da biste započeli, unesite tekst ovdje ili dodirnite ikonu mikrofona</translation> <translation id="5814749351757353073">Pratite svoje omiljene web-lokacije</translation> +<translation id="5822875253699806474">Da biste se brzo vratili na web-lokacije koje ste posjetili, sinkronizirajte kartice i povijest</translation> <translation id="583281660410589416">Nepoznato</translation> <translation id="5833984609253377421">Dijeli vezu</translation> <translation id="5834764604050996579">Da biste skenirali QR kôd, omogućite Chromeu da koristi vašu kameru</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7105047059074518658">Prijavite se da biste lakše pregledavali na više uređaja</translation> <translation id="7106762743910369165">Vašim preglednikom upravlja vaša organizacija</translation> +<translation id="7116588989735740310">Za povratak na web-lokacije posjećene na drugim uređajima sinkronizirajte kartice i povijest</translation> <translation id="7130504491556983216">Popis interesa pojavit će se ovdje kad budete pregledavali na webu</translation> <translation id="7138678301420049075">Ostalo</translation> <translation id="7146622961999026732">Čini se da su vam ove web-lokacije i aplikacije važne:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Povezivanje s web-lokacijom nije uspjelo</translation> <translation id="752220631458524187">Odspojite telefon kad završite</translation> <translation id="7523960634226602883">Pretražujte kamerom pomoću Google objektiva</translation> +<translation id="7539698981064401140">Sinkronizirajte kartice i povijest</translation> <translation id="7562080006725997899">Brisanje podataka o pregledavanju</translation> <translation id="756809126120519699">Chromeovi su podaci izbrisani</translation> <translation id="7577900504646297215">Upravljaj interesima</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Šifriraj sinkronizirane podatke vlastitom šifrom za sinkronizaciju</translation> <translation id="8466613982764129868">Provjerite je li <ph name="TARGET_DEVICE_NAME" /> povezan s internetom</translation> <translation id="8473863474539038330">Adrese i više</translation> +<translation id="847433688444405067">Pregledajte na različitim uređajima</translation> <translation id="8481980314595922412">Probne značajke su uključene</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Prikaz stranice povijesti</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Shvaćam</translation> <translation id="8725066075913043281">Pokušajte ponovo</translation> <translation id="8746155870861185046">Podijeli isticanje</translation> +<translation id="874726034427945498">Da biste u adresnoj traci dobivali bolje prijedloge, sinkronizirajte kartice i povijest</translation> <translation id="8748850008226585750">Sadržaj je skriven</translation> <translation id="8756969031206844760">Želite li ažurirati zaporku?</translation> <translation id="8765470054473112089">Kad upisujete u adresnu traku ili okvir za pretraživanje, ono što upisujete Chrome šalje vašoj zadanoj tražilici kako bi vam pružio bolje prijedloge. To je isključeno u anonimnom načinu.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Pokretanje glasovnog pretraživanja</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Web-lokacije koje posjećujete ne spremaju se u anonimnom načinu</translation> +<translation id="9084103763810123431">Da biste nastavili pregledavati na drugom uređaju, sinkronizirajte kartice i povijest</translation> <translation id="9086302186042011942">Sinkronizacija</translation> <translation id="9086455579313502267">Nije moguće pristupiti mreži</translation> <translation id="9099220545925418560">Na temelju vaše povijesti pregledavanja. Postavka je isključena.</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 7a4ac629..515b1d73 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Stýrikerfi</translation> <translation id="7605594153474022051">Samstilling virkar ekki</translation> <translation id="7612619742409846846">Innskráð(ur) á Google sem</translation> +<translation id="7612989789287281429">Skráir þig inn…</translation> <translation id="7616551326690708776">Veldu sniðmát fyrir áherslumerkingu.</translation> <translation id="7619072057915878432">Niðurhal á <ph name="FILE_NAME" /> mistókst vegna villu í netkerfi.</translation> <translation id="7626032353295482388">Velkomin(n) í Chrome</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 4bf0d6c..c06831f 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Aggiungi pagine al tuo Elenco di lettura per consultarle in un secondo momento</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> pagina da leggere}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> pagine da leggere}}</translation> <translation id="2961210776189273067">Titolo</translation> +<translation id="296370266220139811">Risparmia tempo e digita meno</translation> <translation id="2979025552038692506">Scheda in incognito selezionata</translation> <translation id="2979639724566107830">Apri in un'altra finestra</translation> <translation id="2981364137500752533">Puoi avere fino a 5 finestre.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Aiuta i siti a contrastare le attività fraudolente e a distinguere i bot dalle persone</translation> <translation id="3587482841069643663">Tutti</translation> <translation id="3587596251841506391">Aumenta la sicurezza sul Web</translation> +<translation id="3597179440835065298">Ricevi suggerimenti migliori</translation> <translation id="3602290021589620013">Anteprima</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3622349720008044802">Gestisci finestre</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Copia password</translation> <translation id="5011311129201317034">Il sito <ph name="SITE" /> desidera collegarsi</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Ultimi 15 minuti</translation> <translation id="5032430150487044192">Impossibile creare codice QR</translation> <translation id="5039804452771397117">Consenti</translation> <translation id="5040262127954254034">Privacy</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Questo browser è gestito da <ph name="PARENT_NAME_1" /> e <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Per iniziare, digita qui oppure tocca l'icona a forma di microfono</translation> <translation id="5814749351757353073">Rimani al passo con i tuoi siti preferiti</translation> +<translation id="5822875253699806474">Per tornare rapidamente ai siti che hai visitato, sincronizza le tue schede e la cronologia</translation> <translation id="583281660410589416">Sconosciuto</translation> <translation id="5833984609253377421">Condividi link</translation> <translation id="5834764604050996579">Per scansionare un codice QR, consenti a Chrome di usare la tua fotocamera</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome è aggiornato</translation> <translation id="7105047059074518658">Accedi per navigare più facilmente su più dispositivi</translation> <translation id="7106762743910369165">Il tuo browser è gestito dalla tua organizzazione</translation> +<translation id="7116588989735740310">Per tornare ai siti che hai visitato su altri dispositivi, sincronizza le tue schede e la cronologia</translation> <translation id="7130504491556983216">Qui verrà visualizzato un elenco di interessi quando navigherai sul Web</translation> <translation id="7138678301420049075">Altro</translation> <translation id="7146622961999026732">Questi siti e app sembrano importanti per te:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Impossibile connettersi al sito</translation> <translation id="752220631458524187">Scollegati quando hai finito</translation> <translation id="7523960634226602883">Cerca con la fotocamera usando Google Lens</translation> +<translation id="7539698981064401140">Sincronizza schede e cronologia</translation> <translation id="7562080006725997899">Cancellazione dei dati di navigazione in corso</translation> <translation id="756809126120519699">Dati di Chrome cancellati</translation> <translation id="7577900504646297215">Gestisci interessi</translation> @@ -1225,6 +1231,7 @@ <translation id="7596558890252710462">Sistema operativo</translation> <translation id="7605594153474022051">La sincronizzazione non funziona</translation> <translation id="7612619742409846846">Accesso effettuato a Google come</translation> +<translation id="7612989789287281429">Accesso in corso…</translation> <translation id="7616551326690708776">Seleziona un modello per i tuoi contenuti in evidenza.</translation> <translation id="7619072057915878432">Download di <ph name="FILE_NAME" /> non riuscito a causa di errori di rete.</translation> <translation id="7626032353295482388">Benvenuto in Chrome</translation> @@ -1395,6 +1402,7 @@ <translation id="8461694314515752532">Cripta i dati sincronizzati con la tua passphrase di sincronizzazione</translation> <translation id="8466613982764129868">Assicurati che il dispositivo <ph name="TARGET_DEVICE_NAME" /> sia connesso a Internet</translation> <translation id="8473863474539038330">Indirizzi e altro</translation> +<translation id="847433688444405067">Naviga su più dispositivi</translation> <translation id="8481980314595922412">Funzionalità di prova attive</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Apri la pagina Cronologia</translation> @@ -1448,6 +1456,7 @@ <translation id="8712637175834984815">Fatto</translation> <translation id="8725066075913043281">Riprova</translation> <translation id="8746155870861185046">Condividi evidenziazione</translation> +<translation id="874726034427945498">Per vedere suggerimenti migliori nella barra degli indirizzi, sincronizza le schede e la cronologia</translation> <translation id="8748850008226585750">Contenuti nascosti</translation> <translation id="8756969031206844760">Aggiornare la password?</translation> <translation id="8765470054473112089">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chrome invia ciò che digiti al tuo motore di ricerca predefinito per ricevere suggerimenti migliori. Questa opzione è disattivata in incognito.</translation> @@ -1513,6 +1522,7 @@ <translation id="9070377983101773829">Avvia la ricerca vocale</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">I siti che visiti non vengono salvati in modalità di navigazione in incognito</translation> +<translation id="9084103763810123431">Per continuare a navigare su un altro dispositivo, sincronizza le tue schede e la cronologia</translation> <translation id="9086302186042011942">Sincronizzazione in corso</translation> <translation id="9086455579313502267">Impossibile accedere alla rete</translation> <translation id="9099220545925418560">In base alla tua cronologia di navigazione. Questa impostazione non è attiva.</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 59dbc74..b77807c 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">מוסיפים דפים לרשימת הקריאה לשלב מאוחר יותר</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{דף אחד (<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" />) שלא נקרא}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}two{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}}</translation> <translation id="2961210776189273067">תואר</translation> +<translation id="296370266220139811">חוסכים זמן ומקלידים פחות</translation> <translation id="2979025552038692506">כרטיסיית המצב האנונימי שנבחרה</translation> <translation id="2979639724566107830">פתיחה בחלון חדש</translation> <translation id="2981364137500752533">ניתן לפתוח עד 5 חלונות.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">במסגרת פעילות באתרים, יש אפשרות להבדיל בין בוטים לאנשים כדי למנוע תרמיות</translation> <translation id="3587482841069643663">הכול</translation> <translation id="3587596251841506391">סיוע לשיפור האבטחה באינטרנט</translation> +<translation id="3597179440835065298">קבלת הצעות טובות יותר</translation> <translation id="3602290021589620013">תצוגה מקדימה</translation> <translation id="3616113530831147358">אודיו</translation> <translation id="3622349720008044802">ניהול החלונות</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">העתקת הסיסמה</translation> <translation id="5011311129201317034"><ph name="SITE" /> מבקש להתחבר אל</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">15 הדקות האחרונות</translation> <translation id="5032430150487044192">לא ניתן ליצור קוד QR</translation> <translation id="5039804452771397117">זה בסדר</translation> <translation id="5040262127954254034">פרטיות</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">הדפדפן הזה מנוהל על ידי <ph name="PARENT_NAME_1" /> ו-<ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">כדי להתחיל, יש להקליד כאן או להקיש על סמל המיקרופון</translation> <translation id="5814749351757353073">עוקבים אחר אתרים שאוהבים</translation> +<translation id="5822875253699806474">אחרי סנכרון הכרטיסיות וההיסטוריה אפשר יהיה לחזור במהירות לאתרים שביקרת בהם</translation> <translation id="583281660410589416">לא ידוע</translation> <translation id="5833984609253377421">שיתוף קישור</translation> <translation id="5834764604050996579">כדי לסרוק קוד QR, מאשרים ל-Chrome להשתמש במצלמה</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome מעודכן</translation> <translation id="7105047059074518658">כדי שיהיה קל יותר לגלוש במכשירים שונים, עליך להיכנס לחשבון</translation> <translation id="7106762743910369165">הדפדפן מנוהל על ידי הארגון שלך</translation> +<translation id="7116588989735740310">אחרי סנכרון הכרטיסיות וההיסטוריה אפשר יהיה לחזור לאתרים שביקרת בהם במכשירים אחרים</translation> <translation id="7130504491556983216">רשימה של תחומי עניין תופיע כאן בזמן הגלישה באינטרנט</translation> <translation id="7138678301420049075">אחר</translation> <translation id="7146622961999026732">נראה שהאתרים והאפליקציות האלה חשובים לך:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">לא ניתן להתחבר לאתר</translation> <translation id="752220631458524187">יש לנתק את הכבל בסיום הפעולה</translation> <translation id="7523960634226602883">חיפוש עם המצלמה באמצעות Google Lens</translation> +<translation id="7539698981064401140">סנכרון הכרטיסיות וההיסטוריה</translation> <translation id="7562080006725997899">ניקוי נתוני הגלישה מתבצע</translation> <translation id="756809126120519699">נתוני Chrome נוקו</translation> <translation id="7577900504646297215">ניהול תחומי עניין</translation> @@ -1225,6 +1231,7 @@ <translation id="7596558890252710462">מערכת הפעלה</translation> <translation id="7605594153474022051">הסנכרון לא עובד</translation> <translation id="7612619742409846846">התחברת ל-Google בשם</translation> +<translation id="7612989789287281429">מתבצעת כניסה לחשבון…</translation> <translation id="7616551326690708776">צריך לבחור תבנית להדגשה.</translation> <translation id="7619072057915878432">הורדת <ph name="FILE_NAME" /> נכשלה עקב כשלים ברשת.</translation> <translation id="7626032353295482388">ברוך בואך אל Chrome</translation> @@ -1395,6 +1402,7 @@ <translation id="8461694314515752532">הצפנת נתונים מסונכרנים בעזרת ביטוי סיסמה אישי לסנכרון</translation> <translation id="8466613982764129868">יש לוודא ש-<ph name="TARGET_DEVICE_NAME" /> מחובר לאינטרנט</translation> <translation id="8473863474539038330">כתובות ועוד</translation> +<translation id="847433688444405067">גלישה בכמה מכשירים</translation> <translation id="8481980314595922412">התכונות הניסיוניות מופעלות</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">פתיחת דף ההיסטוריה</translation> @@ -1448,6 +1456,7 @@ <translation id="8712637175834984815">הבנתי</translation> <translation id="8725066075913043281">ניסיון חוזר</translation> <translation id="8746155870861185046">שיתוף של הטקסט המודגש</translation> +<translation id="874726034427945498">אחרי סנכרון הכרטיסיות וההיסטוריה יתקבלו הצעות טובות יותר בסרגל הכתובות</translation> <translation id="8748850008226585750">התוכן מוסתר</translation> <translation id="8756969031206844760">לעדכן את הסיסמה?</translation> <translation id="8765470054473112089">כשמקלידים טקסט בסרגל הכתובות או בתיבת החיפוש, Chrome שולח את הטקסט הזה למנוע החיפוש שמוגדר כברירת מחדל כדי לקבל הצעות טובות יותר. האפשרות הזו מושבתת במצב הפרטי.</translation> @@ -1513,6 +1522,7 @@ <translation id="9070377983101773829">ביצוע חיפוש קולי</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">אתרים שנכנסים אליהם לא נשמרים במצב אנונימי</translation> +<translation id="9084103763810123431">אחרי סנכרון הכרטיסיות וההיסטוריה אפשר יהיה להמשיך בגלישה במכשיר אחר</translation> <translation id="9086302186042011942">הסנכרון מתבצע</translation> <translation id="9086455579313502267">אין אפשרות לגשת לרשת</translation> <translation id="9099220545925418560">על סמך היסטוריית הגלישה שלך. ההגדרה הזו מושבתת.</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 d1fd5d1..6d650aa 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">დაამატეთ გვერდები თქვენს მოგვიანებით წასაკითხთა სიაში</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> წაუკითხავი გვერდი}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> წაუკითხავი გვერდი}}</translation> <translation id="2961210776189273067">მიმართვა</translation> +<translation id="296370266220139811">დაზოგეთ დრო — აკრიფეთ ნაკლები</translation> <translation id="2979025552038692506">არჩეული ინკოგნიტო ჩანართი</translation> <translation id="2979639724566107830">ახალ ფანჯარაში გახსნა</translation> <translation id="2981364137500752533">დაშვებულია მაქსიმუმ 5 ფანჯარა.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">შეუწყვეთ ხელი საიტებს თაღლითობასთან ბრძოლასა და ბოტების ადამიანებისგან გარჩევაში</translation> <translation id="3587482841069643663">ყველა</translation> <translation id="3587596251841506391">გააუმჯობესეთ ვების უსაფრთხოება</translation> +<translation id="3597179440835065298">მიიღეთ უკეთესი შემოთავაზებები</translation> <translation id="3602290021589620013">გადახედვა</translation> <translation id="3616113530831147358">აუდიო</translation> <translation id="3622349720008044802">მართეთ ფანჯრები</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">პაროლის კოპირება</translation> <translation id="5011311129201317034"><ph name="SITE" /> დაკავშირებას ითხოვს</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">ბოლო 15 წუთი</translation> <translation id="5032430150487044192">QR კოდის შექმნა ვერ მოხერხდა</translation> <translation id="5039804452771397117">დაშვება</translation> <translation id="5040262127954254034">კონფიდენციალურობა</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">ამ ბრაუზერს მართავს <ph name="PARENT_NAME_1" /> და <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">დასაწყებად აკრიფეთ ტექსტი აქ ან შეეხეთ ხმის ხატულას</translation> <translation id="5814749351757353073">თვალყური ადევნეთ თქვენს რჩეულ საიტებს</translation> +<translation id="5822875253699806474">მონახულებულ საიტებს სწრაფად რომ დაუბრუნდეთ, დაასინქრონეთ ჩანართები და ისტორია</translation> <translation id="583281660410589416">უცნობი</translation> <translation id="5833984609253377421">ბმულის გაზიარება</translation> <translation id="5834764604050996579">QR კოდი რომ დაასკანიროთ, მიანიჭეთ Chrome-ს კამერაზე წვდომის ნებართვა</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome განახლებულია</translation> <translation id="7105047059074518658">სხვადასხვა მოწყობილობიდან ვები მარტივად რომ დაათვალიეროთ, შედით სისტემაში</translation> <translation id="7106762743910369165">თქვენს ბრაუზერს მართავს თქვენი ორგანიზაცია</translation> +<translation id="7116588989735740310">სხვა მოწყობილობებზე მონახულებულ საიტებს რომ დაუბრუნდეთ, დაასინქრონეთ ჩანართები და ისტორია</translation> <translation id="7130504491556983216">აქ გამოჩნდება ინტერესების სია ვების დათვალიერების პარალელურად</translation> <translation id="7138678301420049075">სხვა</translation> <translation id="7146622961999026732">როგორც ჩანს, თქვენთვის მნიშვნელოვანია შემდეგი აპები და საიტები:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">საიტთან დაკავშირება ვერ ხერხდება</translation> <translation id="752220631458524187">გათიშეთ, როცა დაასრულებთ</translation> <translation id="7523960634226602883">მოიძიეთ კონტენტი თქვენი კამერით, Google Lens-ის მეშვეობით</translation> +<translation id="7539698981064401140">დაასინქრონეთ ჩანართები და ისტორია</translation> <translation id="7562080006725997899">დათვალიერების მონაცემების გასუფთავება</translation> <translation id="756809126120519699">Chrome მონაცემები გასუფთავდა</translation> <translation id="7577900504646297215">ინტერესების მართვა</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">სინქრონიზებული მონაცემების დაშიფვრა თქვენი საკუთარი საიდუმლო ფრაზით</translation> <translation id="8466613982764129868">დარწმუნდით, რომ <ph name="TARGET_DEVICE_NAME" /> დაკავშირებულია ინტერნეტთან</translation> <translation id="8473863474539038330">მისამართები და სხვა</translation> +<translation id="847433688444405067">დაათვალიერეთ ყველა მოწყობილობაზე</translation> <translation id="8481980314595922412">საცდელი ფუნქციები ჩართულია</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">ისტორიის გვერდის გახსნა</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">კარგი</translation> <translation id="8725066075913043281">ხელახლა სცადეთ</translation> <translation id="8746155870861185046">გამოყოფილის გაზიარება</translation> +<translation id="874726034427945498">მისამართთა ზოლში უკეთესი შემოთავაზებები რომ იხილოთ, დაასინქრონეთ ჩანართები და ისტორია</translation> <translation id="8748850008226585750">შიგთავსი დამალულია</translation> <translation id="8756969031206844760">გსურთ პაროლის განახლება?</translation> <translation id="8765470054473112089">მისამართთა ზოლში ან საძიებო ველში ტექსტის აკრეფისას უკეთესი შემოთავაზებების მისაღებად Chrome თქვენ მიერ აკრეფილ ტექსტს გაუგზავნის თქვენს ნაგულისხმევ საძიებო სისტემას. აღნიშნული ფუნქცია გამორთულია ინკოგნიტო რეჟიმში.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">ხმოვანი ძიების დაწყება</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">თქვენ მიერ მონახულებული საიტები არ ინახება ინკოგნიტო რეჟიმში</translation> +<translation id="9084103763810123431">ვების დათვალიერება სხვა მოწყობილობაზე რომ გააგრძელოთ, დაასინქრონეთ ჩანართები და ისტორია</translation> <translation id="9086302186042011942">სინქრონიზაცია</translation> <translation id="9086455579313502267">შეუძლებელია ქსელში შესვლა</translation> <translation id="9099220545925418560">ეფუძნება თქვენს დათვალიერების ისტორიას. ეს პარამეტრი გამორთულია.</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 aa1bfb1..9e0ca4f 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Беттерді кейінірек оқу тізіміне қосу</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> оқылмаған бет.}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> оқылмаған бет.}}</translation> <translation id="2961210776189273067">Атауы</translation> +<translation id="296370266220139811">Уақытты үнемдеу және аз теру</translation> <translation id="2979025552038692506">Таңдалған инкогнито қойындысы</translation> <translation id="2979639724566107830">Жаңа терезеде ашу</translation> <translation id="2981364137500752533">Ең көбі 5 терезе аша аласыз.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Сайттарға алаяқтықпен күресуге және боттарды адамдардан ажыратуға көмектеседі.</translation> <translation id="3587482841069643663">Барлығы</translation> <translation id="3587596251841506391">Интернет қауіпсіздігін күшейту</translation> +<translation id="3597179440835065298">Жақсырақ ұсыныстар алыңыз</translation> <translation id="3602290021589620013">Алдын ала көру</translation> <translation id="3616113530831147358">Аудио</translation> <translation id="3622349720008044802">Терезелерді басқару</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Құпия сөзді көшіру</translation> <translation id="5011311129201317034"><ph name="SITE" /> сайты байланыс орнатқысы келеді</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Соңғы 15 минут</translation> <translation id="5032430150487044192">QR кодын жасау мүмкін емес.</translation> <translation id="5039804452771397117">Рұқсат беру</translation> <translation id="5040262127954254034">Құпиялық</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Бұл браузерді <ph name="PARENT_NAME_1" /> және <ph name="PARENT_NAME_2" /> басқарады.</translation> <translation id="5814131985548525293">Бастау үшін осы жерге жазыңыз немесе микрофон белгішесін түртіңіз.</translation> <translation id="5814749351757353073">Өзіңізге ұнайтын сайттарды бақылап жүріңіз</translation> +<translation id="5822875253699806474">Сіз кірген сайттарға жылдам оралу үшін қойындылар мен тарихты синхрондаңыз</translation> <translation id="583281660410589416">Белгісіз</translation> <translation id="5833984609253377421">Сілтемені бөлісу</translation> <translation id="5834764604050996579">QR кодын сканерлеу үшін Chrome-ға камера пайдалану рұқсатын беріңіз.</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome жаңартылған.</translation> <translation id="7105047059074518658">Құрылғыларды оңай қолдану үшін аккаунтқа кіріңіз.</translation> <translation id="7106762743910369165">Браузеріңізді ұйым басқарады.</translation> +<translation id="7116588989735740310">Басқа құрылғыларда кірген сайттарға оралу үшін қойындылар мен тарихты синхрондаңыз</translation> <translation id="7130504491556983216">Интернетті шолу кезінде табылған қызығушылықтар тізімі осы жерге шығады.</translation> <translation id="7138678301420049075">Басқа</translation> <translation id="7146622961999026732">Бұл сайттар мен қолданбалар маңызды болуы мүмкін:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Сайтқа қосылу мүмкін емес</translation> <translation id="752220631458524187">Дайын болғанда, ажыратыңыз.</translation> <translation id="7523960634226602883">Google Lens арқылы камерамен іздеу</translation> +<translation id="7539698981064401140">Қойындылар мен тарихты синхрондау</translation> <translation id="7562080006725997899">Шолу деректерін тазалау</translation> <translation id="756809126120519699">Chrome деректері өшірілді</translation> <translation id="7577900504646297215">Қызығушылықтарды басқару</translation> @@ -1225,6 +1231,7 @@ <translation id="7596558890252710462">Операциялық жүйе</translation> <translation id="7605594153474022051">Синхрондау жұмыс істемейді</translation> <translation id="7612619742409846846">Google жүйесіне келесі пайдаланушы атымен кірген:</translation> +<translation id="7612989789287281429">Аккаунтқа кіруде…</translation> <translation id="7616551326690708776">Ерекшелеу үшін үлгіні таңдаңыз.</translation> <translation id="7619072057915878432">Желідегі ақаулықтар себебінен <ph name="FILE_NAME" /> жүктелмеді.</translation> <translation id="7626032353295482388">Chrome жүйесіне қош келдіңіз</translation> @@ -1395,6 +1402,7 @@ <translation id="8461694314515752532">Синхрондалған деректерді өзіңіздің синхрондау құпия фразаңызбен шифрлау</translation> <translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> құрылғысы интернетке қосулы екенін тексеріңіз.</translation> <translation id="8473863474539038330">Мекенжайлар және басқа ақпарат</translation> +<translation id="847433688444405067">Құрылғылар бойынша шолу</translation> <translation id="8481980314595922412">Сынақ функциялары қосулы</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Тарих бетін ашу</translation> @@ -1448,6 +1456,7 @@ <translation id="8712637175834984815">Түсінікті</translation> <translation id="8725066075913043281">Әрекетті қайталау</translation> <translation id="8746155870861185046">Ерекшеленген мәтінді бөлісу</translation> +<translation id="874726034427945498">Мекенжай жолағында жақсырақ ұсыныстарды көру үшін қойындылар мен тарихты синхрондаңыз</translation> <translation id="8748850008226585750">Мазмұны жасырылған</translation> <translation id="8756969031206844760">Құпия сөз жаңартылсын ба?</translation> <translation id="8765470054473112089">Мекенжай жолағында немесе іздеу өрісінде терген кезде, Chrome браузері жақсырақ ұсыныстар алу үшін тергеніңізді әдепкі іздеу жүйесіне жібереді. Бұл Инкогнито режимінде өшірілген.</translation> @@ -1513,6 +1522,7 @@ <translation id="9070377983101773829">Дауыспен іздеуді іске қосу</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Кірген сайттарыңыз инкогнито режимінде сақталмайды</translation> +<translation id="9084103763810123431">Басқа құрылғыда шолуды жалғастыру үшін қойындылар мен тарихты синхрондаңыз</translation> <translation id="9086302186042011942">Синхрондау</translation> <translation id="9086455579313502267">Желіге кіру мүмкін емес</translation> <translation id="9099220545925418560">Браузерді қолдану тарихыңызға негізделген. Бұл параметр өшірулі.</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 01d9271..45e3aecd 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">ನಂತರದಲ್ಲಿ ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಗೆ ಪುಟಗಳನ್ನು ಸೇರಿಸಿ</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> ಓದದಿರುವ ಪುಟ}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> ಓದದಿರುವ ಪುಟಗಳು}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> ಓದದಿರುವ ಪುಟಗಳು}}</translation> <translation id="2961210776189273067">ಶೀರ್ಷಿಕೆ</translation> +<translation id="296370266220139811">ಸಮಯ ಉಳಿಸಿ ಮತ್ತು ಟೈಪಿಂಗ್ ಕಡಿಮೆ ಮಾಡಿ</translation> <translation id="2979025552038692506">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation> <translation id="2979639724566107830">ಹೊಸ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="2981364137500752533">ನೀವು ಗರಿಷ್ಠ 5 ವಿಂಡೋಗಳನ್ನು ಹೊಂದಬಹುದು.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">ವಂಚನೆಯ ವಿರುದ್ಧ ಹೋರಾಡಲು ಮತ್ತು ಬಾಟ್ಗಳು ಮತ್ತು ಜನರ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ಗುರುತಿಸಲು ಸೈಟ್ಗಳಿಗೆ ನೆರವಾಗಿ</translation> <translation id="3587482841069643663">ಎಲ್ಲ</translation> <translation id="3587596251841506391">ವೆಬ್ ಸುರಕ್ಷತೆ ಸುಧಾರಿಸಲು ಸಹಕರಿಸಿ</translation> +<translation id="3597179440835065298">ಉತ್ತಮ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="3602290021589620013">ಪೂರ್ವವೀಕ್ಷಣೆ</translation> <translation id="3616113530831147358">ಆಡಿಯೋ</translation> <translation id="3622349720008044802">ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -746,6 +748,7 @@ <translation id="5005498671520578047">ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ</translation> <translation id="5011311129201317034"><ph name="SITE" /> ಸಂಪರ್ಕಿಸಲು ಬಯಸುತ್ತದೆ</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">ಹಿಂದಿನ 15 ನಿಮಿಷಗಳು</translation> <translation id="5032430150487044192">QR ಕೋಡ್ ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation> <translation id="5039804452771397117">ಅನುಮತಿಸಿ</translation> <translation id="5040262127954254034">ಗೌಪ್ಯತೆ</translation> @@ -881,6 +884,7 @@ <translation id="5813552293717797987">ಈ ಬ್ರೌಸರ್ ಅನ್ನು <ph name="PARENT_NAME_1" /> ಮತ್ತು <ph name="PARENT_NAME_2" /> ಅವರು ನಿರ್ವಹಿಸುತ್ತಾರೆ.</translation> <translation id="5814131985548525293">ಪ್ರಾರಂಭಿಸಲು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ ಅಥವಾ ಧ್ವನಿ ಐಕಾನ್ ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="5814749351757353073">ನಿಮ್ಮ ಮೆಚ್ಚಿನ ಸೈಟ್ಗಳನ್ನು ಇರಿಸಿಕೊಳ್ಳಿ</translation> +<translation id="5822875253699806474">ನೀವು ಭೇಟಿ ನೀಡಿದ ಸೈಟ್ಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಹಿಂತಿರುಗಲು, ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="583281660410589416">ಅಪರಿಚಿತ</translation> <translation id="5833984609253377421">ಲಿಂಕ್ ಹಂಚಿಕೊಳ್ಳಿ</translation> <translation id="5834764604050996579">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, Chrome ಗೆ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಅನುಮತಿಸಿ</translation> @@ -1135,6 +1139,7 @@ <translation id="7088681679121566888">Chrome ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="7105047059074518658">ಸಾಧನಗಳಾದ್ಯಂತ ಸುಲಭವಾಗಿ ಬ್ರೌಸ್ ಮಾಡಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="7106762743910369165">ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation> +<translation id="7116588989735740310">ಇತರ ಸಾಧನಗಳಲ್ಲಿ ನೀವು ಭೇಟಿ ನೀಡಿದ ಸೈಟ್ಗಳಿಗೆ ಹಿಂತಿರುಗಲು, ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="7130504491556983216">ನೀವು ವೆಬ್ ಅನ್ನು ಬ್ರೌಸ್ ಮಾಡುತ್ತಿದ್ದಂತೆ ಆಸಕ್ತಿಗಳ ಪಟ್ಟಿಯೊಂದು ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ</translation> <translation id="7138678301420049075">ಇತರೆ</translation> <translation id="7146622961999026732">ಈ ಸೈಟ್ಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳು ನಿಮಗೆ ಮುಖ್ಯವಾದವು ಎನಿಸುತ್ತಿದೆ:</translation> @@ -1213,6 +1218,7 @@ <translation id="751961395872307827">ಸೈಟ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="752220631458524187">ನೀವು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ ಕನೆಕ್ಷನ್ ರದ್ದುಮಾಡಿ</translation> <translation id="7523960634226602883">Google Lens ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಕ್ಯಾಮರಾದ ಮೂಲಕ ಹುಡುಕಿ</translation> +<translation id="7539698981064401140">ನಿಮ್ಮ ಟ್ಯಾಬ್ ಹಾಗೂ ಇತಿಹಾಸ ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="7562080006725997899">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="756809126120519699">Chrome ಡೇಟಾ ತೆರವುಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="7577900504646297215">ಆಸಕ್ತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -1395,6 +1401,7 @@ <translation id="8461694314515752532">ನಿಮ್ಮ ಸ್ವಂತ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ ಬಳಸಿಕೊಂಡು ಸಿಂಕ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿ</translation> <translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> ಸಾಧನವು ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> <translation id="8473863474539038330">ವಿಳಾಸಗಳು ಮತ್ತು ಇನ್ನಷ್ಟು</translation> +<translation id="847433688444405067">ಸಾಧನಗಳಾದ್ಯಂತ ಬ್ರೌಸ್ ಮಾಡಿ</translation> <translation id="8481980314595922412">ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಆನ್ ಆಗಿವೆ</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">ಇತಿಹಾಸ ಪುಟ ತೆರೆಯಿರಿ</translation> @@ -1448,6 +1455,7 @@ <translation id="8712637175834984815">ಅರ್ಥವಾಯಿತು</translation> <translation id="8725066075913043281">ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="8746155870861185046">ಹೈಲೈಟ್ ಹಂಚಿಕೊಳ್ಳಿ</translation> +<translation id="874726034427945498">ನಿಮ್ಮ ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಉತ್ತಮ ಸಲಹೆಗಳನ್ನು ನೋಡಲು, ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="8748850008226585750">ವಿಷಯಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ</translation> <translation id="8756969031206844760">ಪಾಸ್ವರ್ಡ್ ಅಪ್ಡೇಟ್ ಮಾಡುವುದೇ?</translation> <translation id="8765470054473112089">ನೀವು ವಿಳಾಸ ಪಟ್ಟಿ ಅಥವಾ ಹುಡುಕಾಟ ಪೆಟ್ಟಿಗೆಯಲ್ಲಿ ಟೈಪ್ ಮಾಡಿದಾಗ, ಉತ್ತಮ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಲು Chrome ನೀವು ಟೈಪ್ ಮಾಡಿದ್ದನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಎಂಜಿನ್ಗೆ ಕಳುಹಿಸುತ್ತದೆ. ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಇದು ಆಫ್ ಆಗಿರುತ್ತದೆ.</translation> @@ -1513,6 +1521,7 @@ <translation id="9070377983101773829">ಧ್ವನಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="9074739597929991885">ಬ್ಲೂಟೂತ್</translation> <translation id="9081543426177426948">ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್ಗಳನ್ನು ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಉಳಿಸಲಾಗುವುದಿಲ್ಲ</translation> +<translation id="9084103763810123431">ಮತ್ತೊಂದು ಸಾಧನದಲ್ಲಿ ಬ್ರೌಸ್ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಲು, ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="9086302186042011942">ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="9086455579313502267">ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="9099220545925418560">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಆಧರಿಸಿ. ಈ ಸೆಟ್ಟಿಂಗ್ ಆಫ್ ಆಗಿದೆ.</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 85b1f8af..e17e9260 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
@@ -587,7 +587,7 @@ <translation id="4198423547019359126">Nav pieejamu lejupielādes atrašanās vietu.</translation> <translation id="4202218894997543208">Jūsu bloķētās tēmas</translation> <translation id="4214315110991671325">Ja atļaujat sīkfailus, Chrome var tos izmantot iepriekšējai ielādei.</translation> -<translation id="4225895483398857530">Rīkjoslas īsinājumtaustiņš</translation> +<translation id="4225895483398857530">Rīkjoslas saīsne</translation> <translation id="4242533952199664413">Atvērt iestatījumus</translation> <translation id="4248098802131000011">Aizsargājiet savas paroles pret datu pārkāpumiem un citām drošības problēmām.</translation> <translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation> @@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Operētājsistēma</translation> <translation id="7605594153474022051">Sinhronizācija nedarbojas</translation> <translation id="7612619742409846846">Pierakstījies Google kontā kā</translation> +<translation id="7612989789287281429">Notiek pierakstīšanās…</translation> <translation id="7616551326690708776">Atlasiet veidni izceltajam tekstam.</translation> <translation id="7619072057915878432">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās tīkla kļūdas.</translation> <translation id="7626032353295482388">Laipni lūdzam pārlūkā Chrome</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 baa8d7b..a340dee 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Оперативен систем</translation> <translation id="7605594153474022051">Синхронизацијата не функционира</translation> <translation id="7612619742409846846">Најавени на Google како</translation> +<translation id="7612989789287281429">Ве најавуваме…</translation> <translation id="7616551326690708776">Изберете шаблон за нагласувањето.</translation> <translation id="7619072057915878432">Преземањето на <ph name="FILE_NAME" /> не успеа поради прекини на мрежата.</translation> <translation id="7626032353295482388">Добре дојдовте на Chrome</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 967c2980..1c8d0bf 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">പിന്നീട് വായിക്കാൻ വായിക്കാനുള്ളവയുടെ ലിസ്റ്റിലേക്ക് പേജുകൾ ചേർക്കുക</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{വായിക്കാത്ത <ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> പേജ്}other{വായിക്കാത്ത <ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> പേജുകൾ}}</translation> <translation id="2961210776189273067">ശീർഷകം</translation> +<translation id="296370266220139811">ടൈപ്പിംഗ് കുറച്ച് സമയം ലാഭിക്കൂ</translation> <translation id="2979025552038692506">തിരഞ്ഞെടുത്ത അദൃശ്യ ടാബ്</translation> <translation id="2979639724566107830">പുതിയ വിന്ഡോയില് തുറക്കുക</translation> <translation id="2981364137500752533">നിങ്ങൾക്ക് 5 വിൻഡോകൾ വരെ തുറക്കാനാകും.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">വഞ്ചനയ്ക്കെതിരെ പോരാടാനും ബോട്ടുകളെ ആളുകളിൽ നിന്ന് വേർതിരിച്ചറിയാനും സൈറ്റുകളെ സഹായിക്കുക</translation> <translation id="3587482841069643663">എല്ലാം</translation> <translation id="3587596251841506391">വെബിലെ സുരക്ഷ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> +<translation id="3597179440835065298">മെച്ചപ്പെട്ട നിർദ്ദേശങ്ങൾ നേടൂ</translation> <translation id="3602290021589620013">പ്രിവ്യൂ</translation> <translation id="3616113530831147358">ഓഡിയോ</translation> <translation id="3622349720008044802">വിൻഡോകൾ മാനേജ് ചെയ്യുക</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">പാസ്വേഡ് പകർത്തുക</translation> <translation id="5011311129201317034"><ph name="SITE" /> കണക്റ്റുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">കഴിഞ്ഞ 15 മിനിറ്റ്</translation> <translation id="5032430150487044192">QR കോഡ് സൃഷ്ടിക്കാനാകില്ല</translation> <translation id="5039804452771397117">അനുവദിക്കൂ</translation> <translation id="5040262127954254034">സ്വകാര്യത</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">ഈ ബ്രൗസർ മാനേജ് ചെയ്യുന്നത് <ph name="PARENT_NAME_1" />, <ph name="PARENT_NAME_2" /> എന്നിവരാണ്.</translation> <translation id="5814131985548525293">ആരംഭിക്കാൻ ഇവിടെ ടൈപ്പ് ചെയ്യുക അല്ലെങ്കിൽ വോയ്സ് ഐക്കണിൽ ടാപ്പ് ചെയ്യുക</translation> <translation id="5814749351757353073">നിങ്ങളുടെ പ്രിയപ്പെട്ട സൈറ്റുകളെ കുറിച്ച് അറിഞ്ഞുകൊണ്ടേ ഇരിക്കൂ</translation> +<translation id="5822875253699806474">നിങ്ങൾ സന്ദർശിച്ച സൈറ്റുകളിലേക്ക് വേഗത്തിൽ മടങ്ങാൻ, ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> <translation id="583281660410589416">അജ്ഞാതം</translation> <translation id="5833984609253377421">ലിങ്ക് പങ്കിടുക</translation> <translation id="5834764604050996579">QR കോഡ് സ്കാൻ ചെയ്യാൻ, Chrome-നെ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ അനുവദിക്കുക</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome അപ് റ്റു ഡേറ്റാണ്</translation> <translation id="7105047059074518658">ഉപകരണങ്ങളിൽ ഉടനീളം എളുപ്പം ബ്രൗസ് ചെയ്യാൻ സൈൻ ഇൻ ചെയ്യൂ</translation> <translation id="7106762743910369165">നിങ്ങളുടെ സ്ഥാപനമാണ് നിങ്ങളുടെ ബ്രൗസർ മാനേജ് ചെയ്യുന്നത്</translation> +<translation id="7116588989735740310">നിങ്ങൾ മറ്റ് ഉപകരണങ്ങളിൽ നിന്ന് സന്ദർശിച്ച സൈറ്റുകളിലേക്ക് പോകാൻ, ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> <translation id="7130504491556983216">നിങ്ങൾ വെബിൽ ബ്രൗസ് ചെയ്യുമ്പോൾ താൽപ്പര്യങ്ങളുടെ ഒരു ലിസ്റ്റ് ഇവിടെ ദൃശ്യമാകും</translation> <translation id="7138678301420049075">മറ്റുള്ളവ</translation> <translation id="7146622961999026732">ഈ സൈറ്റുകളും ആപ്പുകളും നിങ്ങൾക്ക് പ്രാധാന്യമുള്ളവയാകാം:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">സൈറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല</translation> <translation id="752220631458524187">പൂർത്തിയാകുമ്പോൾ വിച്ഛേദിക്കുക</translation> <translation id="7523960634226602883">Google Lens ഉപയോഗിച്ച് ക്യാമറയുടെ സഹായത്തോടെ തിരയുക</translation> +<translation id="7539698981064401140">ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> <translation id="7562080006725997899">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കൽ</translation> <translation id="756809126120519699">Chrome ഡാറ്റ മായ്ച്ചു</translation> <translation id="7577900504646297215">താൽപ്പര്യങ്ങൾ മാനേജ് ചെയ്യുക</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് ഉപയോഗിച്ച്, സമന്വയിപ്പിച്ച ഡാറ്റ എൻക്രിപ്റ്റ് ചെയ്യുക</translation> <translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> ഉപകരണം ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</translation> <translation id="8473863474539038330">വിലാസങ്ങളും മറ്റും</translation> +<translation id="847433688444405067">ഉപകരണങ്ങളിലുടനീളം ബ്രൗസ് ചെയ്യൂ</translation> <translation id="8481980314595922412">ട്രയൽ ഫീച്ചറുകൾ ഓണാണ്</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">ചരിത്ര പേജ് തുറക്കുക</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">മനസ്സിലായി</translation> <translation id="8725066075913043281">വീണ്ടും ശ്രമിക്കുക</translation> <translation id="8746155870861185046">ഹൈലൈറ്റ് പങ്കിടുക</translation> +<translation id="874726034427945498">നിങ്ങളുടെ വിലാസ ബാറിൽ മെച്ചപ്പെട്ട നിർദ്ദേശങ്ങൾ കാണാൻ, ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> <translation id="8748850008226585750">കോൺടാക്റ്റുകൾ മറച്ചു</translation> <translation id="8756969031206844760">പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യണോ?</translation> <translation id="8765470054473112089">നിങ്ങൾ വിലാസ ബാറിലോ സെർച്ച് ബോക്സിലോ ടൈപ്പ് ചെയ്യുമ്പോൾ, മികച്ച നിർദ്ദേശങ്ങൾ ലഭിക്കുന്നതിന് ടൈപ്പ് ചെയ്യുന്നതെന്തോ അത് Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് തിരയൽ യന്ത്രത്തിലേക്ക് അയയ്ക്കുന്നു. ഇത് അദൃശ്യ മോഡിൽ ഓഫാണ്.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">ശബ്ദ തിരയൽ ആരംഭിക്കുക</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">നിങ്ങൾ സന്ദർശിച്ച സൈറ്റുകൾ അദൃശ്യ മോഡിൽ സംരക്ഷിച്ചിട്ടില്ല</translation> +<translation id="9084103763810123431">ബ്രൗസ് ചെയ്യുന്നത് മറ്റൊരു ഉപകരണത്തിൽ തുടരാൻ, നിങ്ങളുടെ ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> <translation id="9086302186042011942">സമന്വയിപ്പിക്കുന്നു</translation> <translation id="9086455579313502267">നെറ്റ്വർക്ക് ആക്സസ് ചെയ്യാനാകുന്നില്ല</translation> <translation id="9099220545925418560">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം അടിസ്ഥാനമാക്കി. ഈ ക്രമീകരണം ഓഫാണ്.</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 661d65e..7e9af2a6 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">ଅପରେଟିଂ ସିଷ୍ଟମ୍</translation> <translation id="7605594153474022051">ସିଙ୍କ୍ କାର୍ଯ୍ୟ କରୁନାହିଁ</translation> <translation id="7612619742409846846">ଏପରି Googleରେ ସାଇନ୍ ଇନ୍ ହୋଇଛି</translation> +<translation id="7612989789287281429">ଆପଣଙ୍କୁ ସାଇନ ଇନ କରାଯାଉଛି…</translation> <translation id="7616551326690708776">ଆପଣଙ୍କ ହାଇଲାଇଟ ପାଇଁ ଏକ ଟେମ୍ପଲେଟ ଚୟନ କରନ୍ତୁ।</translation> <translation id="7619072057915878432">ନେଟ୍ୱାର୍କ ନଥିବା ଯୋଗୁଁ <ph name="FILE_NAME" /> ଡାଉନ୍ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।</translation> <translation id="7626032353295482388">Chromeକୁ ସ୍ୱାଗତ୍</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 d239431..434e7c9 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Dodaj strony do listy Do przeczytania, aby przeczytać je później</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> nieprzeczytana strona}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nieprzeczytane strony}many{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nieprzeczytanych stron}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> nieprzeczytanej strony}}</translation> <translation id="2961210776189273067">Tytuł</translation> +<translation id="296370266220139811">Więcej czasu, mniej pisania</translation> <translation id="2979025552038692506">Wybrana karta incognito</translation> <translation id="2979639724566107830">Otwórz w nowym oknie</translation> <translation id="2981364137500752533">Możesz mieć maksymalnie 5 okien.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Pomóż witrynom w walce z oszustwami i w odróżnianiu botów od ludzi</translation> <translation id="3587482841069643663">Wszystkie</translation> <translation id="3587596251841506391">Pomóż poprawić bezpieczeństwo w sieci</translation> +<translation id="3597179440835065298">Otrzymuj lepsze sugestie</translation> <translation id="3602290021589620013">Podgląd</translation> <translation id="3616113530831147358">Dźwięk</translation> <translation id="3622349720008044802">Zarządzaj oknami</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Skopiuj hasło</translation> <translation id="5011311129201317034"><ph name="SITE" /> chce się połączyć</translation> <translation id="5016205925109358554">Szeryfowa</translation> +<translation id="5017529052065664584">Ostatnie 15 minut</translation> <translation id="5032430150487044192">Nie udało się utworzyć kodu QR</translation> <translation id="5039804452771397117">Zezwalaj</translation> <translation id="5040262127954254034">Prywatność</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Tą przeglądarką zarządzają <ph name="PARENT_NAME_1" /> i <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Wpisz coś tutaj lub kliknij ikonę mikrofonu, by wyszukiwać głosem</translation> <translation id="5814749351757353073">Bądź na bieżąco ze swoimi ulubionymi stronami</translation> +<translation id="5822875253699806474">Aby szybko wracać do odwiedzonych stron, włącz synchronizację kart i historii</translation> <translation id="583281660410589416">Nieznany</translation> <translation id="5833984609253377421">Udostępnij link</translation> <translation id="5834764604050996579">Aby zeskanować kod QR, zezwól Chrome na używanie aparatu</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Masz aktualną wersję Chrome</translation> <translation id="7105047059074518658">Zaloguj się, aby ułatwić sobie przeglądanie na różnych urządzeniach</translation> <translation id="7106762743910369165">Przeglądarka jest zarządzana przez Twoją organizację</translation> +<translation id="7116588989735740310">Aby wracać do stron odwiedzonych na innych urządzeniach, włącz synchronizację kart i historii</translation> <translation id="7130504491556983216">Gdy zaczniesz przeglądać strony, tu pojawi się lista zainteresowań</translation> <translation id="7138678301420049075">Inne</translation> <translation id="7146622961999026732">Wygląda na to, że te strony i aplikacje są dla Ciebie ważne:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Nie można połączyć się ze stroną</translation> <translation id="752220631458524187">Odłącz go, gdy skończysz</translation> <translation id="7523960634226602883">Szukaj za pomocą aparatu i Obiektywu Google</translation> +<translation id="7539698981064401140">Synchronizuj karty i historię</translation> <translation id="7562080006725997899">Czyszczenie danych przeglądania</translation> <translation id="756809126120519699">Wyczyszczono dane Chrome</translation> <translation id="7577900504646297215">Zarządzaj zainteresowaniami</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Szyfruj synchronizowane dane własnym hasłem synchronizacji</translation> <translation id="8466613982764129868">Sprawdź, czy <ph name="TARGET_DEVICE_NAME" /> ma połączenie z internetem</translation> <translation id="8473863474539038330">Adresy i ustawienia</translation> +<translation id="847433688444405067">Przeglądaj na różnych urządzeniach</translation> <translation id="8481980314595922412">Funkcje próbne są włączone</translation> <translation id="8485434340281759656"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8489271220582375723">Otwórz stronę historii</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Rozumiem</translation> <translation id="8725066075913043281">Spróbuj ponownie</translation> <translation id="8746155870861185046">Udostępnij zaznaczenie</translation> +<translation id="874726034427945498">Aby otrzymywać lepsze sugestie na pasku adresu, włącz synchronizację kart i historii</translation> <translation id="8748850008226585750">Treści ukryte</translation> <translation id="8756969031206844760">Zaktualizować hasło?</translation> <translation id="8765470054473112089">Gdy piszesz na pasku adresu lub w polu wyszukiwania, Chrome wysyła to, co piszesz, do domyślnej wyszukiwarki, aby podawać Ci lepsze sugestie. Ta funkcja jest wyłączona w trybie incognito.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Rozpocznij wyszukiwanie głosowe</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">W trybie incognito otwierane strony nie są zapisywane</translation> +<translation id="9084103763810123431">Aby kontynuować przeglądanie na innym urządzeniu, włącz synchronizację kart i historii</translation> <translation id="9086302186042011942">Synchronizuję</translation> <translation id="9086455579313502267">Nie można uzyskać dostępu do sieci</translation> <translation id="9099220545925418560">Na podstawie Twojej historii przeglądania. To ustawienie jest wyłączone.</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 2070e51..b9d7ed2 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Adicione páginas à sua lista de leitura para ler mais tarde</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> página não lida}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> páginas não lidas}}</translation> <translation id="2961210776189273067">Título</translation> +<translation id="296370266220139811">Poupe tempo e escreva menos</translation> <translation id="2979025552038692506">Separador de navegação anónima selecionado</translation> <translation id="2979639724566107830">Abrir numa nova janela</translation> <translation id="2981364137500752533">Pode ter até 5 janelas.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Ajude os sites a combater fraudes e distinguir bots de pessoas</translation> <translation id="3587482841069643663">Tudo</translation> <translation id="3587596251841506391">Ajude a melhorar a segur. na Web</translation> +<translation id="3597179440835065298">Obtenha sugestões melhores</translation> <translation id="3602290021589620013">Pré-visualizar</translation> <translation id="3616113530831147358">Áudio</translation> <translation id="3622349720008044802">Faça a gestão das janelas</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Copiar palavra-passe</translation> <translation id="5011311129201317034"><ph name="SITE" /> pretende estabelecer ligação</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Últimos 15 minutos</translation> <translation id="5032430150487044192">Não é possível criar o código QR</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidade</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Este navegador é gerido por <ph name="PARENT_NAME_1" /> e <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Escreva aqui ou toque no ícone de voz para começar.</translation> <translation id="5814749351757353073">Mantenha-se a par dos seus sites favoritos</translation> +<translation id="5822875253699806474">Para voltar rapidamente aos sites que visitou, sincronize os separadores e o histórico</translation> <translation id="583281660410589416">Desconhecido</translation> <translation id="5833984609253377421">Partilhar link</translation> <translation id="5834764604050996579">Para ler um código QR, permita que o Chrome utilize a sua câmara</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">O Chrome está atualizado.</translation> <translation id="7105047059074518658">Inicie sessão para navegar mais facilmente nos dispositivos</translation> <translation id="7106762743910369165">O seu navegador é gerido pela sua entidade</translation> +<translation id="7116588989735740310">Para voltar aos sites que visitou noutros dispositivos, sincronize os separadores e o histórico</translation> <translation id="7130504491556983216">Irá aparecer aqui uma lista de interesses enquanto navega na Web</translation> <translation id="7138678301420049075">Outros</translation> <translation id="7146622961999026732">Estes sites e apps parecem ser importantes para si:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Não é possível estabelecer ligação ao site.</translation> <translation id="752220631458524187">Desligue quando terminar.</translation> <translation id="7523960634226602883">Pesquise com a sua câmara através do Google Lens.</translation> +<translation id="7539698981064401140">Sincronize separadores e histórico</translation> <translation id="7562080006725997899">A limpar dados de navegação</translation> <translation id="756809126120519699">Dados do Chrome limpos</translation> <translation id="7577900504646297215">Gerir interesses</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Encriptar dados sincronizados com a sua própria frase de acesso de sincronização</translation> <translation id="8466613982764129868">Certifique-se de que o <ph name="TARGET_DEVICE_NAME" /> está ligado à Internet.</translation> <translation id="8473863474539038330">Moradas e mais</translation> +<translation id="847433688444405067">Navegue entre dispositivos</translation> <translation id="8481980314595922412">As funcionalidades de avaliação estão ativadas</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Abrir a página do histórico</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Entendido</translation> <translation id="8725066075913043281">Tentar novamente</translation> <translation id="8746155870861185046">Partilhar destaque</translation> +<translation id="874726034427945498">Para ver melhores sugestões na barra de endereço, sincronize os separadores e o histórico</translation> <translation id="8748850008226585750">Conteúdo ocultado</translation> <translation id="8756969031206844760">Pretende atualizar a palavra-passe?</translation> <translation id="8765470054473112089">Quando escreve na barra de endereço ou caixa de pesquisa, o Chrome envia o que escreve para o motor de pesquisa predefinido de forma a obter melhores sugestões. Esta opção está desativada na Navegação anónima.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Iniciar pesquisa por voz</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Os sites que visita não são guardados na Navegação anónima</translation> +<translation id="9084103763810123431">Para continuar a navegar noutro dispositivo, sincronize os separadores e o histórico</translation> <translation id="9086302186042011942">A sincronizar</translation> <translation id="9086455579313502267">Não é possível aceder à rede</translation> <translation id="9099220545925418560">Com base no seu histórico de navegação. Esta definição está desativada.</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 173a072..a5ff4a06 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Adaugă pagini la lista de lecturi pentru mai târziu</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> pagină necitită}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> pagini necitite}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> de pagini necitite}}</translation> <translation id="2961210776189273067">Titlu</translation> +<translation id="296370266220139811">Economisește timp și tastează mai puțin</translation> <translation id="2979025552038692506">Fila incognito selectată</translation> <translation id="2979639724566107830">Deschide într-o fereastră nouă</translation> <translation id="2981364137500752533">Poți deschide maximum cinci ferestre.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Ajută site-urile să prevină frauda și să deosebească aplicațiile bot de persoane</translation> <translation id="3587482841069643663">Toate</translation> <translation id="3587596251841506391">Îmbunătățește securitatea pe web</translation> +<translation id="3597179440835065298">Primește sugestii mai bune</translation> <translation id="3602290021589620013">Previzualizare</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3622349720008044802">Gestionează ferestrele</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Copiază parola</translation> <translation id="5011311129201317034"><ph name="SITE" /> dorește să se conecteze</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Ultimele 15 minute</translation> <translation id="5032430150487044192">Nu s-a putut crea codul QR</translation> <translation id="5039804452771397117">Permite</translation> <translation id="5040262127954254034">Confidențialitate</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Browserul este gestionat de <ph name="PARENT_NAME_1" /> și de <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Introdu text aici sau atinge pictograma microfon pentru a începe</translation> <translation id="5814749351757353073">Fii la curent cu site-urile preferate</translation> +<translation id="5822875253699806474">Pentru a reveni rapid la site-urile pe care le-ai accesat, sincronizează filele și istoricul</translation> <translation id="583281660410589416">Necunoscut</translation> <translation id="5833984609253377421">Trimite linkul</translation> <translation id="5834764604050996579">Pentru a scana un cod QR, permite ca Chrome să utilizeze camera</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome este actualizat</translation> <translation id="7105047059074518658">Conectează-te pentru a naviga mai ușor pe diferite dispozitive</translation> <translation id="7106762743910369165">Browserul este gestionat de organizația ta</translation> +<translation id="7116588989735740310">Pentru a reveni la site-urile accesate pe alte dispozitive, sincronizează filele și istoricul</translation> <translation id="7130504491556983216">Aici va apărea o listă de categorii de interese pe măsură ce navighezi pe web</translation> <translation id="7138678301420049075">Altele</translation> <translation id="7146622961999026732">Următoarele site-uri și aplicații par importante pentru tine:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Nu se poate realiza conexiunea la site</translation> <translation id="752220631458524187">Deconectează-te când ai terminat</translation> <translation id="7523960634226602883">Caută cu camera foto folosind Google Lens</translation> +<translation id="7539698981064401140">Sincronizează filele și istoricul</translation> <translation id="7562080006725997899">Se șterg datele de navigare</translation> <translation id="756809126120519699">Datele Chrome au fost șterse</translation> <translation id="7577900504646297215">Gestionează interesele</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Criptează datele sincronizate folosind propria expresie de acces pentru sincronizare</translation> <translation id="8466613982764129868">Asigură-te că <ph name="TARGET_DEVICE_NAME" /> este conectat la internet</translation> <translation id="8473863474539038330">Adrese și altele</translation> +<translation id="847433688444405067">Răsfoiește pe mai multe dispozitive</translation> <translation id="8481980314595922412">Funcțiile de încercare sunt activate</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Deschide pagina Istoric</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Am înțeles</translation> <translation id="8725066075913043281">Încearcă din nou</translation> <translation id="8746155870861185046">Distribuie selecția</translation> +<translation id="874726034427945498">Pentru a vedea sugestii mai bune în bara de adrese, sincronizează filele și istoricul</translation> <translation id="8748850008226585750">Conținutul este ascuns</translation> <translation id="8756969031206844760">Actualizezi parola?</translation> <translation id="8765470054473112089">Când introduci text în bara de adrese sau în caseta de căutare, Chrome trimite ceea ce introduci la motorul de căutare prestabilit, pentru a primi sugestii mai bune. Această opțiune este dezactivată în modul incognito.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Începe căutarea vocală</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Site-urile pe care le accesezi nu sunt salvate în modul incognito</translation> +<translation id="9084103763810123431">Pentru a continua să navighezi pe alt dispozitiv, sincronizează filele și istoricul</translation> <translation id="9086302186042011942">Se sincronizează</translation> <translation id="9086455579313502267">Nu se poate accesa rețeaua</translation> <translation id="9099220545925418560">Pe baza istoricului de navigare. Setarea este dezactivată.</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 f67c25776..2c81722c 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Добавьте страницы в список для чтения.</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> непрочитанная страница}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> непрочитанная страница}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> непрочитанные страницы}many{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> непрочитанных страниц}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> непрочитанной страницы}}</translation> <translation id="2961210776189273067">Обращение</translation> +<translation id="296370266220139811">Экономьте время на вводе URL</translation> <translation id="2979025552038692506">Выбранная вкладка инкогнито</translation> <translation id="2979639724566107830">Открыть в новом окне</translation> <translation id="2981364137500752533">Можно открыть не более пяти окон.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Вы можете помогать сайтам бороться с мошенничеством и отличать ботов от людей</translation> <translation id="3587482841069643663">Все</translation> <translation id="3587596251841506391">Помогать Google делать Интернет безопаснее</translation> +<translation id="3597179440835065298">Более подходящие подсказки</translation> <translation id="3602290021589620013">Предварительный просмотр</translation> <translation id="3616113530831147358">Аудио</translation> <translation id="3622349720008044802">Управление окнами</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Копировать пароль</translation> <translation id="5011311129201317034"><ph name="SITE" /> запрашивает разрешение на подключение</translation> <translation id="5016205925109358554">С засечками</translation> +<translation id="5017529052065664584">Последние 15 минут</translation> <translation id="5032430150487044192">Не удалось создать QR-код.</translation> <translation id="5039804452771397117">Разрешить</translation> <translation id="5040262127954254034">Конфиденциальность</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Этим браузером управляют <ph name="PARENT_NAME_1" /> и <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Чтобы использовать голосовой ввод, нажмите на значок микрофона</translation> <translation id="5814749351757353073">Подпишитесь на любимые сайты</translation> +<translation id="5822875253699806474">Чтобы быстро возвращаться к просмотренным сайтам, включите синхронизацию вкладок и истории.</translation> <translation id="583281660410589416">Неизвестно</translation> <translation id="5833984609253377421">Отправить ссылку</translation> <translation id="5834764604050996579">Чтобы отсканировать QR-код, разрешите Chrome доступ к камере.</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">У вас установлена последняя версия Chrome.</translation> <translation id="7105047059074518658">Чтобы работать с Chrome на разных устройствах было проще, войдите в аккаунт</translation> <translation id="7106762743910369165">Этим браузером управляет ваша организация.</translation> +<translation id="7116588989735740310">Вы сможете с легкостью возвращаться к сайтам, просмотренным на других устройствах.</translation> <translation id="7130504491556983216">Когда вы начнете посещать сайты, здесь появится список ваших интересов.</translation> <translation id="7138678301420049075">Другое</translation> <translation id="7146622961999026732">Кажется, следующие сайты и приложения важны для вас:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Не удалось подключиться к сайту</translation> <translation id="752220631458524187">Отключите кабель по окончании работы.</translation> <translation id="7523960634226602883">Включить камеру и использовать для поиска Google Объектив</translation> +<translation id="7539698981064401140">Синхронизируйте вкладки и историю</translation> <translation id="7562080006725997899">Очистить историю</translation> <translation id="756809126120519699">Данные Chrome удалены</translation> <translation id="7577900504646297215">Управление интересами</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Задать кодовую фразу для шифрования синхронизированных данных</translation> <translation id="8466613982764129868">Проверьте, подключено ли устройство <ph name="TARGET_DEVICE_NAME" /> к Интернету.</translation> <translation id="8473863474539038330">Адреса и другие данные</translation> +<translation id="847433688444405067">Работайте на разных устройствах</translation> <translation id="8481980314595922412">Функции включены</translation> <translation id="8485434340281759656"><ph name="DESCRIPTION" /> <ph name="FILE_SIZE" /> <ph name="SEPARATOR" /></translation> <translation id="8489271220582375723">Открыть страницу "История"</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Готово</translation> <translation id="8725066075913043281">Повторить попытку</translation> <translation id="8746155870861185046">Поделиться выделенным</translation> +<translation id="874726034427945498">Чтобы получать более точные подсказки в адресной строке, включите синхронизацию вкладок и истории.</translation> <translation id="8748850008226585750">Содержимое скрыто</translation> <translation id="8756969031206844760">Обновить пароль?</translation> <translation id="8765470054473112089">Когда вы вводите текст в адресную строку или окно поиска, Chrome отправляет запрос в поисковую систему по умолчанию, чтобы предложить вам более подходящие подсказки. В режиме инкогнито эта функция не работает.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Голосовой поиск</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">В режиме инкогнито сведения о посещенных сайтах не сохраняются</translation> +<translation id="9084103763810123431">Чтобы продолжать работу в браузере на других устройствах, включите синхронизацию вкладок и истории.</translation> <translation id="9086302186042011942">Выполняется синхронизация</translation> <translation id="9086455579313502267">Нет доступа к сети</translation> <translation id="9099220545925418560">Подбираются на основе истории браузера. Параметр отключен.</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 4b79684..94221b60 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Dodajte strani na bralni seznam za pozneje.</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> neprebrana stran}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> neprebrana stran}two{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> neprebrani strani}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> neprebrane strani}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> neprebranih strani}}</translation> <translation id="2961210776189273067">Naslov</translation> +<translation id="296370266220139811">Prihranite čas in tipkajte manj</translation> <translation id="2979025552038692506">Izbrani anonimni zavihek</translation> <translation id="2979639724566107830">Odpri v novem oknu</translation> <translation id="2981364137500752533">Imate lahko največ pet oken.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Pomagajte spletnim mestom pri boju zoper prevare in ločevanju botov od ljudi.</translation> <translation id="3587482841069643663">Vse</translation> <translation id="3587596251841506391">Izboljšanje varnosti v spletu</translation> +<translation id="3597179440835065298">Prejmite boljše predloge</translation> <translation id="3602290021589620013">Predogled</translation> <translation id="3616113530831147358">Zvok</translation> <translation id="3622349720008044802">Upravljanje oken</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Kopiranje gesla</translation> <translation id="5011311129201317034"><ph name="SITE" /> se želite povezati</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Zadnjih 15 minut</translation> <translation id="5032430150487044192">Kode QR ni mogoče ustvariti.</translation> <translation id="5039804452771397117">Dovoli</translation> <translation id="5040262127954254034">Zasebnost</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Ta brskalnik upravljata <ph name="PARENT_NAME_1" /> in <ph name="PARENT_NAME_2" />.</translation> <translation id="5814131985548525293">Vnesite tukaj ali se dotaknite ikone govora, če želite začeti.</translation> <translation id="5814749351757353073">Bodite na tekočem s priljubljenimi spletnimi mesti</translation> +<translation id="5822875253699806474">Za hitro vrnitev na že obiskana spletna mesta sinhronizirajte zavihke in zgodovino.</translation> <translation id="583281660410589416">Neznano</translation> <translation id="5833984609253377421">Deli povezavo z drugimi</translation> <translation id="5834764604050996579">Če želite optično prebrati kodo QR, Chromu omogočite uporabo fotoaparata.</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome je posodobljen</translation> <translation id="7105047059074518658">Prijavite se za preprostejše brskanje v napravah</translation> <translation id="7106762743910369165">Vaš brskalnik upravlja organizacija</translation> +<translation id="7116588989735740310">Za vrnitev na spletna mesta, obiskana v drugih napravah, sinhronizirajte zavihke in zgodovino.</translation> <translation id="7130504491556983216">Tukaj bo prikazan seznam zanimanj, ko brskate po spletu.</translation> <translation id="7138678301420049075">Drugo</translation> <translation id="7146622961999026732">Videti je, da so vam ta spletna mesta in aplikacije pomembni:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Povezave s spletnim mestom ni mogoče vzpostaviti</translation> <translation id="752220631458524187">Prekinite povezavo, ko opravite.</translation> <translation id="7523960634226602883">Iskanje s fotoaparatom z Googlom Lens.</translation> +<translation id="7539698981064401140">Sinhronizacija zavihkov in zgodovine</translation> <translation id="7562080006725997899">Brisanje podatkov brskanja</translation> <translation id="756809126120519699">Chromovi podatki so izbrisani.</translation> <translation id="7577900504646297215">Upravljanje zanimanj</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Šifriranje sinhroniziranih podatkov z vašim geslom za sinhronizacijo</translation> <translation id="8466613982764129868">Naprava <ph name="TARGET_DEVICE_NAME" /> mora biti povezana v internet</translation> <translation id="8473863474539038330">Naslovi in drugo</translation> +<translation id="847433688444405067">Brskanje po vseh napravah</translation> <translation id="8481980314595922412">Funkcije preizkusa so omogočene</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /><ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">Odpiranje strani z zgodovino</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Razumem</translation> <translation id="8725066075913043281">Poskusite znova</translation> <translation id="8746155870861185046">Deli oznako</translation> +<translation id="874726034427945498">Za prikaz boljših predlogov v naslovni vrstici sinhronizirajte zavihke in zgodovino.</translation> <translation id="8748850008226585750">Vsebina je skrita</translation> <translation id="8756969031206844760">Želite posodobiti geslo?</translation> <translation id="8765470054473112089">Ko tipkate v naslovno vrstico ali iskalno polje, Chrome vaše vnose pošlje v privzeti iskalnik zaradi boljših predlogov. V anonimnem načinu je to izklopljeno.</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Začni glasovno iskanje</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Spletna mesta, ki jih obiščete v anonimnem načinu, se ne shranijo.</translation> +<translation id="9084103763810123431">Če želite brskanje nadaljevati v drugi napravi, sinhronizirajte zavihke in zgodovino.</translation> <translation id="9086302186042011942">Sinhroniziranje</translation> <translation id="9086455579313502267">Dostop do omrežja ni mogoč</translation> <translation id="9099220545925418560">Na podlagi zgodovine brskanja. Ta nastavitev je izklopljena.</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 a3d37d7..b542d904 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Sistemi operativ</translation> <translation id="7605594153474022051">Sinkronizimi nuk po funksionon.</translation> <translation id="7612619742409846846">U identifikove te Google si</translation> +<translation id="7612989789287281429">Po identifikohesh…</translation> <translation id="7616551326690708776">Zgjidh një shabllon për theksimin.</translation> <translation id="7619072057915878432">Shkarkimi i <ph name="FILE_NAME" /> dështoi për shkak të problemeve të rrjetit.</translation> <translation id="7626032353295482388">Mirë se vjen në Chrome</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 8297d6f..2bb3282 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
@@ -1226,6 +1226,7 @@ <translation id="7596558890252710462">Operativsystem</translation> <translation id="7605594153474022051">Det går inte att synkronisera</translation> <translation id="7612619742409846846">Inloggad i Google som</translation> +<translation id="7612989789287281429">Du loggas in …</translation> <translation id="7616551326690708776">Välj en mall för markeringen.</translation> <translation id="7619072057915878432">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av nätverksfel.</translation> <translation id="7626032353295482388">Välkommen till Chrome</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 24da250e..694a9de 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Mfumo wa uendeshaji</translation> <translation id="7605594153474022051">Kipengele cha usawazishaji hakifanyi kazi</translation> <translation id="7612619742409846846">Umeingia katika akaunti ya Google ukitumia</translation> +<translation id="7612989789287281429">Unaingia katika akaunti…</translation> <translation id="7616551326690708776">Chagua kiolezo cha maandishi uliyoyaangazia.</translation> <translation id="7619072057915878432">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya hitilafu za mtandao.</translation> <translation id="7626032353295482388">Karibu kwenye Chrome</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 ea16408..f51c6ef 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">ஆப்ரேட்டிங் சிஸ்டம்</translation> <translation id="7605594153474022051">ஒத்திசைவு வேலை செய்யவில்லை</translation> <translation id="7612619742409846846">Google இல் உள்நுழைந்திருக்கும் கணக்கு</translation> +<translation id="7612989789287281429">உள்நுழைகிறீர்கள்…</translation> <translation id="7616551326690708776">ஹைலைட் செய்வதற்கான டெம்ப்ளேட்டைத் தேர்ந்தெடுங்கள்.</translation> <translation id="7619072057915878432">நெட்வொர்க் தோல்விகளால் <ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை.</translation> <translation id="7626032353295482388">Chrome க்கு வருக</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 86debcfa..31602c0 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
@@ -1225,6 +1225,7 @@ <translation id="7596558890252710462">Операційна система</translation> <translation id="7605594153474022051">Синхронізація не працює</translation> <translation id="7612619742409846846">Ви ввійшли в обліковий запис Google як</translation> +<translation id="7612989789287281429">Виконується вхід…</translation> <translation id="7616551326690708776">Виберіть шаблон для виділеного тексту.</translation> <translation id="7619072057915878432">Не вдалося завантажити файл <ph name="FILE_NAME" />. Помилка мережі.</translation> <translation id="7626032353295482388">Вітаємо у Chrome!</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 e5200df..8183fea 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">بعد کیلئے اپنی پڑھنے کی فہرست میں صفحات شامل کریں</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> نہ پڑھا ہوا صفحہ}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> نہ پڑھے ہوئے صفحات}}</translation> <translation id="2961210776189273067">عنوان</translation> +<translation id="296370266220139811">وقت کی بچت کریں اور کم ٹائپ کریں</translation> <translation id="2979025552038692506">منتخب پوشیدگی ٹیب</translation> <translation id="2979639724566107830">نئی ونڈو میں کھولیں</translation> <translation id="2981364137500752533">آپ 5 ونڈوز تک کھول سکتے ہیں۔</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">دھوکہ دہی سے لڑنے اور بوٹس کو لوگوں سے ممتاز کرنے میں سائٹس کی مدد کریں</translation> <translation id="3587482841069643663">سبھی</translation> <translation id="3587596251841506391">ویب پر سیکیورٹی کو بہتر بنانے میں مدد کریں</translation> +<translation id="3597179440835065298">بہتر تجاویز حاصل کریں</translation> <translation id="3602290021589620013">پیش منظر</translation> <translation id="3616113530831147358">آڈیو</translation> <translation id="3622349720008044802">ونڈوز کا نظم کریں</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">پاس ورڈ کاپی کریں</translation> <translation id="5011311129201317034"><ph name="SITE" /> منسلک ہونا چاہتی ہے</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">آخری 15 منٹ</translation> <translation id="5032430150487044192">QR کوڈ تخلیق نہیں کیا جا سکتا</translation> <translation id="5039804452771397117">اجازت دیں</translation> <translation id="5040262127954254034">رازداری</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">یہ براؤزر <ph name="PARENT_NAME_1" /> اور <ph name="PARENT_NAME_2" /> کے زیر انتظام ہے۔</translation> <translation id="5814131985548525293">شروع کرنے کیلئے یہاں ٹائپ کریں یا آواز کے آئیکن پر تھپتھپائیں</translation> <translation id="5814749351757353073">اپنی پسندیدہ سائٹس سے باخبر رہیں</translation> +<translation id="5822875253699806474">تیزی سے اپنی ملاحظہ کردہ سائٹس پر واپس جانے کے لیے، اپنے ٹیبز اور سرگزشت کو سِنک کریں</translation> <translation id="583281660410589416">نامعلوم</translation> <translation id="5833984609253377421">لنک کا اشتراک کریں</translation> <translation id="5834764604050996579">QR کوڈ اسکین کرنے کیلئے Chrome کو اپنا کیمرا استعمال کرنے دیں</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome اپ ٹو ڈیٹ ہے</translation> <translation id="7105047059074518658">تمام آلات پر آسانی سے براؤز کرنے کے لیے سائن ان کریں</translation> <translation id="7106762743910369165">آپ کا براؤزر آپ کی تنظیم کے زیر انتظام ہے</translation> +<translation id="7116588989735740310">ان سائٹس پر واپس جانے کیلئے جنہیں آپ نے دوسرے آلات پر ملاحظہ کیے ہیں، اپنے ٹیبز اور سرگزشت سِنک کریں</translation> <translation id="7130504491556983216">آپ کے ویب براؤز کرتے ہی دلچسپیوں کی ایک فہرست یہاں ظاہر ہوگی</translation> <translation id="7138678301420049075">دوسرا</translation> <translation id="7146622961999026732">یہ سائٹیں اور ایپس آپ کے لیے اہم معلوم ہوتی ہیں:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">سائٹ سے منسلک نہیں کیا جا سکتا</translation> <translation id="752220631458524187">جب آپ کا کام مکمل ہو جائے تو غیر منسلک کر لیں</translation> <translation id="7523960634226602883">Google لینز کا استعمال کرتے ہوئے اپنے کیمرے کی مدد سے تلاش کریں</translation> +<translation id="7539698981064401140">اپنے ٹیبز اور سرگزشت کو سِنک کریں</translation> <translation id="7562080006725997899">براؤزنگ ڈیٹا صاف کرنا</translation> <translation id="756809126120519699">Chrome ڈیٹا صاف کر دیا گیا</translation> <translation id="7577900504646297215">دلچسپیوں کا نظم کریں</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">اپنے ذاتی مطابقت پذیر پاس فریز کے ساتھ مطابقت پذیر کردہ ڈیٹا کی مرموزکاری کریں</translation> <translation id="8466613982764129868">یہ یقینی بنائیں کہ <ph name="TARGET_DEVICE_NAME" /> انٹرنیٹ سے منسلک ہے</translation> <translation id="8473863474539038330">پتے وغیرہ</translation> +<translation id="847433688444405067">آلات پر براؤز کریں</translation> <translation id="8481980314595922412">ٹرائل خصوصیات آن ہیں</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">سرگزشت صفحہ کھولیں</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">سمجھ آ گئی</translation> <translation id="8725066075913043281">دوبارہ کوشش کریں</translation> <translation id="8746155870861185046">ہائی لائٹ کا اشتراک کریں</translation> +<translation id="874726034427945498">اپنے ایڈریس بار میں بہتر تجاویز دیکھنے کے لیے، اپنے ٹیبز اور سرگزشت کو سِنک کریں</translation> <translation id="8748850008226585750">مواد مخفی ہیں</translation> <translation id="8756969031206844760">پاس ورڈ کو اپ ڈیٹ کریں؟</translation> <translation id="8765470054473112089">جب آپ ایڈریس بار یا تلاش کے خانے میں ٹائپ کرتے ہیں تو بہتر تجاویز حاصل کرنے کے لیے Chrome آپ جو ٹائپ کرتے ہیں اسے آپ کے ڈیفالٹ سرچ انجن کو بھیجتا ہے۔ یہ پوشیدگی میں آف ہے۔</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">صوتی تلاش شروع کریں</translation> <translation id="9074739597929991885">بلوٹوتھ</translation> <translation id="9081543426177426948">جو سائٹس آپ ملاحظہ کرتے ہیں وہ پوشیدگی وضع میں محفوظ نہیں ہوتی ہیں</translation> +<translation id="9084103763810123431">دیگر آلے پر براؤز کرنا جاری رکھنے کے لیے، اپنے ٹیبز اور سرگزشت کو سِنک کریں</translation> <translation id="9086302186042011942">مطابقت پذیری کی جا رہی ہے</translation> <translation id="9086455579313502267">نیٹ ورک تک رسائی حاصل کرنے سے قاصر</translation> <translation id="9099220545925418560">آپ کی براؤزنگ کی سرگزشت کی بنیاد پر۔ یہ ترتیب آف ہے۔</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 1ccf21d..ed392d6 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">Sahifalarni roʻyxatga keyinroq kiritish</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> ta sahifa oʻqilmagan}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> ta sahifa oʻqilmagan}}</translation> <translation id="2961210776189273067">Nomi</translation> +<translation id="296370266220139811">Kamroq yozib, vaqtni tejang</translation> <translation id="2979025552038692506">Tanlangan inkognito sahifa</translation> <translation id="2979639724566107830">Yangi oynada ochish</translation> <translation id="2981364137500752533">5 tagcha oyna ochish mumkin.</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">Saytlarga firibgarlikka qarshi kurash va botlarni odamlardan farqlashda yordam berish</translation> <translation id="3587482841069643663">Barchasi</translation> <translation id="3587596251841506391">Himoyani oshirishga yordam bering</translation> +<translation id="3597179440835065298">Yaxshiroq takliflar oling</translation> <translation id="3602290021589620013">Razm solish</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3622349720008044802">Oynalarni boshqarish</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">Parolni nusxalash</translation> <translation id="5011311129201317034"><ph name="SITE" /> qurilmangiz bilan aloqa o‘rnatmoqchi</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">Oxirgi 15 daqiqa</translation> <translation id="5032430150487044192">QR kod yaratilmadi</translation> <translation id="5039804452771397117">Ruxsat berish</translation> <translation id="5040262127954254034">Shaxsiy ma’lumotlar</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">Bu brauzer <ph name="PARENT_NAME_1" /> va <ph name="PARENT_NAME_2" /> tomonidan boshqariladi.</translation> <translation id="5814131985548525293">Boshlash uchun shu yerga yozing yoki ovoz belgisini bosing</translation> <translation id="5814749351757353073">Sevimli saytlardan xabar olib turing</translation> +<translation id="5822875253699806474">Ochilgan sahifani davom ettirish uchun varaqlar va tarixni sinxronlang</translation> <translation id="583281660410589416">Noma’lum</translation> <translation id="5833984609253377421">Havolani ulashish</translation> <translation id="5834764604050996579">Chrome QR kodni skanerlashi uchun kameradan foydalanishga ruxsat bering</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome eng oxirgi versiyada</translation> <translation id="7105047059074518658">Internetni turli qurilmalararo kezish uchun hisobga kiring</translation> <translation id="7106762743910369165">Brauzeringiz tashkilotingiz boshqaruvida</translation> +<translation id="7116588989735740310">Ochiq sahifani boshqa qurilmalarda davom ettirish uchun varaqlar va tarixni sinxronlang</translation> <translation id="7130504491556983216">Qiziqishlaringiz roʻyxati saytlarga kirishingiz natijasida shu yerda chiqadi</translation> <translation id="7138678301420049075">Boshqa</translation> <translation id="7146622961999026732">Bu sayt va ilovalar siz uchun muhimga oʻxshaydi:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">Saytga ulanib bo‘lmadi</translation> <translation id="752220631458524187">Ish tugasa, kabelni uzing</translation> <translation id="7523960634226602883">Google Lens yordamida kamera bilan qidiring</translation> +<translation id="7539698981064401140">Varaqlar va tarixni sinxronlang</translation> <translation id="7562080006725997899">Brauzer tarixini tozalash</translation> <translation id="756809126120519699">Chrome ma’lumotlari tozalandi</translation> <translation id="7577900504646297215">Qiziqishlarni sozlash</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">Sinxronlangan ma’lumotlarni kodli ibora bilan shifrlash</translation> <translation id="8466613982764129868"><ph name="TARGET_DEVICE_NAME" /> internetga ulanganini tekshiring.</translation> <translation id="8473863474539038330">Mazillar va boshqa ma’lumotlar</translation> +<translation id="847433688444405067">Barcha qurilmalarda varaqlash</translation> <translation id="8481980314595922412">Bepul sinov funksiyalari yoniq</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">“Tarix” sahifasini ochish</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">Tushunarli</translation> <translation id="8725066075913043281">Qayta urinib ko‘ring</translation> <translation id="8746155870861185046">Belgilovni ulashish</translation> +<translation id="874726034427945498">Manzillar qatorida yaxshiroq takliflar olish uchun varaqlar va tarixni sinxronlang</translation> <translation id="8748850008226585750">Kontent berkitildi</translation> <translation id="8756969031206844760">Parolni yangilash</translation> <translation id="8765470054473112089">Manzillar qatori yoki qidiruv oynasiga matn kiritilganda Chrome yaxshiroq takliflar olish uchun yozilgan matnni birlamchi qidiruv tizimiga yuboradi. Inkognito rejimda bu funksiya yoqilmasin</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">Ovozli qidiruv</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9081543426177426948">Siz Inkognito rejimida ochgans saytlar saqlanmaydi</translation> +<translation id="9084103763810123431">Ochiq sahifani boshqa qurilmada davom ettirish uchun varaqlar va tarixni sinxronlang</translation> <translation id="9086302186042011942">Sinxronlanmoqda</translation> <translation id="9086455579313502267">Tarmoqqa ruxsat yo‘q</translation> <translation id="9099220545925418560">Brauzeringiz tarixi asosida. Bu sozlama oʻchiq.</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 cc558726..301580dc 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">将网页添加到阅读清单以供日后阅读</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> 个未读页面}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> 个未读页面}}</translation> <translation id="2961210776189273067">称谓</translation> +<translation id="296370266220139811">节省时间并减少输入操作</translation> <translation id="2979025552038692506">所选的无痕模式标签页</translation> <translation id="2979639724566107830">在新窗口中打开</translation> <translation id="2981364137500752533">您最多只能打开 5 个窗口。</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">协助网站打击欺诈行为以及区分机器人和真人</translation> <translation id="3587482841069643663">全部</translation> <translation id="3587596251841506391">帮助我们改善网络安全环境</translation> +<translation id="3597179440835065298">获得更好的建议</translation> <translation id="3602290021589620013">预览</translation> <translation id="3616113530831147358">音频</translation> <translation id="3622349720008044802">管理窗口</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">复制密码</translation> <translation id="5011311129201317034"><ph name="SITE" /> 希望连接到以下所选设备:</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">过去 15 分钟</translation> <translation id="5032430150487044192">无法创建二维码</translation> <translation id="5039804452771397117">允许</translation> <translation id="5040262127954254034">隐私权</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">此浏览器由 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="5814131985548525293">在此处输入内容或点按麦克风图标即可开始搜索</translation> <translation id="5814749351757353073">随时掌握您最喜爱的网站的最新动态</translation> +<translation id="5822875253699806474">如果想快速重新访问浏览过的网站,请同步您的标签页和历史记录</translation> <translation id="583281660410589416">未知</translation> <translation id="5833984609253377421">分享链接</translation> <translation id="5834764604050996579">如需扫描二维码,请允许 Chrome 使用您的摄像头</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome 已是最新版本</translation> <translation id="7105047059074518658">登录即可让跨设备浏览更轻松顺畅</translation> <translation id="7106762743910369165">您的浏览器由贵单位管理</translation> +<translation id="7116588989735740310">如果想重新访问在其他设备上浏览过的网站,请同步您的标签页和历史记录</translation> <translation id="7130504491556983216">当您浏览网页时,此处会显示一个兴趣列表</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">这些网站和应用似乎对您很重要:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">无法连接到该网站</translation> <translation id="752220631458524187">完成当前操作后断开连接</translation> <translation id="7523960634226602883">借助摄像头使用 Google 智能镜头进行搜索</translation> +<translation id="7539698981064401140">同步您的标签页和历史记录</translation> <translation id="7562080006725997899">正在清除浏览数据</translation> <translation id="756809126120519699">已清除 Chrome 数据</translation> <translation id="7577900504646297215">管理我的兴趣</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">使用您自己的同步密码加密已同步的数据</translation> <translation id="8466613982764129868">请确保<ph name="TARGET_DEVICE_NAME" />已连接到互联网</translation> <translation id="8473863474539038330">地址和其他信息</translation> +<translation id="847433688444405067">跨设备浏览</translation> <translation id="8481980314595922412">试用版功能已开启</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">打开历史记录页</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">知道了</translation> <translation id="8725066075913043281">重试</translation> <translation id="8746155870861185046">分享突出显示的内容</translation> +<translation id="874726034427945498">如果想于在地址栏中输入内容时获得更好的建议,请同步您的标签页和历史记录</translation> <translation id="8748850008226585750">内容已隐藏</translation> <translation id="8756969031206844760">要更新密码吗?</translation> <translation id="8765470054473112089">当您在地址栏或搜索框中输入内容时,Chrome 会将您输入的内容发送给默认搜索引擎,以便为您提供更好的建议。在无痕模式下,此设置处于关闭状态。</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">开始语音搜索</translation> <translation id="9074739597929991885">蓝牙</translation> <translation id="9081543426177426948">在无痕模式下,系统不会保存您访问过的网站</translation> +<translation id="9084103763810123431">如果想在别的设备上继续浏览,请同步您的标签页和历史记录</translation> <translation id="9086302186042011942">正在同步</translation> <translation id="9086455579313502267">无法访问网络</translation> <translation id="9099220545925418560">根据您的浏览记录。此设置已关闭。</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 a55f621..d778b44f 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
@@ -355,6 +355,7 @@ <translation id="2951071800649516099">將網頁新增至閱讀清單,以便稍後瀏覽</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> 個未讀網頁}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> 個未讀網頁}}</translation> <translation id="2961210776189273067">標題</translation> +<translation id="296370266220139811">不必重複輸入網址,節省寶貴時間</translation> <translation id="2979025552038692506">已選取無痕式分頁</translation> <translation id="2979639724566107830">在新視窗中開啟</translation> <translation id="2981364137500752533">您最多可同時開啟 5 個視窗。</translation> @@ -482,6 +483,7 @@ <translation id="3578874072190212775">協助網站對抗欺詐,以及分辨機器人和人類</translation> <translation id="3587482841069643663">全部</translation> <translation id="3587596251841506391">協助改善網絡安全</translation> +<translation id="3597179440835065298">取得更貼近需求的建議</translation> <translation id="3602290021589620013">預覽</translation> <translation id="3616113530831147358">音效檔案</translation> <translation id="3622349720008044802">管理視窗</translation> @@ -747,6 +749,7 @@ <translation id="5005498671520578047">複製密碼</translation> <translation id="5011311129201317034"><ph name="SITE" /> 要求連接至</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">過去 15 分鐘</translation> <translation id="5032430150487044192">無法建立 QR 碼</translation> <translation id="5039804452771397117">允許</translation> <translation id="5040262127954254034">私隱權</translation> @@ -882,6 +885,7 @@ <translation id="5813552293717797987">此瀏覽器由 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="5814131985548525293">在此處輸入或輕按麥克風圖示以開始搜尋</translation> <translation id="5814749351757353073">緊貼最喜愛網站的最新動態</translation> +<translation id="5822875253699806474">如要快速重新造訪瀏覽過的網站,可以同步分頁和歷史記錄</translation> <translation id="583281660410589416">不明</translation> <translation id="5833984609253377421">分享連結</translation> <translation id="5834764604050996579">如要掃瞄 QR 碼,請允許 Chrome 使用攝錄機</translation> @@ -1136,6 +1140,7 @@ <translation id="7088681679121566888">Chrome 目前是最新版本</translation> <translation id="7105047059074518658">登入即可讓跨裝置瀏覽更順暢</translation> <translation id="7106762743910369165">您的瀏覽器由組織管理</translation> +<translation id="7116588989735740310">如要重新造訪在其他裝置上瀏覽過的網站,可以同步分頁和歷史記錄</translation> <translation id="7130504491556983216">在您瀏覽網絡同時,系統會於此處顯示興趣清單</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">這些網站和應用程式似乎對您很重要:</translation> @@ -1214,6 +1219,7 @@ <translation id="751961395872307827">無法連接網站</translation> <translation id="752220631458524187">請在完成後拔除連接線</translation> <translation id="7523960634226602883">使用 Google 智能鏡頭,透過相機搜尋</translation> +<translation id="7539698981064401140">同步分頁和歷史記錄</translation> <translation id="7562080006725997899">正在清除瀏覽資料</translation> <translation id="756809126120519699">已清除 Chrome 資料</translation> <translation id="7577900504646297215">管理興趣</translation> @@ -1396,6 +1402,7 @@ <translation id="8461694314515752532">使用您的同步密碼短語,加密已同步的資料</translation> <translation id="8466613982764129868">請確保 <ph name="TARGET_DEVICE_NAME" /> 已連接互聯網</translation> <translation id="8473863474539038330">地址及其他資料</translation> +<translation id="847433688444405067">跨裝置瀏覽</translation> <translation id="8481980314595922412">試用功能已開啟</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">開啟記錄頁面</translation> @@ -1449,6 +1456,7 @@ <translation id="8712637175834984815">我知道了</translation> <translation id="8725066075913043281">再試一次</translation> <translation id="8746155870861185046">分享突顯項目</translation> +<translation id="874726034427945498">如要讓網址列顯示更貼近需求的建議,可以同步分頁和歷史記錄</translation> <translation id="8748850008226585750">內容已隱藏</translation> <translation id="8756969031206844760">要更新密碼嗎?</translation> <translation id="8765470054473112089">在網址列或搜尋框中輸入內容時,Chrome 會將輸入的內容傳送至預設搜尋引擎,以便取得更切合需求的建議。此功能不會在無痕模式下啟用。</translation> @@ -1514,6 +1522,7 @@ <translation id="9070377983101773829">開始語音搜尋</translation> <translation id="9074739597929991885">藍牙</translation> <translation id="9081543426177426948">在無痕模式下無法儲存您瀏覽的網站</translation> +<translation id="9084103763810123431">如要在其他裝置上繼續瀏覽,可以同步分頁和歷史記錄</translation> <translation id="9086302186042011942">正在同步處理</translation> <translation id="9086455579313502267">無法存取網絡</translation> <translation id="9099220545925418560">根據您的瀏覽記錄推薦。此設定已關閉。</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 88d8737..a6d6b43 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
@@ -356,6 +356,7 @@ <translation id="2951071800649516099">將網頁新增至閱讀清單以供日後使用</translation> <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> 個未讀取的網頁}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> 個未讀取的網頁}}</translation> <translation id="2961210776189273067">稱謂</translation> +<translation id="296370266220139811">不必重複輸入網址,節省寶貴時間</translation> <translation id="2979025552038692506">選取的無痕式分頁</translation> <translation id="2979639724566107830">於新視窗中開啟</translation> <translation id="2981364137500752533">最多只能開啟 5 個視窗。</translation> @@ -483,6 +484,7 @@ <translation id="3578874072190212775">協助網站防範詐欺及辨別機器人和真人</translation> <translation id="3587482841069643663">全部</translation> <translation id="3587596251841506391">協助改善網路安全</translation> +<translation id="3597179440835065298">取得更貼近需求的建議</translation> <translation id="3602290021589620013">預覽</translation> <translation id="3616113530831147358">音訊</translation> <translation id="3622349720008044802">管理視窗</translation> @@ -746,6 +748,7 @@ <translation id="5005498671520578047">複製密碼</translation> <translation id="5011311129201317034"><ph name="SITE" /> 要求連線</translation> <translation id="5016205925109358554">Serif</translation> +<translation id="5017529052065664584">過去 15 分鐘</translation> <translation id="5032430150487044192">無法建立 QR 圖碼</translation> <translation id="5039804452771397117">允許</translation> <translation id="5040262127954254034">隱私權</translation> @@ -881,6 +884,7 @@ <translation id="5813552293717797987">這個瀏覽器是由 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation> <translation id="5814131985548525293">在此輸入內容或麥克風語音圖示即可開始搜尋</translation> <translation id="5814749351757353073">掌握最愛網站的最新動態</translation> +<translation id="5822875253699806474">如要快速重新造訪瀏覽過的網站,可以同步分頁和歷史記錄</translation> <translation id="583281660410589416">未知</translation> <translation id="5833984609253377421">分享連結</translation> <translation id="5834764604050996579">如要掃描 QR 圖碼,請允許 Chrome 使用你的攝影機</translation> @@ -1135,6 +1139,7 @@ <translation id="7088681679121566888">Chrome 目前是最新版本</translation> <translation id="7105047059074518658">登入即可讓跨裝置瀏覽更順暢</translation> <translation id="7106762743910369165">你的瀏覽器是由貴機構管理</translation> +<translation id="7116588989735740310">如要重新造訪在其他裝置上瀏覽過的網站,可以同步分頁和歷史記錄</translation> <translation id="7130504491556983216">瀏覽網路時,你的興趣喜好清單會顯示在這裡</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">這些網站和應用程式似乎對你很重要:</translation> @@ -1213,6 +1218,7 @@ <translation id="751961395872307827">無法連線至網站</translation> <translation id="752220631458524187">請在完成後拔除傳輸線</translation> <translation id="7523960634226602883">使用 Google 智慧鏡頭透過相機進行搜尋</translation> +<translation id="7539698981064401140">同步分頁和歷史記錄</translation> <translation id="7562080006725997899">正在清除瀏覽資料</translation> <translation id="756809126120519699">已清除 Chrome 資料</translation> <translation id="7577900504646297215">管理興趣喜好</translation> @@ -1395,6 +1401,7 @@ <translation id="8461694314515752532">使用你自己的同步通關密語,加密保護同步資料</translation> <translation id="8466613982764129868">請確認「<ph name="TARGET_DEVICE_NAME" />」已連上網際網路</translation> <translation id="8473863474539038330">地址和其他資訊</translation> +<translation id="847433688444405067">跨裝置瀏覽</translation> <translation id="8481980314595922412">試用功能已開啟</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> <translation id="8489271220582375723">開啟記錄頁面</translation> @@ -1448,6 +1455,7 @@ <translation id="8712637175834984815">我瞭解了</translation> <translation id="8725066075913043281">再試一次</translation> <translation id="8746155870861185046">分享醒目顯示內容</translation> +<translation id="874726034427945498">如要讓網址列顯示更貼近需求的建議,可以同步分頁和歷史記錄</translation> <translation id="8748850008226585750">內容已隱藏</translation> <translation id="8756969031206844760">要更新密碼嗎?</translation> <translation id="8765470054473112089">在網址列或搜尋框中輸入時,Chrome 會將你輸入的內容傳送給預設搜尋引擎,提供更符合需求的搜尋建議。這項功能在無痕模式中為關閉狀態。</translation> @@ -1513,6 +1521,7 @@ <translation id="9070377983101773829">開始語音搜尋</translation> <translation id="9074739597929991885">藍牙</translation> <translation id="9081543426177426948">無痕模式不會儲存你造訪的網站</translation> +<translation id="9084103763810123431">如要在其他裝置上繼續瀏覽,可以同步分頁和歷史記錄</translation> <translation id="9086302186042011942">正在同步處理</translation> <translation id="9086455579313502267">無法存取網路</translation> <translation id="9099220545925418560">根據你的瀏覽記錄獨家推薦。這項設定已關閉。</translation>
diff --git a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h index 9be1e3d..881d7e7 100644 --- a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h
@@ -76,6 +76,11 @@ observer_for_testing_ = observer; } + // For testing, to mock OfferLocal save bubble. + void SetBubbleTypeToLocalSaveForTesting(IbanBubbleType type) { + current_bubble_type_ = type; + } + protected: explicit IbanBubbleControllerImpl(content::WebContents* web_contents);
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index 3362d02..6790142a 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc
@@ -1311,10 +1311,15 @@ // Regression test for crbug.com/702505. IN_PROC_BROWSER_TEST_F(BrowserTest, ReattachDevToolsWindow) { ASSERT_TRUE(embedded_test_server()->Start()); + net::EmbeddedTestServer https_test_server( + net::EmbeddedTestServer::TYPE_HTTPS); + https_test_server.ServeFilesFromSourceDirectory(GetChromeTestDataDir()); + ASSERT_TRUE(https_test_server.Start()); + GURL http_url(embedded_test_server()->GetURL("/title1.html")); WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL(chrome::kChromeUINewTabURL))); + + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), http_url)); // Open a devtools window. DevToolsWindow* devtools_window =
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc index 8acd80a9..b383113c 100644 --- a/chrome/browser/ui/browser_element_identifiers.cc +++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -58,3 +58,4 @@ DEFINE_CUSTOM_ELEMENT_EVENT_TYPE(kTabGroupedCustomEventId); DEFINE_CUSTOM_ELEMENT_EVENT_TYPE(kSidePanelComboboxChangedCustomEventId); DEFINE_CUSTOM_ELEMENT_EVENT_TYPE(kSidePanelReadingMarkedAsReadEventId); +DEFINE_CUSTOM_ELEMENT_EVENT_TYPE(kSideSearchResultsClickedCustomEventId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h index 6cfbc9d..a44c370 100644 --- a/chrome/browser/ui/browser_element_identifiers.h +++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -67,5 +67,6 @@ DECLARE_CUSTOM_ELEMENT_EVENT_TYPE(kTabGroupedCustomEventId); DECLARE_CUSTOM_ELEMENT_EVENT_TYPE(kSidePanelComboboxChangedCustomEventId); DECLARE_CUSTOM_ELEMENT_EVENT_TYPE(kSidePanelReadingMarkedAsReadEventId); +DECLARE_CUSTOM_ELEMENT_EVENT_TYPE(kSideSearchResultsClickedCustomEventId); #endif // CHROME_BROWSER_UI_BROWSER_ELEMENT_IDENTIFIERS_H_
diff --git a/chrome/browser/ui/browser_tabstrip.cc b/chrome/browser/ui/browser_tabstrip.cc index e36ffb2..535d038 100644 --- a/chrome/browser/ui/browser_tabstrip.cc +++ b/chrome/browser/ui/browser_tabstrip.cc
@@ -6,7 +6,6 @@ #include "base/command_line.h" #include "base/feature_list.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h"
diff --git a/chrome/browser/ui/browser_window_state.cc b/chrome/browser/ui/browser_window_state.cc index 66e80799..da49c28b 100644 --- a/chrome/browser/ui/browser_window_state.cc +++ b/chrome/browser/ui/browser_window_state.cc
@@ -13,7 +13,6 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/buildflags.h" #include "chrome/browser/defaults.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_service_base.h" #include "chrome/browser/sessions/session_service_lookup.h" #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/ui/cocoa/applescript/metrics_applescript.h b/chrome/browser/ui/cocoa/applescript/metrics_applescript.h deleted file mode 100644 index b094202..0000000 --- a/chrome/browser/ui/cocoa/applescript/metrics_applescript.h +++ /dev/null
@@ -1,39 +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. - -#ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_METRICS_APPLESCRIPT_H_ -#define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_METRICS_APPLESCRIPT_H_ - -namespace AppleScript { - -// The AppleScript verb commands that are being recorded in a histogram. These -// values should not be re-ordered or removed. -enum AppleScriptCommand { - TAB_CLOSE = 0, - TAB_COPY, - TAB_CUT, - TAB_EXECUTE_JAVASCRIPT, - TAB_GO_BACK, - TAB_GO_FORWARD, - TAB_PASTE, - TAB_PRINT, - TAB_REDO, - TAB_RELOAD, - TAB_SAVE, - TAB_SELECT_ALL, - TAB_STOP, - TAB_UNDO, - TAB_VIEW_SOURCE, - WINDOW_CLOSE, - WINDOW_ENTER_PRESENTATION_MODE, - WINDOW_EXIT_PRESENTATION_MODE, - APPLESCRIPT_COMMAND_EVENTS_COUNT -}; - -// Logs the sample's UMA metrics into the AppleScript.CommandEvent histogram -void LogAppleScriptUMA(AppleScriptCommand sample); - -} // namespace - -#endif // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_METRICS_APPLESCRIPT_H_
diff --git a/chrome/browser/ui/cocoa/applescript/metrics_applescript.mm b/chrome/browser/ui/cocoa/applescript/metrics_applescript.mm deleted file mode 100644 index 0939921..0000000 --- a/chrome/browser/ui/cocoa/applescript/metrics_applescript.mm +++ /dev/null
@@ -1,16 +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. - -#import "chrome/browser/ui/cocoa/applescript/metrics_applescript.h" - -#include "base/metrics/histogram_macros.h" - -namespace AppleScript { - -void LogAppleScriptUMA(AppleScriptCommand sample) { - UMA_HISTOGRAM_ENUMERATION("AppleScript.CommandEvent", sample, - APPLESCRIPT_COMMAND_EVENTS_COUNT); -} - -} // namespace
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm index 10387f8..197eb58 100644 --- a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm +++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
@@ -14,7 +14,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/cocoa/applescript/apple_event_util.h" #include "chrome/browser/ui/cocoa/applescript/error_applescript.h" -#include "chrome/browser/ui/cocoa/applescript/metrics_applescript.h" #include "chrome/common/chrome_isolated_world_ids.h" #include "chrome/common/url_constants.h" #include "components/sessions/content/session_tab_helper.h" @@ -111,8 +110,9 @@ [[NSNumber alloc] initWithInt:session_tab_helper->session_id().id()]); [self setUniqueID:numID]; - if ([self tempURL]) + if ([self tempURL]) { [self setURL:[self tempURL]]; + } } - (NSString*)URL { @@ -151,8 +151,9 @@ } NavigationEntry* entry = _webContents->GetController().GetActiveEntry(); - if (!entry) + if (!entry) { return; + } const GURL& previousURL = entry->GetVirtualURL(); _webContents->OpenURL(OpenURLParams( @@ -163,8 +164,9 @@ - (NSString*)title { NavigationEntry* entry = _webContents->GetController().GetActiveEntry(); - if (!entry) + if (!entry) { return nil; + } std::u16string title = entry ? entry->GetTitle() : std::u16string(); return base::SysUTF16ToNSString(title); @@ -176,65 +178,54 @@ } - (void)handlesUndoScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_UNDO); _webContents->Undo(); } - (void)handlesRedoScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_REDO); _webContents->Redo(); } - (void)handlesCutScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_CUT); _webContents->Cut(); } - (void)handlesCopyScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_COPY); _webContents->Copy(); } - (void)handlesPasteScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_PASTE); _webContents->Paste(); } - (void)handlesSelectAllScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA( - AppleScript::AppleScriptCommand::TAB_SELECT_ALL); _webContents->SelectAll(); } - (void)handlesGoBackScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_GO_BACK); NavigationController& navigationController = _webContents->GetController(); - if (navigationController.CanGoBack()) + if (navigationController.CanGoBack()) { navigationController.GoBack(); + } } - (void)handlesGoForwardScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA( - AppleScript::AppleScriptCommand::TAB_GO_FORWARD); NavigationController& navigationController = _webContents->GetController(); - if (navigationController.CanGoForward()) + if (navigationController.CanGoForward()) { navigationController.GoForward(); + } } - (void)handlesReloadScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_RELOAD); NavigationController& navigationController = _webContents->GetController(); const bool checkForRepost = true; navigationController.Reload(content::ReloadType::NORMAL, checkForRepost); } - (void)handlesStopScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_STOP); _webContents->Stop(); } - (void)handlesPrintScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_PRINT); bool initiated = printing::PrintViewManager::FromWebContents(_webContents) ->PrintNow(_webContents->GetPrimaryMainFrame()); if (!initiated) { @@ -243,7 +234,6 @@ } - (void)handlesSaveScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_SAVE); NSDictionary* dictionary = [command evaluatedArguments]; NSURL* fileURL = dictionary[@"File"]; @@ -279,13 +269,10 @@ } - (void)handlesCloseScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_CLOSE); _webContents->GetDelegate()->CloseContents(_webContents); } - (void)handlesViewSourceScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA( - AppleScript::AppleScriptCommand::TAB_VIEW_SOURCE); NavigationEntry* entry = _webContents->GetController().GetLastCommittedEntry(); if (entry) { @@ -298,9 +285,6 @@ } - (id)handlesExecuteJavascriptScriptCommand:(NSScriptCommand*)command { - AppleScript::LogAppleScriptUMA( - AppleScript::AppleScriptCommand::TAB_EXECUTE_JAVASCRIPT); - if (!chrome::mac::IsJavaScriptEnabledForProfile(_profile)) { AppleScript::SetError(AppleScript::errJavaScriptUnsupported); return nil;
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.mm b/chrome/browser/ui/cocoa/applescript/window_applescript.mm index 54d69721..8549698 100644 --- a/chrome/browser/ui/cocoa/applescript/window_applescript.mm +++ b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
@@ -24,7 +24,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/cocoa/applescript/constants_applescript.h" #include "chrome/browser/ui/cocoa/applescript/error_applescript.h" -#include "chrome/browser/ui/cocoa/applescript/metrics_applescript.h" #import "chrome/browser/ui/cocoa/applescript/tab_applescript.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" @@ -117,8 +116,9 @@ - (NSWindow*)nativeHandle { // window() can be NULL during startup. - if (_browser->window()) + if (_browser->window()) { return _browser->window()->GetNativeWindow().GetNativeNSWindow(); + } return nil; } @@ -152,8 +152,9 @@ - (NSString*)mode { Profile* profile = _browser->profile(); - if (profile->IsOffTheRecord()) + if (profile->IsOffTheRecord()) { return AppleScript::kIncognitoWindowMode; + } return AppleScript::kNormalWindowMode; } @@ -231,8 +232,9 @@ } - (void)removeFromTabsAtIndex:(int)index { - if (index < 0 || index >= _browser->tab_strip_model()->count()) + if (index < 0 || index >= _browser->tab_strip_model()->count()) { return; + } _browser->tab_strip_model()->CloseWebContentsAt( index, TabCloseTypes::CLOSE_CREATE_HISTORICAL_TAB); } @@ -253,10 +255,11 @@ - (NSComparisonResult)windowComparator:(WindowAppleScript*)otherWindow { int thisIndex = [[self orderedIndex] intValue]; int otherIndex = [[otherWindow orderedIndex] intValue]; - if (thisIndex < otherIndex) + if (thisIndex < otherIndex) { return NSOrderedAscending; - else if (thisIndex > otherIndex) + } else if (thisIndex > otherIndex) { return NSOrderedDescending; + } // Indexes can never be same. NOTREACHED(); return NSOrderedSame; @@ -272,11 +275,10 @@ } - (void)handlesCloseScriptCommand:(NSCloseCommand*)command { - AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::WINDOW_CLOSE); - // window() can be NULL during startup. - if (_browser->window()) + if (_browser->window()) { _browser->window()->Close(); + } } @end
diff --git a/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc b/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc index efa3404e..938dce7 100644 --- a/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc +++ b/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ui/exclusive_access/exclusive_access_controller_base.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h"
diff --git a/chrome/browser/ui/exclusive_access/mouse_lock_controller.cc b/chrome/browser/ui/exclusive_access/mouse_lock_controller.cc index 83b9c4ba..d4ce7850 100644 --- a/chrome/browser/ui/exclusive_access/mouse_lock_controller.cc +++ b/chrome/browser/ui/exclusive_access/mouse_lock_controller.cc
@@ -7,7 +7,6 @@ #include "base/functional/bind.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
diff --git a/chrome/browser/ui/global_error/global_error_service.cc b/chrome/browser/ui/global_error/global_error_service.cc index 3dc3c9d..6de441a 100644 --- a/chrome/browser/ui/global_error/global_error_service.cc +++ b/chrome/browser/ui/global_error/global_error_service.cc
@@ -8,7 +8,6 @@ #include "base/observer_list.h" #include "base/ranges/algorithm.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/global_error/global_error.h" #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
diff --git a/chrome/browser/ui/keyboard_lock_interactive_browsertest.cc b/chrome/browser/ui/keyboard_lock_interactive_browsertest.cc index 7adc3f48..02fc5fd 100644 --- a/chrome/browser/ui/keyboard_lock_interactive_browsertest.cc +++ b/chrome/browser/ui/keyboard_lock_interactive_browsertest.cc
@@ -104,6 +104,9 @@ bool RequestKeyboardLock(bool lock_all_keys = true); bool CancelKeyboardLock(); bool DisablePreventDefaultOnTestPage(); +#if BUILDFLAG(IS_MAC) + void ExitFullscreen(); +#endif ExclusiveAccessManager* GetExclusiveAccessManager() { return browser()->exclusive_access_manager(); @@ -118,7 +121,8 @@ net::EmbeddedTestServer https_test_server_; #if BUILDFLAG(IS_MAC) - ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen_; + std::unique_ptr<ui::test::ScopedFakeNSWindowFullscreen> fake_fullscreen_ = + std::make_unique<ui::test::ScopedFakeNSWindowFullscreen>(); #endif }; @@ -185,6 +189,12 @@ return ExecuteScript(GetActiveWebContents(), kKeyboardUnlockMethodCall); } +#if BUILDFLAG(IS_MAC) +void KeyboardLockInteractiveBrowserTest::ExitFullscreen() { + fake_fullscreen_.reset(); +} +#endif + bool KeyboardLockInteractiveBrowserTest::DisablePreventDefaultOnTestPage() { // We cannot test browser shortcuts in JS fullscreen with the default webpage // behavior as it will prevent default on every keypress. Since we want to @@ -639,4 +649,11 @@ ui_test_utils::DownloadURL(browser(), download_url); ASSERT_TRUE(IsKeyboardLockActive()); +#if BUILDFLAG(IS_MAC) + // Must exit fullscreen before ending the test to prevent crashing while + // tearing down the test browser, due to the download bubble being shown on + // changing the fullscreen state while the browser is being destroyed. + CancelKeyboardLock(); + ExitFullscreen(); +#endif }
diff --git a/chrome/browser/ui/media_router/media_router_ui.cc b/chrome/browser/ui/media_router/media_router_ui.cc index 70a63dc6..f7d0a7b0 100644 --- a/chrome/browser/ui/media_router/media_router_ui.cc +++ b/chrome/browser/ui/media_router/media_router_ui.cc
@@ -19,7 +19,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h" #include "chrome/browser/media/webrtc/desktop_media_picker_controller.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/media_router/media_sink_with_cast_modes.h"
diff --git a/chrome/browser/ui/network_profile_bubble.cc b/chrome/browser/ui/network_profile_bubble.cc index 58ecb952..f854178 100644 --- a/chrome/browser/ui/network_profile_bubble.cc +++ b/chrome/browser/ui/network_profile_bubble.cc
@@ -127,7 +127,7 @@ // Try to create some non-empty temp file in the profile dir and use // it to check if there is a reparse-point free path to it. if (base::CreateTemporaryFileInDir(profile_folder, &temp_file) && - (base::WriteFile(temp_file, ".", 1) == 1)) { + base::WriteFile(temp_file, ".")) { base::FilePath normalized_temp_file; if (!base::NormalizeFilePath(temp_file, &normalized_temp_file)) profile_on_network = true;
diff --git a/chrome/browser/ui/page_info/chrome_page_info_client.cc b/chrome/browser/ui/page_info/chrome_page_info_client.cc index 8c1d35c..46d62dc 100644 --- a/chrome/browser/ui/page_info/chrome_page_info_client.cc +++ b/chrome/browser/ui/page_info/chrome_page_info_client.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ui/page_info/chrome_page_info_client.h" #include "chrome/browser/android/resource_mapper.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/page_info/chrome_page_info_delegate.h" #include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/performance_controls/tab_discard_tab_helper.cc b/chrome/browser/ui/performance_controls/tab_discard_tab_helper.cc index e11fad4..eee3506 100644 --- a/chrome/browser/ui/performance_controls/tab_discard_tab_helper.cc +++ b/chrome/browser/ui/performance_controls/tab_discard_tab_helper.cc
@@ -62,7 +62,10 @@ // them causes the state to get reset. return; } - was_discarded_ = navigation_handle->ExistingDocumentWasDiscarded(); + discard_reason_ = GetDiscardReason(navigation_handle); + was_discarded_ = + discard_reason_.has_value() && + discard_reason_.value() == mojom::LifecycleUnitDiscardReason::PROACTIVE; was_animated_ = false; was_chip_hidden_ = false; is_page_supported_ = DoesChipSupportPage(navigation_handle->GetURL()); @@ -72,4 +75,20 @@ return !url.SchemeIs(content::kChromeUIScheme); } +absl::optional<mojom::LifecycleUnitDiscardReason> +TabDiscardTabHelper::GetDiscardReason( + content::NavigationHandle* navigation_handle) const { + if (navigation_handle->ExistingDocumentWasDiscarded()) { + auto* pre_discard_resource_usage = performance_manager::user_tuning:: + UserPerformanceTuningManager::PreDiscardResourceUsage::FromWebContents( + navigation_handle->GetWebContents()); + return pre_discard_resource_usage == nullptr + ? absl::nullopt + : absl::make_optional<mojom::LifecycleUnitDiscardReason>( + pre_discard_resource_usage->discard_reason()); + } + + return absl::nullopt; +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(TabDiscardTabHelper);
diff --git a/chrome/browser/ui/performance_controls/tab_discard_tab_helper.h b/chrome/browser/ui/performance_controls/tab_discard_tab_helper.h index 0df95c7..344d93d1 100644 --- a/chrome/browser/ui/performance_controls/tab_discard_tab_helper.h +++ b/chrome/browser/ui/performance_controls/tab_discard_tab_helper.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_TAB_DISCARD_TAB_HELPER_H_ #define CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_TAB_DISCARD_TAB_HELPER_H_ +#include "chrome/browser/resource_coordinator/lifecycle_unit_state.mojom-shared.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents_observer.h" @@ -58,10 +59,14 @@ // given URL bool DoesChipSupportPage(const GURL& url) const; + absl::optional<mojom::LifecycleUnitDiscardReason> GetDiscardReason( + content::NavigationHandle* navigation_handle) const; + bool was_discarded_ = false; bool was_animated_ = false; bool was_chip_hidden_ = false; bool is_page_supported_ = false; + absl::optional<mojom::LifecycleUnitDiscardReason> discard_reason_; WEB_CONTENTS_USER_DATA_KEY_DECL(); };
diff --git a/chrome/browser/ui/quick_answers/quick_answers_controller_impl.cc b/chrome/browser/ui/quick_answers/quick_answers_controller_impl.cc index 0ffe6c3..5dd94d0 100644 --- a/chrome/browser/ui/quick_answers/quick_answers_controller_impl.cc +++ b/chrome/browser/ui/quick_answers/quick_answers_controller_impl.cc
@@ -12,6 +12,7 @@ #include "chromeos/strings/grit/chromeos_strings.h" #include "components/prefs/pref_service.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/views/controls/menu/menu_controller.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ui/quick_answers/quick_answers_state_ash.h" @@ -220,8 +221,11 @@ return; } - if (visibility_ == QuickAnswersVisibility::kClosed) + auto* active_menu_controller = views::MenuController::GetActiveInstance(); + if (visibility_ == QuickAnswersVisibility::kClosed || + !active_menu_controller || !active_menu_controller->owner()) { return; + } query_ = processed_request.preprocessed_output.query; title_ = processed_request.preprocessed_output.intent_info.intent_text;
diff --git a/chrome/browser/ui/quick_answers/quick_answers_controller_unittest.cc b/chrome/browser/ui/quick_answers/quick_answers_controller_unittest.cc index e5ac50c..edaa5c7f 100644 --- a/chrome/browser/ui/quick_answers/quick_answers_controller_unittest.cc +++ b/chrome/browser/ui/quick_answers/quick_answers_controller_unittest.cc
@@ -11,8 +11,10 @@ #include "chrome/browser/ui/quick_answers/ui/user_consent_view.h" #include "chromeos/components/quick_answers/public/cpp/quick_answers_state.h" #include "chromeos/components/quick_answers/quick_answers_client.h" +#include "chromeos/components/quick_answers/quick_answers_model.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" +#include "ui/views/controls/menu/menu_controller.h" namespace { @@ -223,3 +225,32 @@ const views::View* consent_view = GetConsentView(); EXPECT_EQ(123, consent_view->GetBoundsInScreen().x()); } + +TEST_F(QuickAnswersControllerTest, ShouldNotCrashWhenContextMenuCloses) { + ShowConsentView(); + + auto* active_menu_controller = views::MenuController::GetActiveInstance(); + // Ensure that the context menu currently exists and has a non-null owner. + ASSERT_TRUE(active_menu_controller != nullptr); + ASSERT_TRUE(active_menu_controller->owner() != nullptr); + + // Simulate closing the context menu. + ChromeQuickAnswersTestBase::ResetMenuParent(); + + // Simulate returning a quick answers request after the context menu closed. + // This should *not* result in a crash. + std::unique_ptr<quick_answers::QuickAnswersRequest> processed_request = + std::make_unique<quick_answers::QuickAnswersRequest>(); + processed_request->selected_text = "unfathomable"; + quick_answers::PreprocessedOutput expected_processed_output; + expected_processed_output.intent_info.intent_text = "unfathomable"; + expected_processed_output.query = "Define unfathomable"; + expected_processed_output.intent_info.intent_type = + quick_answers::IntentType::kDictionary; + processed_request->preprocessed_output = expected_processed_output; + controller()->OnRequestPreprocessFinished(*processed_request); + + // Confirm that the quick answers views are not showing. + EXPECT_FALSE(ui_controller()->IsShowingUserConsentView()); + EXPECT_FALSE(ui_controller()->IsShowingQuickAnswersView()); +}
diff --git a/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.cc b/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.cc index 447baa0..3330ed0e 100644 --- a/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.cc +++ b/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.cc
@@ -48,3 +48,8 @@ views::MenuAnchorPosition::kTopLeft, ui::MENU_SOURCE_MOUSE); } + +void ChromeQuickAnswersTestBase::ResetMenuParent() { + CHECK(menu_parent_.get() != nullptr); + menu_parent_.reset(); +}
diff --git a/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.h b/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.h index 8c3749f30..464980e 100644 --- a/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.h +++ b/chrome/browser/ui/quick_answers/test/chrome_quick_answers_test_base.h
@@ -36,6 +36,7 @@ protected: void CreateAndShowBasicMenu(); + void ResetMenuParent(); private: // Menu.
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 4b970a2..81d8e44 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -271,8 +271,7 @@ base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); - base::WriteFile(output_file, output_string.data(), - static_cast<int>(output_string.size())); + base::WriteFile(output_file, output_string); } // Returns whether |profile_info.profile| can be opened during Chrome startup
diff --git a/chrome/browser/ui/tabs/existing_tab_group_sub_menu_model.cc b/chrome/browser/ui/tabs/existing_tab_group_sub_menu_model.cc index c04b5de..153b1c5a 100644 --- a/chrome/browser/ui/tabs/existing_tab_group_sub_menu_model.cc +++ b/chrome/browser/ui/tabs/existing_tab_group_sub_menu_model.cc
@@ -11,7 +11,6 @@ #include "base/metrics/user_metrics_action.h" #include "base/notreached.h" #include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_group.h" #include "chrome/browser/ui/tabs/tab_group_model.h"
diff --git a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc index f0fef24..fcac79cb 100644 --- a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc
@@ -118,7 +118,7 @@ ->GetFormDataImporter() ->iban_save_manager_for_testing(); iban_save_manager_->SetEventObserverForTesting(this); - AddEventObserverToController(); + AddEventObserverAndResetBubbleTypeToController(); } // The primary main frame's AutofillManager. @@ -255,9 +255,7 @@ CHECK(!GetSaveIbanBubbleView()); } - void ClickOnIbanValueTogglelButton() { - SaveIbanBubbleView* save_iban_bubble_views = GetSaveIbanBubbleView(); - CHECK(save_iban_bubble_views); + void ClickOnIbanValueToggleButton() { ClickOnDialogView( FindViewInBubbleById(DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON)); } @@ -315,12 +313,14 @@ return GetBrowser(0)->tab_strip_model()->GetActiveWebContents(); } - void AddEventObserverToController() { + void AddEventObserverAndResetBubbleTypeToController() { IbanBubbleControllerImpl* save_iban_bubble_controller_impl = static_cast<IbanBubbleControllerImpl*>( IbanBubbleController::GetOrCreate(GetActiveWebContents())); CHECK(save_iban_bubble_controller_impl); save_iban_bubble_controller_impl->SetEventObserverForTesting(this); + save_iban_bubble_controller_impl->SetBubbleTypeToLocalSaveForTesting( + IbanBubbleType::kLocalSave); } void ResetEventWaiterForSequence(std::list<DialogEvent> event_sequence) { @@ -353,12 +353,12 @@ } void ClickOnDialogViewAndWaitForWidgetDestruction(views::View* view) { - EXPECT_TRUE(GetSaveIbanBubbleView()); + EXPECT_TRUE(GetIbanBubbleView()); views::test::WidgetDestroyedWaiter destroyed_waiter( GetSaveIbanBubbleView()->GetWidget()); ClickOnDialogView(view); destroyed_waiter.Wait(); - EXPECT_FALSE(GetSaveIbanBubbleView()); + EXPECT_FALSE(GetIbanBubbleView()); } views::Textfield* nickname_input() { @@ -542,16 +542,16 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); - ClickOnIbanValueTogglelButton(); + ClickOnIbanValueToggleButton(); EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89"); - ClickOnIbanValueTogglelButton(); + ClickOnIbanValueToggleButton(); EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89"); - ClickOnIbanValueTogglelButton(); + ClickOnIbanValueToggleButton(); EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89"); - ClickOnIbanValueTogglelButton(); + ClickOnIbanValueToggleButton(); EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89"); } @@ -578,7 +578,7 @@ EXPECT_TRUE(nickname_label); EXPECT_EQ(nickname_label->GetText(), kNickname); // Verify the bubble type is manage saved IBAN. - EXPECT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban); + ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban); } // Tests the local save bubble. Ensures that clicking the omnibox icon opens @@ -599,7 +599,38 @@ EXPECT_FALSE(FindViewInBubbleById(DialogViewId::NICKNAME_LABEL)); // Verify the bubble type is manage saved IBAN. - EXPECT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban); + ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban); +} + +// Tests the manage saved bubble. Ensures that clicking the eye icon button +// successfully causes the IBAN value to be masked or unmasked. +IN_PROC_BROWSER_TEST_F(IbanBubbleViewFullFormBrowserTest, + Local_ClickingHideOrShowIbanValueManageView) { + FillForm(kIbanValue); + SubmitFormAndWaitForIbanLocalSaveBubble(); + + ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); + ClickOnSaveButton(); + WaitForObservedEvent(); + + // Open up manage IBANs bubble. + ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); + ClickOnView(GetSaveIbanIconView()); + WaitForObservedEvent(); + + // Verify the bubble type is manage saved IBAN. + ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban); + ClickOnIbanValueToggleButton(); + EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89"); + + ClickOnIbanValueToggleButton(); + EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89"); + + ClickOnIbanValueToggleButton(); + EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 1000 0000 0123 4567 89"); + + ClickOnIbanValueToggleButton(); + EXPECT_EQ(GetDisplayedIbanValue(), u"DE91 **** **** **** **67 89"); } } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc index c88eee9..2a33bc5 100644 --- a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc +++ b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.cc
@@ -8,12 +8,14 @@ #include "chrome/browser/ui/views/autofill/payments/dialog_view_ids.h" #include "chrome/browser/ui/views/autofill/payments/payments_view_util.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/grit/generated_resources.h" #include "components/autofill/core/browser/data_model/iban.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/views/controls/button/md_text_button.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/box_layout_view.h" +#include "ui/views/view_class_properties.h" namespace autofill { @@ -39,10 +41,6 @@ views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); } -std::u16string ManageSavedIbanBubbleView::GetIBANIdentifierString() { - return controller_->GetIBAN().GetIdentifierStringForAutofillDisplay(); -} - void ManageSavedIbanBubbleView::Show(DisplayReason reason) { ShowForReason(reason); AssignIdsToDialogButtons(); @@ -88,6 +86,11 @@ if (nickname_label_) { nickname_label_->SetID(DialogViewId::NICKNAME_LABEL); } + + DCHECK(iban_value_and_toggle_); + iban_value_and_toggle_->value()->SetID(DialogViewId::IBAN_VALUE_LABEL); + iban_value_and_toggle_->toggle_obscured()->SetID( + DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON); } void ManageSavedIbanBubbleView::Init() { @@ -113,13 +116,15 @@ AddChildView(std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_LABEL), views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY)); - // TODO(crbug.com/1349109): Revisit how the IBAN value will be shown if it's - // too long, same for nickname row. - AddChildView( - std::make_unique<views::Label>(GetIBANIdentifierString(), - views::style::CONTEXT_DIALOG_BODY_TEXT, - views::style::STYLE_PRIMARY)) - ->SetHorizontalAlignment(gfx::ALIGN_LEFT); + + iban_value_and_toggle_ = + AddChildView(std::make_unique<ObscurableLabelWithToggleButton>( + controller_->GetIBAN().GetIdentifierStringForAutofillDisplay( + /*is_value_masked=*/true), + controller_->GetIBAN().GetIdentifierStringForAutofillDisplay( + /*is_value_masked=*/false), + l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_SHOW_VALUE), + l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_HIDE_VALUE))); // Nickname label row will be added if a nickname was saved in the IBAN save // bubble, which is displayed previously in the flow. @@ -133,6 +138,8 @@ AddChildView(std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_PROMPT_NICKNAME), views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY)); + // TODO(crbug.com/1349109): Revisit how the nickname will be shown if it's + // too long. nickname_label_ = AddChildView(std::make_unique<views::Label>( controller_->GetIBAN().nickname(), views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY));
diff --git a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h index 5b125c1..fa753cb 100644 --- a/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h +++ b/chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h
@@ -8,7 +8,9 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/autofill/autofill_bubble_base.h" #include "chrome/browser/ui/autofill/payments/iban_bubble_controller.h" +#include "chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h" #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h" +#include "ui/views/controls/button/image_button.h" namespace autofill { @@ -28,10 +30,6 @@ void Show(DisplayReason reason); - // Gets the masked IBAN value to be displayed to the user (e.g., - // CH56 **** **** **** *800 9). - std::u16string GetIBANIdentifierString(); - // AutofillBubbleBase: void Hide() override; @@ -58,6 +56,10 @@ // saving the IBAN in the IBAN save bubble. raw_ptr<views::Label> nickname_label_ = nullptr; + // The view that toggles the masking/unmasking of the IBAN value displayed in + // the bubble. + raw_ptr<ObscurableLabelWithToggleButton> iban_value_and_toggle_; + raw_ptr<IbanBubbleController> controller_; };
diff --git a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc index 2d3b96c5..7fb09ac 100644 --- a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc +++ b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.cc
@@ -14,39 +14,15 @@ #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" -#include "ui/color/color_id.h" -#include "ui/color/color_provider.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/vector_icon_utils.h" -#include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/layout/box_layout.h" -#include "ui/views/layout/box_layout_view.h" #include "ui/views/layout/flex_layout_types.h" -#include "ui/views/vector_icons.h" #include "ui/views/view_class_properties.h" namespace autofill { -namespace { - -// Creates eye icon view to toggle between the masked or revealed IBAN value -// on click. -std::unique_ptr<views::ToggleImageButton> CreateIbanMaskingToggle( - views::Button::PressedCallback callback) { - auto button = std::make_unique<views::ToggleImageButton>(std::move(callback)); - button->SetTooltipText( - l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_SHOW_VALUE)); - button->SetToggledTooltipText( - l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_HIDE_VALUE)); - button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); - button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - button->SetToggled(false); - return button; -} - -} // namespace - SaveIbanBubbleView::SaveIbanBubbleView(views::View* anchor_view, content::WebContents* web_contents, IbanBubbleController* controller) @@ -70,12 +46,6 @@ AssignIdsToDialogButtonsForTesting(); // IN-TEST } -void SaveIbanBubbleView::ToggleIbanValueMasking() { - const bool is_value_masked = iban_value_masking_button_->GetToggled(); - iban_value_masking_button_->SetToggled(!is_value_masked); - iban_value_->SetText(GetIbanIdentifierString(is_value_masked)); -} - void SaveIbanBubbleView::Hide() { CloseBubble(); @@ -149,32 +119,20 @@ iban_view->AddChildView(std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_LABEL), - views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY)); - auto* iban_value_view = - iban_view->AddChildView(std::make_unique<views::BoxLayoutView>()); - iban_value_ = iban_value_view->AddChildView(std::make_unique<views::Label>( - GetIbanIdentifierString(/*is_value_masked=*/true), - views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY)); - iban_value_->SetProperty( - views::kFlexBehaviorKey, - views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred, - views::MaximumFlexSizeRule::kScaleToMaximum)); - iban_value_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY)); - iban_value_masking_button_ = - iban_value_view->AddChildView(CreateIbanMaskingToggle( - base::BindRepeating(&SaveIbanBubbleView::ToggleIbanValueMasking, - base::Unretained(this)))); - views::SetImageFromVectorIconWithColorId(iban_value_masking_button_, - views::kEyeIcon, ui::kColorIcon, - ui::kColorIconDisabled); - views::SetToggledImageFromVectorIconWithColorId( - iban_value_masking_button_, views::kEyeCrossedIcon, ui::kColorIcon, - ui::kColorIconDisabled); + iban_value_and_toggle_ = + iban_view->AddChildView(std::make_unique<ObscurableLabelWithToggleButton>( + controller_->GetIBAN().GetIdentifierStringForAutofillDisplay( + /*is_value_masked=*/true), + controller_->GetIBAN().GetIdentifierStringForAutofillDisplay( + /*is_value_masked=*/false), + l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_SHOW_VALUE), + l10n_util::GetStringUTF16(IDS_MANAGE_IBAN_VALUE_HIDE_VALUE))); iban_view->AddChildView(std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_IBAN_PROMPT_NICKNAME), - views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY)); + views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_PRIMARY)); nickname_textfield_ = iban_view->AddChildView(std::make_unique<views::Textfield>()); nickname_textfield_->SetAccessibleName( @@ -195,13 +153,11 @@ cancel_button->SetID(DialogViewId::CANCEL_BUTTON); } - DCHECK(iban_value_masking_button_); - iban_value_masking_button_->SetID( + DCHECK(iban_value_and_toggle_); + iban_value_and_toggle_->value()->SetID(DialogViewId::IBAN_VALUE_LABEL); + iban_value_and_toggle_->toggle_obscured()->SetID( DialogViewId::TOGGLE_IBAN_VALUE_MASKING_BUTTON); - DCHECK(iban_value_); - iban_value_->SetID(DialogViewId::IBAN_VALUE_LABEL); - if (nickname_textfield_) { nickname_textfield_->SetID(DialogViewId::NICKNAME_TEXTFIELD); } @@ -224,10 +180,4 @@ CreateMainContentView(); } -std::u16string SaveIbanBubbleView::GetIbanIdentifierString( - bool is_value_masked) const { - return controller_->GetIBAN().GetIdentifierStringForAutofillDisplay( - is_value_masked); -} - } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h index 060c4d3..53f2001 100644 --- a/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h +++ b/chrome/browser/ui/views/autofill/payments/save_iban_bubble_view.h
@@ -8,6 +8,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/autofill/autofill_bubble_base.h" #include "chrome/browser/ui/autofill/payments/iban_bubble_controller.h" +#include "chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h" #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/textfield/textfield.h" @@ -34,9 +35,6 @@ void Show(DisplayReason reason); - // Toggle displayed IBAN value to be masked or fully shown. - void ToggleIbanValueMasking(); - // AutofillBubbleBase: void Hide() override; @@ -66,16 +64,12 @@ private: friend class SaveIbanBubbleViewFullFormBrowserTest; - // If `is_value_masked` is true, gets the masked IBAN value to be displayed to - // the user (e.g., DE75 **** **** **** **61 99), otherwise, gets the unmasked - // IBAN valued grouped by four (e.g., DE75 5121 0800 1245 1261 99). - std::u16string GetIbanIdentifierString(bool is_value_masked) const; - raw_ptr<views::Textfield> nickname_textfield_ = nullptr; - // The view that toggles the masking/unmasking of an IBAN value. - raw_ptr<views::ToggleImageButton> iban_value_masking_button_ = nullptr; - raw_ptr<views::Label> iban_value_ = nullptr; + // The view that toggles the masking/unmasking of the IBAN value displayed in + // the bubble. + raw_ptr<ObscurableLabelWithToggleButton> iban_value_and_toggle_; + raw_ptr<IbanBubbleController> controller_; };
diff --git a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc new file mode 100644 index 0000000..afc9022 --- /dev/null +++ b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.cc
@@ -0,0 +1,68 @@ +// 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/views/controls/obscurable_label_with_toggle_button.h" + +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/color/color_id.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/image_button_factory.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/flex_layout_types.h" +#include "ui/views/style/typography.h" +#include "ui/views/vector_icons.h" +#include "ui/views/view_class_properties.h" + +ObscurableLabelWithToggleButton::ObscurableLabelWithToggleButton( + const std::u16string& obscured_value, + const std::u16string& revealed_value, + const std::u16string& toggle_button_tooltip, + const std::u16string& toggle_button_toggled_tooltip) + : obscured_value_(obscured_value), revealed_value_(revealed_value) { + value_ = AddChildView(std::make_unique<views::Label>( + obscured_value, views::style::CONTEXT_DIALOG_BODY_TEXT, + views::style::STYLE_PRIMARY)); + // TODO(crbug.com/1349109): Revisit how the value will be shown if it's too + // long. + value_->SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred, + views::MaximumFlexSizeRule::kScaleToMaximum)); + value_->SetHorizontalAlignment(gfx::ALIGN_LEFT); + + toggle_obscured_ = AddChildView(std::make_unique<views::ToggleImageButton>( + base::BindRepeating(&ObscurableLabelWithToggleButton::ToggleValueObscured, + base::Unretained(this)))); + toggle_obscured_->SetImageHorizontalAlignment( + views::ImageButton::ALIGN_CENTER); + toggle_obscured_->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); + toggle_obscured_->SetToggled(false); + views::SetImageFromVectorIconWithColorId(toggle_obscured_, views::kEyeIcon, + ui::kColorIcon, + ui::kColorIconDisabled); + views::SetToggledImageFromVectorIconWithColorId( + toggle_obscured_, views::kEyeCrossedIcon, ui::kColorIcon, + ui::kColorIconDisabled); + toggle_obscured_->SetTooltipText(toggle_button_tooltip); + toggle_obscured_->SetToggledTooltipText(toggle_button_toggled_tooltip); +} + +ObscurableLabelWithToggleButton::~ObscurableLabelWithToggleButton() = default; + +views::Label* ObscurableLabelWithToggleButton::value() { + return value_; +} + +views::ToggleImageButton* ObscurableLabelWithToggleButton::toggle_obscured() { + return toggle_obscured_; +} + +void ObscurableLabelWithToggleButton::ToggleValueObscured() { + const bool was_revealed = toggle_obscured_->GetToggled(); + toggle_obscured_->SetToggled(!was_revealed); + value_->SetText(was_revealed ? obscured_value_ : revealed_value_); +} + +BEGIN_METADATA(ObscurableLabelWithToggleButton, views::BoxLayoutView) +END_METADATA
diff --git a/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h new file mode 100644 index 0000000..7e4ea4d --- /dev/null +++ b/chrome/browser/ui/views/controls/obscurable_label_with_toggle_button.h
@@ -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. + +#ifndef CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_ +#define CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_ + +#include <string> + +#include "base/memory/raw_ptr.h" +#include "ui/views/layout/box_layout_view.h" + +namespace views { +class Label; +class ToggleImageButton; +} // namespace views + +// Creates a view with label and eye icon button that displays the obscured or +// unobscured label on clicking. +class ObscurableLabelWithToggleButton : public views::BoxLayoutView { + public: + METADATA_HEADER(ObscurableLabelWithToggleButton); + ObscurableLabelWithToggleButton( + const std::u16string& obscured_value, + const std::u16string& revealed_value, + const std::u16string& toggle_button_tooltip, + const std::u16string& toggle_button_toggled_tooltip); + ObscurableLabelWithToggleButton(const ObscurableLabelWithToggleButton&) = + delete; + ObscurableLabelWithToggleButton& operator=( + const ObscurableLabelWithToggleButton&) = delete; + ~ObscurableLabelWithToggleButton() override; + + views::Label* value(); + views::ToggleImageButton* toggle_obscured(); + + private: + // Toggles between the obscured and revealed values. + void ToggleValueObscured(); + + const std::u16string obscured_value_; + const std::u16string revealed_value_; + + raw_ptr<views::Label> value_ = nullptr; + // The button that toggles whether the value is obscured. + raw_ptr<views::ToggleImageButton> toggle_obscured_ = nullptr; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_CONTROLS_OBSCURABLE_LABEL_WITH_TOGGLE_BUTTON_H_
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc index c9c4c82..78a0207 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
@@ -22,6 +22,7 @@ #include "components/vector_icons/vector_icons.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/metadata/metadata_impl_macros.h" #include "ui/gfx/text_constants.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/button.h" @@ -80,6 +81,21 @@ return views::AsViewClass<InstalledExtensionMenuItemView>(view); } +// Returns the InstalledExtensionsMenuItemView corresponding to `action_id` if +// it is a children of `parent_view`. The children of the parent view must be +// InstalledExtensionsMenuItemView, otherwise it will DCHECK. +InstalledExtensionMenuItemView* GetMenuItem( + views::View* parent_view, + const ToolbarActionsModel::ActionId& action_id) { + for (auto* view : parent_view->children()) { + auto* item_view = GetAsMenuItem(view); + if (item_view->view_controller()->GetId() == action_id) { + return item_view; + } + } + return nullptr; +} + } // namespace class RequestsAccessSection : public views::BoxLayoutView { @@ -249,6 +265,12 @@ menu_items_->AddChildViewAt(std::move(item), index); } +void ExtensionsMenuMainPageView::RemoveMenuItem( + const ToolbarActionsModel::ActionId& action_id) { + views::View* item = GetMenuItem(menu_items_, action_id); + menu_items_->RemoveChildViewT(item); +} + void ExtensionsMenuMainPageView::OnToggleButtonPressed() { // TODO(crbug.com/1390952): Update user site setting and add test. UpdateSiteSettingToggleText(site_settings_toggle_); @@ -271,6 +293,12 @@ } } +void ExtensionsMenuMainPageView::UpdatePinButtons() { + for (views::View* view : menu_items_->children()) { + GetAsMenuItem(view)->UpdatePinButton(); + } +} + std::vector<InstalledExtensionMenuItemView*> ExtensionsMenuMainPageView::GetMenuItemsForTesting() const { std::vector<InstalledExtensionMenuItemView*> menu_item_views; @@ -283,3 +311,6 @@ content::WebContents* ExtensionsMenuMainPageView::GetActiveWebContents() const { return browser_->tab_strip_model()->GetActiveWebContents(); } + +BEGIN_METADATA(ExtensionsMenuMainPageView, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h index 9b1b6d8..669f5c1 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h
@@ -9,6 +9,8 @@ #include "chrome/browser/ui/toolbar/toolbar_actions_model.h" #include "ui/views/view.h" +#include "ui/base/metadata/metadata_header_macros.h" + namespace content { class WebContents; } @@ -16,7 +18,7 @@ namespace views { class Label; class ToggleButton; -} +} // namespace views class Browser; class ExtensionsMenuNavigationHandler; @@ -27,6 +29,8 @@ // The main view of the extensions menu. class ExtensionsMenuMainPageView : public views::View { public: + METADATA_HEADER(ExtensionsMenuMainPageView); + explicit ExtensionsMenuMainPageView( Browser* browser, ExtensionsMenuNavigationHandler* navigation_handler); @@ -43,9 +47,15 @@ bool allow_pinning, int index); + // Removes the menu item corresponding to `action_id`. + void RemoveMenuItem(const ToolbarActionsModel::ActionId& action_id); + // Updates the view based on `web_contents`. void Update(content::WebContents* web_contents); + // Updates the pin button of each menu item. + void UpdatePinButtons(); + void OnToggleButtonPressed(); // Accessors used by tests:
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc index 2496bf5..8e2a4606 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
@@ -6,6 +6,8 @@ #include "base/feature_list.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/extensions/chrome_test_extension_loader.h" +#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h" #include "chrome/browser/ui/views/extensions/extensions_menu_button.h" #include "chrome/browser/ui/views/extensions/extensions_menu_coordinator.h" @@ -14,8 +16,11 @@ #include "chrome/browser/ui/views/extensions/extensions_menu_view_controller.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h" +#include "extensions/browser/test_extension_registry_observer.h" #include "extensions/common/extension_features.h" +#include "extensions/test/test_extension_dir.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/views/view_utils.h" namespace { @@ -73,11 +78,13 @@ // Asserts there is exactly one menu item and then returns it. InstalledExtensionMenuItemView* GetOnlyMenuItem(); + // Since this is a unittest, the extensions menu widget sometimes needs a + // nudge to re-layout the views. + void LayoutMenuIfNecessary(); + void ClickPinButton(InstalledExtensionMenuItemView* menu_item); void ClickSitePermissionsButton(InstalledExtensionMenuItemView* menu_item); - ExtensionsToolbarButton* extensions_button(); - ExtensionsMenuCoordinator* menu_coordinator(); ExtensionsMenuMainPageView* main_page(); ExtensionsMenuSitePermissionsPageView* site_permissions_page(); std::vector<InstalledExtensionMenuItemView*> menu_items(); @@ -109,6 +116,10 @@ return *items.begin(); } +void ExtensionsMenuMainPageViewUnitTest::LayoutMenuIfNecessary() { + menu_coordinator()->GetExtensionsMenuWidget()->LayoutRootViewIfNecessary(); +} + void ExtensionsMenuMainPageViewUnitTest::ClickPinButton( InstalledExtensionMenuItemView* menu_item) { ClickButton(menu_item->pin_button_for_testing()); @@ -121,16 +132,6 @@ WaitForAnimation(); } -ExtensionsToolbarButton* -ExtensionsMenuMainPageViewUnitTest::extensions_button() { - return extensions_container()->GetExtensionsButton(); -} - -ExtensionsMenuCoordinator* -ExtensionsMenuMainPageViewUnitTest::menu_coordinator() { - return extensions_container()->GetExtensionsMenuCoordinatorForTesting(); -} - ExtensionsMenuMainPageView* ExtensionsMenuMainPageViewUnitTest::main_page() { ExtensionsMenuViewController* menu_controller = menu_coordinator()->GetControllerForTesting(); @@ -311,5 +312,158 @@ ExtensionsMenuSitePermissionsPageView* page = site_permissions_page(); ASSERT_TRUE(page); - EXPECT_EQ(page->GetExtensionIdForTesting(), extensionA->id()); + EXPECT_EQ(page->extension_id(), extensionA->id()); +} + +TEST_F(ExtensionsMenuMainPageViewUnitTest, + AddAndRemoveExtensionWhenMainPageIsOpen) { + constexpr char kExtensionA[] = "A Extension"; + constexpr char kExtensionC[] = "C Extension"; + InstallExtension(kExtensionA); + InstallExtension(kExtensionC); + + ShowMenu(); + + // Verify the order of the extensions is A,C. + { + std::vector<InstalledExtensionMenuItemView*> items = menu_items(); + ASSERT_EQ(items.size(), 2u); + std::vector<std::string> expected_names{kExtensionA, kExtensionC}; + EXPECT_EQ(GetNamesFromMenuItems(items), expected_names); + } + + // Add a new extension while the menu is open. + constexpr char kExtensionB[] = "B Extension"; + auto extensionB = InstallExtension(kExtensionB); + LayoutMenuIfNecessary(); + + // Extension should be added in the correct place. + // Verify the new order is A,B,C. + { + std::vector<InstalledExtensionMenuItemView*> items = menu_items(); + ASSERT_EQ(items.size(), 3u); + std::vector<std::string> expected_names{kExtensionA, kExtensionB, + kExtensionC}; + EXPECT_EQ(GetNamesFromMenuItems(items), expected_names); + } + + // Remove a extension while the menu is open + UninstallExtension(extensionB->id()); + LayoutMenuIfNecessary(); + + // Verify the new order is A,C. + { + std::vector<InstalledExtensionMenuItemView*> items = menu_items(); + ASSERT_EQ(items.size(), 2u); + std::vector<std::string> expected_names{kExtensionA, kExtensionC}; + EXPECT_EQ(GetNamesFromMenuItems(items), expected_names); + } +} + +TEST_F(ExtensionsMenuMainPageViewUnitTest, DisableAndEnableExtension) { + constexpr char kName[] = "Test Extension"; + auto extension_id = InstallExtension(kName)->id(); + + ShowMenu(); + + InstalledExtensionMenuItemView* menu_item = GetOnlyMenuItem(); + EXPECT_EQ(menu_items().size(), 1u); + ClickPinButton(menu_item); + + DisableExtension(extension_id); + LayoutMenuIfNecessary(); + WaitForAnimation(); + + EXPECT_EQ(menu_items().size(), 0u); + EXPECT_THAT(GetPinnedExtensionNames(), testing::IsEmpty()); + + EnableExtension(extension_id); + LayoutMenuIfNecessary(); + WaitForAnimation(); + + EXPECT_EQ(menu_items().size(), 1u); + EXPECT_EQ(GetPinnedExtensionNames(), std::vector<std::string>{kName}); +} + +// Tests that when an extension is reloaded it remains visible in the toolbar +// and extensions menu. +TEST_F(ExtensionsMenuMainPageViewUnitTest, ReloadExtension) { + // The extension must have a manifest to be reloaded. + extensions::TestExtensionDir extension_directory; + constexpr char kManifest[] = R"({ + "name": "Test Extension", + "version": "1", + "manifest_version": 3 + })"; + extension_directory.WriteManifest(kManifest); + extensions::ChromeTestExtensionLoader loader(profile()); + scoped_refptr<const extensions::Extension> extension = + loader.LoadExtension(extension_directory.UnpackedPath()); + + ShowMenu(); + + InstalledExtensionMenuItemView* menu_item = GetOnlyMenuItem(); + EXPECT_EQ(menu_items().size(), 1u); + + ClickPinButton(menu_item); + EXPECT_TRUE( + extensions_container()->IsActionVisibleOnToolbar(extension->id())); + + // Reload the extension. + extensions::TestExtensionRegistryObserver registry_observer( + extensions::ExtensionRegistry::Get(profile())); + ReloadExtension(extension->id()); + ASSERT_TRUE(registry_observer.WaitForExtensionLoaded()); + LayoutMenuIfNecessary(); + + // Verify the extension is visible in the menu and on the toolbar. + menu_item = GetOnlyMenuItem(); + EXPECT_EQ(menu_items().size(), 1u); + EXPECT_TRUE( + extensions_container()->IsActionVisibleOnToolbar(extension->id())); +} + +// Tests that a when an extension is reloaded with manifest errors, and +// therefore fails to be loaded into Chrome, it's removed from the toolbar and +// extensions menu. +TEST_F(ExtensionsMenuMainPageViewUnitTest, InstalledTab_ReloadExtensionFailed) { + extensions::TestExtensionDir extension_directory; + constexpr char kManifest[] = R"({ + "name": "Test Extension", + "version": "1", + "manifest_version": 3 + })"; + extension_directory.WriteManifest(kManifest); + extensions::ChromeTestExtensionLoader loader(profile()); + scoped_refptr<const extensions::Extension> extension = + loader.LoadExtension(extension_directory.UnpackedPath()); + + ShowMenu(); + + InstalledExtensionMenuItemView* menu_item = GetOnlyMenuItem(); + EXPECT_EQ(menu_items().size(), 1u); + + ClickPinButton(menu_item); + EXPECT_TRUE( + extensions_container()->IsActionVisibleOnToolbar(extension->id())); + + // Replace the extension's valid manifest with one containing errors. In this + // case, 'version' keys is missing. + constexpr char kManifestWithErrors[] = R"({ + "name": "Test", + "manifest_version": 3, + })"; + extension_directory.WriteManifest(kManifestWithErrors); + + // Reload the extension. It should fail due to the manifest errors. + extension_service()->ReloadExtensionWithQuietFailure(extension->id()); + base::RunLoop().RunUntilIdle(); + LayoutMenuIfNecessary(); + + // Verify the extension is no longer visible in the menu or on the toolbar + // since it was removed. + EXPECT_EQ(menu_items().size(), 0u); + for (views::View* child : extensions_container()->children()) { + EXPECT_FALSE(views::IsViewClass<ToolbarActionView>(child)); + } }
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.cc index c065fa5..a91cb9c2 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.cc
@@ -13,6 +13,7 @@ #include "components/vector_icons/vector_icons.h" #include "extensions/common/extension_id.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/models/image_model.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/button.h" @@ -111,3 +112,6 @@ } // TODO(crbug.com/1390952): Update content once content is added to this page. + +BEGIN_METADATA(ExtensionsMenuSitePermissionsPageView, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h index 2c51b2e..c46de52f 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h +++ b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h
@@ -17,6 +17,8 @@ class ExtensionsMenuSitePermissionsPageView : public views::View { public: + METADATA_HEADER(ExtensionsMenuSitePermissionsPageView); + explicit ExtensionsMenuSitePermissionsPageView( Browser* browser, std::u16string extension_name, @@ -29,8 +31,7 @@ const ExtensionsMenuSitePermissionsPageView&) = delete; ~ExtensionsMenuSitePermissionsPageView() override = default; - // Accessors used by tests: - extensions::ExtensionId GetExtensionIdForTesting() { return extension_id_; } + extensions::ExtensionId extension_id() { return extension_id_; } private: extensions::ExtensionId extension_id_;
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view_unittest.cc new file mode 100644 index 0000000..ae0a2c5 --- /dev/null +++ b/chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view_unittest.cc
@@ -0,0 +1,174 @@ +// 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/views/extensions/extensions_menu_main_page_view.h" + +#include "base/feature_list.h" +#include "chrome/browser/extensions/chrome_test_extension_loader.h" +#include "chrome/browser/ui/views/extensions/extensions_menu_coordinator.h" +#include "chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h" +#include "chrome/browser/ui/views/extensions/extensions_menu_view_controller.h" +#include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h" +#include "chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h" +#include "extensions/browser/test_extension_registry_observer.h" +#include "extensions/common/extension_features.h" +#include "extensions/test/test_extension_dir.h" +#include "testing/gmock/include/gmock/gmock.h" + +class ExtensionsSitePermissionsPageViewUnitTest + : public ExtensionsToolbarUnitTest { + public: + ExtensionsSitePermissionsPageViewUnitTest(); + ~ExtensionsSitePermissionsPageViewUnitTest() override = default; + ExtensionsSitePermissionsPageViewUnitTest( + const ExtensionsSitePermissionsPageViewUnitTest&) = delete; + ExtensionsSitePermissionsPageViewUnitTest& operator=( + const ExtensionsSitePermissionsPageViewUnitTest&) = delete; + + // Opens menu and navigates to site permissions page for `extension_id`. + void ShowSitePermissionsPage(extensions::ExtensionId extension_id); + + // Returns whether me menu has the main page opened. + bool IsMainPageOpened(); + + // Returns whether the menu has the `extension_id` site permissions page + // opened. + bool IsSitePermissionsPageOpened(extensions::ExtensionId extension_id); + + // Since this is a unittest, the extensions menu widget sometimes needs a + // nudge to re-layout the views. + void LayoutMenuIfNecessary(); + + ExtensionsMenuMainPageView* main_page(); + ExtensionsMenuSitePermissionsPageView* site_permissions_page(); + + // ExtensionsToolbarUnitTest: + void SetUp() override; + + private: + base::test::ScopedFeatureList scoped_feature_list_; + raw_ptr<content::WebContentsTester> web_contents_tester_; +}; + +ExtensionsSitePermissionsPageViewUnitTest:: + ExtensionsSitePermissionsPageViewUnitTest() { + scoped_feature_list_.InitAndEnableFeature( + extensions_features::kExtensionsMenuAccessControl); +} + +void ExtensionsSitePermissionsPageViewUnitTest::ShowSitePermissionsPage( + extensions::ExtensionId extension_id) { + menu_coordinator()->Show(extensions_button(), extensions_container()); + menu_coordinator()->GetControllerForTesting()->OpenSitePermissionsPage( + extension_id); +} + +bool ExtensionsSitePermissionsPageViewUnitTest::IsMainPageOpened() { + ExtensionsMenuMainPageView* page = main_page(); + return !!page; +} + +bool ExtensionsSitePermissionsPageViewUnitTest::IsSitePermissionsPageOpened( + extensions::ExtensionId extension_id) { + ExtensionsMenuSitePermissionsPageView* page = site_permissions_page(); + return page && page->extension_id() == extension_id; +} + +void ExtensionsSitePermissionsPageViewUnitTest::LayoutMenuIfNecessary() { + menu_coordinator()->GetExtensionsMenuWidget()->LayoutRootViewIfNecessary(); +} + +ExtensionsMenuMainPageView* +ExtensionsSitePermissionsPageViewUnitTest::main_page() { + ExtensionsMenuViewController* menu_controller = + menu_coordinator()->GetControllerForTesting(); + return menu_controller ? menu_controller->GetMainPageViewForTesting() + : nullptr; +} + +ExtensionsMenuSitePermissionsPageView* +ExtensionsSitePermissionsPageViewUnitTest::site_permissions_page() { + ExtensionsMenuViewController* menu_controller = + menu_coordinator()->GetControllerForTesting(); + return menu_controller ? menu_controller->GetSitePermissionsPageForTesting() + : nullptr; +} + +void ExtensionsSitePermissionsPageViewUnitTest::SetUp() { + ExtensionsToolbarUnitTest::SetUp(); + // Menu needs web contents at construction, so we need to add them to every + // test. + web_contents_tester_ = AddWebContentsAndGetTester(); +} + +TEST_F(ExtensionsSitePermissionsPageViewUnitTest, + AddAndRemoveExtensionWhenSitePermissionsPageIsOpen) { + auto extensionA = InstallExtension("A Extension"); + + ShowSitePermissionsPage(extensionA->id()); + + // Verify site permissions page is open for extension A. + EXPECT_TRUE(IsSitePermissionsPageOpened(extensionA->id())); + + // Adding a new extension doesn't affect the opened site permissions page for + // extension A. + auto extensionB = InstallExtension("B Extension"); + EXPECT_TRUE(IsSitePermissionsPageOpened(extensionA->id())); + + // Removing extension B doesn't affect the opened site permissions page for + // extension A. + UninstallExtension(extensionB->id()); + EXPECT_TRUE(IsSitePermissionsPageOpened(extensionA->id())); + + // Removing extension A closes its open site permissions page and menu + // navigates back to the main page. + UninstallExtension(extensionA->id()); + EXPECT_FALSE(IsSitePermissionsPageOpened(extensionA->id())); + EXPECT_TRUE(IsMainPageOpened()); +} + +// Tests that menu navigates back to the main page when an extension, whose site +// permissions page is open, is disabled. +TEST_F(ExtensionsSitePermissionsPageViewUnitTest, DisableAndEnableExtension) { + auto extension = InstallExtension("Test Extension"); + + ShowSitePermissionsPage(extension->id()); + EXPECT_TRUE(IsSitePermissionsPageOpened(extension->id())); + + DisableExtension(extension->id()); + LayoutMenuIfNecessary(); + WaitForAnimation(); + + EXPECT_FALSE(IsSitePermissionsPageOpened(extension->id())); + EXPECT_TRUE(IsMainPageOpened()); +} + +// Tests that menu navigates back to the main page when an extension, whose site +// permissions page is open, is reloaded. +TEST_F(ExtensionsSitePermissionsPageViewUnitTest, ReloadExtension) { + // The extension must have a manifest to be reloaded. + extensions::TestExtensionDir extension_directory; + constexpr char kManifest[] = R"({ + "name": "Test Extension", + "version": "1", + "manifest_version": 3 + })"; + extension_directory.WriteManifest(kManifest); + extensions::ChromeTestExtensionLoader loader(profile()); + scoped_refptr<const extensions::Extension> extension = + loader.LoadExtension(extension_directory.UnpackedPath()); + + ShowSitePermissionsPage(extension->id()); + EXPECT_TRUE(IsSitePermissionsPageOpened(extension->id())); + + // Reload the extension. + extensions::TestExtensionRegistryObserver registry_observer( + extensions::ExtensionRegistry::Get(profile())); + ReloadExtension(extension->id()); + ASSERT_TRUE(registry_observer.WaitForExtensionLoaded()); + LayoutMenuIfNecessary(); + + EXPECT_FALSE(IsSitePermissionsPageOpened(extension->id())); + EXPECT_TRUE(IsMainPageOpened()); +}
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc index 428be5ee..e8c46f2d 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h" #include "chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h" #include "content/public/browser/web_contents.h" +#include "ui/base/metadata/metadata_types.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/view_utils.h" #include "ui/views/widget/widget.h" @@ -33,6 +34,22 @@ return sorted_ids; } +// Returns the index of `action_id` in the toolbar model actions based on the +// extensions name alphabetical order. +size_t FindIndex(ToolbarActionsModel* toolbar_model, + const ToolbarActionsModel::ActionId action_id) { + std::u16string extension_name = + base::i18n::ToLower(toolbar_model->GetExtensionName(action_id)); + auto sorted_action_ids = SortExtensionsByName(toolbar_model); + return static_cast<size_t>( + base::ranges::lower_bound(sorted_action_ids, extension_name, {}, + [toolbar_model](std::string id) { + return base::i18n::ToLower( + toolbar_model->GetExtensionName(id)); + }) - + sorted_action_ids.begin()); +} + // Returns the main page, if it is the correct type. ExtensionsMenuMainPageView* GetMainPage(views::View* page) { return views::AsViewClass<ExtensionsMenuMainPageView>(page); @@ -57,25 +74,17 @@ bubble_delegate_(bubble_delegate), toolbar_model_(ToolbarActionsModel::Get(browser_->profile())) { browser_->tab_strip_model()->AddObserver(this); + toolbar_model_observation_.Observe(toolbar_model_.get()); +} + +ExtensionsMenuViewController::~ExtensionsMenuViewController() { + // Note: No need to call TabStripModel::RemoveObserver(), because it's handled + // directly within TabStripModelObserver::~TabStripModelObserver(). } void ExtensionsMenuViewController::OpenMainPage() { auto main_page = std::make_unique<ExtensionsMenuMainPageView>(browser_, this); - - // Populate. - bool allow_pinning = extensions_container_->CanShowActionsInToolbar(); - - std::vector<std::string> sorted_ids = SortExtensionsByName(toolbar_model_); - for (size_t i = 0; i < sorted_ids.size(); ++i) { - // TODO(emiliapaz): Under MVC architecture, view should not own the view - // controller. However, the current extensions structure depends on this - // thus a major restructure is needed. - std::unique_ptr<ExtensionActionViewController> action_controller = - ExtensionActionViewController::Create(sorted_ids[i], browser_, - extensions_container_); - main_page->CreateAndInsertMenuItem(std::move(action_controller), - sorted_ids[i], allow_pinning, i); - } + PopulateMainPage(main_page.get()); SwitchToPage(std::move(main_page)); } @@ -126,14 +135,98 @@ DCHECK(current_page_); ExtensionsMenuMainPageView* main_page = GetMainPage(current_page_); - if (main_page) { + if (main_page && web_contents) { main_page->Update(web_contents); } } -// TODO(crbug.com/1390952): Listen for "toolbar pinned actions changed" to -// update the pin button. Currently pin button icon is not updated after -// clicking on it. +void ExtensionsMenuViewController::OnToolbarActionAdded( + const ToolbarActionsModel::ActionId& action_id) { + DCHECK(current_page_); + + // Do nothing when site permission page is opened as a new extension doesn't + // affect the site permissions page of another extension. + if (GetSitePermissionsPage(current_page_)) { + return; + } + + // Insert a menu item for the extension when main page is opened. + auto* main_page = GetMainPage(current_page_); + DCHECK(main_page); + + int index = FindIndex(toolbar_model_, action_id); + std::unique_ptr<ExtensionActionViewController> action_controller = + ExtensionActionViewController::Create(action_id, browser_, + extensions_container_); + + main_page->CreateAndInsertMenuItem( + std::move(action_controller), action_id, + extensions_container_->CanShowActionsInToolbar(), index); + + // TODO(crbug.com/1390952): Update requests access section once such section + // is implemented (if the extension added requests site access, it needs to be + // added to such section). + bubble_delegate_->SizeToContents(); +} + +void ExtensionsMenuViewController::OnToolbarActionRemoved( + const ToolbarActionsModel::ActionId& action_id) { + DCHECK(current_page_); + + auto* site_permissions_page = GetSitePermissionsPage(current_page_); + if (site_permissions_page) { + // Return to the main page if site permissions page belongs to the extension + // removed. + if (site_permissions_page->extension_id() == action_id) { + OpenMainPage(); + } + return; + } + + // Remove the menu item for the extension when main page is opened. + auto* main_page = GetMainPage(current_page_); + DCHECK(main_page); + main_page->RemoveMenuItem(action_id); + + // TODO(crbug.com/1390952): Update requests access section (if the extension + // removed was in the section, it needs to be removed). + bubble_delegate_->SizeToContents(); +} + +void ExtensionsMenuViewController::OnToolbarActionUpdated( + const ToolbarActionsModel::ActionId& action_id) { + UpdatePage(GetActiveWebContents()); +} + +void ExtensionsMenuViewController::OnToolbarModelInitialized() { + DCHECK(current_page_); + + // Toolbar model should have been initialized if site permissions page is + // open, since this page can only be reached after main page was populated + // after toolbar model was initialized. + if (GetSitePermissionsPage(current_page_)) { + NOTREACHED(); + return; + } + + auto* main_page = GetMainPage(current_page_); + DCHECK(main_page); + PopulateMainPage(main_page); +} + +void ExtensionsMenuViewController::OnToolbarPinnedActionsChanged() { + DCHECK(current_page_); + + // Do nothing when site permissions page is opened as it doesn't have pin + // buttons. + if (GetSitePermissionsPage(current_page_)) { + return; + } + + auto* main_page = GetMainPage(current_page_); + DCHECK(main_page); + main_page->UpdatePinButtons(); +} ExtensionsMenuMainPageView* ExtensionsMenuViewController::GetMainPageViewForTesting() { @@ -161,6 +254,22 @@ } } +void ExtensionsMenuViewController::PopulateMainPage( + ExtensionsMenuMainPageView* main_page) { + bool allow_pinning = extensions_container_->CanShowActionsInToolbar(); + std::vector<std::string> sorted_ids = SortExtensionsByName(toolbar_model_); + for (size_t i = 0; i < sorted_ids.size(); ++i) { + // TODO(emiliapaz): Under MVC architecture, view should not own the view + // controller. However, the current extensions structure depends on this + // thus a major restructure is needed. + std::unique_ptr<ExtensionActionViewController> action_controller = + ExtensionActionViewController::Create(sorted_ids[i], browser_, + extensions_container_); + main_page->CreateAndInsertMenuItem(std::move(action_controller), + sorted_ids[i], allow_pinning, i); + } +} + content::WebContents* ExtensionsMenuViewController::GetActiveWebContents() const { return browser_->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.h b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.h index 8fb1d594..904124cb 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.h +++ b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.h
@@ -7,6 +7,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" +#include "chrome/browser/ui/toolbar/toolbar_actions_model.h" #include "chrome/browser/ui/views/extensions/extensions_menu_navigation_handler.h" #include "content/public/browser/web_contents.h" @@ -22,7 +23,8 @@ class ToolbarActionsModel; class ExtensionsMenuViewController : public ExtensionsMenuNavigationHandler, - public TabStripModelObserver { + public TabStripModelObserver, + public ToolbarActionsModel::Observer { public: ExtensionsMenuViewController(Browser* browser, ExtensionsContainer* extensions_container, @@ -31,7 +33,7 @@ ExtensionsMenuViewController(const ExtensionsMenuViewController&) = delete; const ExtensionsMenuViewController& operator=( const ExtensionsMenuViewController&) = delete; - ~ExtensionsMenuViewController() override = default; + ~ExtensionsMenuViewController() override; // ExtensionsMenuNavigationHandler: void OpenMainPage() override; @@ -50,6 +52,16 @@ const TabStripModelChange& change, const TabStripSelectionChange& selection) override; + // ToolbarActionsModel::Observer: + void OnToolbarActionAdded( + const ToolbarActionsModel::ActionId& action_id) override; + void OnToolbarActionRemoved( + const ToolbarActionsModel::ActionId& action_id) override; + void OnToolbarActionUpdated( + const ToolbarActionsModel::ActionId& action_id) override; + void OnToolbarModelInitialized() override; + void OnToolbarPinnedActionsChanged() override; + // Accessors used by tests: // Returns the main page iff it's the `current_page_` one. ExtensionsMenuMainPageView* GetMainPageViewForTesting(); @@ -63,6 +75,9 @@ // Updates current_page for the given `web_contents`. void UpdatePage(content::WebContents* web_contents); + // Populates menu items in `main_page`. + void PopulateMainPage(ExtensionsMenuMainPageView* main_page); + // Returns the currently active web contents. content::WebContents* GetActiveWebContents() const; @@ -72,6 +87,8 @@ const raw_ptr<views::BubbleDialogDelegate> bubble_delegate_; const raw_ptr<ToolbarActionsModel> toolbar_model_; + base::ScopedObservation<ToolbarActionsModel, ToolbarActionsModel::Observer> + toolbar_model_observation_{this}; // The current page visible in `bubble_contents_`. raw_ptr<views::View> current_page_ = nullptr;
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc index c464a99..b6a0348ab 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
@@ -13,14 +13,10 @@ #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h" #include "chrome/grit/generated_resources.h" -#include "content/public/browser/notification_service.h" -#include "content/public/test/test_utils.h" -#include "extensions/browser/notification_types.h" #include "extensions/common/extension_features.h" #include "extensions/test/permissions_manager_waiter.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/views/view_utils.h" #include "url/origin.h" class ExtensionsToolbarControlsUnitTest : public ExtensionsToolbarUnitTest { @@ -113,11 +109,11 @@ browser()->tab_strip_model()->GetActiveWebContents()); runner->accept_bubble_for_testing(true); + auto* manager = extensions::PermissionsManager::Get(profile()); // Change the extension to run only on click using the context // menu. The extension should request access to the current site. { - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(manager); context_menu.ExecuteCommand( extensions::ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_CLICK, 0); waiter.WaitForExtensionPermissionsUpdate(); @@ -130,8 +126,7 @@ // Change the extension to run only on site using the context // menu. The extension should not request access to the current site. { - extensions::PermissionsManagerWaiter waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter waiter(manager); context_menu.ExecuteCommand( extensions::ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_SITE, 0); waiter.WaitForExtensionPermissionsUpdate(); @@ -241,8 +236,7 @@ { // Request access button is not visible in restricted sites. - extensions::PermissionsManagerWaiter manager_waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter manager_waiter(manager); manager->AddUserRestrictedSite(url_origin); manager_waiter.WaitForUserPermissionsSettingsChange(); WaitForAnimation(); @@ -252,8 +246,7 @@ { // Request acesss button is visible if site is not restricted, // and at least one extension is requesting access. - extensions::PermissionsManagerWaiter manager_waiter( - extensions::PermissionsManager::Get(profile())); + extensions::PermissionsManagerWaiter manager_waiter(manager); manager->RemoveUserRestrictedSite(url_origin); manager_waiter.WaitForUserPermissionsSettingsChange(); WaitForAnimation();
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h index 0d768e03..3937072 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
@@ -40,6 +40,14 @@ return browser_view()->toolbar()->extensions_container(); } + ExtensionsToolbarButton* extensions_button() { + return extensions_container()->GetExtensionsButton(); + } + + ExtensionsMenuCoordinator* menu_coordinator() { + return extensions_container()->GetExtensionsMenuCoordinatorForTesting(); + } + // Adds the specified `extension`. scoped_refptr<const extensions::Extension> InstallExtension( const std::string& name);
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index 5277d57..c9b4becd 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -13,7 +13,6 @@ #include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/ui/views/global_media_controls/media_item_ui_legacy_cast_footer_view.cc b/chrome/browser/ui/views/global_media_controls/media_item_ui_legacy_cast_footer_view.cc index 47dd9fd2..7103063 100644 --- a/chrome/browser/ui/views/global_media_controls/media_item_ui_legacy_cast_footer_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_item_ui_legacy_cast_footer_view.cc
@@ -6,7 +6,6 @@ #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/feature_engagement/tracker_factory.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/global_media_controls/cast_media_notification_item.h" #include "chrome/browser/ui/global_media_controls/media_notification_service.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
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 748416c6..d549d83 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -185,7 +185,9 @@ return v->omnibox_view_->model()->is_caret_visible() && !v->GetOmniboxPopupView()->IsOpen(); }); - + if (features::IsChromeRefresh2023()) { + views::FocusRing::Get(this)->SetInnerStrokeDisabled(); + } views::InstallPillHighlightPathGenerator(this); #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc b/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc index 632d943..db6629f 100644 --- a/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc +++ b/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc
@@ -43,7 +43,7 @@ SetCustomPadding(gfx::Insets::VH( GetLayoutConstant(LOCATION_BAR_CHILD_INTERIOR_PADDING), GetLayoutInsets(LOCATION_BAR_ICON_INTERIOR_PADDING).left())); - + SetCornerRadius(GetIconSize()); constexpr auto kAnimationDuration = base::Milliseconds(350); animation_ = std::make_unique<gfx::SlideAnimation>(this); animation_->SetSlideDuration(kAnimationDuration);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc index 0d7ccebc..4d5e7e1 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
@@ -389,10 +389,11 @@ gfx::Size OmniboxMatchCellView::CalculatePreferredSize() const { int contentHeight = content_view_->GetLineHeight(); - int height = OmniboxFieldTrial::IsUniformRowHeightEnabled() && has_image_ - ? std::max(contentHeight, kEntityImageSizeSmall) + - GetInsets().height() - : contentHeight + GetInsets().height(); + int height = + OmniboxFieldTrial::IsUniformRowHeightEnabled() + ? GetEntityImageSize() + + 2 * OmniboxFieldTrial::kRichSuggestionVerticalMargin.Get() + : contentHeight + GetInsets().height(); if (layout_style_ == LayoutStyle::TWO_LINE_SUGGESTION) height += description_view_->GetHeightForWidth(width() - GetTextIndent()); // Width is not calculated because it's not needed by current callers.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h index c513053..0c2c310 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -136,6 +136,7 @@ // Weak pointers for easy reference. raw_ptr<OmniboxMatchCellView> suggestion_view_; // The leading (or left) view. + // TODO(manukh) No longer used as of crrev.com/c/3381302. Remove. raw_ptr<OmniboxMatchCellView> keyword_view_; // The trailing (or right) view. // The blue bar used to indicate selection.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc index 8a20126..30c02f2 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
@@ -193,7 +193,8 @@ for (const SuggestionAnswer::TextField& text_field : line.text_fields()) AppendText(text_field, std::u16string()); if (!line.text_fields().empty()) { - constexpr int kMaxDisplayLines = 3; + const int kMaxDisplayLines = + OmniboxFieldTrial::IsUniformRowHeightEnabled() ? 1 : 3; const SuggestionAnswer::TextField& first_field = line.text_fields().front(); if (first_field.has_num_lines() && first_field.num_lines() > 1) { render_text_->SetMultiline(true);
diff --git a/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc b/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc index fab5c61..f36b260 100644 --- a/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_permission_content_view.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ui/views/page_info/page_info_permission_content_view.h" #include "base/ranges/algorithm.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h"
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc index 68b7bd7..569dcd30 100644 --- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -10,7 +10,6 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/passwords/credential_manager_dialog_controller.h" #include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc index 2e36fad..888a3018 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -52,6 +52,7 @@ #include "ui/gfx/vector_icon_utils.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/bubble/bubble_frame_view.h" +#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/combobox/combobox.h" #include "ui/views/controls/editable_combobox/editable_combobox.h" @@ -194,8 +195,7 @@ std::unique_ptr<views::EditablePasswordCombobox> CreateEditablePasswordCombobox( const password_manager::PasswordForm& form, bool are_passwords_revealed, - views::EditablePasswordCombobox::IsPasswordRevealPermittedCheck - reveal_permitted_check) { + views::Button::PressedCallback reveal_password_callback) { DCHECK(!form.IsFederatedCredential()); std::vector<std::u16string> passwords = form.all_possible_passwords.empty() @@ -209,12 +209,12 @@ std::make_unique<ui::SimpleComboboxModel>( std::vector<ui::SimpleComboboxModel::Item>(passwords.begin(), passwords.end())), - views::style::CONTEXT_BUTTON, STYLE_PRIMARY_MONOSPACED, display_arrow); + views::style::CONTEXT_BUTTON, STYLE_PRIMARY_MONOSPACED, display_arrow, + std::move(reveal_password_callback)); combobox->SetText(form.password_value); combobox->SetPasswordIconTooltips( l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_SHOW_PASSWORD), l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_HIDE_PASSWORD)); - combobox->SetIsPasswordRevealPermittedCheck(std::move(reveal_permitted_check)); combobox->RevealPasswords(are_passwords_revealed); combobox->SetAccessibleName( l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_PASSWORD_LABEL)); @@ -340,8 +340,8 @@ CreateEditablePasswordCombobox( password_form, controller_.are_passwords_revealed_when_bubble_is_opened(), - base::BindRepeating(&SaveUpdateBubbleController::RevealPasswords, - base::Unretained(&controller_))); + base::BindRepeating(&PasswordSaveUpdateView::TogglePasswordRevealed, + base::Unretained(this))); // Set up layout: SetLayoutManager(std::make_unique<AutoResizingLayout>()); views::View* root_view = AddChildView(std::make_unique<views::View>()); @@ -699,3 +699,11 @@ // affects the account store, and hence resize. SizeToContents(); } + +void PasswordSaveUpdateView::TogglePasswordRevealed() { + if (password_dropdown_->ArePasswordsRevealed()) { + password_dropdown_->RevealPasswords(false); + } else if (controller_.RevealPasswords()) { + password_dropdown_->RevealPasswords(true); + } +}
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.h b/chrome/browser/ui/views/passwords/password_save_update_view.h index 8f516b22..00c774a 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.h +++ b/chrome/browser/ui/views/passwords/password_save_update_view.h
@@ -94,6 +94,9 @@ // Should be called only after the bubble has been displayed. void UpdateFootnote(); + // Reveals/masks the passwords in the password dropdown. + void TogglePasswordRevealed(); + SaveUpdateBubbleController controller_; // True iff it is an update password bubble on creation. False iff it is a
diff --git a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc index 5257aa6..919e3e1a 100644 --- a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h" #include "components/omnibox/browser/buildflags.h" #include "components/payments/core/features.h" +#include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -18,13 +19,7 @@ : public PaymentRequestBrowserTestBase, public testing::WithParamInterface<bool> { public: - PaymentHandlerHeaderViewUITest() : minimal_header_ux_enabled_(GetParam()) { - if (minimal_header_ux_enabled_) { - features_.InitAndEnableFeature(features::kPaymentHandlerMinimalHeaderUX); - } else { - features_.InitAndDisableFeature(features::kPaymentHandlerMinimalHeaderUX); - } - } + PaymentHandlerHeaderViewUITest() : minimal_header_ux_enabled_(GetParam()) {} ~PaymentHandlerHeaderViewUITest() override = default; void SetUpOnMainThread() override { @@ -32,6 +27,14 @@ NavigateTo("/payment_handler.html"); } + void SetUpCommandLine(base::CommandLine* command_line) override { + PaymentRequestBrowserTestBase::SetUpCommandLine(command_line); + if (minimal_header_ux_enabled_) { + command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, + "PaymentHandlerMinimalHeaderUX"); + } + } + protected: bool minimal_header_ux_enabled_;
diff --git a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc index c44660d..9654c67 100644 --- a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc +++ b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc
@@ -258,8 +258,7 @@ // colors will be set in PopulateSheetHeaderView. progress_bar_ = header_content_separator_container()->AddChildView( std::make_unique<views::ProgressBar>(/*preferred_height=*/2)); - if (!base::FeatureList::IsEnabled( - features::kPaymentHandlerMinimalHeaderUX)) { + if (!spec()->IsPaymentHandlerMinimalHeaderUXEnabled()) { // Prior to minimal UX, the separator container used a Separator view, // which uses the Chrome theme color which may not match the header color. progress_bar_->SetBackgroundColor(SK_ColorTRANSPARENT); @@ -309,7 +308,7 @@ void PaymentHandlerWebFlowViewController::PopulateSheetHeaderView( views::View* container) { - if (!base::FeatureList::IsEnabled(features::kPaymentHandlerMinimalHeaderUX)) { + if (!spec()->IsPaymentHandlerMinimalHeaderUXEnabled()) { PaymentRequestSheetController::PopulateSheetHeaderView(container); return; } @@ -564,7 +563,7 @@ } void PaymentHandlerWebFlowViewController::LoadProgressChanged(double progress) { - if (base::FeatureList::IsEnabled(features::kPaymentHandlerMinimalHeaderUX)) { + if (spec()->IsPaymentHandlerMinimalHeaderUXEnabled()) { // The progress bar reflects the load progress until it reaches 1.0, at // which point it's reset to 0 to just show the separator color. progress_bar_->SetValue(progress < 1.0 ? progress : 0);
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc index e04d02f..d24de51 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc
@@ -43,9 +43,14 @@ public: void SetWasDiscarded(bool was_discarded) { was_discarded_ = was_discarded; } bool ExistingDocumentWasDiscarded() const override { return was_discarded_; } + void SetWebContents(content::WebContents* web_contents) { + web_contents_ = web_contents; + } + content::WebContents* GetWebContents() override { return web_contents_; } private: bool was_discarded_ = false; + raw_ptr<content::WebContents> web_contents_ = nullptr; }; class HighEfficiencyChipViewTest : public TestWithBrowserView { @@ -61,14 +66,8 @@ environment_.SetUp(&local_state_); TestWithBrowserView::SetUp(); - AddTab(browser(), GURL("http://foo")); - content::WebContents* contents = - browser()->tab_strip_model()->GetWebContentsAt(0); - TabDiscardTabHelper::CreateForWebContents(contents); - performance_manager::user_tuning::UserPerformanceTuningManager:: - PreDiscardResourceUsage::CreateForWebContents( - contents, kMemorySavingsKilobytes, - ::mojom::LifecycleUnitDiscardReason::PROACTIVE); + AddNewTab(kMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::PROACTIVE); } void TearDown() override { @@ -76,12 +75,27 @@ environment_.TearDown(); } + // Creates a new tab at index 0 that would report the given memory savings and + // discard reason if the tab was discarded + void AddNewTab(int memory_savings, + mojom::LifecycleUnitDiscardReason discard_reason) { + AddTab(browser(), GURL("http://foo")); + content::WebContents* contents = + browser()->tab_strip_model()->GetActiveWebContents(); + TabDiscardTabHelper::CreateForWebContents(contents); + performance_manager::user_tuning::UserPerformanceTuningManager:: + PreDiscardResourceUsage::CreateForWebContents(contents, memory_savings, + discard_reason); + } + void SetTabDiscardState(int tab_index, bool is_discarded) { TabDiscardTabHelper* tab_helper = TabDiscardTabHelper::FromWebContents( browser()->tab_strip_model()->GetWebContentsAt(tab_index)); std::unique_ptr<DiscardMockNavigationHandle> navigation_handle = std::make_unique<DiscardMockNavigationHandle>(); navigation_handle.get()->SetWasDiscarded(is_discarded); + navigation_handle.get()->SetWebContents( + browser()->tab_strip_model()->GetWebContentsAt(tab_index)); tab_helper->DidStartNavigation(navigation_handle.get()); browser_view() @@ -138,13 +152,27 @@ // When the previous page has a tab discard state of true, when the icon is // updated it should be visible. -TEST_F(HighEfficiencyChipViewTest, ShouldShowForDiscardedPage) { +TEST_F(HighEfficiencyChipViewTest, ShouldShowChipForProactivelyDiscardedPage) { SetHighEfficiencyModeEnabled(true); SetTabDiscardState(0, true); + EXPECT_TRUE(GetPageActionIconView()->GetVisible()); +} - PageActionIconView* view = GetPageActionIconView(); +TEST_F(HighEfficiencyChipViewTest, + ShouldNotShowChipWhenNonProactivelyDiscardPage) { + SetHighEfficiencyModeEnabled(true); - EXPECT_TRUE(view->GetVisible()); + // Add a new tab that was discarded through extensions + AddNewTab(kMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::EXTERNAL); + SetTabDiscardState(0, true); + EXPECT_FALSE(GetPageActionIconView()->GetVisible()); + + // Add a new tab that was urgently discarded + AddNewTab(kMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::URGENT); + SetTabDiscardState(0, true); + EXPECT_FALSE(GetPageActionIconView()->GetVisible()); } // If a discard is triggered when the user doesn't have high efficiency mode @@ -246,17 +274,11 @@ // in the dialog. TEST_F(HighEfficiencyChipViewTest, ShouldNotRenderSmallMemorySavingsInDialog) { // Add a new tab with small memory savings. - AddTab(browser(), GURL("http://bar")); - content::WebContents* contents = - browser()->tab_strip_model()->GetWebContentsAt(1); - TabDiscardTabHelper::CreateForWebContents(contents); - performance_manager::user_tuning::UserPerformanceTuningManager:: - PreDiscardResourceUsage::CreateForWebContents( - contents, kSmallMemorySavingsKilobytes, - ::mojom::LifecycleUnitDiscardReason::PROACTIVE); + AddNewTab(kSmallMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::PROACTIVE); // Mark the new tab as discarded. - SetTabDiscardState(1, true); + SetTabDiscardState(0, true); ClickPageActionChip(); @@ -283,12 +305,11 @@ EXPECT_FALSE(GetPageActionIconView()->ShouldShowLabel()); } -// When a chip is expaneded with the label, if we navigate to another tab -// and come back, the chip should be collapsed with the label hidden. TEST_F(HighEfficiencyChipViewTest, ShouldCollapseChipAfterNavigatingTabs) { SetHighEfficiencyModeEnabled(true); + AddNewTab(kMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::PROACTIVE); TabStripModel* tab_strip_model = browser()->tab_strip_model(); - AddTab(browser(), GURL("http://foo")); EXPECT_EQ(2, tab_strip_model->GetTabCount()); SetTabDiscardState(0, true); @@ -330,21 +351,14 @@ TEST_F(HighEfficiencyChipViewTest, ShowChipWithoutSavingsInGuestMode) { // Add a new tab with small memory savings. - AddTab(browser(), GURL("http://bar")); - content::WebContents* contents = - browser()->tab_strip_model()->GetWebContentsAt(1); - TabDiscardTabHelper::CreateForWebContents(contents); - performance_manager::user_tuning::UserPerformanceTuningManager:: - PreDiscardResourceUsage::CreateForWebContents( - contents, kSmallMemorySavingsKilobytes, - ::mojom::LifecycleUnitDiscardReason::PROACTIVE); + AddNewTab(kSmallMemorySavingsKilobytes, + ::mojom::LifecycleUnitDiscardReason::PROACTIVE); TestingProfile* testprofile = browser()->profile()->AsTestingProfile(); EXPECT_TRUE(testprofile); testprofile->SetGuestSession(true); - SetTabDiscardState(1, true); - + SetTabDiscardState(0, true); ClickPageActionChip(); // Since there is no placeholders in the bubble text in guest mode and without
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.cc index b163506..855ea51 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/metrics/histogram_functions.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h" #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h" @@ -76,9 +77,19 @@ void ReadAnythingContainerView::OnCoordinatorDestroyed() { // When the coordinator that created |this| is destroyed, clean up pointers. + LogTextStyle(); coordinator_ = nullptr; } +void ReadAnythingContainerView::LogTextStyle() { + read_anything::mojom::LineSpacing line_spacing = + coordinator_->GetModel()->line_spacing(); + base::UmaHistogramEnumeration(kLineSpacingHistogramName, line_spacing); + read_anything::mojom::LetterSpacing letter_spacing = + coordinator_->GetModel()->letter_spacing(); + base::UmaHistogramEnumeration(kLetterSpacingHistogramName, letter_spacing); +} + BEGIN_METADATA(ReadAnythingContainerView, views::View) END_METADATA @@ -86,6 +97,7 @@ // If |this| is being destroyed before the associated coordinator, then // remove |this| as an observer. if (coordinator_) { + LogTextStyle(); coordinator_->RemoveObserver(this); coordinator_->RemoveModelObserver(this); }
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.h index 82f72569..c597d612 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_container_view.h
@@ -11,7 +11,6 @@ #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h" #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h" #include "ui/base/metadata/metadata_header_macros.h" -#include "ui/base/metadata/metadata_impl_macros.h" #include "ui/views/controls/separator.h" #include "ui/views/view.h" @@ -54,6 +53,8 @@ void OnCoordinatorDestroyed() override; private: + void LogTextStyle(); + raw_ptr<ReadAnythingCoordinator> coordinator_; raw_ptr<views::Separator> separator_; };
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc index 55e0e44..c1f20c0 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -184,6 +184,11 @@ /////////////////////////////////////////////////////////////////////////////// void ReadAnythingController::OnUIReady() { + // Return early if this has already been called. Prevents the scoped + // observation from observing twice. + if (ui_ready_) { + return; + } ui_ready_ = true; #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) if (features::IsReadAnythingWithScreen2xEnabled()) {
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc index a1944f2..23b1c25 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
@@ -12,10 +12,13 @@ #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.h" #include "chrome/common/accessibility/read_anything_constants.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/accessibility/accessibility_features.h" class ReadAnythingControllerTest : public TestWithBrowserView { public: void SetUp() override { + scoped_feature_list_.InitWithFeatures({features::kReadAnythingWithScreen2x}, + {}); TestWithBrowserView::SetUp(); model_ = std::make_unique<ReadAnythingModel>(); @@ -66,6 +69,8 @@ model_->Init(font_name, font_scale, colors, line_spacing, letter_spacing); } + void OnUIReady() { controller_->OnUIReady(); } + std::string GetPrefFontName() { return browser()->profile()->GetPrefs()->GetString( prefs::kAccessibilityReadAnythingFontName); @@ -94,6 +99,7 @@ protected: std::unique_ptr<ReadAnythingModel> model_; std::unique_ptr<ReadAnythingController> controller_; + base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(ReadAnythingControllerTest, ValidIndexUpdatesFontNamePref) { @@ -239,3 +245,8 @@ EXPECT_EQ(GetPrefsLetterSpacing(), 1); } + +TEST_F(ReadAnythingControllerTest, CallOnUIReadyTwiceNoCrash) { + OnUIReady(); + OnUIReady(); +}
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc index 4db49aabe..92f9063 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
@@ -8,9 +8,7 @@ #include <utility> #include <vector> -#include "base/feature_list.h" #include "base/memory/raw_ptr.h" -#include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/test_with_browser_view.h" #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h" #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" @@ -31,7 +29,7 @@ public: void SetUp() override { base::test::ScopedFeatureList features; - features.InitWithFeatures({features::kReadAnything}, {}); + scoped_feature_list_.InitWithFeatures({features::kReadAnything}, {}); TestWithBrowserView::SetUp(); side_panel_coordinator_ = browser_view()->side_panel_coordinator(); @@ -67,6 +65,7 @@ raw_ptr<ReadAnythingCoordinator> read_anything_coordinator_ = nullptr; MockReadAnythingCoordinatorObserver coordinator_observer_; + base::test::ScopedFeatureList scoped_feature_list_; }; // TODO(crbug.com/1344891): Fix the memory leak on destruction observed on these
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc index 8bb7e56..a39b6bd 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -266,24 +266,28 @@ ReadAnythingColorsModel::ReadAnythingColorsModel() { // Define the possible sets of colors available to the user. ColorInfo kDefaultColors = { - u"Default", IDS_READING_MODE_DEFAULT_PNG, kColorReadAnythingForeground, + l10n_util::GetStringUTF16(IDS_READING_MODE_DEFAULT_COLOR_LABEL), + IDS_READING_MODE_DEFAULT_PNG, kColorReadAnythingForeground, kColorReadAnythingBackground, kColorReadAnythingSeparator}; ColorInfo kLightColors = { - u"Light", IDS_READING_MODE_LIGHT_PNG, kColorReadAnythingForegroundLight, + l10n_util::GetStringUTF16(IDS_READING_MODE_LIGHT_COLOR_LABEL), + IDS_READING_MODE_LIGHT_PNG, kColorReadAnythingForegroundLight, kColorReadAnythingBackgroundLight, kColorReadAnythingSeparatorLight}; ColorInfo kDarkColors = { - u"Dark", IDS_READING_MODE_DARK_PNG, kColorReadAnythingForegroundDark, + l10n_util::GetStringUTF16(IDS_READING_MODE_DARK_COLOR_LABEL), + IDS_READING_MODE_DARK_PNG, kColorReadAnythingForegroundDark, kColorReadAnythingBackgroundDark, kColorReadAnythingSeparatorDark}; - ColorInfo kYellowColors = {u"Yellow", IDS_READING_MODE_YELLOW_PNG, - kColorReadAnythingForegroundYellow, - kColorReadAnythingBackgroundYellow, - kColorReadAnythingSeparatorYellow}; + ColorInfo kYellowColors = { + l10n_util::GetStringUTF16(IDS_READING_MODE_YELLOW_COLOR_LABEL), + IDS_READING_MODE_YELLOW_PNG, kColorReadAnythingForegroundYellow, + kColorReadAnythingBackgroundYellow, kColorReadAnythingSeparatorYellow}; ColorInfo kBlueColors = { - u"Blue", IDS_READING_MODE_BLUE_PNG, kColorReadAnythingForegroundBlue, + l10n_util::GetStringUTF16(IDS_READING_MODE_BLUE_COLOR_LABEL), + IDS_READING_MODE_BLUE_PNG, kColorReadAnythingForegroundBlue, kColorReadAnythingBackgroundBlue, kColorReadAnythingSeparatorBlue}; colors_choices_.emplace_back(kDefaultColors);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h index 94a2158..d2aeaac 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -243,9 +243,13 @@ ReadAnythingLineSpacingModel* GetLineSpacingModel() { return line_spacing_model_.get(); } + read_anything::mojom::LineSpacing line_spacing() { return line_spacing_; } ReadAnythingLetterSpacingModel* GetLetterSpacingModel() { return letter_spacing_model_.get(); } + read_anything::mojom::LetterSpacing letter_spacing() { + return letter_spacing_; + } private: void NotifyThemeChanged();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc b/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc index 5c35598..2cd10a4 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_web_ui_view.cc
@@ -8,7 +8,6 @@ #include "base/metrics/user_metrics_action.h" #include "chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h" #include "chrome/browser/feature_engagement/tracker_factory.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc index 1888c68..d4f5ae1 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
@@ -27,6 +27,7 @@ #include "content/public/browser/navigation_handle.h" #include "ui/gfx/image/image_skia.h" #include "ui/views/controls/webview/webview.h" +#include "ui/views/interaction/element_tracker_views.h" #include "ui/views/layout/flex_layout_types.h" #include "ui/views/layout/flex_layout_view.h" #include "ui/views/view_class_properties.h" @@ -36,6 +37,12 @@ public: using WebView::WebView; + void DidStartNavigation( + content::NavigationHandle* navigation_handle) override { + views::ElementTrackerViews::GetInstance()->NotifyCustomEvent( + kSideSearchResultsClickedCustomEventId, this); + } + ~SideSearchWebView() override { if (!web_contents()) return;
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc index aaa9d0e..010a984b 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller_interactive_uitest.cc
@@ -24,18 +24,23 @@ #include "chrome/browser/ui/views/side_search/side_search_browsertest.h" #include "chrome/browser/ui/views/side_search/side_search_icon_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/grit/generated_resources.h" #include "chrome/test/base/ui_test_utils.h" #include "chrome/test/interaction/interactive_browser_test.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/test/scoped_iph_feature_list.h" #include "components/feature_engagement/test/test_tracker.h" +#include "components/strings/grit/components_strings.h" +#include "components/user_education/views/help_bubble_view.h" #include "content/public/browser/navigation_controller.h" #include "content/public/common/result_codes.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "ui/base/interaction/element_identifier.h" +#include "ui/base/interaction/element_tracker.h" #include "ui/views/interaction/element_tracker_views.h" +#include "ui/views/view_class_properties.h" // Fixture for testing side panel v2 only. Only instantiate tests for DSE // configuration. @@ -868,6 +873,206 @@ base::CallbackListSubscription subscription_; }; +class SideSearchIPHAndTutorialBrowserTest + : public SideSearchFeatureEngagementTest, + public InteractiveBrowserTestApi { + public: + SideSearchIPHAndTutorialBrowserTest() { + feature_list_.InitAndEnableFeaturesWithParameters({ + {feature_engagement::kIPHSideSearchFeature, + GetFeatureEngagementParams()}, + }); + } + + void SetUp() override { + set_open_about_blank_on_browser_launch(true); + SideSearchFeatureEngagementTest::SetUp(); + } + + void SetUpOnMainThread() override { + SideSearchFeatureEngagementTest::SetUpOnMainThread(); + private_test_impl().DoTestSetUp(); + SetContextWidget( + BrowserView::GetBrowserViewForBrowser(browser())->GetWidget()); + } + + void TearDownOnMainThread() override { + private_test_impl().DoTestTearDown(); + SideSearchFeatureEngagementTest::TearDownOnMainThread(); + } + + bool CurrentBubbleAnchoredToCorrectElement( + const ui::ElementIdentifier& anchored_element_id) { + ui::TrackedElement* t = + ui::ElementTracker::GetElementTracker()->GetElementInAnyContext( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting); + auto* const view_element = t->AsA<views::TrackedElementViews>()->view(); + return views::AsViewClass<views::BubbleDialogDelegateView>(view_element) + ->GetAnchorView() + ->GetProperty(views::kElementIdentifierKey) == + anchored_element_id; + } + + auto StartNavigationFromSidePanel(Browser* browser, const GURL& url) { + auto* side_contents = GetActiveSidePanelWebContents(browser); + side_contents->GetController().LoadURLWithParams( + content::NavigationController::LoadURLParams(url)); + } + + auto CheckIPHTriggeredCorrectly(const ui::ElementIdentifier& primary_tab_id) { + const auto srp_url = GetMatchingSearchUrl(); + const auto non_srp_url_1 = GetNonMatchingUrl(); + const auto non_srp_url_2 = GetNonMatchingUrl(); + return Steps( + InstrumentTab(primary_tab_id), + // Navigate to a SRP URL and then once to a non-SRP URL. + NavigateWebContents(primary_tab_id, srp_url), + NavigateWebContents(primary_tab_id, non_srp_url_1), + // Ensure that the side search button is present, but the side search + // panel isn't open. + WaitForShow(kSideSearchButtonElementId), + EnsureNotPresent(kSidePanelElementId), + + // Detects a po-go action. + PressButton(kBackButtonElementId), + WaitForWebContentsNavigation(primary_tab_id), + NavigateWebContents(primary_tab_id, non_srp_url_2), + WaitForShow(kSideSearchButtonElementId), + + // IPH bubble appears. + // Verify it's created with correct body text and anchored to side + // search page action icon button. + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty(user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16(IDS_SIDE_SEARCH_PROMO)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSideSearchButtonElementId); + }))); + } + + private: + feature_engagement::test::ScopedIphFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(SideSearchIPHAndTutorialBrowserTest, + IPHDismissedCorrectly) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kPrimaryTabId); + + RunTestSequence( + CheckIPHTriggeredCorrectly(kPrimaryTabId), + + // Press "Remind me later". + PressButton( + user_education::HelpBubbleView::kFirstNonDefaultButtonIdForTesting), + WaitForHide( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)); +} + +IN_PROC_BROWSER_TEST_F(SideSearchIPHAndTutorialBrowserTest, + IPHTriggersTutorialCorrectly) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kPrimaryTabId); + const auto non_srp_url = GetNonMatchingUrl(); + + RunTestSequence( + CheckIPHTriggeredCorrectly(kPrimaryTabId), + + // Press "Show me how". + PressButton(user_education::HelpBubbleView::kDefaultButtonIdForTesting), + + // 1st tutorial bubble appears. + // Verify it's created with correct body text and anchored to side search + // page action icon button. + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty( + user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16(IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSideSearchButtonElementId); + })), + + // Click on side search page action icon to pop up side panel. + PressButton(kSideSearchButtonElementId), + + // 2nd tutorial bubble appears. + // Verify it's created with correct body text and anchored to side panel + // web view. + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty(user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16( + IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSideSearchWebViewElementId); + })), + + // Simulate a click on a random result in side panel. + Do(base::BindLambdaForTesting([&, this]() { + StartNavigationFromSidePanel(browser(), non_srp_url); + })), + WaitForWebContentsNavigation(kPrimaryTabId), + + // 3rd tutorial bubble appears. + // Verify it's created with correct body text and anchored to side panel + // close button. + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty( + user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16(IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSidePanelCloseButtonElementId); + })), + + // Press side panel close button. + PressButton(kSidePanelCloseButtonElementId), FlushEvents(), + + // Final tutorial button appears. + // Verify it's created with correct body text and anchored to side search + // page action icon button. + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty(user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16(IDS_SIDE_SEARCH_PROMO)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSideSearchButtonElementId); + })), + + // Verify the final tutorial bubble has a Restart button. + CheckViewProperty( + user_education::HelpBubbleView::kFirstNonDefaultButtonIdForTesting, + &views::MdTextButton::GetText, + l10n_util::GetStringUTF16(IDS_TUTORIAL_RESTART_TUTORIAL)), + + // Pressing Restart button restarts the tutorial flow. + // 1st tutorial bubble appears. + // Verify it's created with correct body text and anchored to side search + // page action icon button. + PressButton( + user_education::HelpBubbleView::kFirstNonDefaultButtonIdForTesting), + WaitForShow( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), + CheckViewProperty( + user_education::HelpBubbleView::kBodyTextIdForTesting, + &views::Label::GetText, + l10n_util::GetStringUTF16(IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL)), + Check(base::BindLambdaForTesting([this]() { + return CurrentBubbleAnchoredToCorrectElement( + kSideSearchButtonElementId); + }))); +} + class SideSearchAutoTriggeringBrowserTest : public SideSearchFeatureEngagementTest, public InteractiveBrowserTestApi {
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc index cba134dd..3ab937e3 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.cc
@@ -169,7 +169,7 @@ base::FilePath file_path = temp_dir.Append( "status_icon_" + base::NumberToString(icon_file_id) + ".png"); - if (!base::WriteFile(file_path, data->front_as<char>(), data->size())) { + if (!base::WriteFile(file_path, *data)) { base::DeletePathRecursively(temp_dir); return {}; }
diff --git a/chrome/browser/ui/views/toolbar/home_button.cc b/chrome/browser/ui/views/toolbar/home_button.cc index 0df5541..ec74b098 100644 --- a/chrome/browser/ui/views/toolbar/home_button.cc +++ b/chrome/browser/ui/views/toolbar/home_button.cc
@@ -10,7 +10,6 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
diff --git a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc index 35a68bd..8d1e742 100644 --- a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc +++ b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc
@@ -23,7 +23,6 @@ #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/platform_util.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/translate/translate_service.h" #include "chrome/browser/ui/chrome_pages.h"
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc index 3eea8f49..28ae619 100644 --- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc +++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -62,6 +62,7 @@ const char kTabGroupWithGroupTutorialMetricPrefix[] = "TabGroupWithGroup"; const char kSidePanelReadingListTutorialMetricPrefix[] = "SidePanelReadingList"; const char kCustomizeChromeTutorialMetricPrefix[] = "CustomizeChromeSidePanel"; +const char kSideSearchTutorialMetricPrefix[] = "SideSearch"; constexpr char kTabGroupHeaderElementName[] = "TabGroupHeader"; constexpr char kReadingListItemElementName[] = "ReadingListItem"; constexpr char kChangeChromeThemeElementName[] = "ChangeChromeTheme"; @@ -174,6 +175,8 @@ const char kSidePanelReadingListTutorialId[] = "Side Panel Reading List Tutorial"; +const char kSideSearchTutorialId[] = "Side Search Tutorial"; + user_education::HelpBubbleDelegate* GetHelpBubbleDelegate() { static base::NoDestructor<BrowserHelpBubbleDelegate> delegate; return delegate.get(); @@ -298,9 +301,12 @@ FeaturePromoSpecification::AcceleratorInfo(IDC_RESTORE_TAB))); // kIPHSideSearchFeature: - registry.RegisterFeature(FeaturePromoSpecification::CreateForLegacyPromo( - &feature_engagement::kIPHSideSearchFeature, kSideSearchButtonElementId, - IDS_SIDE_SEARCH_PROMO)); + registry.RegisterFeature(std::move( + FeaturePromoSpecification::CreateForTutorialPromo( + feature_engagement::kIPHSideSearchFeature, kSideSearchButtonElementId, + IDS_SIDE_SEARCH_PROMO, kSideSearchTutorialId) + .SetBubbleArrow(HelpBubbleArrow::kBottomCenter) + .SetBubbleIcon(&vector_icons::kLightbulbOutlineIcon))); // kIPHTabSearchFeature: registry.RegisterFeature(FeaturePromoSpecification::CreateForLegacyPromo( @@ -691,4 +697,52 @@ tutorial_registry.AddTutorial(kSidePanelReadingListTutorialId, std::move(side_panel_description)); } + + { + TutorialDescription side_search_description; + + // 1st bubble appears and prompts users to open side search + TutorialDescription::Step open_side_search_in_panel_step( + 0, IDS_SIDE_SEARCH_TUTORIAL_OPEN_SIDE_PANEL, + ui::InteractionSequence::StepType::kShown, kSideSearchButtonElementId, + std::string(), HelpBubbleArrow::kBottomCenter); + side_search_description.steps.emplace_back(open_side_search_in_panel_step); + + // 2nd bubble appears and prompts users to open a link + TutorialDescription::Step see_side_search( + 0, IDS_SIDE_SEARCH_TUTORIAL_OPEN_A_LINK_TO_TAB, + ui::InteractionSequence::StepType::kShown, kSideSearchWebViewElementId, + std::string(), HelpBubbleArrow::kLeftCenter); + side_search_description.steps.emplace_back(see_side_search); + + // Hidden step that detects a link is pressed + TutorialDescription::Step detect_side_search_result_clicked( + 0, 0, ui::InteractionSequence::StepType::kCustomEvent, + kSideSearchWebViewElementId, std::string(), HelpBubbleArrow::kNone, + kSideSearchResultsClickedCustomEventId); + side_search_description.steps.emplace_back( + detect_side_search_result_clicked); + + // 3rd bubble appears and prompts users to press close button + TutorialDescription::Step click_close( + 0, IDS_SIDE_SEARCH_TUTORIAL_CLOSE_SIDE_PANEL, + ui::InteractionSequence::StepType::kShown, + kSidePanelCloseButtonElementId, std::string(), + HelpBubbleArrow::kTopRight); + side_search_description.steps.emplace_back(click_close); + + // Completion of the tutorial. + TutorialDescription::Step success_step( + IDS_TUTORIAL_GENERIC_SUCCESS_TITLE, IDS_SIDE_SEARCH_PROMO, + ui::InteractionSequence::StepType::kShown, kSideSearchButtonElementId, + std::string(), HelpBubbleArrow::kTopRight); + side_search_description.steps.emplace_back(success_step); + + side_search_description.histograms = + user_education::MakeTutorialHistograms<kSideSearchTutorialMetricPrefix>( + side_search_description.steps.size()); + side_search_description.can_be_restarted = true; + tutorial_registry.AddTutorial(kSideSearchTutorialId, + std::move(side_search_description)); + } }
diff --git a/chrome/browser/ui/web_applications/tabbed_web_app_navigation_throttle.cc b/chrome/browser/ui/web_applications/tabbed_web_app_navigation_throttle.cc index ffbec66..47ecc83 100644 --- a/chrome/browser/ui/web_applications/tabbed_web_app_navigation_throttle.cc +++ b/chrome/browser/ui/web_applications/tabbed_web_app_navigation_throttle.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/web_applications/tabbed_web_app_navigation_throttle.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
diff --git a/chrome/browser/ui/web_applications/webui_web_app_navigation_throttle.cc b/chrome/browser/ui/web_applications/webui_web_app_navigation_throttle.cc index cf6fd3b..695eff3 100644 --- a/chrome/browser/ui/web_applications/webui_web_app_navigation_throttle.cc +++ b/chrome/browser/ui/web_applications/webui_web_app_navigation_throttle.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/web_applications/webui_web_app_navigation_throttle.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/ui/webui/app_home/app_home_page_handler.cc b/chrome/browser/ui/webui/app_home/app_home_page_handler.cc index f22e998..6fa9489 100644 --- a/chrome/browser/ui/webui/app_home/app_home_page_handler.cc +++ b/chrome/browser/ui/webui/app_home/app_home_page_handler.cc
@@ -416,17 +416,17 @@ continue; } - bool is_deprecated_app = false; - auto* context = extension_system_->extension_service()->GetBrowserContext(); #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_FUCHSIA) - is_deprecated_app = extensions::IsExtensionUnsupportedDeprecatedApp( - context, extension->id()); -#endif + auto* context = extension_system_->extension_service()->GetBrowserContext(); + const bool is_deprecated_app = + extensions::IsExtensionUnsupportedDeprecatedApp(context, + extension->id()); if (is_deprecated_app && !extensions::IsExtensionForceInstalled( context, extension->id(), nullptr)) { deprecated_app_ids_.insert(extension->id()); } +#endif result->emplace_back(CreateAppInfoPtrFromExtension(extension.get())); } }
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc index 24b1e5650..89c7071e 100644 --- a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc +++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -13,7 +13,9 @@ #include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" +#include "base/debug/dump_without_crashing.h" #include "base/i18n/message_formatter.h" +#include "base/logging.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -153,6 +155,26 @@ supported_links.end()); } +absl::optional<std::string> MaybeFormatBytes(absl::optional<uint64_t> bytes) { + if (bytes.has_value()) { + // ui::FormatBytes requires a non-negative signed integer. In general, we + // expect that converting from unsigned to signed int here should always + // yield a positive value, since overflowing into negative would require an + // implausibly large app (2^63 bytes ~= 9 exabytes). + int64_t signed_bytes = static_cast<int64_t>(bytes.value()); + if (signed_bytes < 0) { + // TODO(crbug.com/1418590): Investigate ARC apps which have negative data + // sizes. + LOG(ERROR) << "Invalid app size: " << signed_bytes; + base::debug::DumpWithoutCrashing(); + return absl::nullopt; + } + return base::UTF16ToUTF8(ui::FormatBytes(signed_bytes)); + } + + return absl::nullopt; +} + } // namespace AppManagementPageHandler::AppManagementPageHandler( @@ -417,14 +439,8 @@ app->description = update.Description(); - if (update.AppSizeInBytes().has_value()) { - app->app_size = - base::UTF16ToUTF8(ui::FormatBytes(update.AppSizeInBytes().value())); - } - if (update.DataSizeInBytes().has_value()) { - app->data_size = - base::UTF16ToUTF8(ui::FormatBytes(update.DataSizeInBytes().value())); - } + app->app_size = MaybeFormatBytes(update.AppSizeInBytes()); + app->data_size = MaybeFormatBytes(update.DataSizeInBytes()); // On other OS's, is_pinned defaults to OptionalBool::kUnknown, which is // used to represent the fact that there is no concept of being pinned.
diff --git a/chrome/browser/ui/webui/ash/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chrome/browser/ui/webui/ash/arc_graphics_tracing/arc_graphics_tracing_handler.cc index 03579070..6a8dad46 100644 --- a/chrome/browser/ui/webui/ash/arc_graphics_tracing/arc_graphics_tracing_handler.cc +++ b/chrome/browser/ui/webui/ash/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -185,13 +185,11 @@ model_path.DirName().Append(model_path.BaseName().value() + "_raw"); const base::FilePath system_path = model_path.DirName().Append(model_path.BaseName().value() + "_system"); - if (!base::WriteFile(base::FilePath(raw_path), data.c_str(), - data.length())) { + if (!base::WriteFile(base::FilePath(raw_path), data)) { LOG(ERROR) << "Failed to save raw trace model to " << raw_path.value(); } const std::string system_raw = system_stat_collector->SerializeToJson(); - if (!base::WriteFile(base::FilePath(system_path), system_raw.c_str(), - system_raw.length())) { + if (!base::WriteFile(base::FilePath(system_path), system_raw)) { LOG(ERROR) << "Failed to save system model to " << system_path.value(); } } @@ -231,8 +229,7 @@ model, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_content); DCHECK(!json_content.empty()); - if (!base::WriteFile(model_path, json_content.c_str(), - json_content.length())) { + if (!base::WriteFile(model_path, json_content)) { LOG(ERROR) << "Failed serialize model to " << model_path.value() << "."; }
diff --git a/chrome/browser/ui/webui/ash/drive_internals_ui.cc b/chrome/browser/ui/webui/ash/drive_internals_ui.cc index 6e17e9c0..257c838 100644 --- a/chrome/browser/ui/webui/ash/drive_internals_ui.cc +++ b/chrome/browser/ui/webui/ash/drive_internals_ui.cc
@@ -647,7 +647,8 @@ d.Set("pinned_files", ToString(progress.pinned_files)); d.Set("failed_files", ToString(progress.failed_files)); d.Set("syncing_files", ToString(progress.syncing_files)); - d.Set("skipped_files", ToString(progress.skipped_files)); + d.Set("skipped_items", ToString(progress.skipped_items)); + d.Set("listed_items", ToString(progress.listed_items)); MaybeCallJavascript("onBulkPinningProgress", base::Value(std::move(d))); }
diff --git a/chrome/browser/ui/webui/ash/login/debug/debug_overlay_handler.cc b/chrome/browser/ui/webui/ash/login/debug/debug_overlay_handler.cc index fe24c60..4cd6739 100644 --- a/chrome/browser/ui/webui/ash/login/debug/debug_overlay_handler.cc +++ b/chrome/browser/ui/webui/ash/login/debug/debug_overlay_handler.cc
@@ -41,9 +41,7 @@ } base::FilePath file_path = screenshot_dir.Append(screenshot_name); - if (static_cast<size_t>(base::WriteFile( - file_path, reinterpret_cast<const char*>(png_data->front()), - static_cast<int>(png_data->size()))) != png_data->size()) { + if (!base::WriteFile(file_path, *png_data)) { LOG(ERROR) << "Failed to save screenshot to " << file_path.value(); } else { VLOG(1) << "Saved screenshot to " << file_path.value();
diff --git a/chrome/browser/ui/webui/ash/network_logs_message_handler.cc b/chrome/browser/ui/webui/ash/network_logs_message_handler.cc index 152b10a..f5815759 100644 --- a/chrome/browser/ui/webui/ash/network_logs_message_handler.cc +++ b/chrome/browser/ui/webui/ash/network_logs_message_handler.cc
@@ -47,9 +47,7 @@ const std::string& contents) { base::FilePath timestamped_file_path = logging::GenerateTimestampedName(file_path, base::Time::Now()); - int bytes_written = - base::WriteFile(timestamped_file_path, contents.data(), contents.size()); - return bytes_written > 0; + return base::WriteFile(timestamped_file_path, contents); } bool GetBoolOrFalse(const base::Value::Dict& dict, const char* keyname) {
diff --git a/chrome/browser/ui/webui/feedback/feedback_handler.cc b/chrome/browser/ui/webui/feedback/feedback_handler.cc index d753332..027b63d 100644 --- a/chrome/browser/ui/webui/feedback/feedback_handler.cc +++ b/chrome/browser/ui/webui/feedback/feedback_handler.cc
@@ -105,7 +105,10 @@ void FeedbackHandler::HandleShowAutofillMetadataInfo( const base::Value::List& args) { - // TODO(crbug.com/1407646): Introduce autofill metadata child page. + ShowChildPage( + Profile::FromWebUI(web_ui()), dialog_, + ChildPageURL("html/autofill_metadata_info.html"), + l10n_util::GetStringUTF16(IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE)); } void FeedbackHandler::HandleShowSystemInfo(const base::Value::List& args) {
diff --git a/chrome/browser/ui/webui/feedback/feedback_ui.cc b/chrome/browser/ui/webui/feedback/feedback_ui.cc index ed6f718..6f89b18 100644 --- a/chrome/browser/ui/webui/feedback/feedback_ui.cc +++ b/chrome/browser/ui/webui/feedback/feedback_ui.cc
@@ -30,6 +30,7 @@ {"attachFileLabel", IDS_FEEDBACK_ATTACH_FILE_LABEL}, {"attachFileNote", IDS_FEEDBACK_ATTACH_FILE_NOTE}, {"attachFileToBig", IDS_FEEDBACK_ATTACH_FILE_TO_BIG}, + {"autofillMetadataPageTitle", IDS_FEEDBACK_AUTOFILL_METADATA_PAGE_TITLE}, {"autofillMetadataInfo", IDS_FEEDBACK_INCLUDE_AUTOFILL_METADATA_CHECKBOX}, {"bluetoothLogsInfo", IDS_FEEDBACK_BLUETOOTH_LOGS_CHECKBOX}, {"bluetoothLogsMessage", IDS_FEEDBACK_BLUETOOTH_LOGS_MESSAGE},
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc index 343a49e8..c35f7724 100644 --- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc +++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -275,7 +275,8 @@ return std::make_unique<security_interstitials::HttpsOnlyModeBlockingPage>( web_contents, request_url, std::make_unique<HttpsOnlyModeControllerClient>(web_contents, - request_url)); + request_url), + /*is_under_advanced_protection=*/false); } std::unique_ptr<safe_browsing::SafeBrowsingBlockingPage>
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc index 20a573f5..aae494e 100644 --- a/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc +++ b/chrome/browser/ui/webui/interstitials/interstitial_ui_browsertest.cc
@@ -19,10 +19,26 @@ #include "content/public/test/test_navigation_observer.h" #include "ui/base/l10n/l10n_util.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/constants/ash_switches.h" +#endif + class InterstitialUITest : public InProcessBrowserTest { public: - InterstitialUITest() {} - ~InterstitialUITest() override {} + InterstitialUITest() {} + ~InterstitialUITest() override {} + + void SetUpCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpCommandLine(command_line); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // These tests use chrome:// URLs and are written on the assumption devtools + // are always available, so guarantee that assumption holds. Tests that + // check if devtools can be disabled should use a test fixture without the + // kForceDevToolsAvailable switch set. + command_line->AppendSwitch(ash::switches::kForceDevToolsAvailable); +#endif + } protected: // Tests interstitial displayed at url to verify that it has the given @@ -34,9 +50,8 @@ const std::string& page_title, const std::u16string& body_text) { ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - EXPECT_EQ( - base::ASCIIToUTF16(page_title), - browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); + EXPECT_EQ(base::ASCIIToUTF16(page_title), + browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); // Should also be able to open and close devtools. DevToolsWindow* window = @@ -44,8 +59,9 @@ EXPECT_TRUE(window); DevToolsWindowTesting::CloseDevToolsWindowSync(window); - if (body_text.empty()) + if (body_text.empty()) { return; + } content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); @@ -56,8 +72,7 @@ } // Convenience function to test interstitial pages without provided body_text. - void TestInterstitial(GURL url, - const std::string& page_title) { + void TestInterstitial(GURL url, const std::string& page_title) { TestInterstitial(url, page_title, std::u16string()); } @@ -71,16 +86,12 @@ }; IN_PROC_BROWSER_TEST_F(InterstitialUITest, HomePage) { - TestInterstitial( - GURL("chrome://interstitials"), - "Interstitials"); + TestInterstitial(GURL("chrome://interstitials"), "Interstitials"); } IN_PROC_BROWSER_TEST_F(InterstitialUITest, InvalidURLShouldOpenHomePage) { // Invalid path should open the main page: - TestInterstitial( - GURL("chrome://interstitials/--invalid--"), - "Interstitials"); + TestInterstitial(GURL("chrome://interstitials/--invalid--"), "Interstitials"); } IN_PROC_BROWSER_TEST_F(InterstitialUITest,
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index f234de1e..8e9f4a04 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -269,9 +269,7 @@ CookieControlsServiceFactory::GetForProfile(incognito_profile); replacements["incognitoTabDescription"] = - l10n_util::GetStringUTF8(reading_list::switches::IsReadingListEnabled() - ? IDS_NEW_TAB_OTR_SUBTITLE_WITH_READING_LIST - : IDS_NEW_TAB_OTR_SUBTITLE); + l10n_util::GetStringUTF8(IDS_NEW_TAB_OTR_SUBTITLE_WITH_READING_LIST); bool use_revamped_ui = base::FeatureList::IsEnabled(features::kIncognitoNtpRevamp);
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc index 4c07f602..a0622d22 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -90,14 +90,6 @@ #include "components/policy/core/common/cloud/user_cloud_policy_manager.h" #endif -namespace { -void DoWritePoliciesToJSONFile(const base::FilePath& path, - const std::string& data) { - base::WriteFile(path, data.c_str(), data.size()); -} - -} // namespace - PolicyUIHandler::PolicyUIHandler() = default; PolicyUIHandler::~PolicyUIHandler() { @@ -373,5 +365,9 @@ FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::BLOCK_SHUTDOWN}, - base::BindOnce(&DoWritePoliciesToJSONFile, path, json_policies)); + base::BindOnce( + [](base::FilePath path, base::StringPiece content) { + base::WriteFile(path, content); + }, + path, json_policies)); }
diff --git a/chrome/browser/ui/webui/settings/ash/apps_section.cc b/chrome/browser/ui/webui/settings/ash/apps_section.cc index b3a8a971..0fdbcde 100644 --- a/chrome/browser/ui/webui/settings/ash/apps_section.cc +++ b/chrome/browser/ui/webui/settings/ash/apps_section.cc
@@ -89,7 +89,7 @@ {{IDS_OS_SETTINGS_TAG_APP_BADGING, mojom::kAppNotificationsSubpagePath, mojom::SearchResultIcon::kAppsGrid, - mojom::SearchResultDefaultRank::kLow, + mojom::SearchResultDefaultRank::kMedium, mojom::SearchResultType::kSetting, {.setting = mojom::Setting::kAppBadgingOnOff}}}); return *tags;
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn b/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn index 83c5397..ea1cd4c 100644 --- a/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/BUILD.gn
@@ -12,8 +12,11 @@ sources = [ "input_device_settings_provider.mojom" ] + webui_module_path = "/" + use_typescript_sources = true + public_deps = [ - "//ash/public/mojom:mojom", + "//ash/public/mojom:input_device_settings", "//mojo/public/mojom/base", ] }
diff --git a/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS b/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS index 08850f4..14f8cf6 100644 --- a/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS +++ b/chrome/browser/ui/webui/settings/ash/input_device_settings/OWNERS
@@ -1,2 +1,4 @@ +dpad@google.com + per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/settings/captions_handler.cc b/chrome/browser/ui/webui/settings/captions_handler.cc index b33b8cb2..6098de7 100644 --- a/chrome/browser/ui/webui/settings/captions_handler.cc +++ b/chrome/browser/ui/webui/settings/captions_handler.cc
@@ -8,12 +8,13 @@ #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/browser_process.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/live_caption/pref_names.h" #include "components/prefs/pref_service.h" #include "components/soda/constants.h" +#include "components/soda/soda_installer.h" #include "content/public/browser/web_ui.h" #include "media/base/media_switches.h" #include "ui/base/l10n/l10n_util.h" @@ -26,6 +27,11 @@ #include "chrome/browser/accessibility/caption_settings_dialog.h" #endif +namespace { +constexpr char kCodeKey[] = "code"; +constexpr char kDisplayNameKey[] = "displayName"; +} // namespace + namespace settings { CaptionsHandler::CaptionsHandler(PrefService* prefs) : prefs_(prefs) { @@ -51,6 +57,22 @@ "liveCaptionSectionReady", base::BindRepeating(&CaptionsHandler::HandleLiveCaptionSectionReady, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getInstalledLanguagePacks", + base::BindRepeating(&CaptionsHandler::HandleGetInstalledLanguagePacks, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getAvailableLanguagePacks", + base::BindRepeating(&CaptionsHandler::HandleGetAvailableLanguagePacks, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "removeLanguagePack", + base::BindRepeating(&CaptionsHandler::HandleRemoveLanguagePacks, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "installLanguagePacks", + base::BindRepeating(&CaptionsHandler::HandleInstallLanguagePacks, + base::Unretained(this))); } void CaptionsHandler::OnJavascriptAllowed() { @@ -75,6 +97,76 @@ #endif } +void CaptionsHandler::HandleGetAvailableLanguagePacks( + const base::Value::List& args) { + CHECK_EQ(args.size(), 1U); + AllowJavascript(); + const base::Value& callback_id = args[0]; + ResolveJavascriptCallback(callback_id, GetAvailableLanguagePacks()); +} + +void CaptionsHandler::HandleGetInstalledLanguagePacks( + const base::Value::List& args) { + CHECK_EQ(args.size(), 1U); + AllowJavascript(); + const base::Value& callback_id = args[0]; + ResolveJavascriptCallback(callback_id, GetInstalledLanguagePacks()); +} + +void CaptionsHandler::HandleRemoveLanguagePacks(const base::Value::List& args) { + CHECK_GT(args.size(), 0U); + AllowJavascript(); + for (const base::Value& arg : args) { + const std::string* language_code = arg.GetIfString(); + speech::SodaInstaller::GetInstance()->UninstallLanguage( + *language_code, g_browser_process->local_state()); + } +} + +void CaptionsHandler::HandleInstallLanguagePacks( + const base::Value::List& args) { + CHECK_GT(args.size(), 0U); + AllowJavascript(); + for (const base::Value& arg : args) { + const std::string* language_code = arg.GetIfString(); + speech::SodaInstaller::GetInstance()->InstallLanguage( + *language_code, g_browser_process->local_state()); + } +} + +base::Value::List CaptionsHandler::GetAvailableLanguagePacks() { + base::Value::List available_language_packs; + for (const auto& config : speech::kLanguageComponentConfigs) { + if (config.language_code != speech::LanguageCode::kNone) { + base::Value::Dict available_language_pack; + available_language_pack.Set(kCodeKey, config.language_name); + available_language_pack.Set( + kDisplayNameKey, l10n_util::GetStringUTF16(config.display_name)); + available_language_packs.Append(std::move(available_language_pack)); + } + } + + return available_language_packs; +} + +base::Value::List CaptionsHandler::GetInstalledLanguagePacks() { + base::Value::List installed_language_packs; + for (const auto& language : g_browser_process->local_state()->GetList( + prefs::kSodaRegisteredLanguagePacks)) { + base::Value::Dict installed_language_pack; + const absl::optional<speech::SodaLanguagePackComponentConfig> config = + speech::GetLanguageComponentConfig(language.GetString()); + if (config && config->language_code != speech::LanguageCode::kNone) { + installed_language_pack.Set(kCodeKey, language.GetString()); + installed_language_pack.Set( + kDisplayNameKey, l10n_util::GetStringUTF16(config->display_name)); + installed_language_packs.Append(std::move(installed_language_pack)); + } + } + + return installed_language_packs; +} + void CaptionsHandler::OnSodaInstalled(speech::LanguageCode language_code) { if (!base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage) && soda_available_) {
diff --git a/chrome/browser/ui/webui/settings/captions_handler.h b/chrome/browser/ui/webui/settings/captions_handler.h index 9df9255f..5533739 100644 --- a/chrome/browser/ui/webui/settings/captions_handler.h +++ b/chrome/browser/ui/webui/settings/captions_handler.h
@@ -31,6 +31,13 @@ private: void HandleLiveCaptionSectionReady(const base::Value::List& args); void HandleOpenSystemCaptionsDialog(const base::Value::List& args); + void HandleGetAvailableLanguagePacks(const base::Value::List& args); + void HandleGetInstalledLanguagePacks(const base::Value::List& args); + void HandleRemoveLanguagePacks(const base::Value::List& args); + void HandleInstallLanguagePacks(const base::Value::List& args); + + base::Value::List GetAvailableLanguagePacks(); + base::Value::List GetInstalledLanguagePacks(); // SodaInstaller::Observer overrides: void OnSodaInstalled(speech::LanguageCode language_code) override;
diff --git a/chrome/browser/ui/webui/tab_strip/thumbnail_tracker.cc b/chrome/browser/ui/webui/tab_strip/thumbnail_tracker.cc index dbad744..b57daa11 100644 --- a/chrome/browser/ui/webui/tab_strip/thumbnail_tracker.cc +++ b/chrome/browser/ui/webui/tab_strip/thumbnail_tracker.cc
@@ -9,7 +9,6 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h" #include "content/public/browser/web_contents_observer.h"
diff --git a/chrome/browser/ui/webui/translate_internals/chrome_translate_internals_handler.cc b/chrome/browser/ui/webui/translate_internals/chrome_translate_internals_handler.cc index 003b7045a..5b3bc28 100644 --- a/chrome/browser/ui/webui/translate_internals/chrome_translate_internals_handler.cc +++ b/chrome/browser/ui/webui/translate_internals/chrome_translate_internals_handler.cc
@@ -12,7 +12,6 @@ #include "base/functional/callback_helpers.h" #include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/translate/translate_service.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index c4a7608b..63f456d 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -612,6 +612,7 @@ "os_integration/protocol_handling_sub_manager_unittest.cc", "os_integration/run_on_os_login_sub_manager_unittest.cc", "os_integration/shortcut_menu_handling_sub_manager_unittest.cc", + "os_integration/shortcut_sub_manager_unittest.cc", "os_integration/uninstallation_via_os_settings_sub_manager_unittest.cc", "os_integration/web_app_file_handler_manager_unittest.cc", "os_integration/web_app_protocol_handler_manager_unittest.cc", @@ -752,6 +753,7 @@ deps = [ ":web_applications_unit_tests", "//chrome/browser/web_applications/adjustments:unit_tests", + "//chrome/browser/web_applications/app_service:unit_tests", "//chrome/browser/web_applications/extensions:unit_tests", ] } @@ -772,7 +774,6 @@ "isolated_web_apps/isolated_web_app_browsertest.cc", "isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc", "manifest_update_manager_browsertest.cc", - "os_integration/shortcut_sub_manager_browsertest.cc", "policy/web_app_policy_manager_browsertest.cc", "preinstalled_web_app_manager_browsertest.cc", "preinstalled_web_apps_browsertest.cc",
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc index c1fb5b7..cab4f0c9 100644 --- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc +++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -31,8 +31,6 @@ #include "base/functional/identity.h" #include "base/location.h" #include "base/logging.h" -#include "base/metrics/histogram_base.h" -#include "base/metrics/histogram_macros.h" #include "base/notreached.h" #include "base/one_shot_event.h" #include "base/ranges/algorithm.h" @@ -77,7 +75,6 @@ #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/browser/web_applications/web_app_utils.h" -#include "chrome/common/extensions/extension_constants.h" #include "components/content_settings/core/browser/content_settings_type_set.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" @@ -880,54 +877,6 @@ return; } - switch (launch_source) { - case apps::LaunchSource::kUnknown: - case apps::LaunchSource::kFromParentalControls: - break; - case apps::LaunchSource::kFromAppListGrid: - case apps::LaunchSource::kFromAppListGridContextMenu: - UMA_HISTOGRAM_ENUMERATION("Extensions.AppLaunch", - extension_misc::APP_LAUNCH_APP_LIST_MAIN, - extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); - - break; - case apps::LaunchSource::kFromAppListQuery: - case apps::LaunchSource::kFromAppListQueryContextMenu: - UMA_HISTOGRAM_ENUMERATION("Extensions.AppLaunch", - extension_misc::APP_LAUNCH_APP_LIST_SEARCH, - extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); - break; - case apps::LaunchSource::kFromAppListRecommendation: - case apps::LaunchSource::kFromShelf: - case apps::LaunchSource::kFromFileManager: - case apps::LaunchSource::kFromLink: - case apps::LaunchSource::kFromOmnibox: - case apps::LaunchSource::kFromChromeInternal: - case apps::LaunchSource::kFromKeyboard: - case apps::LaunchSource::kFromOtherApp: - case apps::LaunchSource::kFromMenu: - case apps::LaunchSource::kFromInstalledNotification: - case apps::LaunchSource::kFromTest: - case apps::LaunchSource::kFromArc: - case apps::LaunchSource::kFromSharesheet: - case apps::LaunchSource::kFromReleaseNotesNotification: - case apps::LaunchSource::kFromFullRestore: - case apps::LaunchSource::kFromSmartTextContextMenu: - case apps::LaunchSource::kFromDiscoverTabNotification: - case apps::LaunchSource::kFromManagementApi: - case apps::LaunchSource::kFromKiosk: - case apps::LaunchSource::kFromCommandLine: - case apps::LaunchSource::kFromBackgroundMode: - case apps::LaunchSource::kFromNewTabPage: - case apps::LaunchSource::kFromIntentUrl: - case apps::LaunchSource::kFromOsLogin: - case apps::LaunchSource::kFromProtocolHandler: - case apps::LaunchSource::kFromUrlHandler: - case apps::LaunchSource::kFromLockScreen: - case apps::LaunchSource::kFromAppHomePage: - break; - } - DisplayMode display_mode = registrar().GetAppEffectiveDisplayMode(app_id); apps::AppLaunchParams params = apps::CreateAppIdLaunchParamsWithEventFlags(
diff --git a/chrome/browser/web_applications/commands/web_app_command.cc b/chrome/browser/web_applications/commands/web_app_command.cc index 4d11dbd8..0d17c42 100644 --- a/chrome/browser/web_applications/commands/web_app_command.cc +++ b/chrome/browser/web_applications/commands/web_app_command.cc
@@ -6,6 +6,8 @@ #include "base/atomic_sequence_num.h" #include "base/functional/callback_forward.h" +#include "base/location.h" +#include "base/values.h" #include "chrome/browser/web_applications/locks/app_lock.h" #include "chrome/browser/web_applications/locks/full_system_lock.h" #include "chrome/browser/web_applications/locks/noop_lock.h" @@ -52,6 +54,10 @@ return weak_factory_.GetWeakPtr(); } +void WebAppCommand::SetScheduledLocation(const base::Location& location) { + scheduled_location_ = location; +} + template <typename LockType> WebAppCommandTemplate<LockType>::WebAppCommandTemplate(const std::string& name) : WebAppCommand(name) {} @@ -63,12 +69,14 @@ void WebAppCommandTemplate<LockType>::RequestLock( WebAppCommandManager* command_manager, WebAppLockManager* lock_manager, - LockAcquiredCallback on_lock_acquired) { + LockAcquiredCallback on_lock_acquired, + const base::Location& location) { lock_manager->AcquireLock( lock_description(), base::BindOnce(&WebAppCommandTemplate::PrepareForStart, weak_factory_.GetWeakPtr(), command_manager, - std::move(on_lock_acquired))); + std::move(on_lock_acquired)), + location); } template <typename LockType> @@ -77,7 +85,6 @@ LockAcquiredCallback on_lock_acquired, std::unique_ptr<LockType> lock) { command_manager_ = command_manager; - std::move(on_lock_acquired) .Run(base::BindOnce(&WebAppCommandTemplate::StartWithLock, weak_factory_.GetWeakPtr(), std::move(lock)));
diff --git a/chrome/browser/web_applications/commands/web_app_command.h b/chrome/browser/web_applications/commands/web_app_command.h index 6dbca4d..37c1b70 100644 --- a/chrome/browser/web_applications/commands/web_app_command.h +++ b/chrome/browser/web_applications/commands/web_app_command.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/functional/callback_forward.h" +#include "base/location.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" @@ -66,6 +67,10 @@ const std::string& name() const { return name_; } + const absl::optional<base::Location>& scheduled_location() const { + return scheduled_location_; + } + // Returns a debug value to log the state of the command. Used in // chrome://web-app-internals. virtual base::Value ToDebugValue() const = 0; @@ -85,7 +90,8 @@ // after the lock is acquired. virtual void RequestLock(WebAppCommandManager* command_manager, WebAppLockManager* lock_manager, - LockAcquiredCallback on_lock_acquired) = 0; + LockAcquiredCallback on_lock_acquired, + const base::Location& location) = 0; // This is called when the sync system has triggered an uninstall for an app // id that is relevant to this command and this command is running @@ -121,10 +127,13 @@ private: friend class WebAppCommandManager; + void SetScheduledLocation(const base::Location& location); + base::WeakPtr<WebAppCommand> AsWeakPtr(); Id id_; std::string name_; + absl::optional<base::Location> scheduled_location_; raw_ptr<WebAppCommandManager> command_manager_ = nullptr; base::WeakPtrFactory<WebAppCommand> weak_factory_{this}; @@ -154,7 +163,8 @@ // WebAppCommand: void RequestLock(WebAppCommandManager* command_manager, WebAppLockManager* lock_manager, - LockAcquiredCallback on_lock_acquired) override; + LockAcquiredCallback on_lock_acquired, + const base::Location& location) override; void PrepareForStart(WebAppCommandManager* command_manager, LockAcquiredCallback on_lock_acquired,
diff --git a/chrome/browser/web_applications/locks/lock.cc b/chrome/browser/web_applications/locks/lock.cc index b1734d3..ea4f5ed 100644 --- a/chrome/browser/web_applications/locks/lock.cc +++ b/chrome/browser/web_applications/locks/lock.cc
@@ -4,10 +4,27 @@ #include "chrome/browser/web_applications/locks/lock.h" +#include <ostream> + #include "components/services/storage/indexed_db/locks/partitioned_lock_manager.h" namespace web_app { +std::string LockTypeToString(LockDescription::Type type) { + switch (type) { + case web_app::LockDescription::Type::kApp: + return "App"; + case web_app::LockDescription::Type::kAppAndWebContents: + return "AppAndWebContents"; + case web_app::LockDescription::Type::kBackgroundWebContents: + return "WebContents"; + case web_app::LockDescription::Type::kFullSystem: + return "FullSystem"; + case web_app::LockDescription::Type::kNoOp: + return "NoOp"; + } +} + LockDescription::LockDescription(base::flat_set<AppId> app_ids, LockDescription::Type type) : app_ids_(std::move(app_ids)), type_(type) {} @@ -24,6 +41,22 @@ return true; } } +base::Value LockDescription::AsDebugValue() const { + base::Value::Dict result; + base::Value::List ids; + ids.reserve(app_ids_.size()); + for (const auto& id : app_ids_) { + ids.Append(id); + } + result.Set("type", LockTypeToString(type())); + result.Set("app_ids", std::move(ids)); + return base::Value(std::move(result)); +} + +std::ostream& operator<<(std::ostream& out, + const LockDescription& lock_description) { + return out << lock_description.AsDebugValue(); +} Lock::Lock(std::unique_ptr<content::PartitionedLockHolder> holder) : holder_(std::move(holder)) {}
diff --git a/chrome/browser/web_applications/locks/lock.h b/chrome/browser/web_applications/locks/lock.h index f198878..2b7ed98 100644 --- a/chrome/browser/web_applications/locks/lock.h +++ b/chrome/browser/web_applications/locks/lock.h
@@ -5,10 +5,12 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_LOCK_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_LOCK_H_ +#include <iosfwd> #include <memory> #include "base/containers/flat_set.h" #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "chrome/browser/web_applications/web_app_id.h" #include "components/services/storage/indexed_db/locks/partitioned_lock_manager.h" @@ -45,6 +47,8 @@ // exclusive lock on the shared web contents. bool IncludesSharedWebContents() const; + base::Value AsDebugValue() const; + protected: explicit LockDescription(base::flat_set<AppId> app_ids, Type type); @@ -61,6 +65,9 @@ base::WeakPtrFactory<LockDescription> weak_factory_{this}; }; +std::ostream& operator<<(std::ostream& os, + const LockDescription& lock_description); + class Lock { public: explicit Lock(std::unique_ptr<content::PartitionedLockHolder> holder);
diff --git a/chrome/browser/web_applications/locks/web_app_lock_manager.cc b/chrome/browser/web_applications/locks/web_app_lock_manager.cc index f0213a9..f74aaf0 100644 --- a/chrome/browser/web_applications/locks/web_app_lock_manager.cc +++ b/chrome/browser/web_applications/locks/web_app_lock_manager.cc
@@ -8,6 +8,7 @@ #include "base/functional/bind.h" #include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" +#include "base/location.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_number_conversions.h" #include "base/task/sequenced_task_runner.h" @@ -99,6 +100,26 @@ return requests; } +#if DCHECK_IS_ON() +void LogLockRequest( + const LockDescription& description, + const base::Location& location, + const std::vector<content::PartitionedLockManager::PartitionedLockRequest>& + requests, + const content::PartitionedLockManager& lock_manager) { + DVLOG(1) << "Requesting or upgrading to lock " << description + << " for location " << location.ToString(); + std::vector<base::Location> locations = + lock_manager.GetHeldAndQueuedLockLocations(requests); + if (!locations.empty()) { + DVLOG(1) << "Lock currently held (or queued to be held) by:"; + for (const auto& held_location : locations) { + DVLOG(1) << " " << held_location.ToString(); + } + } +} +#endif + } // namespace WebAppLockManager::WebAppLockManager(WebAppProvider& provider) @@ -113,19 +134,24 @@ void WebAppLockManager::AcquireLock( base::WeakPtr<content::PartitionedLockHolder> holder, const LockDescription& lock_description, - base::OnceClosure on_lock_acquired) { + base::OnceClosure on_lock_acquired, + const base::Location& location) { std::vector<content::PartitionedLockManager::PartitionedLockRequest> requests = GetLockRequestsForLock(lock_description); content::PartitionedLockManager::AcquireOptions options; options.ensure_async = true; +#if DCHECK_IS_ON() + LogLockRequest(lock_description, location, requests, lock_manager_); +#endif lock_manager_.AcquireLocks(std::move(requests), holder, - std::move(on_lock_acquired), options); + std::move(on_lock_acquired), options, location); } template <> void WebAppLockManager::AcquireLock( const LockDescription& lock_description, - base::OnceCallback<void(std::unique_ptr<NoopLock>)> on_lock_acquired) { + base::OnceCallback<void(std::unique_ptr<NoopLock>)> on_lock_acquired, + const base::Location& location) { CHECK(lock_description.type() == LockDescription::Type::kNoOp); auto lock = std::make_unique<NoopLock>( @@ -133,14 +159,16 @@ base::WeakPtr<content::PartitionedLockHolder> holder = lock->holder_->AsWeakPtr(); AcquireLock(holder, lock_description, - base::BindOnce(std::move(on_lock_acquired), std::move(lock))); + base::BindOnce(std::move(on_lock_acquired), std::move(lock)), + location); } template <> void WebAppLockManager::AcquireLock( const LockDescription& lock_description, base::OnceCallback<void(std::unique_ptr<SharedWebContentsLock>)> - on_lock_acquired) { + on_lock_acquired, + const base::Location& location) { CHECK(lock_description.type() == LockDescription::Type::kBackgroundWebContents); @@ -151,13 +179,15 @@ base::WeakPtr<content::PartitionedLockHolder> holder = lock->holder_->AsWeakPtr(); AcquireLock(holder, lock_description, - base::BindOnce(std::move(on_lock_acquired), std::move(lock))); + base::BindOnce(std::move(on_lock_acquired), std::move(lock)), + location); } template <> void WebAppLockManager::AcquireLock( const LockDescription& lock_description, - base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired) { + base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired, + const base::Location& location) { CHECK(lock_description.type() == LockDescription::Type::kApp); auto lock = std::make_unique<AppLock>( @@ -170,14 +200,16 @@ base::WeakPtr<content::PartitionedLockHolder> holder = lock->holder_->AsWeakPtr(); AcquireLock(holder, lock_description, - base::BindOnce(std::move(on_lock_acquired), std::move(lock))); + base::BindOnce(std::move(on_lock_acquired), std::move(lock)), + location); } template <> void WebAppLockManager::AcquireLock( const LockDescription& lock_description, base::OnceCallback<void(std::unique_ptr<SharedWebContentsWithAppLock>)> - on_lock_acquired) { + on_lock_acquired, + const base::Location& location) { CHECK(lock_description.type() == LockDescription::Type::kAppAndWebContents); auto lock = std::make_unique<SharedWebContentsWithAppLock>( @@ -191,14 +223,15 @@ base::WeakPtr<content::PartitionedLockHolder> holder = lock->holder_->AsWeakPtr(); AcquireLock(holder, lock_description, - base::BindOnce(std::move(on_lock_acquired), std::move(lock))); + base::BindOnce(std::move(on_lock_acquired), std::move(lock)), + location); } template <> void WebAppLockManager::AcquireLock( const LockDescription& lock_description, - base::OnceCallback<void(std::unique_ptr<FullSystemLock>)> - on_lock_acquired) { + base::OnceCallback<void(std::unique_ptr<FullSystemLock>)> on_lock_acquired, + const base::Location& location) { CHECK(lock_description.type() == LockDescription::Type::kFullSystem); auto lock = std::make_unique<FullSystemLock>( @@ -210,7 +243,8 @@ base::WeakPtr<content::PartitionedLockHolder> holder = lock->holder_->AsWeakPtr(); AcquireLock(holder, lock_description, - base::BindOnce(std::move(on_lock_acquired), std::move(lock))); + base::BindOnce(std::move(on_lock_acquired), std::move(lock)), + location); } std::unique_ptr<SharedWebContentsWithAppLockDescription> @@ -218,7 +252,8 @@ std::unique_ptr<SharedWebContentsLock> lock, const base::flat_set<AppId>& app_ids, base::OnceCallback<void(std::unique_ptr<SharedWebContentsWithAppLock>)> - on_lock_acquired) { + on_lock_acquired, + const base::Location& location) { std::unique_ptr<SharedWebContentsWithAppLockDescription> result_lock_description = std::make_unique<SharedWebContentsWithAppLockDescription>(app_ids); @@ -234,10 +269,14 @@ content::PartitionedLockManager::AcquireOptions options; options.ensure_async = true; +#if DCHECK_IS_ON() + LogLockRequest(*result_lock_description, location, GetAppIdLocks(app_ids), + lock_manager_); +#endif lock_manager_.AcquireLocks( GetAppIdLocks(app_ids), holder, base::BindOnce(std::move(on_lock_acquired), std::move(result_lock)), - options); + options, location); return result_lock_description; } @@ -245,7 +284,8 @@ std::unique_ptr<AppLockDescription> WebAppLockManager::UpgradeAndAcquireLock( std::unique_ptr<NoopLock> lock, const base::flat_set<AppId>& app_ids, - base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired) { + base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired, + const base::Location& location) { std::unique_ptr<AppLockDescription> result_lock_description = std::make_unique<AppLockDescription>(app_ids); @@ -264,8 +304,13 @@ base::IgnoreResult(&base::TaskRunner::PostTask), base::SequencedTaskRunner::GetCurrentDefault(), FROM_HERE, base::BindOnce(std::move(on_lock_acquired), std::move(result_lock))); - lock_manager_.AcquireLocks(GetAppIdLocks(app_ids), holder, - std::move(posted_callback)); +#if DCHECK_IS_ON() + LogLockRequest(*result_lock_description, location, GetAppIdLocks(app_ids), + lock_manager_); +#endif + lock_manager_.AcquireLocks( + GetAppIdLocks(app_ids), holder, std::move(posted_callback), + content::PartitionedLockManager::AcquireOptions(), location); return result_lock_description; }
diff --git a/chrome/browser/web_applications/locks/web_app_lock_manager.h b/chrome/browser/web_applications/locks/web_app_lock_manager.h index 62add22..4ce2eab 100644 --- a/chrome/browser/web_applications/locks/web_app_lock_manager.h +++ b/chrome/browser/web_applications/locks/web_app_lock_manager.h
@@ -9,6 +9,7 @@ #include "base/containers/flat_set.h" #include "base/functional/callback_forward.h" +#include "base/location.h" #include "base/memory/raw_ref.h" #include "base/types/pass_key.h" #include "chrome/browser/web_applications/web_app_id.h" @@ -44,12 +45,14 @@ // destroyed. void AcquireLock(base::WeakPtr<content::PartitionedLockHolder> holder, const LockDescription& lock, - base::OnceClosure on_lock_acquired); + base::OnceClosure on_lock_acquired, + const base::Location& location); template <class LockType> void AcquireLock( const LockDescription& lock_description, - base::OnceCallback<void(std::unique_ptr<LockType>)> on_lock_acquired); + base::OnceCallback<void(std::unique_ptr<LockType>)> on_lock_acquired, + const base::Location& location); // Upgrades the given lock to a new one, and will call `on_lock_acquired` on // when the new lock has been acquired. This call will CHECK-fail if `lock` @@ -59,12 +62,14 @@ std::unique_ptr<SharedWebContentsLock> lock, const base::flat_set<AppId>& app_ids, base::OnceCallback<void(std::unique_ptr<SharedWebContentsWithAppLock>)> - on_lock_acquired); + on_lock_acquired, + const base::Location& location = FROM_HERE); std::unique_ptr<AppLockDescription> UpgradeAndAcquireLock( std::unique_ptr<NoopLock> lock, const base::flat_set<AppId>& app_ids, - base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired); + base::OnceCallback<void(std::unique_ptr<AppLock>)> on_lock_acquired, + const base::Location& location = FROM_HERE); private: content::PartitionedLockManager lock_manager_;
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.cc b/chrome/browser/web_applications/os_integration/os_integration_manager.cc index 44e289d..88341ef 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.cc +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
@@ -192,8 +192,8 @@ auto shortcut_menu_handling_sub_manager = std::make_unique<ShortcutMenuHandlingSubManager>( profile_->GetPath(), *icon_manager, *registrar); - auto run_on_os_login_sub_manager = - std::make_unique<RunOnOsLoginSubManager>(*registrar); + auto run_on_os_login_sub_manager = std::make_unique<RunOnOsLoginSubManager>( + *profile_, *registrar, *sync_bridge, *icon_manager); auto uninstallation_via_os_settings_sub_manager = std::make_unique<UninstallationViaOsSettingsSubManager>(*registrar); sub_managers_.push_back(std::move(shortcut_sub_manager));
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc index 88e7781b..a991dfe 100644 --- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc +++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.cc
@@ -5,15 +5,33 @@ #include "chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h" +#include <memory> #include <utility> +#include "base/feature_list.h" #include "base/functional/callback.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/task_runner.h" +#include "build/buildflag.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h" +#include "chrome/browser/web_applications/os_integration/web_app_run_on_os_login.h" +#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/web_app_icon_manager.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/browser/web_applications/web_app_registry_update.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_service.h" +#include "content/public/browser/browser_thread.h" #include "third_party/abseil-cpp/absl/types/optional.h" +using content::BrowserThread; + namespace web_app { namespace { @@ -30,10 +48,38 @@ } } +// On non-desktop platforms (like ChromeOS and Android), we do not trigger +// Run on OS Login. ChromeOS does support Run on OS login but its behavior is +// different from other platforms, see web_app_run_on_os_login_manager.h for +// more info. +bool DoesRunOnOsLoginRequireExecution() { +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + return base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin); +#else + return false; +#endif +} + +bool ShouldTriggerRunOnOsLoginRegistration( + const proto::WebAppOsIntegrationState& state) { + if (!state.has_run_on_os_login()) { + return false; + } + DCHECK(state.run_on_os_login().has_run_on_os_login_mode()); + return (state.run_on_os_login().run_on_os_login_mode() == + proto::RunOnOsLoginMode::WINDOWED); +} + } // namespace -RunOnOsLoginSubManager::RunOnOsLoginSubManager(WebAppRegistrar& registrar) - : registrar_(registrar) {} +RunOnOsLoginSubManager::RunOnOsLoginSubManager(Profile& profile, + WebAppRegistrar& registrar, + WebAppSyncBridge& sync_bridge, + WebAppIconManager& icon_manager) + : profile_(profile), + registrar_(registrar), + sync_bridge_(sync_bridge), + icon_manager_(icon_manager) {} RunOnOsLoginSubManager::~RunOnOsLoginSubManager() = default; @@ -67,9 +113,110 @@ const absl::optional<SynchronizeOsOptions>& synchronize_options, const proto::WebAppOsIntegrationState& desired_state, const proto::WebAppOsIntegrationState& current_state, - base::OnceClosure callback) { - // Not implemented yet. - std::move(callback).Run(); + base::OnceClosure execute_done) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!DoesRunOnOsLoginRequireExecution()) { + std::move(execute_done).Run(); + return; + } + + if (!desired_state.has_run_on_os_login() && + !current_state.has_run_on_os_login()) { + std::move(execute_done).Run(); + return; + } + + if (desired_state.has_run_on_os_login() && + current_state.has_run_on_os_login() && + (desired_state.run_on_os_login().SerializeAsString() == + current_state.run_on_os_login().SerializeAsString())) { + std::move(execute_done).Run(); + return; + } + + StartUnregistration( + app_id, current_state, desired_state, + base::BindOnce(&RunOnOsLoginSubManager::CreateShortcutInfoWithFavicons, + weak_ptr_factory_.GetWeakPtr(), app_id, desired_state, + std::move(execute_done))); +} + +void RunOnOsLoginSubManager::StartUnregistration( + const AppId& app_id, + const proto::WebAppOsIntegrationState& current_state, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure registration_callback) { + if (!current_state.has_run_on_os_login()) { + std::move(registration_callback).Run(); + return; + } + + // TODO(crbug.com/1401125): Remove once sub managers have been implemented and + // OsIntegrationManager::Synchronize() is running fine. + if (!desired_state.has_run_on_os_login()) { + ScopedRegistryUpdate update(&sync_bridge_.get()); + update->UpdateApp(app_id)->SetRunOnOsLoginOsIntegrationState( + RunOnOsLoginMode::kNotRun); + } + + ResultCallback continue_to_registration = + base::BindOnce([](Result result) { + base::UmaHistogramBoolean("WebApp.RunOnOsLogin.Unregistration.Result", + (result == Result::kOk)); + }).Then(std::move(registration_callback)); + + internals::GetShortcutIOTaskRunner()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&internals::UnregisterRunOnOsLogin, app_id, + profile_->GetPath(), + base::UTF8ToUTF16(registrar_->GetAppShortName(app_id))), + std::move(continue_to_registration)); +} + +void RunOnOsLoginSubManager::CreateShortcutInfoWithFavicons( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure execute_done) { + if (!ShouldTriggerRunOnOsLoginRegistration(desired_state)) { + std::move(execute_done).Run(); + return; + } + + const WebApp* web_app = registrar_->GetAppById(app_id); + DCHECK(web_app); + PopulateFaviconForShortcutInfo( + web_app, *icon_manager_, + BuildShortcutInfoWithoutFavicon( + app_id, registrar_->GetAppStartUrl(app_id), profile_->GetPath(), + profile_->GetPrefs()->GetString(prefs::kProfileName), desired_state), + base::BindOnce( + &RunOnOsLoginSubManager::OnShortcutInfoCreatedStartRegistration, + weak_ptr_factory_.GetWeakPtr(), app_id, desired_state, + std::move(execute_done))); +} + +void RunOnOsLoginSubManager::OnShortcutInfoCreatedStartRegistration( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure execute_done, + std::unique_ptr<ShortcutInfo> shortcut_info) { + DCHECK(ShouldTriggerRunOnOsLoginRegistration(desired_state)); + // TODO(crbug.com/1401125): Remove once sub managers have been implemented and + // OsIntegrationManager::Synchronize() is running fine. + { + ScopedRegistryUpdate update(&sync_bridge_.get()); + update->UpdateApp(app_id)->SetRunOnOsLoginOsIntegrationState( + RunOnOsLoginMode::kWindowed); + } + + ResultCallback record_metric_and_complete = + base::BindOnce([](Result result) { + base::UmaHistogramBoolean("WebApp.RunOnOsLogin.Registration.Result", + (result == Result::kOk)); + }).Then(std::move(execute_done)); + + ScheduleRegisterRunOnOsLogin(&sync_bridge_.get(), std::move(shortcut_info), + std::move(record_metric_and_complete)); } } // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h index ae9eba6f..b64e5693 100644 --- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h +++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager.h
@@ -5,20 +5,30 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_RUN_ON_OS_LOGIN_SUB_MANAGER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_RUN_ON_OS_LOGIN_SUB_MANAGER_H_ +#include <memory> + #include "base/functional/callback_forward.h" #include "base/memory/raw_ref.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h" #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" #include "chrome/browser/web_applications/web_app_id.h" #include "third_party/abseil-cpp/absl/types/optional.h" +class Profile; + namespace web_app { class WebAppRegistrar; +class WebAppSyncBridge; +class WebAppIconManager; class RunOnOsLoginSubManager : public OsIntegrationSubManager { public: - explicit RunOnOsLoginSubManager(WebAppRegistrar& registrar); + explicit RunOnOsLoginSubManager(Profile& profile, + WebAppRegistrar& registrar, + WebAppSyncBridge& sync_bridge, + WebAppIconManager& icon_manager); ~RunOnOsLoginSubManager() override; void Start() override; void Shutdown() override; @@ -31,10 +41,32 @@ const absl::optional<SynchronizeOsOptions>& synchronize_options, const proto::WebAppOsIntegrationState& desired_state, const proto::WebAppOsIntegrationState& current_state, - base::OnceClosure callback) override; + base::OnceClosure execute_done) override; private: + // Unregistration logic. + void StartUnregistration(const AppId& app_id, + const proto::WebAppOsIntegrationState& current_state, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure registration_callback); + + // Registration logic. + void CreateShortcutInfoWithFavicons( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure execute_done); + void OnShortcutInfoCreatedStartRegistration( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure execute_done, + std::unique_ptr<ShortcutInfo> shortcut_info); + + const raw_ref<Profile> profile_; const raw_ref<WebAppRegistrar> registrar_; + const raw_ref<WebAppSyncBridge> sync_bridge_; + const raw_ref<WebAppIconManager> icon_manager_; + + base::WeakPtrFactory<RunOnOsLoginSubManager> weak_ptr_factory_{this}; }; } // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc index ad681e5..55840535 100644 --- a/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc +++ b/chrome/browser/web_applications/os_integration/run_on_os_login_sub_manager_unittest.cc
@@ -10,6 +10,7 @@ #include "base/strings/string_piece_forward.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" +#include "build/buildflag.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/os_integration/os_integration_test_override.h" @@ -34,14 +35,12 @@ namespace { -class RunOnOsLoginSubManagerTest - : public WebAppTest, - public ::testing::WithParamInterface<OsIntegrationSubManagersState> { +class RunOnOsLoginSubManagerTestBase : public WebAppTest { public: const GURL kWebAppUrl = GURL("https://example.com/path/index.html"); - RunOnOsLoginSubManagerTest() = default; - ~RunOnOsLoginSubManagerTest() override = default; + RunOnOsLoginSubManagerTestBase() = default; + ~RunOnOsLoginSubManagerTestBase() override = default; void SetUp() override { WebAppTest::SetUp(); @@ -50,20 +49,6 @@ test_override_ = OsIntegrationTestOverride::OverrideForTesting(base::GetHomeDir()); } - if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kOsIntegrationSubManagers, {{"stage", "write_config"}}); - } else if (GetParam() == - OsIntegrationSubManagersState::kSaveStateAndExecute) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kOsIntegrationSubManagers, - {{"stage", "execute_and_write_config"}}); - } else { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{features::kOsIntegrationSubManagers}); - } - provider_ = FakeWebAppProvider::Get(profile()); auto file_handler_manager = @@ -129,12 +114,38 @@ private: raw_ptr<FakeWebAppProvider> provider_; - base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<OsIntegrationTestOverride::BlockingRegistration> test_override_; }; -TEST_P(RunOnOsLoginSubManagerTest, VerifyRunOnOsLoginSetProperlyOnInstall) { +// Configure tests only. +class RunOnOsLoginSubManagerConfigureTest + : public RunOnOsLoginSubManagerTestBase, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { + public: + RunOnOsLoginSubManagerConfigureTest() = default; + ~RunOnOsLoginSubManagerConfigureTest() override = default; + + void SetUp() override { + if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) { + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}, + {features::kDesktopPWAsRunOnOsLogin, {}}}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kDesktopPWAsRunOnOsLogin}, + /*disabled_features=*/{features::kOsIntegrationSubManagers}); + } + RunOnOsLoginSubManagerTestBase::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_P(RunOnOsLoginSubManagerConfigureTest, + VerifyRunOnOsLoginSetProperlyOnInstall) { const AppId& app_id = InstallWebApp(); auto state = registrar().GetAppCurrentOsIntegrationState(app_id); @@ -148,11 +159,11 @@ ASSERT_THAT(run_on_os_login.run_on_os_login_mode(), testing::Eq(proto::RunOnOsLoginMode::NOT_RUN)); } else { - ASSERT_THAT(os_integration_state.ByteSizeLong(), testing::Eq(0ul)); + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); } } -TEST_P(RunOnOsLoginSubManagerTest, VerifyRunOnOsLoginSetFromCommand) { +TEST_P(RunOnOsLoginSubManagerConfigureTest, VerifyRunOnOsLoginSetFromCommand) { const AppId& app_id = InstallWebApp(); base::test::TestFuture<void> future; @@ -170,11 +181,11 @@ ASSERT_THAT(run_on_os_login.run_on_os_login_mode(), testing::Eq(proto::RunOnOsLoginMode::WINDOWED)); } else { - ASSERT_THAT(os_integration_state.ByteSizeLong(), testing::Eq(0ul)); + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); } } -TEST_P(RunOnOsLoginSubManagerTest, VerifyPolicySettingBlocked) { +TEST_P(RunOnOsLoginSubManagerConfigureTest, VerifyPolicySettingBlocked) { const AppId& app_id = InstallWebApp(); const char kWebAppSettingPolicyBlockedConfig[] = R"([{ @@ -206,7 +217,7 @@ } } -TEST_P(RunOnOsLoginSubManagerTest, VerifyPolicySettingWindowedMode) { +TEST_P(RunOnOsLoginSubManagerConfigureTest, VerifyPolicySettingWindowedMode) { const AppId& app_id = InstallWebApp(); const char kWebAppSettingPolicyWindowedConfig[] = R"([{ @@ -238,7 +249,7 @@ } } -TEST_P(RunOnOsLoginSubManagerTest, VerifyPolicySettingAllowedMode) { +TEST_P(RunOnOsLoginSubManagerConfigureTest, VerifyPolicySettingAllowedMode) { const AppId& app_id = InstallWebApp(); const char kWebAppSettingPolicyAllowedConfig[] = R"([{ @@ -270,7 +281,7 @@ } } -TEST_P(RunOnOsLoginSubManagerTest, StatesEmptyOnUninstall) { +TEST_P(RunOnOsLoginSubManagerConfigureTest, StatesEmptyOnUninstall) { const AppId& app_id = InstallWebApp(); test::UninstallAllWebApps(profile()); auto state = registrar().GetAppCurrentOsIntegrationState(app_id); @@ -279,11 +290,232 @@ INSTANTIATE_TEST_SUITE_P( All, - RunOnOsLoginSubManagerTest, + RunOnOsLoginSubManagerConfigureTest, ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB, OsIntegrationSubManagersState::kDisabled), test::GetOsIntegrationSubManagersTestName); +// Configure and Execute tests. +class RunOnOsLoginSubManagerExecuteTest + : public RunOnOsLoginSubManagerTestBase, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { + public: + RunOnOsLoginSubManagerExecuteTest() = default; + ~RunOnOsLoginSubManagerExecuteTest() override = default; + + void SetUp() override { + if (GetParam() == OsIntegrationSubManagersState::kSaveStateAndExecute) { + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kOsIntegrationSubManagers, + {{"stage", "execute_and_write_config"}}}, + {features::kDesktopPWAsRunOnOsLogin, {}}}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kDesktopPWAsRunOnOsLogin}, + /*disabled_features=*/{features::kOsIntegrationSubManagers}); + } + RunOnOsLoginSubManagerTestBase::SetUp(); + } + + bool IsRunOnOsLoginExecuteEnabled() { +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + return true; +#else + return false; +#endif + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_P(RunOnOsLoginSubManagerExecuteTest, InstallRunOnOsLoginNotRun) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + + // A default install should have a Run on OS Login mode of kNotRun, so no + // OS integration should be triggered. + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_FALSE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } +} + +TEST_P(RunOnOsLoginSubManagerExecuteTest, + InstallAndExecuteWindowedRunOnOsLogin) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + base::test::TestFuture<void> future; + provider().scheduler().SetRunOnOsLoginMode( + app_id, RunOnOsLoginMode::kWindowed, future.GetCallback()); + EXPECT_TRUE(future.Wait()); + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_TRUE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } +} + +TEST_P(RunOnOsLoginSubManagerExecuteTest, BlockedPolicySettingNoOsIntegration) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + const char kWebAppSettingPolicyBlockedConfig[] = R"([{ + "manifest_id" : "https://example.com/path/index.html", + "run_on_os_login": "blocked" + }])"; + + { + base::test::TestFuture<void> policy_future; + provider() + .policy_manager() + .SetRefreshPolicySettingsCompletedCallbackForTesting( + policy_future.GetCallback()); + SetWebAppSettingsListPref(kWebAppSettingPolicyBlockedConfig); + EXPECT_TRUE(policy_future.Wait()); + } + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_FALSE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } +} + +TEST_P(RunOnOsLoginSubManagerExecuteTest, + WindowedPolicySettingAllowsOsIntegration) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + const char kWebAppSettingPolicyBlockedConfig[] = R"([{ + "manifest_id" : "https://example.com/path/index.html", + "run_on_os_login": "run_windowed" + }])"; + + { + base::test::TestFuture<void> policy_future; + provider() + .policy_manager() + .SetRefreshPolicySettingsCompletedCallbackForTesting( + policy_future.GetCallback()); + SetWebAppSettingsListPref(kWebAppSettingPolicyBlockedConfig); + EXPECT_TRUE(policy_future.Wait()); + } + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_TRUE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } +} + +TEST_P(RunOnOsLoginSubManagerExecuteTest, UpdateRunOnOsLoginMode) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + base::test::TestFuture<void> future_windowed; + provider().scheduler().SetRunOnOsLoginMode( + app_id, RunOnOsLoginMode::kWindowed, future_windowed.GetCallback()); + EXPECT_TRUE(future_windowed.Wait()); + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_TRUE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } + + // Changing to kNotRun should update and unregister all OS integrations. + base::test::TestFuture<void> future_not_run; + provider().scheduler().SetRunOnOsLoginMode(app_id, RunOnOsLoginMode::kNotRun, + future_not_run.GetCallback()); + EXPECT_TRUE(future_not_run.Wait()); + + auto updated_state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(updated_state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state_updated = + updated_state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_FALSE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state_updated.has_run_on_os_login()); + } +} + +TEST_P(RunOnOsLoginSubManagerExecuteTest, UnregisterRunOnOsLogin) { + const AppId& app_id = InstallWebApp(); + const std::string& app_name = registrar().GetAppShortName(app_id); + + base::test::TestFuture<void> future; + provider().scheduler().SetRunOnOsLoginMode( + app_id, RunOnOsLoginMode::kWindowed, future.GetCallback()); + EXPECT_TRUE(future.Wait()); + + auto state = registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_TRUE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } else { + ASSERT_FALSE(os_integration_state.has_run_on_os_login()); + } + + test::UninstallAllWebApps(profile()); + if (AreOsIntegrationSubManagersEnabled()) { + if (IsRunOnOsLoginExecuteEnabled()) { + ASSERT_FALSE(GetOsIntegrationTestOverride()->IsRunOnOsLoginEnabled( + profile(), app_id, app_name)); + } + } +} + +INSTANTIATE_TEST_SUITE_P( + All, + RunOnOsLoginSubManagerExecuteTest, + ::testing::Values(OsIntegrationSubManagersState::kSaveStateAndExecute, + OsIntegrationSubManagersState::kDisabled), + test::GetOsIntegrationSubManagersTestName); + } // namespace } // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc deleted file mode 100644 index dca0df5..0000000 --- a/chrome/browser/web_applications/os_integration/shortcut_sub_manager_browsertest.cc +++ /dev/null
@@ -1,166 +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 <memory> -#include <utility> - -#include "base/files/file_util.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/test_future.h" -#include "base/threading/thread_restrictions.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" -#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" -#include "chrome/browser/web_applications/os_integration/os_integration_test_override.h" -#include "chrome/browser/web_applications/os_integration/shortcut_sub_manager.h" -#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" -#include "chrome/browser/web_applications/test/web_app_test_utils.h" -#include "chrome/browser/web_applications/web_app_command_manager.h" -#include "chrome/browser/web_applications/web_app_command_scheduler.h" -#include "chrome/browser/web_applications/web_app_id.h" -#include "chrome/browser/web_applications/web_app_install_finalizer.h" -#include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" -#include "components/sync/base/time.h" -#include "components/webapps/browser/install_result_code.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/browser_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace web_app { - -using ::testing::Eq; -using ::testing::IsFalse; - -namespace { - -class ShortcutSubManagerBrowserTest - : public WebAppControllerBrowserTest, - public ::testing::WithParamInterface<OsIntegrationSubManagersState> { - public: - const int kTotalIconSizes = 9; - - void SetUpOnMainThread() override { - os_hooks_suppress_.reset(); - { - base::ScopedAllowBlockingForTesting allow_blocking; - test_override_ = - OsIntegrationTestOverride::OverrideForTesting(base::GetHomeDir()); - } - WebAppControllerBrowserTest::SetUpOnMainThread(); - } - - void SetUp() override { - if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kOsIntegrationSubManagers, {{"stage", "write_config"}}); - } else if (GetParam() == - OsIntegrationSubManagersState::kSaveStateAndExecute) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kOsIntegrationSubManagers, - {{"stage", "execute_and_write_config"}}); - } else { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{features::kOsIntegrationSubManagers}); - } - WebAppControllerBrowserTest::SetUp(); - } - - void TearDownOnMainThread() override { - test::UninstallAllWebApps(profile()); - { - base::ScopedAllowBlockingForTesting allow_blocking; - test_override_.reset(); - } - WebAppControllerBrowserTest::TearDownOnMainThread(); - } - - AppId LoadUrlAndInstallApp(const GURL& url) { - EXPECT_TRUE(NavigateAndAwaitInstallabilityCheck(browser(), url)); - base::test::TestFuture<const AppId, webapps::InstallResultCode> test_future; - provider().scheduler().FetchManifestAndInstall( - webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, - browser()->tab_strip_model()->GetActiveWebContents()->GetWeakPtr(), - /*bypass_service_worker_check=*/false, - base::BindOnce(test::TestAcceptDialogCallback), - test_future.GetCallback<const AppId&, webapps::InstallResultCode>(), - /*use_fallback=*/false); - EXPECT_THAT(test_future.Get<webapps::InstallResultCode>(), - testing::Eq(webapps::InstallResultCode::kSuccessNewInstall)); - return test_future.Get<AppId>(); - } - - void UninstallWebApp(const AppId& app_id) { - base::test::TestFuture<webapps::UninstallResultCode> uninstall_future; - provider().install_finalizer().UninstallWebApp( - app_id, webapps::WebappUninstallSource::kAppsPage, - uninstall_future.GetCallback()); - EXPECT_THAT(uninstall_future.Get(), - testing::Eq(webapps::UninstallResultCode::kSuccess)); - } - - private: - std::unique_ptr<OsIntegrationTestOverride::BlockingRegistration> - test_override_; - base::test::ScopedFeatureList scoped_feature_list_; -}; - -IN_PROC_BROWSER_TEST_P(ShortcutSubManagerBrowserTest, Configure) { - GURL test_url = https_server()->GetURL( - "/banners/" - "manifest_test_page.html"); - - const AppId& app_id = LoadUrlAndInstallApp(test_url); - - auto state = - provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); - ASSERT_TRUE(state.has_value()); - if (AreOsIntegrationSubManagersEnabled()) { - ASSERT_THAT(state.value().shortcut().title(), - testing::Eq("Manifest test app")); - // All icons are read from the disk. - ASSERT_THAT(state.value().shortcut().icon_data_any_size(), - testing::Eq(kTotalIconSizes)); - - for (const proto::ShortcutIconData& icon_time_map_data : - state.value().shortcut().icon_data_any()) { - ASSERT_THAT( - syncer::ProtoTimeToTime(icon_time_map_data.timestamp()).is_null(), - testing::IsFalse()); - } - // TODO(dmurph): Implement shortcut & color detection if - // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032. - } else { - ASSERT_FALSE(state.value().has_shortcut()); - } -} - -IN_PROC_BROWSER_TEST_P(ShortcutSubManagerBrowserTest, - ConfigureUninstallReturnsEmptyState) { - GURL test_url = https_server()->GetURL( - "/banners/" - "manifest_test_page.html"); - const AppId& app_id = LoadUrlAndInstallApp(test_url); - - test::UninstallAllWebApps(profile()); - auto state = - provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); - EXPECT_FALSE(state.has_value()); - - // TODO(dmurph): Implement shortcut & color detection if - // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032. -} - -INSTANTIATE_TEST_SUITE_P( - All, - ShortcutSubManagerBrowserTest, - ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB, - OsIntegrationSubManagersState::kSaveStateAndExecute, - OsIntegrationSubManagersState::kDisabled), - test::GetOsIntegrationSubManagersTestName); - -} // namespace - -} // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc new file mode 100644 index 0000000..df6425ec --- /dev/null +++ b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc
@@ -0,0 +1,200 @@ +// 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 <map> +#include <memory> +#include <utility> + +#include "base/files/file_util.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/test_future.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" +#include "chrome/browser/web_applications/os_integration/os_integration_test_override.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" +#include "chrome/browser/web_applications/web_app_command_scheduler.h" +#include "chrome/browser/web_applications/web_app_icon_generator.h" +#include "chrome/browser/web_applications/web_app_install_info.h" +#include "chrome/browser/web_applications/web_app_install_params.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/chrome_features.h" +#include "components/sync/base/time.h" +#include "components/webapps/browser/install_result_code.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" +#include "url/gurl.h" + +namespace web_app { + +using ::testing::Eq; +using ::testing::IsFalse; + +namespace { + +class ShortcutSubManagerTest + : public WebAppTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { + public: + const GURL kWebAppUrl = GURL("https://example.com/path/index.html"); + const int kTotalIconSizes = 9; + + ShortcutSubManagerTest() = default; + ~ShortcutSubManagerTest() override = default; + + void SetUp() override { + WebAppTest::SetUp(); + { + base::ScopedAllowBlockingForTesting allow_blocking; + test_override_ = + OsIntegrationTestOverride::OverrideForTesting(base::GetHomeDir()); + } + if (GetParam() == OsIntegrationSubManagersState::kSaveStateToDB) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kOsIntegrationSubManagers, {{"stage", "write_config"}}); + } else if (GetParam() == + OsIntegrationSubManagersState::kSaveStateAndExecute) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kOsIntegrationSubManagers, + {{"stage", "execute_and_write_config"}}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kOsIntegrationSubManagers}); + } + + provider_ = FakeWebAppProvider::Get(profile()); + + auto file_handler_manager = + std::make_unique<WebAppFileHandlerManager>(profile()); + auto protocol_handler_manager = + std::make_unique<WebAppProtocolHandlerManager>(profile()); + auto shortcut_manager = std::make_unique<WebAppShortcutManager>( + profile(), /*icon_manager=*/nullptr, file_handler_manager.get(), + protocol_handler_manager.get()); + auto os_integration_manager = std::make_unique<OsIntegrationManager>( + profile(), std::move(shortcut_manager), std::move(file_handler_manager), + std::move(protocol_handler_manager), /*url_handler_manager=*/nullptr); + + provider_->SetOsIntegrationManager(std::move(os_integration_manager)); + test::AwaitStartWebAppProviderAndSubsystems(profile()); + } + + void TearDown() override { + // Blocking required due to file operations in the shortcut override + // destructor. + test::UninstallAllWebApps(profile()); + { + base::ScopedAllowBlockingForTesting allow_blocking; + test_override_.reset(); + } + WebAppTest::TearDown(); + } + + web_app::AppId InstallWebAppWithShortcuts( + std::map<SquareSizePx, SkBitmap> icon_map) { + std::unique_ptr<WebAppInstallInfo> info = + std::make_unique<WebAppInstallInfo>(); + info->start_url = kWebAppUrl; + info->title = u"Test App"; + info->user_display_mode = web_app::mojom::UserDisplayMode::kStandalone; + info->icon_bitmaps.any = std::move(icon_map); + base::test::TestFuture<const AppId&, webapps::InstallResultCode> result; + provider().scheduler().InstallFromInfoWithParams( + std::move(info), /*overwrite_existing_manifest_fields=*/true, + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, + result.GetCallback(), WebAppInstallParams()); + bool success = result.Wait(); + EXPECT_TRUE(success); + if (!success) { + return AppId(); + } + EXPECT_EQ(result.Get<webapps::InstallResultCode>(), + webapps::InstallResultCode::kSuccessNewInstall); + return result.Get<AppId>(); + } + + protected: + WebAppProvider& provider() { return *provider_; } + SkBitmap CreateSolidColorIcon(int size, SkColor color) { + SkBitmap bitmap; + bitmap.allocN32Pixels(size, size); + bitmap.eraseColor(color); + return bitmap; + } + + private: + raw_ptr<FakeWebAppProvider> provider_; + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<OsIntegrationTestOverride::BlockingRegistration> + test_override_; +}; + +TEST_P(ShortcutSubManagerTest, ConfigureAppInstall) { + std::map<SquareSizePx, SkBitmap> icon_map; + icon_map[icon_size::k16] = CreateSolidColorIcon(icon_size::k16, SK_ColorBLUE); + icon_map[icon_size::k24] = CreateSolidColorIcon(icon_size::k24, SK_ColorRED); + icon_map[icon_size::k128] = + CreateSolidColorIcon(icon_size::k128, SK_ColorGREEN); + icon_map[icon_size::k512] = + CreateSolidColorIcon(icon_size::k512, SK_ColorYELLOW); + const AppId& app_id = InstallWebAppWithShortcuts(std::move(icon_map)); + + auto state = + provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + + if (AreOsIntegrationSubManagersEnabled()) { + ASSERT_THAT(state.value().shortcut().title(), testing::Eq("Test App")); + ASSERT_THAT(state.value().shortcut().icon_data_any_size(), + testing::Eq(kTotalIconSizes)); + + for (const proto::ShortcutIconData& icon_time_map_data : + state.value().shortcut().icon_data_any()) { + ASSERT_THAT( + syncer::ProtoTimeToTime(icon_time_map_data.timestamp()).is_null(), + testing::IsFalse()); + } + } else { + ASSERT_FALSE(os_integration_state.has_shortcut()); + } + + // TODO(dmurph): Implement shortcut & color detection if + // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032. +} + +TEST_P(ShortcutSubManagerTest, ConfigureAppUninstall) { + std::map<SquareSizePx, SkBitmap> icon_map; + icon_map[icon_size::k16] = CreateSolidColorIcon(icon_size::k16, SK_ColorBLUE); + icon_map[icon_size::k24] = CreateSolidColorIcon(icon_size::k24, SK_ColorRED); + icon_map[icon_size::k128] = + CreateSolidColorIcon(icon_size::k128, SK_ColorGREEN); + icon_map[icon_size::k512] = + CreateSolidColorIcon(icon_size::k512, SK_ColorYELLOW); + const AppId& app_id = InstallWebAppWithShortcuts(std::move(icon_map)); + + test::UninstallAllWebApps(profile()); + auto state = + provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); + ASSERT_FALSE(state.has_value()); + + // TODO(dmurph): Implement shortcut & color detection if + // `AreSubManagersExecuteEnabled()` returns true. https://crbug.com/1404032. +} + +INSTANTIATE_TEST_SUITE_P( + All, + ShortcutSubManagerTest, + ::testing::Values(OsIntegrationSubManagersState::kSaveStateToDB, + OsIntegrationSubManagersState::kDisabled), + test::GetOsIntegrationSubManagersTestName); + +} // namespace + +} // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/web_app_run_on_os_login.cc b/chrome/browser/web_applications/os_integration/web_app_run_on_os_login.cc index 55a3494..46d73d1a 100644 --- a/chrome/browser/web_applications/os_integration/web_app_run_on_os_login.cc +++ b/chrome/browser/web_applications/os_integration/web_app_run_on_os_login.cc
@@ -8,6 +8,7 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_registry_update.h" @@ -39,7 +40,9 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(sync_bridge); - { + // TODO(crbug.com/1401125): Remove once sub managers have been implemented and + // OsIntegrationManager::Synchronize() is running fine. + if (!AreSubManagersExecuteEnabled()) { ScopedRegistryUpdate update(sync_bridge); update->UpdateApp(shortcut_info->extension_id) ->SetRunOnOsLoginOsIntegrationState(RunOnOsLoginMode::kWindowed); @@ -58,7 +61,10 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(sync_bridge); - if (sync_bridge->registrar().IsInstalled(app_id)) { + // TODO(crbug.com/1401125): Remove once sub managers have been implemented and + // OsIntegrationManager::Synchronize() is running fine. + if (!AreSubManagersExecuteEnabled() && + sync_bridge->registrar().IsInstalled(app_id)) { ScopedRegistryUpdate update(sync_bridge); update->UpdateApp(app_id)->SetRunOnOsLoginOsIntegrationState( RunOnOsLoginMode::kNotRun);
diff --git a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto index 11e3178..ade2248 100644 --- a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto +++ b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
@@ -88,5 +88,5 @@ optional FileHandling file_handling = 7; // Add data states for other OS integration hooks here. // New fields added to this message must also be added to: - // OsStatesDebugValue() + // OsStatesDebugValue() and GenerateRandomWebAppOsIntegrationState(). } \ No newline at end of file
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc index fa4a7b7..d24fe2e 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -58,6 +58,7 @@ #include "components/services/app_service/public/cpp/protocol_handler_info.h" #include "components/services/app_service/public/cpp/share_target.h" #include "components/services/app_service/public/cpp/url_handler_info.h" +#include "components/sync/base/time.h" #include "components/webapps/browser/installable/installable_metrics.h" #include "content/public/browser/service_worker_context.h" #include "content/public/browser/storage_partition.h" @@ -380,6 +381,92 @@ } return icons; } + +proto::WebAppOsIntegrationState GenerateRandomWebAppOsIntegrationState( + RandomHelper& random, + WebApp& app) { + proto::WebAppOsIntegrationState state; + + // Randomly fill shortcuts data. + auto* shortcuts = state.mutable_shortcut(); + shortcuts->set_title(app.untranslated_name()); + shortcuts->set_description(app.untranslated_description()); + auto* first_shortcut = shortcuts->add_icon_data_any(); + first_shortcut->set_icon_size(32); + first_shortcut->set_timestamp(syncer::TimeToProtoTime( + base::Time::UnixEpoch() + base::Milliseconds(random.next_uint()))); + + // Randomly fill protocols_handled. + auto* protocols_handled = state.mutable_protocols_handled(); + int num_protocols = random.next_uint(/*bound=*/3); + for (int i = 0; i < num_protocols; i++) { + auto* protocol = protocols_handled->add_protocols(); + protocol->set_protocol(base::StrCat({"web+test", base::NumberToString(i)})); + protocol->set_url( + base::StrCat({app.start_url().spec(), base::NumberToString(i)})); + } + + // Randomly fill run_on_os_login. + const proto::RunOnOsLoginMode run_on_os_login_modes[3] = { + proto::RunOnOsLoginMode::NOT_RUN, proto::RunOnOsLoginMode::WINDOWED, + proto::RunOnOsLoginMode::MINIMIZED}; + state.mutable_run_on_os_login()->set_run_on_os_login_mode( + run_on_os_login_modes[random.next_uint(/*bound=*/3)]); + + // Randomly fill uninstallation registration logic. + state.mutable_uninstall_registration()->set_registered_with_os( + random.next_bool()); + + // Randomly fill shortcuts menu information. + auto* shortcut_menus = state.mutable_shortcut_menus(); + int count_shortcut_menu_items = random.next_uint(/*bound=*/2); + for (int i = 0; i < count_shortcut_menu_items; i++) { + auto* menu_info = shortcut_menus->add_shortcut_menu_info(); + menu_info->set_shortcut_name( + base::StrCat({"shortcut_name", base::NumberToString(i)})); + menu_info->set_shortcut_launch_url( + base::StrCat({app.scope().spec(), base::NumberToString(i)})); + + auto* data_any = menu_info->add_icon_data_any(); + data_any->set_icon_size(16 * random.next_uint(/*bound=*/4)); + data_any->set_timestamp(syncer::TimeToProtoTime( + base::Time::UnixEpoch() + base::Milliseconds(random.next_uint()))); + + auto* data_maskable = menu_info->add_icon_data_maskable(); + data_maskable->set_icon_size(16 * random.next_uint(/*bound=*/4)); + data_maskable->set_timestamp(syncer::TimeToProtoTime( + base::Time::UnixEpoch() + base::Milliseconds(random.next_uint()))); + + auto* data_monochrome = menu_info->add_icon_data_monochrome(); + data_monochrome->set_icon_size(16 * random.next_uint(/*bound=*/4)); + data_monochrome->set_timestamp(syncer::TimeToProtoTime( + base::Time::UnixEpoch() + base::Milliseconds(random.next_uint()))); + } + + // Randomly fill file handling information. + auto* file_handling = state.mutable_file_handling(); + int count_file_handlers = random.next_uint(/*bound=*/2); + for (int i = 0; i < count_file_handlers; i++) { + auto* file_handlers = file_handling->add_file_handlers(); + int count_accepts = random.next_uint(/*bound=*/2); + file_handlers->set_action( + base::StrCat({"https://file.open/", base::NumberToString(i)})); + file_handlers->set_display_name( + base::StrCat({"file_type", base::NumberToString(i)})); + for (int j = 0; j < count_accepts; j++) { + auto* accept = file_handlers->add_accept(); + accept->set_mimetype( + base::StrCat({"application/type", base::NumberToString(i)})); + accept->add_file_extensions( + base::StrCat({"foo", base::NumberToString(i)})); + accept->add_file_extensions( + base::StrCat({"bar", base::NumberToString(i)})); + } + } + + return state; +} + } // namespace std::string GetExternalPrefMigrationTestName( @@ -725,12 +812,8 @@ app->SetAlwaysShowToolbarInFullscreen(random.next_bool()); - if (random.next_bool()) { - // TODO(crbug.com/1403844): Fill this up randomly to use in - // WebAppDatabaseTests. - proto::WebAppOsIntegrationState state; - app->SetCurrentOsIntegrationStates(state); - } + app->SetCurrentOsIntegrationStates( + GenerateRandomWebAppOsIntegrationState(random, *app)); if (random.next_bool()) { constexpr size_t kNumLocationTypes =
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index 7461deb..15d0d1e 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -85,9 +85,9 @@ shortcut_data.Set("description", current_states.shortcut().description()); base::Value::Dict icon_data; for (const auto& data : current_states.shortcut().icon_data_any()) { - icon_data.Set(base::NumberToString(data.icon_size()), - syncer::GetTimeDebugString( - syncer::ProtoTimeToTime(data.timestamp()))); + icon_data.Set( + base::NumberToString(data.icon_size()), + base::StreamableToString(syncer::ProtoTimeToTime(data.timestamp()))); } shortcut_data.Set("icon_size_to_timestamp_map", base::Value(std::move(icon_data))); @@ -125,21 +125,20 @@ base::Value::Dict icon_data_maskable_dict; base::Value::Dict icon_data_monochrome_dict; for (const auto& icon_data_any : shortcut_menu.icon_data_any()) { - icon_data_any_dict.Set( - base::NumberToString(icon_data_any.icon_size()), - syncer::GetTimeDebugString( - syncer::ProtoTimeToTime(icon_data_any.timestamp()))); + icon_data_any_dict.Set(base::NumberToString(icon_data_any.icon_size()), + base::StreamableToString(syncer::ProtoTimeToTime( + icon_data_any.timestamp()))); } for (const auto& icon_data_maskable : shortcut_menu.icon_data_any()) { icon_data_maskable_dict.Set( base::NumberToString(icon_data_maskable.icon_size()), - syncer::GetTimeDebugString( + base::StreamableToString( syncer::ProtoTimeToTime(icon_data_maskable.timestamp()))); } for (const auto& icon_data_monochrome : shortcut_menu.icon_data_any()) { icon_data_monochrome_dict.Set( base::NumberToString(icon_data_monochrome.icon_size()), - syncer::GetTimeDebugString( + base::StreamableToString( syncer::ProtoTimeToTime(icon_data_monochrome.timestamp()))); } base::Value::Dict shortcut_menu_dict;
diff --git a/chrome/browser/web_applications/web_app_command_manager.cc b/chrome/browser/web_applications/web_app_command_manager.cc index be88f61e..79dc94e 100644 --- a/chrome/browser/web_applications/web_app_command_manager.cc +++ b/chrome/browser/web_applications/web_app_command_manager.cc
@@ -12,13 +12,12 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_forward.h" +#include "base/location.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" #include "base/task/sequenced_task_runner.h" #include "chrome/browser/web_applications/commands/web_app_command.h" -#include "chrome/browser/web_applications/locks/app_lock.h" #include "chrome/browser/web_applications/locks/lock.h" -#include "chrome/browser/web_applications/locks/shared_web_contents_with_app_lock.h" #include "chrome/browser/web_applications/locks/web_app_lock_manager.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_install_task.h" @@ -31,11 +30,20 @@ namespace { -base::Value CreateLogValue(const WebAppCommand& command, - absl::optional<CommandResult> result) { +base::Value::Dict CreateCommandMetadata(const WebAppCommand& command) { base::Value::Dict dict; dict.Set("name", command.name()); dict.Set("id", command.id()); + if (command.scheduled_location().has_value()) { + dict.Set("scheduled_location", + command.scheduled_location().value().ToString()); + } + return dict; +} + +base::Value CreateLogValue(const WebAppCommand& command, + absl::optional<CommandResult> result) { + base::Value::Dict dict = CreateCommandMetadata(command); base::Value debug_value = command.ToDebugValue(); bool is_empty_dict = debug_value.is_dict() && debug_value.DictEmpty(); if (!debug_value.is_none() && !is_empty_dict) { @@ -82,8 +90,11 @@ } void WebAppCommandManager::ScheduleCommand( - std::unique_ptr<WebAppCommand> command) { + std::unique_ptr<WebAppCommand> command, + const base::Location& location) { DCHECK(command); + command->SetScheduledLocation(location); + DVLOG(2) << "Scheduling command: " << CreateCommandMetadata(*command); if (!started_) { commands_waiting_for_start_.push_back(std::move(command)); return; @@ -98,7 +109,8 @@ command_it->second->RequestLock( this, lock_manager_.get(), base::BindOnce(&WebAppCommandManager::OnLockAcquired, - weak_ptr_factory_.GetWeakPtr(), command_id)); + weak_ptr_factory_.GetWeakPtr(), command_id), + location); } void WebAppCommandManager::OnLockAcquired(WebAppCommand::Id command_id, @@ -139,6 +151,7 @@ std::move(start_command))); return; } + DVLOG(2) << "Starting command: " << CreateCommandMetadata(*command); std::move(start_command).Run(); } @@ -165,7 +178,7 @@ provider_->install_manager().TakeCommandErrorLog( PassKey(), std::move(url_loader_error)); } - + DVLOG(2) << "Starting command: " << CreateCommandMetadata(*command); std::move(start_command).Run(); }
diff --git a/chrome/browser/web_applications/web_app_command_manager.h b/chrome/browser/web_applications/web_app_command_manager.h index 8018cec..6625cb9 100644 --- a/chrome/browser/web_applications/web_app_command_manager.h +++ b/chrome/browser/web_applications/web_app_command_manager.h
@@ -9,6 +9,7 @@ #include <map> #include <memory> +#include "base/location.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" @@ -52,7 +53,8 @@ // Enqueues the given command in the queue corresponding to the command's // `lock_description()`. `Start()` will always be called asynchronously. - void ScheduleCommand(std::unique_ptr<WebAppCommand> command); + void ScheduleCommand(std::unique_ptr<WebAppCommand> command, + const base::Location& location = FROM_HERE); // Called on system shutdown. This call is also forwarded to any commands that // have been `Start()`ed.
diff --git a/chrome/browser/web_applications/web_app_command_scheduler.cc b/chrome/browser/web_applications/web_app_command_scheduler.cc index 87db018d..c594a00 100644 --- a/chrome/browser/web_applications/web_app_command_scheduler.cc +++ b/chrome/browser/web_applications/web_app_command_scheduler.cc
@@ -8,6 +8,7 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/location.h" #include "base/task/sequenced_task_runner.h" #include "base/types/expected.h" #include "base/values.h" @@ -83,7 +84,8 @@ bool bypass_service_worker_check, WebAppInstallDialogCallback dialog_callback, OnceInstallCallback callback, - bool use_fallback) { + bool use_fallback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), AppId(), @@ -96,14 +98,16 @@ std::make_unique<FetchManifestAndInstallCommand>( install_surface, std::move(contents), bypass_service_worker_check, std::move(dialog_callback), std::move(callback), use_fallback, - std::make_unique<WebAppDataRetriever>())); + std::make_unique<WebAppDataRetriever>()), + location); } void WebAppCommandScheduler::InstallFromInfo( std::unique_ptr<WebAppInstallInfo> install_info, bool overwrite_existing_manifest_fields, webapps::WebappInstallSource install_surface, - OnceInstallCallback install_callback) { + OnceInstallCallback install_callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(install_callback), AppId(), @@ -116,7 +120,8 @@ std::make_unique<InstallFromInfoCommand>( &profile_.get(), std::move(install_info), overwrite_existing_manifest_fields, install_surface, - std::move(install_callback))); + std::move(install_callback)), + location); } void WebAppCommandScheduler::InstallFromInfoWithParams( @@ -124,7 +129,8 @@ bool overwrite_existing_manifest_fields, webapps::WebappInstallSource install_surface, OnceInstallCallback install_callback, - const WebAppInstallParams& install_params) { + const WebAppInstallParams& install_params, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(install_callback), AppId(), @@ -137,7 +143,8 @@ std::make_unique<InstallFromInfoCommand>( &profile_.get(), std::move(install_info), overwrite_existing_manifest_fields, install_surface, - std::move(install_callback), install_params)); + std::move(install_callback), install_params), + location); } void WebAppCommandScheduler::InstallFromInfoWithParams( @@ -148,7 +155,8 @@ webapps::InstallResultCode code, bool did_uninstall_and_replace)> install_callback, const WebAppInstallParams& install_params, - const std::vector<AppId>& apps_to_uninstall) { + const std::vector<AppId>& apps_to_uninstall, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, @@ -163,7 +171,8 @@ std::make_unique<InstallFromInfoCommand>( &profile_.get(), std::move(install_info), overwrite_existing_manifest_fields, std::move(install_surface), - std::move(install_callback), install_params, apps_to_uninstall)); + std::move(install_callback), install_params, apps_to_uninstall), + location); } void WebAppCommandScheduler::InstallExternallyManagedApp( @@ -173,7 +182,8 @@ bool did_uninstall_and_replace)> install_callback, base::WeakPtr<content::WebContents> contents, std::unique_ptr<WebAppDataRetriever> data_retriever, - WebAppUrlLoader* web_app_url_loader) { + WebAppUrlLoader* web_app_url_loader, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, @@ -188,7 +198,8 @@ std::make_unique<ExternallyManagedInstallCommand>( &profile_.get(), external_install_options, std::move(install_callback), contents, std::move(data_retriever), - web_app_url_loader)); + web_app_url_loader), + location); } void WebAppCommandScheduler::InstallPlaceholder( @@ -196,7 +207,8 @@ base::OnceCallback<void(const AppId& app_id, webapps::InstallResultCode code, bool did_uninstall_and_replace)> callback, - base::WeakPtr<content::WebContents> web_contents) { + base::WeakPtr<content::WebContents> web_contents, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, @@ -210,13 +222,15 @@ provider_->command_manager().ScheduleCommand( std::make_unique<InstallPlaceholderCommand>( &profile_.get(), install_options, std::move(callback), web_contents, - std::make_unique<WebAppDataRetriever>())); + std::make_unique<WebAppDataRetriever>()), + location); } void WebAppCommandScheduler::PersistFileHandlersUserChoice( const AppId& app_id, bool allowed, - base::OnceClosure callback) { + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback))); @@ -224,15 +238,17 @@ } provider_->command_manager().ScheduleCommand( - UpdateFileHandlerCommand::CreateForPersistUserChoice( - app_id, allowed, std::move(callback))); + UpdateFileHandlerCommand::CreateForPersistUserChoice(app_id, allowed, + std::move(callback)), + location); } void WebAppCommandScheduler::ScheduleManifestUpdateDataFetch( const GURL& url, const AppId& app_id, base::WeakPtr<content::WebContents> contents, - ManifestFetchCallback callback) { + ManifestFetchCallback callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -245,7 +261,8 @@ provider_->command_manager().ScheduleCommand( std::make_unique<ManifestUpdateDataFetchCommand>( url, app_id, contents, std::move(callback), - std::make_unique<WebAppDataRetriever>())); + std::make_unique<WebAppDataRetriever>()), + location); } void WebAppCommandScheduler::ScheduleManifestUpdateFinalize( @@ -255,7 +272,8 @@ bool app_identity_update_allowed, std::unique_ptr<ScopedKeepAlive> keep_alive, std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive, - ManifestWriteCallback callback) { + ManifestWriteCallback callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -269,13 +287,15 @@ std::make_unique<ManifestUpdateFinalizeCommand>( url, app_id, std::move(install_info), app_identity_update_allowed, std::move(callback), std::move(keep_alive), - std::move(profile_keep_alive))); + std::move(profile_keep_alive)), + location); } void WebAppCommandScheduler::FetchInstallabilityForChromeManagement( const GURL& url, base::WeakPtr<content::WebContents> web_contents, - FetchInstallabilityForChromeManagementCallback callback) { + FetchInstallabilityForChromeManagementCallback callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -288,13 +308,15 @@ std::make_unique<web_app::FetchInstallabilityForChromeManagement>( url, web_contents, std::make_unique<web_app::WebAppUrlLoader>(), std::make_unique<web_app::WebAppDataRetriever>(), - std::move(callback))); + std::move(callback)), + location); } void WebAppCommandScheduler::InstallIsolatedWebApp( const IsolatedWebAppUrlInfo& url_info, const IsolatedWebAppLocation& location, - InstallIsolatedWebAppCallback callback) { + InstallIsolatedWebAppCallback callback, + const base::Location& call_location) { if (IsShuttingDown()) { InstallIsolatedWebAppCommandError error; error.message = "The profile and/or browser are shutting down."; @@ -307,11 +329,13 @@ provider_->command_manager().ScheduleCommand( std::make_unique<InstallIsolatedWebAppCommand>( url_info, location, CreateIsolatedWebAppWebContents(*profile_), - std::make_unique<WebAppUrlLoader>(), *profile_, std::move(callback))); + std::make_unique<WebAppUrlLoader>(), *profile_, std::move(callback)), + call_location); } void WebAppCommandScheduler::InstallFromSync(const WebApp& web_app, - OnceInstallCallback callback) { + OnceInstallCallback callback, + const base::Location& location) { DCHECK(web_app.is_from_sync_and_pending_installation()); InstallFromSyncCommand::Params params = InstallFromSyncCommand::Params( web_app.app_id(), web_app.manifest_id(), web_app.start_url(), @@ -321,15 +345,16 @@ provider_->command_manager().ScheduleCommand( std::make_unique<InstallFromSyncCommand>( url_loader_.get(), &profile_.get(), - std::make_unique<WebAppDataRetriever>(), params, - std::move(callback))); + std::make_unique<WebAppDataRetriever>(), params, std::move(callback)), + location); } void WebAppCommandScheduler::Uninstall( const AppId& app_id, absl::optional<WebAppManagement::Type> external_install_source, webapps::WebappUninstallSource uninstall_source, - WebAppUninstallCommand::UninstallWebAppCallback callback) { + WebAppUninstallCommand::UninstallWebAppCallback callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -339,12 +364,15 @@ provider_->command_manager().ScheduleCommand( std::make_unique<WebAppUninstallCommand>( app_id, external_install_source, uninstall_source, - std::move(callback), &profile_.get())); + std::move(callback), &profile_.get()), + location); } -void WebAppCommandScheduler::SetRunOnOsLoginMode(const AppId& app_id, - RunOnOsLoginMode login_mode, - base::OnceClosure callback) { +void WebAppCommandScheduler::SetRunOnOsLoginMode( + const AppId& app_id, + RunOnOsLoginMode login_mode, + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(callback)); @@ -353,11 +381,14 @@ provider_->command_manager().ScheduleCommand( RunOnOsLoginCommand::CreateForSetLoginMode(app_id, login_mode, - std::move(callback))); + std::move(callback)), + location); } -void WebAppCommandScheduler::SyncRunOnOsLoginMode(const AppId& app_id, - base::OnceClosure callback) { +void WebAppCommandScheduler::SyncRunOnOsLoginMode( + const AppId& app_id, + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(callback)); @@ -365,14 +396,16 @@ } provider_->command_manager().ScheduleCommand( - RunOnOsLoginCommand::CreateForSyncLoginMode(app_id, std::move(callback))); + RunOnOsLoginCommand::CreateForSyncLoginMode(app_id, std::move(callback)), + location); } void WebAppCommandScheduler::UpdateProtocolHandlerUserApproval( const AppId& app_id, const std::string& protocol_scheme, ApiApprovalState approval_state, - base::OnceClosure callback) { + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(callback)); @@ -381,13 +414,15 @@ provider_->command_manager().ScheduleCommand( std::make_unique<UpdateProtocolHandlerApprovalCommand>( - app_id, protocol_scheme, approval_state, std::move(callback))); + app_id, protocol_scheme, approval_state, std::move(callback)), + location); } void WebAppCommandScheduler::ClearWebAppBrowsingData( const base::Time& begin_time, const base::Time& end_time, - base::OnceClosure done) { + base::OnceClosure done, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE, std::move(done)); @@ -397,12 +432,14 @@ provider_->scheduler().ScheduleCallbackWithLock<FullSystemLock>( "ClearWebAppBrowsingData", std::make_unique<FullSystemLockDescription>(), base::BindOnce(web_app::ClearWebAppBrowsingData, begin_time, end_time, - std::move(done))); + std::move(done)), + location); } void WebAppCommandScheduler::SetAppIsDisabled(const AppId& app_id, bool is_disabled, - base::OnceClosure callback) { + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(callback)); @@ -418,33 +455,40 @@ web_app::AppLock& lock) { lock.sync_bridge().SetAppIsDisabled(lock, app_id, is_disabled); }, - app_id, is_disabled)); + app_id, is_disabled), + location); } template <class LockType, class DescriptionType> void WebAppCommandScheduler::ScheduleCallbackWithLock( const std::string& operation_name, std::unique_ptr<DescriptionType> lock_description, - base::OnceCallback<void(LockType& lock)> callback) { - if (IsShuttingDown()) + base::OnceCallback<void(LockType& lock)> callback, + const base::Location& location) { + if (IsShuttingDown()) { return; + } provider_->command_manager().ScheduleCommand( std::make_unique<CallbackCommand<LockType>>( - operation_name, std::move(lock_description), std::move(callback))); + operation_name, std::move(lock_description), std::move(callback)), + location); } template <class LockType, class DescriptionType> void WebAppCommandScheduler::ScheduleCallbackWithLock( const std::string& operation_name, std::unique_ptr<DescriptionType> lock_description, - base::OnceCallback<base::Value(LockType& lock)> callback) { - if (IsShuttingDown()) + base::OnceCallback<base::Value(LockType& lock)> callback, + const base::Location& location) { + if (IsShuttingDown()) { return; + } provider_->command_manager().ScheduleCommand( std::make_unique<CallbackCommand<LockType>>( - operation_name, std::move(lock_description), std::move(callback))); + operation_name, std::move(lock_description), std::move(callback)), + location); } void WebAppCommandScheduler::LaunchApp( @@ -455,24 +499,27 @@ const absl::optional<GURL>& protocol_handler_launch_url, const absl::optional<GURL>& file_launch_url, const std::vector<base::FilePath>& launch_files, - LaunchWebAppCallback callback) { + LaunchWebAppCallback callback, + const base::Location& location) { LaunchApp(WebAppUiManager::CreateAppLaunchParamsWithoutWindowConfig( app_id, command_line, current_directory, url_handler_launch_url, protocol_handler_launch_url, file_launch_url, launch_files), LaunchWebAppWindowSetting::kOverrideWithWebAppConfig, - std::move(callback)); + std::move(callback), location); } void WebAppCommandScheduler::LaunchAppWithCustomParams( apps::AppLaunchParams params, - LaunchWebAppCallback callback) { + LaunchWebAppCallback callback, + const base::Location& location) { LaunchApp(std::move(params), LaunchWebAppWindowSetting::kUseLaunchParams, - std::move(callback)); + std::move(callback), location); } void WebAppCommandScheduler::SynchronizeOsIntegration( const AppId& app_id, - base::OnceClosure synchronize_callback) { + base::OnceClosure synchronize_callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(synchronize_callback)); @@ -481,11 +528,13 @@ provider_->command_manager().ScheduleCommand( std::make_unique<OsIntegrationSynchronizeCommand>( - app_id, std::move(synchronize_callback))); + app_id, std::move(synchronize_callback)), + location); } void WebAppCommandScheduler::InstallAppLocally(const AppId& app_id, - base::OnceClosure callback) { + base::OnceClosure callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, std::move(callback)); @@ -493,12 +542,14 @@ } provider_->command_manager().ScheduleCommand( - std::make_unique<InstallAppLocallyCommand>(app_id, std::move(callback))); + std::make_unique<InstallAppLocallyCommand>(app_id, std::move(callback)), + location); } void WebAppCommandScheduler::LaunchApp(apps::AppLaunchParams params, LaunchWebAppWindowSetting option, - LaunchWebAppCallback callback) { + LaunchWebAppCallback callback, + const base::Location& location) { if (IsShuttingDown()) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), nullptr, nullptr, @@ -519,7 +570,7 @@ base::BindOnce(&WebAppCommandScheduler::LaunchAppWithKeepAlives, weak_ptr_factory_.GetWeakPtr(), std::move(params), option, std::move(callback), std::move(profile_keep_alive), - std::move(browser_keep_alive)); + std::move(browser_keep_alive), location); // Because we are accessing the WebAppUiManager, we should wait until the // provider has started to actually create the command. if (!provider_->is_registry_ready()) { @@ -535,7 +586,8 @@ LaunchWebAppWindowSetting launch_setting, LaunchWebAppCallback callback, std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive, - std::unique_ptr<ScopedKeepAlive> browser_keep_alive) { + std::unique_ptr<ScopedKeepAlive> browser_keep_alive, + const base::Location& location) { DCHECK(provider_->is_registry_ready()); // Decorate the callback to ensure the keep alives are kept alive during the @@ -555,7 +607,8 @@ base::BindOnce(&WebAppUiManager::LaunchWebApp, base::Unretained(&provider_->ui_manager()), std::move(params), launch_setting, std::ref(*profile_), - std::move(callback))); + std::move(callback)), + location); } bool WebAppCommandScheduler::IsShuttingDown() const { @@ -567,53 +620,63 @@ template void WebAppCommandScheduler::ScheduleCallbackWithLock<NoopLock>( const std::string& operation_name, std::unique_ptr<NoopLock::LockDescription> lock_description, - base::OnceCallback<void(NoopLock& lock)> callback); + base::OnceCallback<void(NoopLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<NoopLock>( const std::string& operation_name, std::unique_ptr<NoopLock::LockDescription> lock_description, - base::OnceCallback<base::Value(NoopLock& lock)> callback); + base::OnceCallback<base::Value(NoopLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<SharedWebContentsLock>( const std::string& operation_name, std::unique_ptr<SharedWebContentsLock::LockDescription> lock_description, - base::OnceCallback<void(SharedWebContentsLock& lock)> callback); + base::OnceCallback<void(SharedWebContentsLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<SharedWebContentsLock>( const std::string& operation_name, std::unique_ptr<SharedWebContentsLock::LockDescription> lock_description, - base::OnceCallback<base::Value(SharedWebContentsLock& lock)> callback); + base::OnceCallback<base::Value(SharedWebContentsLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<AppLock>( const std::string& operation_name, std::unique_ptr<AppLock::LockDescription> lock_description, - base::OnceCallback<void(AppLock& lock)> callback); + base::OnceCallback<void(AppLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<AppLock>( const std::string& operation_name, std::unique_ptr<AppLock::LockDescription> lock_description, - base::OnceCallback<base::Value(AppLock& lock)> callback); + base::OnceCallback<base::Value(AppLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<SharedWebContentsWithAppLock>( const std::string& operation_name, std::unique_ptr<SharedWebContentsWithAppLock::LockDescription> lock_description, - base::OnceCallback<void(SharedWebContentsWithAppLock& lock)> callback); + base::OnceCallback<void(SharedWebContentsWithAppLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<SharedWebContentsWithAppLock>( const std::string& operation_name, std::unique_ptr<SharedWebContentsWithAppLock::LockDescription> lock_description, base::OnceCallback<base::Value(SharedWebContentsWithAppLock& lock)> - callback); + callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<FullSystemLock>( const std::string& operation_name, std::unique_ptr<FullSystemLock::LockDescription> lock_description, - base::OnceCallback<void(FullSystemLock& lock)> callback); + base::OnceCallback<void(FullSystemLock& lock)> callback, + const base::Location& location); template void WebAppCommandScheduler::ScheduleCallbackWithLock<FullSystemLock>( const std::string& operation_name, std::unique_ptr<FullSystemLock::LockDescription> lock_description, - base::OnceCallback<base::Value(FullSystemLock& lock)> callback); + base::OnceCallback<base::Value(FullSystemLock& lock)> callback, + const base::Location& location); } // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_command_scheduler.h b/chrome/browser/web_applications/web_app_command_scheduler.h index 46c470be..565b496e 100644 --- a/chrome/browser/web_applications/web_app_command_scheduler.h +++ b/chrome/browser/web_applications/web_app_command_scheduler.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_COMMAND_SCHEDULER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_COMMAND_SCHEDULER_H_ +#include "base/location.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" @@ -68,7 +69,8 @@ bool bypass_service_worker_check, WebAppInstallDialogCallback dialog_callback, OnceInstallCallback callback, - bool use_fallback); + bool use_fallback, + const base::Location& location = FROM_HERE); // Install with provided `WebAppInstallInfo` instead of fetching data from // manifest. @@ -77,14 +79,16 @@ void InstallFromInfo(std::unique_ptr<WebAppInstallInfo> install_info, bool overwrite_existing_manifest_fields, webapps::WebappInstallSource install_surface, - OnceInstallCallback install_callback); + OnceInstallCallback install_callback, + const base::Location& location = FROM_HERE); void InstallFromInfoWithParams( std::unique_ptr<WebAppInstallInfo> install_info, bool overwrite_existing_manifest_fields, webapps::WebappInstallSource install_surface, OnceInstallCallback install_callback, - const WebAppInstallParams& install_params); + const WebAppInstallParams& install_params, + const base::Location& location = FROM_HERE); void InstallFromInfoWithParams( std::unique_ptr<WebAppInstallInfo> install_info, @@ -94,7 +98,8 @@ webapps::InstallResultCode code, bool did_uninstall_and_replace)> install_callback, const WebAppInstallParams& install_params, - const std::vector<AppId>& apps_to_uninstall); + const std::vector<AppId>& apps_to_uninstall, + const base::Location& location = FROM_HERE); // Install web apps managed by `ExternallyInstalledAppManager`. void InstallExternallyManagedApp( @@ -104,7 +109,8 @@ bool did_uninstall_and_replace)> install_callback, base::WeakPtr<content::WebContents> contents, std::unique_ptr<WebAppDataRetriever> data_retriever, - WebAppUrlLoader* web_app_url_loader); + WebAppUrlLoader* web_app_url_loader, + const base::Location& location = FROM_HERE); // Install a placeholder app, this is used during externally managed install // flow when url load fails. @@ -113,11 +119,14 @@ base::OnceCallback<void(const AppId& app_id, webapps::InstallResultCode code, bool did_uninstall_and_replace)> callback, - base::WeakPtr<content::WebContents> web_contents); + base::WeakPtr<content::WebContents> web_contents, + const base::Location& location = FROM_HERE); - void PersistFileHandlersUserChoice(const AppId& app_id, - bool allowed, - base::OnceClosure callback); + void PersistFileHandlersUserChoice( + const AppId& app_id, + bool allowed, + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Schedule a command that performs fetching data from the manifest // for a manifest update. @@ -125,7 +134,8 @@ const GURL& url, const AppId& app_id, base::WeakPtr<content::WebContents> contents, - ManifestFetchCallback callback); + ManifestFetchCallback callback, + const base::Location& location = FROM_HERE); // Schedules a command that performs the data writes into the DB for // completion of the manifest update. @@ -136,50 +146,62 @@ bool app_identity_update_allowed, std::unique_ptr<ScopedKeepAlive> keep_alive, std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive, - ManifestWriteCallback callback); + ManifestWriteCallback callback, + const base::Location& location = FROM_HERE); void FetchInstallabilityForChromeManagement( const GURL& url, base::WeakPtr<content::WebContents> web_contents, - FetchInstallabilityForChromeManagementCallback callback); + FetchInstallabilityForChromeManagementCallback callback, + const base::Location& location = FROM_HERE); // Schedules a command that installs the Isolated Web App described by the // given IsolatedWebAppUrlInfo and IsolationData. void InstallIsolatedWebApp(const IsolatedWebAppUrlInfo& url_info, const IsolatedWebAppLocation& location, - InstallIsolatedWebAppCallback callback); + InstallIsolatedWebAppCallback callback, + const base::Location& call_location = FROM_HERE); // Scheduler a command that installs a web app from sync. - void InstallFromSync(const WebApp& web_app, OnceInstallCallback callback); + void InstallFromSync(const WebApp& web_app, + OnceInstallCallback callback, + const base::Location& location = FROM_HERE); // Schedules a command that uninstalls a web app. void Uninstall(const AppId& app_id, absl::optional<WebAppManagement::Type> external_install_source, webapps::WebappUninstallSource uninstall_source, - WebAppInstallFinalizer::UninstallWebAppCallback callback); + WebAppInstallFinalizer::UninstallWebAppCallback callback, + const base::Location& location = FROM_HERE); // Schedules a command that updates run on os login to provided `login_mode` // for a web app. void SetRunOnOsLoginMode(const AppId& app_id, RunOnOsLoginMode login_mode, - base::OnceClosure callback); + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Schedules a command that syncs the run on os login mode from web app DB to // OS. - void SyncRunOnOsLoginMode(const AppId& app_id, base::OnceClosure callback); + void SyncRunOnOsLoginMode(const AppId& app_id, + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Updates the approved or disallowed protocol list for the given app. If // necessary, it also updates the protocol registration with the OS. - void UpdateProtocolHandlerUserApproval(const AppId& app_id, - const std::string& protocol_scheme, - ApiApprovalState approval_state, - base::OnceClosure callback); + void UpdateProtocolHandlerUserApproval( + const AppId& app_id, + const std::string& protocol_scheme, + ApiApprovalState approval_state, + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Set app to disabled, This is Chrome OS specific and no-op on other // platforms. void SetAppIsDisabled(const AppId& app_id, bool is_disabled, - base::OnceClosure callback); + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Schedules provided callback after `lock` is granted. The callback can // access web app resources through the `lock`. The `operation_name` is used @@ -192,7 +214,8 @@ void ScheduleCallbackWithLock( const std::string& operation_name, std::unique_ptr<DescriptionType> lock_description, - base::OnceCallback<void(LockType& lock)> callback); + base::OnceCallback<void(LockType& lock)> callback, + const base::Location& location = FROM_HERE); // Same as above, but the callback can return a debug value to also be used in // WebAppCommandManager logs, viewable from chrome://web-app-internals. template <typename LockType, @@ -200,13 +223,15 @@ void ScheduleCallbackWithLock( const std::string& operation_name, std::unique_ptr<DescriptionType> lock_description, - base::OnceCallback<base::Value(LockType& lock)> callback); + base::OnceCallback<base::Value(LockType& lock)> callback, + const base::Location& location = FROM_HERE); // Schedules to clear the browsing data for web app, given the inclusive time // range. void ClearWebAppBrowsingData(const base::Time& begin_time, const base::Time& end_time, - base::OnceClosure done); + base::OnceClosure done, + const base::Location& location = FROM_HERE); // Launches the given app. This call also uses keep-alives to guarantee that // the browser and profile will not destruct before the launch is complete. @@ -217,21 +242,26 @@ const absl::optional<GURL>& protocol_handler_launch_url, const absl::optional<GURL>& file_launch_url, const std::vector<base::FilePath>& launch_files, - LaunchWebAppCallback callback); + LaunchWebAppCallback callback, + const base::Location& location = FROM_HERE); // Used to launch apps with a custom launch params. This does not respect the // configuration of the app, and will respect whatever the params say. void LaunchAppWithCustomParams(apps::AppLaunchParams params, - LaunchWebAppCallback callback); + LaunchWebAppCallback callback, + const base::Location& location = FROM_HERE); // Used to locally install an app from the chrome://apps page, triggered // by the AppLauncherHandler. - void InstallAppLocally(const AppId& app_id, base::OnceClosure callback); + void InstallAppLocally(const AppId& app_id, + base::OnceClosure callback, + const base::Location& location = FROM_HERE); // Used to schedule a synchronization of a web app's OS states with the // current DB states. void SynchronizeOsIntegration(const AppId& app_id, - base::OnceClosure synchronize_callback); + base::OnceClosure synchronize_callback, + const base::Location& location = FROM_HERE); // TODO(https://crbug.com/1298130): expose all commands for web app // operations. @@ -239,14 +269,16 @@ private: void LaunchApp(apps::AppLaunchParams params, LaunchWebAppWindowSetting option, - LaunchWebAppCallback callback); + LaunchWebAppCallback callback, + const base::Location& location); void LaunchAppWithKeepAlives( apps::AppLaunchParams params, LaunchWebAppWindowSetting option, LaunchWebAppCallback callback, std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive, - std::unique_ptr<ScopedKeepAlive> browser_keep_alive); + std::unique_ptr<ScopedKeepAlive> browser_keep_alive, + const base::Location& location); bool IsShuttingDown() const;
diff --git a/chrome/browser/web_applications/web_app_launch_queue.cc b/chrome/browser/web_applications/web_app_launch_queue.cc index 02c2e1d..7f4d20f 100644 --- a/chrome/browser/web_applications/web_app_launch_queue.cc +++ b/chrome/browser/web_applications/web_app_launch_queue.cc
@@ -11,7 +11,6 @@ #include "base/files/file_path.h" #include "base/memory/ptr_util.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "content/public/browser/file_system_access_entry_factory.h" #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc index 5401b03a..ff6d6b5 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.cc +++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -17,7 +17,6 @@ #include "base/metrics/user_metrics.h" #include "base/types/pass_key.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app.h"
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc index 0ca5490..38bb86e 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/containers/contains.h" +#include "base/containers/cxx20_erase_vector.h" #include "base/containers/flat_set.h" #include "base/functional/bind.h" #include "base/strings/string_util.h" @@ -204,7 +205,9 @@ const auto use_pk = Step::kPreSelectSingleAccount; const auto use_pk_multi = Step::kPreSelectAccount; const auto qr = Step::kCableV2QRCode; + const auto qr1st = base::test::FeatureRef(device::kWebAuthPasskeysUI); + const std::vector<base::test::FeatureRef> kAllFeatures = {qr1st}; const struct { int line_num; @@ -469,8 +472,12 @@ SCOPED_TRACE(RequestTypeToString(test.request_type)); SCOPED_TRACE(testing::Message() << "At line number: " << test.line_num); - base::test::ScopedFeatureList features; - features.InitWithFeatures(test.features, {}); + std::vector<base::test::FeatureRef> disabled_features = kAllFeatures; + base::EraseIf(disabled_features, [&test](const auto& feature) { + return base::Contains(test.features, feature); + }); + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures(test.features, disabled_features); TransportAvailabilityInfo transports_info; transports_info.is_ble_powered = true; @@ -591,6 +598,7 @@ tai.resident_key_requirement = is_passkey_request ? device::ResidentKeyRequirement::kRequired : device::ResidentKeyRequirement::kDiscouraged; + tai.is_ble_powered = true; AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.set_cable_transport_info(absl::nullopt, {}, base::DoNothing(), @@ -608,7 +616,9 @@ } // The mechanism selection sheet should now be showing. - EXPECT_EQ(model.current_step(), Step::kMechanismSelection); + EXPECT_EQ(model.current_step(), is_passkey_request + ? Step::kCableV2QRCode + : Step::kMechanismSelection); // Canceling the Windows UI ends the request because the user must have // selected the Windows option first. EXPECT_FALSE(model.OnWinUserCancelled());
diff --git a/chrome/browser/webauthn/local_credential_management.cc b/chrome/browser/webauthn/local_credential_management.cc index d297de9..08aee51 100644 --- a/chrome/browser/webauthn/local_credential_management.cc +++ b/chrome/browser/webauthn/local_credential_management.cc
@@ -8,7 +8,6 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_service.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
diff --git a/chrome/browser/win/titlebar_config.cc b/chrome/browser/win/titlebar_config.cc index ea0ec0b..39ad7b2 100644 --- a/chrome/browser/win/titlebar_config.cc +++ b/chrome/browser/win/titlebar_config.cc
@@ -10,6 +10,7 @@ bool ShouldCustomDrawSystemTitlebar() { // Cache flag lookup. static const bool custom_titlebar_disabled = + base::CommandLine::InitializedForCurrentProcess() && base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableWindows10CustomTitlebar);
diff --git a/chrome/browser/window_management/window_management_browsertest.cc b/chrome/browser/window_management/window_management_browsertest.cc index 06c0ddbfa..1b8e486 100644 --- a/chrome/browser/window_management/window_management_browsertest.cc +++ b/chrome/browser/window_management/window_management_browsertest.cc
@@ -20,7 +20,6 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "third_party/blink/public/common/switches.h" #include "ui/display/screen_base.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -117,7 +116,7 @@ display::ScreenBase screen; screen.display_list().AddDisplay({1, gfx::Rect(100, 1, 801, 802)}, display::DisplayList::Type::PRIMARY); - display::test::ScopedScreenOverride screen_override(&screen); + display::Screen::SetScreenInstance(&screen); #endif // BUILDFLAG(IS_CHROMEOS_ASH) ASSERT_EQ(1, display::Screen::GetScreen()->GetNumDisplays()); @@ -261,6 +260,9 @@ EXPECT_EQ(result, EvalJs(remote_child, await_screens_change)); } } +#if !BUILDFLAG(IS_CHROMEOS_ASH) + display::Screen::SetScreenInstance(nullptr); +#endif } // TODO(crbug.com/1183791): Disabled on non-ChromeOS because of races with @@ -283,7 +285,7 @@ display::DisplayList::Type::PRIMARY); screen.display_list().AddDisplay({2, gfx::Rect(901, 100, 802, 802)}, display::DisplayList::Type::NOT_PRIMARY); - display::test::ScopedScreenOverride screen_override(&screen); + display::Screen::SetScreenInstance(&screen); #endif // BUILDFLAG(IS_CHROMEOS_ASH) ASSERT_EQ(2, display::Screen::GetScreen()->GetNumDisplays()); @@ -393,6 +395,9 @@ } else { EXPECT_EQ(300, EvalJs(remote_child, await_change_height)); } +#if !BUILDFLAG(IS_CHROMEOS_ASH) + display::Screen::SetScreenInstance(nullptr); +#endif } // TODO(crbug.com/1183791): Disabled on non-ChromeOS because of races with @@ -415,7 +420,7 @@ display::DisplayList::Type::PRIMARY); screen.display_list().AddDisplay({2, gfx::Rect(901, 100, 802, 802)}, display::DisplayList::Type::NOT_PRIMARY); - display::test::ScopedScreenOverride screen_override(&screen); + display::Screen::SetScreenInstance(&screen); #endif // BUILDFLAG(IS_CHROMEOS_ASH) ASSERT_EQ(2, display::Screen::GetScreen()->GetNumDisplays()); @@ -597,6 +602,9 @@ } else { EXPECT_EQ(true, EvalJs(remote_child, await_both_changes_width)); } +#if !BUILDFLAG(IS_CHROMEOS_ASH) + display::Screen::SetScreenInstance(nullptr); +#endif } INSTANTIATE_TEST_SUITE_P(,
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 2bac8c9..45aab1a 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1677131997-2698eddc2742554643ff0f17e83a38d43a9f4723.profdata +chrome-linux-main-1677196788-ec5e16886031d582de2a83d01fb842d5aba58067.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 0aee067..147c6901 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1677167795-bd4c018a157fba6364b9c1bfde75730419b49330.profdata +chrome-mac-arm-main-1677225588-71ddb7a0e0e829101d0113c9cd38acffa062e929.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 2128793..f674eeb 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1677153502-82e748ef455d710b585ec951429ff1f06e64aa7d.profdata +chrome-mac-main-1677218310-9115313c5163f20963758f416920b5dbc2d77079.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 60e7f28..98abd23 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1677153502-1b342311ce66c466b7b507b35f2027dade695740.profdata +chrome-win32-main-1677207373-5ad176fc4837ca5ae36404ab59918220554128db.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 2500962..74a9c22 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1677164095-4b731372ae2caf0016a426c61b63bac41df9d9bf.profdata +chrome-win64-main-1677218310-743659e7b61363be032141601434fe704d3b5d68.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index b3f457a..b1dda1a 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -278,6 +278,7 @@ "$root_gen_dir/ash/webui/ash_shimless_rma_resources.pak", "$root_gen_dir/ash/webui/ash_shortcut_customization_app_resources.pak", "$root_gen_dir/ash/webui/ash_system_extensions_internals_resources.pak", + "$root_gen_dir/ash/webui/ash_webui_common_resources.pak", "$root_gen_dir/ash/webui/connectivity_diagnostics_resources.pak", "$root_gen_dir/ash/webui/file_manager/resources/file_manager_swa_resources.pak", "$root_gen_dir/ash/webui/file_manager/untrusted_resources/file_manager_untrusted_resources.pak", @@ -322,6 +323,7 @@ deps += [ "//ash/components/arc/input_overlay/resources", "//ash/public/cpp/resources:ash_public_unscaled_resources", + "//ash/webui/common/resources:resources", "//ash/webui/common/resources/office_fallback:resources", "//ash/webui/file_manager/resources:file_manager_swa_resources", "//ash/webui/file_manager/untrusted_resources:file_manager_untrusted_resources",
diff --git a/chrome/common/accessibility/read_anything_constants.h b/chrome/common/accessibility/read_anything_constants.h index f9e44359..80114d6 100644 --- a/chrome/common/accessibility/read_anything_constants.h +++ b/chrome/common/accessibility/read_anything_constants.h
@@ -35,6 +35,11 @@ const double kReadAnythingMaximumFontScale = 4.5; const double kReadAnythingFontScaleIncrement = 0.25; +const char kLetterSpacingHistogramName[] = + "Accessibility.ReadAnything.LetterSpacing"; +const char kLineSpacingHistogramName[] = + "Accessibility.ReadAnything.LineSpacing"; + } // namespace #endif // CHROME_COMMON_ACCESSIBILITY_READ_ANYTHING_CONSTANTS_H_
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index c58b8b8..2fefc7a 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -618,7 +618,7 @@ // Enables the new implementation of HTTPS-First Mode. BASE_FEATURE(kHttpsFirstModeV2, "HttpsFirstModeV2", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Enables automatically upgrading main frame navigations to HTTPS. BASE_FEATURE(kHttpsUpgrades,
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json index 3e7df93b..bb1e096 100644 --- a/chrome/common/extensions/api/accessibility_private.json +++ b/chrome/common/extensions/api/accessibility_private.json
@@ -289,7 +289,41 @@ { "id": "DlcType", "type": "string", - "enum": ["ttsEsEs", "ttsEsUs", "ttsFrFr", "ttsHiIn", "ttsNlNl", "ttsPtBr", "ttsSvSe", "ttsEnUs", "ttsJaJp", "ttsDeDe", "ttsItIt"], + "enum": [ + "ttsBnBd", + "ttsCsCz", + "ttsDaDk", + "ttsDeDe", + "ttsElGr", + "ttsEnAu", + "ttsEnGb", + "ttsEnUs", + "ttsEsEs", + "ttsEsUs", + "ttsFiFi", + "ttsFilPh", + "ttsFrFr", + "ttsHiIn", + "ttsHuHu", + "ttsIdId", + "ttsItIt", + "ttsJaJp", + "ttsKmKh", + "ttsKoKr", + "ttsNbNo", + "ttsNeNp", + "ttsNlNl", + "ttsPlPl", + "ttsPtBr", + "ttsSiLk", + "ttsSkSk", + "ttsSvSe", + "ttsThTh", + "ttsTrTr", + "ttsUkUa", + "ttsViVn", + "ttsYueHk" + ], "description": "Types of accessibility-specific DLCs." }, {
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index b9a0922..0ea376b 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -1317,14 +1317,6 @@ const char kUseCustomChromeFrame[] = "browser.custom_chrome_frame"; #endif -#if BUILDFLAG(ENABLE_PLUGINS) -// Which plugins have been allowed manually by the user. -// Note that this used to be `kContentSettingsPluginWhitelist`, hence the -// difference between the variable name and the string value. -const char kContentSettingsPluginAllowlist[] = - "profile.content_settings.plugin_whitelist"; -#endif - // Double that indicates the default zoom level. const char kPartitionDefaultZoomLevel[] = "partition.default_zoom_level";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 8120a9a..b84ac2c 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -411,9 +411,6 @@ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) extern const char kUseCustomChromeFrame[]; #endif -#if BUILDFLAG(ENABLE_PLUGINS) -extern const char kContentSettingsPluginAllowlist[]; -#endif extern const char kPartitionDefaultZoomLevel[]; extern const char kPartitionPerHostZoomLevels[];
diff --git a/chrome/common/profiler/BUILD.gn b/chrome/common/profiler/BUILD.gn index 6eac9822..6bc509d 100644 --- a/chrome/common/profiler/BUILD.gn +++ b/chrome/common/profiler/BUILD.gn
@@ -38,7 +38,12 @@ ] if (is_android) { - deps += [ "//chrome/android/modules/stack_unwinder/public:module" ] + deps += [ + "//chrome/android/features/stack_unwinder/public:native", + "//chrome/android/modules/stack_unwinder/public:module", + ] + public += [ "native_unwinder_android_map_delegate_impl.h" ] + sources += [ "native_unwinder_android_map_delegate_impl.cc" ] } if (enable_extensions) {
diff --git a/chrome/common/profiler/native_unwinder_android_map_delegate_impl.cc b/chrome/common/profiler/native_unwinder_android_map_delegate_impl.cc new file mode 100644 index 0000000..0e09c665 --- /dev/null +++ b/chrome/common/profiler/native_unwinder_android_map_delegate_impl.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/common/profiler/native_unwinder_android_map_delegate_impl.h" + +NativeUnwinderAndroidMapDelegateImpl::NativeUnwinderAndroidMapDelegateImpl( + stack_unwinder::Module* module) + : module_(module) { + DCHECK(module); + // The map delegate is created on the thread being profiled, while all its + // methods need to be called on the profiler thread. + DETACH_FROM_SEQUENCE(sequence_checker_); +} + +NativeUnwinderAndroidMapDelegateImpl::~NativeUnwinderAndroidMapDelegateImpl() { + DCHECK_EQ(reference_count_, 0u); + DCHECK(!memory_regions_map_); +} + +base::NativeUnwinderAndroidMemoryRegionsMap* +NativeUnwinderAndroidMapDelegateImpl::GetMapReference() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (reference_count_ == 0) { + DCHECK(!memory_regions_map_); + memory_regions_map_ = module_->CreateMemoryRegionsMap(); + } + reference_count_++; + return memory_regions_map_.get(); +} + +void NativeUnwinderAndroidMapDelegateImpl::ReleaseMapReference() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_GT(reference_count_, 0u); + DCHECK(memory_regions_map_); + if (--reference_count_ == 0) { + memory_regions_map_.reset(); + } +}
diff --git a/chrome/common/profiler/native_unwinder_android_map_delegate_impl.h b/chrome/common/profiler/native_unwinder_android_map_delegate_impl.h new file mode 100644 index 0000000..5143c23 --- /dev/null +++ b/chrome/common/profiler/native_unwinder_android_map_delegate_impl.h
@@ -0,0 +1,43 @@ +// 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_COMMON_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_IMPL_H_ +#define CHROME_COMMON_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_IMPL_H_ + +#include <stdint.h> +#include <memory> + +#include "base/functional/callback.h" +#include "base/profiler/native_unwinder_android_map_delegate.h" +#include "base/profiler/native_unwinder_android_memory_regions_map.h" +#include "base/sequence_checker.h" +#include "chrome/android/modules/stack_unwinder/public/module.h" + +// The implementation of map delegate that manages the lifecycle of +// libunwindstack resources. It is intended that this logic lives in chrome code +// instead of in the stack unwinder dynamic feature module. A single instance of +// this class is expected to be there for each process. The Get/Release of +// libunwindstack resources should happen in the same thread, i.e. the profiler +// thread. +class NativeUnwinderAndroidMapDelegateImpl + : public base::NativeUnwinderAndroidMapDelegate { + public: + explicit NativeUnwinderAndroidMapDelegateImpl(stack_unwinder::Module* module); + + ~NativeUnwinderAndroidMapDelegateImpl() override; + + base::NativeUnwinderAndroidMemoryRegionsMap* GetMapReference() override; + + void ReleaseMapReference() override; + + private: + const raw_ptr<stack_unwinder::Module> module_; + uint32_t reference_count_ = 0u; + std::unique_ptr<base::NativeUnwinderAndroidMemoryRegionsMap> + memory_regions_map_; + + SEQUENCE_CHECKER(sequence_checker_); +}; + +#endif // CHROME_COMMON_PROFILER_NATIVE_UNWINDER_ANDROID_MAP_DELEGATE_IMPL_H_
diff --git a/chrome/common/profiler/unwind_util.cc b/chrome/common/profiler/unwind_util.cc index 07e57a66..2fcbdcdf 100644 --- a/chrome/common/profiler/unwind_util.cc +++ b/chrome/common/profiler/unwind_util.cc
@@ -20,6 +20,7 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "chrome/common/channel_info.h" +#include "chrome/common/profiler/native_unwinder_android_map_delegate_impl.h" #include "chrome/common/profiler/process_type.h" #include "components/metrics/call_stack_profile_params.h" #include "components/version_info/channel.h" @@ -120,31 +121,11 @@ #endif // ANDROID_ARM32_UNWINDING_SUPPORTED #if ANDROID_UNWINDING_SUPPORTED -// Encapsulates the setup required to create the Android native unwinder. -class NativeUnwinderCreator { - public: - explicit NativeUnwinderCreator(stack_unwinder::Module* stack_unwinder_module) - : module_(stack_unwinder_module), - memory_regions_map_(module_->CreateMemoryRegionsMap()) {} - NativeUnwinderCreator(const NativeUnwinderCreator&) = delete; - NativeUnwinderCreator& operator=(const NativeUnwinderCreator&) = delete; - - std::unique_ptr<base::Unwinder> Create() { - return module_->CreateNativeUnwinder( - memory_regions_map_.get(), - reinterpret_cast<uintptr_t>(&__executable_start)); - } - - private: - const raw_ptr<stack_unwinder::Module> module_; - const std::unique_ptr<stack_unwinder::MemoryRegionsMap> memory_regions_map_; -}; - std::vector<std::unique_ptr<base::Unwinder>> CreateCoreUnwinders( stack_unwinder::Module* const stack_unwinder_module) { DCHECK_NE(getpid(), gettid()); - static base::NoDestructor<NativeUnwinderCreator> native_unwinder_creator( + static base::NoDestructor<NativeUnwinderAndroidMapDelegateImpl> map_delegate( stack_unwinder_module); static std::conditional< std::is_trivially_destructible_v<ChromeUnwinderCreator>, @@ -154,7 +135,8 @@ // Note order matters: the more general unwinder must appear first in the // vector. std::vector<std::unique_ptr<base::Unwinder>> unwinders; - unwinders.push_back(native_unwinder_creator->Create()); + unwinders.push_back(stack_unwinder_module->CreateNativeUnwinder( + map_delegate.get(), reinterpret_cast<uintptr_t>(&__executable_start))); unwinders.push_back(chrome_unwinder_creator->Create()); return unwinders; }
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc index ab058554..f30505f 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -323,10 +323,11 @@ // Drawing must be done on the same tree that was sent to the distiller, // so it’s critical that updates are not unserialized until drawing is // complete. - if (tree_id == active_tree_id_ && distillation_in_progress_) { + if (tree_id == model_.active_tree_id() && model_.distillation_in_progress()) { #if DCHECK_IS_ON() - DCHECK(pending_updates_.empty() || tree_id == pending_updates_bundle_id_); - pending_updates_bundle_id_ = tree_id; + DCHECK(pending_updates_.empty() || + tree_id == model_.pending_updates_bundle_id()); + model_.SetPendingUpdatesBundleId(tree_id); #endif pending_updates_.insert(pending_updates_.end(), std::make_move_iterator(updates.begin()), @@ -364,38 +365,38 @@ void ReadAnythingAppController::OnActiveAXTreeIDChanged( const ui::AXTreeID& tree_id, ukm::SourceId ukm_source_id) { - if (tree_id == active_tree_id_) { + if (tree_id == model_.active_tree_id()) { return; } - ui::AXTreeID previous_active_tree_id = active_tree_id_; - active_tree_id_ = tree_id; - active_ukm_source_id_ = ukm_source_id; + ui::AXTreeID previous_active_tree_id = model_.active_tree_id(); + model_.SetActiveTreeId(tree_id); + model_.SetActiveUkmSourceId(ukm_source_id); // Unserialize all pending updates on the formerly active AXTree. // TODO(crbug.com/1266555): If distillation is in progress, cancel the // distillation request. #if DCHECK_IS_ON() DCHECK(pending_updates_.empty() || - pending_updates_bundle_id_ == previous_active_tree_id); + model_.pending_updates_bundle_id() == previous_active_tree_id); #endif UnserializeUpdates(std::move(pending_updates_), previous_active_tree_id); #if DCHECK_IS_ON() - pending_updates_bundle_id_ = ui::AXTreeIDUnknown(); + model_.SetPendingUpdatesBundleId(ui::AXTreeIDUnknown()); #endif // When the UI first constructs, this function may be called before tree_id // has been added to trees_ in AccessibilityEventReceived. In that case, do // not distill. - if (active_tree_id_ != ui::AXTreeIDUnknown() && - base::Contains(trees_, active_tree_id_)) { + if (model_.active_tree_id() != ui::AXTreeIDUnknown() && + base::Contains(trees_, model_.active_tree_id())) { Distill(); } } void ReadAnythingAppController::OnAXTreeDestroyed(const ui::AXTreeID& tree_id) { - if (active_tree_id_ == tree_id) { + if (model_.active_tree_id() == tree_id) { // TODO(crbug.com/1266555): If distillation is in progress, cancel the // distillation request. - active_tree_id_ = ui::AXTreeIDUnknown(); - active_ukm_source_id_ = ukm::kInvalidSourceId; + model_.SetActiveTreeId(ui::AXTreeIDUnknown()); + model_.SetActiveUkmSourceId(ukm::kInvalidSourceId); } // Under rare circumstances, an accessibility tree is not constructed in a // tab. For example, after a browser restart, old tabs are only laid out after @@ -420,8 +421,8 @@ const std::vector<Change>& changes) { // TODO(crbug.com/1266555): This method may be called when child trees finish // updating. We should re-distill if tree is a child of the active tree. - if (active_tree_id_ == ui::AXTreeIDUnknown() || - tree->GetAXTreeID() != active_tree_id_) { + if (model_.active_tree_id() == ui::AXTreeIDUnknown() || + tree->GetAXTreeID() != model_.active_tree_id()) { return; } bool need_to_distill = false; @@ -452,16 +453,16 @@ } void ReadAnythingAppController::Distill() { - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); - DCHECK(base::Contains(trees_, active_tree_id_)); - ui::AXSerializableTree* tree = trees_[active_tree_id_].get(); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); + DCHECK(base::Contains(trees_, model_.active_tree_id())); + ui::AXSerializableTree* tree = trees_[model_.active_tree_id()].get(); std::unique_ptr<ui::AXTreeSource<const ui::AXNode*>> tree_source( tree->CreateTreeSource()); ui::AXTreeSerializer<const ui::AXNode*> serializer(tree_source.get()); ui::AXTreeUpdate snapshot; CHECK(serializer.SerializeChanges(tree->root(), &snapshot)); - distillation_in_progress_ = true; - distiller_->Distill(*tree, snapshot, active_ukm_source_id_); + model_.SetDistillationInProgress(true); + distiller_->Distill(*tree, snapshot, model_.active_ukm_source_id()); } void ReadAnythingAppController::OnAXTreeDistilled( @@ -471,21 +472,23 @@ display_node_ids_.clear(); model_.Reset(); content_node_ids_ = content_node_ids; - distillation_in_progress_ = false; // Return early if any of the following scenarios occurred while waiting for // distillation to complete: - // 1. tree_id != active_tree_id_: The active tree was changed. - // 2. active_tree_id_ == ui::AXTreeIDUnknown(): The active tree was change to + // 1. tree_id != model_.active_tree_id(): The active tree was changed. + // 2. model_.active_tree_id() == ui::AXTreeIDUnknown(): The active tree was + // change to // an unknown tree id. // 3. !base::Contains(trees_, tree_id): The distilled tree was destroyed. // 4. tree_id == ui::AXTreeIDUnknown(): The distiller sent back an unknown // tree id which occurs when there was an error. - if (tree_id != active_tree_id_ || active_tree_id_ == ui::AXTreeIDUnknown() || + if (tree_id != model_.active_tree_id() || + model_.active_tree_id() == ui::AXTreeIDUnknown() || !base::Contains(trees_, tree_id) || tree_id == ui::AXTreeIDUnknown()) { return; } - model_.ResetSelection(trees_[active_tree_id_]->GetUnignoredSelection()); + model_.ResetSelection( + trees_[model_.active_tree_id()]->GetUnignoredSelection()); if (!content_node_ids_.empty()) { // If there are content_node_ids, this means the AXTree was successfully // distilled. Post-process in preparation to display the distilled content. @@ -504,11 +507,11 @@ // active tree and send out a new distillation request. #if DCHECK_IS_ON() DCHECK(pending_updates_.empty() || - pending_updates_bundle_id_ == active_tree_id_); + model_.pending_updates_bundle_id() == model_.active_tree_id()); #endif - UnserializeUpdates(std::move(pending_updates_), active_tree_id_); + UnserializeUpdates(std::move(pending_updates_), model_.active_tree_id()); #if DCHECK_IS_ON() - pending_updates_bundle_id_ = ui::AXTreeIDUnknown(); + model_.SetPendingUpdatesBundleId(ui::AXTreeIDUnknown()); #endif } @@ -521,8 +524,8 @@ void ReadAnythingAppController::PostProcessAXTreeWithSelection() { DCHECK(model_.has_selection()); - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); - DCHECK(base::Contains(trees_, active_tree_id_)); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); + DCHECK(base::Contains(trees_, model_.active_tree_id())); // TODO(crbug.com/1266555): Refactor selection updates into the model once // trees have been moved to the model. @@ -675,9 +678,9 @@ } ui::AXNodeID ReadAnythingAppController::RootId() const { - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); - DCHECK(base::Contains(trees_, active_tree_id_)); - ui::AXSerializableTree* tree = trees_.at(active_tree_id_).get(); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); + DCHECK(base::Contains(trees_, model_.active_tree_id())); + ui::AXSerializableTree* tree = trees_.at(model_.active_tree_id()).get(); return tree->root()->id(); } @@ -828,27 +831,27 @@ } void ReadAnythingAppController::OnLinkClicked(ui::AXNodeID ax_node_id) const { - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); // Prevent link clicks while distillation is in progress, as it means that the // tree may have changed in an unexpected way. // TODO(crbug.com/1266555): Consider how to show this in a more user-friendly // way. - if (distillation_in_progress_) { + if (model_.distillation_in_progress()) { return; } - page_handler_->OnLinkClicked(active_tree_id_, ax_node_id); + page_handler_->OnLinkClicked(model_.active_tree_id(), ax_node_id); } void ReadAnythingAppController::OnSelectionChange(ui::AXNodeID anchor_node_id, int anchor_offset, ui::AXNodeID focus_node_id, int focus_offset) const { - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); // Prevent link clicks while distillation is in progress, as it means that the // tree may have changed in an unexpected way. // TODO(crbug.com/1266555): Consider how to show this in a more user-friendly // way. - if (distillation_in_progress_) { + if (model_.distillation_in_progress()) { return; } @@ -863,7 +866,7 @@ return; } - page_handler_->OnSelectionChange(active_tree_id_, anchor_node_id, + page_handler_->OnSelectionChange(model_.active_tree_id(), anchor_node_id, anchor_offset, focus_node_id, focus_offset); } @@ -911,9 +914,9 @@ // moved into the model. ui::AXNode* ReadAnythingAppController::GetAXNode( ui::AXNodeID ax_node_id) const { - DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); - DCHECK(base::Contains(trees_, active_tree_id_)); - ui::AXSerializableTree* tree = trees_.at(active_tree_id_).get(); + DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); + DCHECK(base::Contains(trees_, model_.active_tree_id())); + ui::AXSerializableTree* tree = trees_.at(model_.active_tree_id()).get(); return tree->GetFromId(ax_node_id); }
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h index b0d8e3f5..7ef5a44 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.h +++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -195,27 +195,10 @@ // AXTrees of web contents in the browser’s tab strip. std::map<ui::AXTreeID, std::unique_ptr<ui::AXSerializableTree>> trees_; - // The AXTreeID of the currently active web contents. - ui::AXTreeID active_tree_id_ = ui::AXTreeIDUnknown(); - - // The UKM source ID of the main frame of the active web contents, whose - // AXTree has ID active_tree_id_. This is used for metrics collection. - ukm::SourceId active_ukm_source_id_ = ukm::kInvalidSourceId; - - // Distillation is slow and happens out-of-process when Screen2x is running. - // This boolean marks when distillation is in progress to avoid sending - // new distillation requests during that time. - bool distillation_in_progress_ = false; - // A queue of pending updates on the active AXTree, which will be // unserialized once distillation completes. std::vector<ui::AXTreeUpdate> pending_updates_; -#if DCHECK_IS_ON() - // The bundle ID for the pending updates. - ui::AXTreeID pending_updates_bundle_id_ = ui::AXTreeIDUnknown(); -#endif - // The node IDs identified as main by the distiller. These are static text // nodes when generated by Screen2x. When generated by the rules-based // distiller, these are heading or paragraph subtrees.
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc index 636e63d..65fe4ad 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.cc +++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -23,6 +23,7 @@ start_offset_ = -1; end_offset_ = -1; has_selection_ = false; + distillation_in_progress_ = false; } void ReadAnythingAppModel::ResetSelection(ui::AXSelection selection) {
diff --git a/chrome/renderer/accessibility/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything_app_model.h index d4fd58a..7ff5d7e 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.h +++ b/chrome/renderer/accessibility/read_anything_app_model.h
@@ -7,6 +7,7 @@ #include "chrome/common/accessibility/read_anything.mojom.h" #include "chrome/common/accessibility/read_anything_constants.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "ui/accessibility/ax_selection.h" namespace ui { @@ -37,6 +38,29 @@ int32_t start_offset() const { return start_offset_; } int32_t end_offset() const { return end_offset_; } + bool distillation_in_progress() const { return distillation_in_progress_; } + const ukm::SourceId& active_ukm_source_id() const { + return active_ukm_source_id_; + } + const ui::AXTreeID& active_tree_id() const { return active_tree_id_; } + +#if DCHECK_IS_ON() + const ui::AXTreeID& pending_updates_bundle_id() const { + return pending_updates_bundle_id_; + } + void SetPendingUpdatesBundleId(ui::AXTreeID id) { + pending_updates_bundle_id_ = id; + } +#endif + + void SetDistillationInProgress(bool distillation) { + distillation_in_progress_ = distillation; + } + void SetActiveUkmSourceId(ukm::SourceId source_id) { + active_ukm_source_id_ = source_id; + } + void SetActiveTreeId(ui::AXTreeID tree_id) { active_tree_id_ = tree_id; } + void SetStart(ui::AXNodeID start_node_id, int32_t start_offset); void SetEnd(ui::AXNodeID end_node_id, int32_t end_offset); @@ -51,6 +75,23 @@ double GetLineSpacingValue( read_anything::mojom::LineSpacing line_spacing) const; + // The AXTreeID of the currently active web contents. + ui::AXTreeID active_tree_id_ = ui::AXTreeIDUnknown(); + + // The UKM source ID of the main frame of the active web contents, whose + // AXTree has ID active_tree_id_. This is used for metrics collection. + ukm::SourceId active_ukm_source_id_ = ukm::kInvalidSourceId; + + // Distillation is slow and happens out-of-process when Screen2x is running. + // This boolean marks when distillation is in progress to avoid sending + // new distillation requests during that time. + bool distillation_in_progress_ = false; + +#if DCHECK_IS_ON() + // The bundle ID for the pending updates. + ui::AXTreeID pending_updates_bundle_id_ = ui::AXTreeIDUnknown(); +#endif + // Theme information. std::string font_name_ = kReadAnythingDefaultFontName; float font_size_ = kReadAnythingDefaultFontScale;
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc index ff246de6..0db004b 100644 --- a/chrome/renderer/chrome_render_frame_observer.cc +++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -640,7 +640,7 @@ } // Language detection should run only once. Parsing finishes before the page - // loads, so let's pick that timing. + // loads, so attempt detection here first. if (translate_agent_ && (layout_type == blink::WebMeaningfulLayout::kFinishedParsing)) { // Under kRetryLanguageDetection, do not attempt language detection if no
diff --git a/chrome/renderer/chrome_render_thread_observer.cc b/chrome/renderer/chrome_render_thread_observer.cc index 7ba7a76e..1393df7 100644 --- a/chrome/renderer/chrome_render_thread_observer.cc +++ b/chrome/renderer/chrome_render_thread_observer.cc
@@ -46,8 +46,6 @@ #include "net/base/net_module.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/platform/web_request_peer.h" -#include "third_party/blink/public/platform/web_resource_request_sender_delegate.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/web/web_document.h" @@ -55,10 +53,6 @@ #include "third_party/blink/public/web/web_security_policy.h" #include "third_party/blink/public/web/web_view.h" -#if BUILDFLAG(ENABLE_EXTENSIONS) -#include "extensions/renderer/localization_peer.h" -#endif - #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/renderer/chromeos_merge_session_loader_throttle.h" #endif @@ -69,31 +63,6 @@ namespace { -class RendererResourceDelegate - : public blink::WebResourceRequestSenderDelegate { - public: - RendererResourceDelegate() = default; - - RendererResourceDelegate(const RendererResourceDelegate&) = delete; - RendererResourceDelegate& operator=(const RendererResourceDelegate&) = delete; - - void OnRequestComplete() override {} - scoped_refptr<blink::WebRequestPeer> OnReceivedResponse( - scoped_refptr<blink::WebRequestPeer> current_peer, - const blink::WebString& mime_type, - const blink::WebURL& url) override { -#if BUILDFLAG(ENABLE_EXTENSIONS) - return ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( - std::move(current_peer), RenderThread::Get(), mime_type.Utf8(), url); -#else - return current_peer; -#endif - } - - private: - base::WeakPtrFactory<RendererResourceDelegate> weak_factory_{this}; -}; - #if BUILDFLAG(IS_CHROMEOS_ASH) scoped_refptr<base::SequencedTaskRunner> GetCallbackGroupTaskRunner() { content::ChildThread* child_thread = content::ChildThread::Get(); @@ -164,13 +133,7 @@ } ChromeRenderThreadObserver::ChromeRenderThreadObserver() - : resource_request_sender_delegate_( - std::make_unique<RendererResourceDelegate>()), - visited_link_reader_(new visitedlink::VisitedLinkReader) { - RenderThread* thread = RenderThread::Get(); - thread->SetResourceRequestSenderDelegate( - resource_request_sender_delegate_.get()); - + : visited_link_reader_(new visitedlink::VisitedLinkReader) { // Configure modules that need access to resources. net::NetModule::SetResourceProvider(ChromeNetResourceProvider); media::SetLocalizedStringProvider(ChromeMediaLocalizedStringProvider);
diff --git a/chrome/renderer/chrome_render_thread_observer.h b/chrome/renderer/chrome_render_thread_observer.h index 89416b9..ad37007 100644 --- a/chrome/renderer/chrome_render_thread_observer.h +++ b/chrome/renderer/chrome_render_thread_observer.h
@@ -21,10 +21,6 @@ #include "chrome/renderer/chromeos_delayed_callback_group.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) -namespace blink { -class WebResourceRequestSenderDelegate; -} // namespace blink - namespace visitedlink { class VisitedLinkReader; } @@ -127,8 +123,6 @@ receiver); static bool is_incognito_process_; - std::unique_ptr<blink::WebResourceRequestSenderDelegate> - resource_request_sender_delegate_; mojo::Remote<content_settings::mojom::ContentSettingsManager> content_settings_manager_;
diff --git a/chrome/renderer/url_loader_throttle_provider_impl.cc b/chrome/renderer/url_loader_throttle_provider_impl.cc index 5e746e1..697cdac 100644 --- a/chrome/renderer/url_loader_throttle_provider_impl.cc +++ b/chrome/renderer/url_loader_throttle_provider_impl.cc
@@ -23,6 +23,7 @@ #include "content/public/common/web_identity.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" +#include "extensions/renderer/extension_localization_throttle.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/loader/resource_type_util.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" @@ -170,6 +171,11 @@ if (throttle) throttles.emplace_back(std::move(throttle)); } + std::unique_ptr<blink::URLLoaderThrottle> localization_throttle = + extensions::ExtensionLocalizationThrottle::MaybeCreate(request.Url()); + if (localization_throttle) { + throttles.emplace_back(std::move(localization_throttle)); + } #endif #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 65aecff..cf3b6553 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2454,7 +2454,6 @@ # These tests also run on Lacros, as part of # lacros_chrome_browsertests_run_in_series below. "../browser/media/webrtc/capture_handle_browsertest.cc", - "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc", "../browser/ui/autofill/autofill_context_menu_manager_browsertest.cc", "../browser/ui/views/intent_picker_bubble_view_browsertest.cc", @@ -4040,6 +4039,7 @@ "../browser/ash/system/timezone_resolver_manager_browsertest.cc", "../browser/ash/system/tray_accessibility_browsertest.cc", "../browser/ash/video_conference/video_conference_app_service_client_browsertest.cc", + "../browser/ash/video_conference/video_conference_integration_browsertest.cc", "../browser/ash/wallpaper/wallpaper_drivefs_delegate_impl_browsertest.cc", "../browser/ash/web_applications/camera_app/camera_app_integration_browsertest.cc", "../browser/ash/web_applications/demo_mode_app_integration_browsertest.cc", @@ -4707,7 +4707,6 @@ # TODO(crbug.com/1290597): Enable once WebRTC becomes functional. sources -= [ "../browser/media/webrtc/capture_handle_browsertest.cc", - "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/media/webrtc/media_stream_devices_controller_browsertest.cc", "../browser/media/webrtc/region_capture_browsertest.cc", "../browser/media/webrtc/same_origin_observer_browsertest.cc", @@ -4940,7 +4939,6 @@ "../browser/lacros/web_contents_can_go_back_observer_browsertest.cc", "../browser/lacros/window_lacros_browsertest.cc", "../browser/media/webrtc/capture_handle_browsertest.cc", - "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc", "../browser/metrics/structured/lacros_structured_metrics_recorder_browsertest.cc", "../browser/payments/webapps/payment_request_lacros_browsertest.cc", @@ -8814,6 +8812,7 @@ "../browser/ui/views/extensions/expandable_container_view_unittest.cc", "../browser/ui/views/extensions/extensions_menu_item_unittest.cc", "../browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc", + "../browser/ui/views/extensions/extensions_menu_site_permissions_page_view_unittest.cc", "../browser/ui/views/extensions/extensions_menu_view_unittest.cc", "../browser/ui/views/extensions/extensions_toolbar_button_unittest.cc", "../browser/ui/views/extensions/extensions_toolbar_container_unittest.cc", @@ -9725,6 +9724,7 @@ if (toolkit_views) { sources += [ + "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/ui/commerce/price_tracking/mock_shopping_list_ui_tab_helper.cc", "../browser/ui/commerce/price_tracking/mock_shopping_list_ui_tab_helper.h", "../browser/ui/toolbar/app_menu_fullscreen_interactive_uitest.cc",
diff --git a/chrome/test/data/video_conference_demo.html b/chrome/test/data/video_conference_demo.html new file mode 100644 index 0000000..32fef3a --- /dev/null +++ b/chrome/test/data/video_conference_demo.html
@@ -0,0 +1,50 @@ +<html> + +<head> + <script> + var video_track = null + var audio_track = null + var screen_track = null + async function startVideo() { + let stream = await navigator.mediaDevices.getUserMedia({ video: true }) + document.getElementById('video_player').srcObject = stream; + video_track = stream.getTracks()[0] + } + function stopVideo() { + document.getElementById('video_player').pause(); + video_track.stop(); + } + async function startAudio() { + let stream = await navigator.mediaDevices.getUserMedia({ audio: true }) + document.getElementById('audio_player').srcObject = stream; + audio_track = stream.getTracks()[0] + + } + function stopAudio() { + document.getElementById('audio_player').pause(); + audio_track.stop(); + } + async function startScreenSharing() { + let stream = await navigator.mediaDevices.getDisplayMedia({ preferCurrentTab: true }) + screen_track = stream.getTracks()[0] + } + function stopScreenSharing() { + screen_track.stop(); + } + </script> +</head> + +<body> + <video id='video_player' controls> </video> + <button onclick='startVideo()'>Start Video</button> + <button onclick='stopVideo()'>Stop Video</button> + <br><br> + <audio id='audio_player' controls> </audio> + <button onclick='startAudio()'>Start Audio</button> + <button onclick='stopAudio()'>Stop Audio</button> + <br><br> + <button onclick='startScreenSharing()'>Start Screen Capturing</button> + <button onclick='stopScreenSharing()'>Stop Screen Capturing</button> +</body> + +</html> \ No newline at end of file
diff --git a/chrome/test/data/web_apps/sample_web_app.json b/chrome/test/data/web_apps/sample_web_app.json index 590953c1..9dc0f513 100644 --- a/chrome/test/data/web_apps/sample_web_app.json +++ b/chrome/test/data/web_apps/sample_web_app.json
@@ -9,6 +9,21 @@ "background_color": "rgba(77,188,194,0.9686274509803922)", "capture_links": "kNone", "current_os_integration_states": { + "file_handling": [ ], + "protocols_handled": { + "web+test0": "https://example.com/scope1234/start12340", + "web+test1": "https://example.com/scope1234/start12341" + }, + "run_on_os_login": "minimized", + "shortcut_descriptions": { + "description": "Description1234", + "icon_size_to_timestamp_map": { + "32": "1970-02-18 08:29:15.376 UTC" + }, + "title": "Name1234" + }, + "shortcut_menus": [ ], + "uninstall_registration": true }, "dark_mode_background_color": "none", "dark_mode_theme_color": "rgba(34,214,187,1)", @@ -149,8 +164,8 @@ "is_uninstalling": false, "isolation_data": { "isolated_web_app_location": { - "dev_mode_proxy": { - "proxy_url": "https://proxy-1234.com" + "dev_mode_bundle": { + "path": "1234" } } },
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js index c043677..556cc20f 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
@@ -1156,7 +1156,7 @@ return flushAsync().then(() => { const share = networkConfig.$$('#share'); assertTrue(!!share); - assertTrue(share.disabled); + assertFalse(share.disabled); assertTrue(share.checked); }); }); @@ -1173,24 +1173,33 @@ }); }); - test('New Config: Authenticated, Not secure to secure', async function() { - // set default to insecure network - setNetworkType(NetworkType.kWiFi); - setAuthenticated(); - initNetworkConfig(); - await flushAsync(); - const share = networkConfig.$$('#share'); - assertTrue(!!share); - assertTrue(share.disabled); - assertTrue(share.checked); + test( + 'New Config: Authenticated, Not secure to secure to not secure', + async function() { + // set default to insecure network + setNetworkType(NetworkType.kWiFi); + setAuthenticated(); + initNetworkConfig(); + await flushAsync(); + const share = networkConfig.$$('#share'); + assertTrue(!!share); + assertFalse(share.disabled); + assertTrue(share.checked); - // change to secure network - networkConfig.securityType_ = SecurityType.kWepPsk; - await flushAsync(); - assertTrue(!!share); - assertFalse(share.disabled); - assertFalse(share.checked); - }); + // change to secure network + networkConfig.securityType_ = SecurityType.kWepPsk; + await flushAsync(); + assertTrue(!!share); + assertFalse(share.disabled); + assertFalse(share.checked); + + // change back to insecure network + networkConfig.securityType_ = SecurityType.kNone; + await flushAsync(); + assertTrue(!!share); + assertFalse(share.disabled); + assertTrue(share.checked); + }); // Existing networks hide the shared control in the config UI. test('Existing Hides Shared', function() {
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_keyboard_subsection_test.js b/chrome/test/data/webui/settings/chromeos/per_device_keyboard_subsection_test.js index 275193d..450c95c79 100644 --- a/chrome/test/data/webui/settings/chromeos/per_device_keyboard_subsection_test.js +++ b/chrome/test/data/webui/settings/chromeos/per_device_keyboard_subsection_test.js
@@ -40,7 +40,7 @@ subsection = document.createElement('settings-per-device-keyboard-subsection'); assertTrue(subsection != null); - subsection.keyboard = fakeKeyboards[0]; + subsection.keyboard = {...fakeKeyboards[0]}; document.body.appendChild(subsection); return flushTasks(); }
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_mouse_subsection_test.js b/chrome/test/data/webui/settings/chromeos/per_device_mouse_subsection_test.js index 8035846..9f0db7f 100644 --- a/chrome/test/data/webui/settings/chromeos/per_device_mouse_subsection_test.js +++ b/chrome/test/data/webui/settings/chromeos/per_device_mouse_subsection_test.js
@@ -38,7 +38,7 @@ setInputDeviceSettingsProviderForTesting(provider); subsection = document.createElement('settings-per-device-mouse-subsection'); assertTrue(subsection != null); - subsection.mouse = fakeMice[0]; + subsection.mouse = {...fakeMice[0]}; subsection.allowScrollSettings_ = true; document.body.appendChild(subsection); return flushTasks(); @@ -95,7 +95,7 @@ updatedMice = await provider.getConnectedMouseSettings(); assertEquals( updatedMice[0].settings.reverseScrolling, - subsection.reverseScrollValue); + mouseReverseScrollToggleButton.checked); const mouseScrollAccelerationToggleButton = subsection.shadowRoot.querySelector('#mouseScrollAcceleration');
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_subsection_test.js b/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_subsection_test.js index 0330d64..357c63a0 100644 --- a/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_subsection_test.js +++ b/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_subsection_test.js
@@ -38,7 +38,7 @@ subsection = document.createElement('settings-per-device-pointing-stick-subsection'); assertTrue(subsection != null); - subsection.pointingStick = fakePointingSticks[0]; + subsection.pointingStick = {...fakePointingSticks[0]}; document.body.appendChild(subsection); return flushTasks(); }
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_touchpad_subsection_test.js b/chrome/test/data/webui/settings/chromeos/per_device_touchpad_subsection_test.js index d9700046..1345385 100644 --- a/chrome/test/data/webui/settings/chromeos/per_device_touchpad_subsection_test.js +++ b/chrome/test/data/webui/settings/chromeos/per_device_touchpad_subsection_test.js
@@ -2,7 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {fakeTouchpads, SettingsPerDeviceTouchpadSubsectionElement} from 'chrome://os-settings/chromeos/os_settings.js'; +import 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js'; + +import {FakeInputDeviceSettingsProvider, fakeTouchpads, setInputDeviceSettingsProviderForTesting, SettingsPerDeviceTouchpadSubsectionElement} from 'chrome://os-settings/chromeos/os_settings.js'; import {assert} from 'chrome://resources/ash/common/assert.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; @@ -13,6 +15,11 @@ * @type {?SettingsPerDeviceTouchpadSubsectionElement} */ let subsection = null; + /** + * @type {?FakeInputDeviceSettingsProvider} + */ + let provider = null; + setup(() => { PolymerTest.clearBody(); @@ -20,16 +27,20 @@ teardown(() => { subsection = null; + provider = null; }); /** * @return {!Promise} */ function initializePerDeviceTouchpadSubsection() { + provider = new FakeInputDeviceSettingsProvider(); + provider.setFakeTouchpads(fakeTouchpads); + setInputDeviceSettingsProviderForTesting(provider); subsection = document.createElement('settings-per-device-touchpad-subsection'); assertTrue(subsection != null); - subsection.touchpad = fakeTouchpads[0]; + subsection.touchpad = {...fakeTouchpads[0]}; subsection.allowScrollSettings_ = true; document.body.appendChild(subsection); return flushTasks(); @@ -55,7 +66,99 @@ return flushTasks(); } - /**Test that touchpad settings data are from the touchpad provider.*/ + // Test that API are updated when touchpad settings change. + test('Update API when touchpad settings change', async () => { + await initializePerDeviceTouchpadSubsection(); + const enableTapToClickButton = + subsection.shadowRoot.querySelector('#enableTapToClick'); + enableTapToClickButton.click(); + await flushTasks(); + let updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.tapToClickEnabled, + enableTapToClickButton.pref.value); + + const enableTapDraggingButton = + subsection.shadowRoot.querySelector('#enableTapDragging'); + enableTapDraggingButton.click(); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.tapDraggingEnabled, + enableTapDraggingButton.pref.value); + + const touchpadAccelerationButton = + subsection.shadowRoot.querySelector('#touchpadAcceleration'); + touchpadAccelerationButton.click(); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.accelerationEnabled, + touchpadAccelerationButton.pref.value); + + const touchpadScrollAccelerationButton = + subsection.shadowRoot.querySelector('#touchpadScrollAcceleration'); + touchpadScrollAccelerationButton.click(); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.scrollAcceleration, + touchpadScrollAccelerationButton.pref.value); + + const touchpadScrollSpeedSlider = assert( + subsection.shadowRoot.querySelector('#touchpadScrollSpeedSlider')); + MockInteractions.pressAndReleaseKeyOn( + touchpadScrollSpeedSlider.shadowRoot.querySelector('cr-slider'), + 39 /* right */, [], 'ArrowRight'); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.scrollSensitivity, + touchpadScrollSpeedSlider.pref.value); + + const touchpadSensitivitySlider = + assert(subsection.shadowRoot.querySelector('#touchpadSensitivity')); + MockInteractions.pressAndReleaseKeyOn( + touchpadSensitivitySlider.shadowRoot.querySelector('cr-slider'), + 39 /* right */, [], 'ArrowRight'); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.sensitivity, + touchpadSensitivitySlider.pref.value); + + const touchpadHapticClickSensitivitySlider = assert( + subsection.shadowRoot.querySelector('#touchpadHapticClickSensitivity')); + MockInteractions.pressAndReleaseKeyOn( + touchpadHapticClickSensitivitySlider.shadowRoot.querySelector( + 'cr-slider'), + 39 /* right */, [], 'ArrowRight'); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.hapticSensitivity, + touchpadHapticClickSensitivitySlider.pref.value); + + const touchpadHapticFeedbackToggleButton = + subsection.shadowRoot.querySelector('#touchpadHapticFeedbackToggle'); + touchpadHapticFeedbackToggleButton.click(); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.hapticEnabled, + touchpadHapticFeedbackToggleButton.checked); + + const touchpadReverseScrollToggleButton = + subsection.shadowRoot.querySelector('#enableReverseScrollingToggle'); + touchpadReverseScrollToggleButton.click(); + await flushTasks(); + updatedTouchpads = await provider.getConnectedTouchpadSettings(); + assertEquals( + updatedTouchpads[0].settings.reverseScrolling, + touchpadReverseScrollToggleButton.checked); + }); + + // Test that touchpad settings data are from the touchpad provider. test('Verify touchpad settings data', async () => { await initializePerDeviceTouchpadSubsection(); let enableTapToClickButton = @@ -83,7 +186,7 @@ subsection.shadowRoot.querySelector('#touchpadScrollSpeedSlider')); assertTrue(isVisible(touchpadScrollSpeedSlider)); assertEquals( - fakeTouchpads[0].settings.hapticSensitivity, + fakeTouchpads[0].settings.scrollSensitivity, touchpadScrollSpeedSlider.pref.value); let touchpadSensitivitySlider = assert(subsection.shadowRoot.querySelector('#touchpadSensitivity')); @@ -94,7 +197,7 @@ subsection.shadowRoot.querySelector('#touchpadHapticClickSensitivity')); assertTrue(isVisible(touchpadHapticClickSensitivitySlider)); assertEquals( - fakeTouchpads[0].settings.scrollSensitivity, + fakeTouchpads[0].settings.hapticSensitivity, touchpadHapticClickSensitivitySlider.pref.value); let touchpadHapticFeedbackToggleButton = subsection.shadowRoot.querySelector('#touchpadHapticFeedbackToggle');
diff --git a/chrome/updater/ipc/ipc_support.cc b/chrome/updater/ipc/ipc_support.cc index 459bc4c7..8d4cf19 100644 --- a/chrome/updater/ipc/ipc_support.cc +++ b/chrome/updater/ipc/ipc_support.cc
@@ -17,6 +17,8 @@ ScopedIPCSupportWrapper::ScopedIPCSupportWrapper() { mojo::core::Configuration config; config.is_broker_process = true; + // TODO(crbug.com/1418740): The implementation should be compatible with ipcz. + config.disable_ipcz = true; mojo::core::Init(config); ipc_thread_.StartWithOptions( base::Thread::Options(base::MessagePumpType::IO, 0));
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc index 2362d9b..e180905 100644 --- a/chrome/updater/test/integration_tests_win.cc +++ b/chrome/updater/test/integration_tests_win.cc
@@ -291,7 +291,7 @@ L"*/chrome/updater/*=2"}) .c_str()); } else { - task_scheduler->ForEachTask( + task_scheduler->ForEachTaskWithPrefix( base::ASCIIToWide(PRODUCT_FULLNAME_STRING), base::BindRepeating([](const std::wstring& task_name) { ADD_FAILURE() << "Unexpected task found: " << task_name; @@ -582,7 +582,7 @@ scoped_refptr<TaskScheduler> task_scheduler = TaskScheduler::CreateInstance(scope); - task_scheduler->ForEachTask( + task_scheduler->ForEachTaskWithPrefix( base::ASCIIToWide(PRODUCT_FULLNAME_STRING), base::BindRepeating( [](scoped_refptr<TaskScheduler> task_scheduler,
diff --git a/chrome/updater/win/task_scheduler.cc b/chrome/updater/win/task_scheduler.cc index bd6a0ae..16af047 100644 --- a/chrome/updater/win/task_scheduler.cc +++ b/chrome/updater/win/task_scheduler.cc
@@ -119,7 +119,8 @@ // A task scheduler class uses the V2 API of the task scheduler. class TaskSchedulerV2 final : public TaskScheduler { public: - explicit TaskSchedulerV2(UpdaterScope scope) : scope_(scope) { + TaskSchedulerV2(UpdaterScope scope, bool use_task_subfolders) + : scope_(scope), use_task_subfolders_(use_task_subfolders) { task_service_ = GetTaskService(); DCHECK(task_service_); task_folder_ = GetUpdaterTaskFolder(); @@ -404,6 +405,10 @@ DCHECK(!IsTaskRegistered(task_name)); + if (!use_task_subfolders_) { + return true; + } + // Try to delete \\Company\Product first and \\Company second. if (DeleteFolderIfEmpty(GetTaskSubfolderName())) { DeleteFolderIfEmpty(GetTaskCompanyFolder()); @@ -731,11 +736,13 @@ } std::wstring GetTaskSubfolderName() override { + DCHECK(use_task_subfolders_); + return base::StrCat( {GetTaskCompanyFolder(), L"\\" PRODUCT_FULLNAME_STRING}); } - void ForEachTask( + void ForEachTaskWithPrefix( const std::wstring& prefix, base::RepeatingCallback<void(const std::wstring&)> callback) override { if (!task_folder_) { @@ -860,6 +867,8 @@ // task folders have a "System" suffix, and User task folders have a "User" // suffix. std::wstring GetTaskCompanyFolder() const { + DCHECK(use_task_subfolders_); + return base::StrCat({L"\\" COMPANY_SHORTNAME_STRING, IsSystemInstall(scope_) ? L"System" : L"User"}); } @@ -1085,6 +1094,10 @@ return nullptr; } + if (!use_task_subfolders_) { + return root_task_folder; + } + // Try to find the folder first. Microsoft::WRL::ComPtr<ITaskFolder> folder; base::win::ScopedBstr task_subfolder_name(GetTaskSubfolderName()); @@ -1284,6 +1297,7 @@ ~TaskSchedulerV2() override = default; const UpdaterScope scope_; + const bool use_task_subfolders_; Microsoft::WRL::ComPtr<ITaskService> task_service_; @@ -1308,8 +1322,10 @@ TaskScheduler::TaskInfo::~TaskInfo() = default; // static. -scoped_refptr<TaskScheduler> TaskScheduler::CreateInstance(UpdaterScope scope) { - return base::MakeRefCounted<TaskSchedulerV2>(scope); +scoped_refptr<TaskScheduler> TaskScheduler::CreateInstance( + UpdaterScope scope, + bool use_task_subfolders) { + return base::MakeRefCounted<TaskSchedulerV2>(scope, use_task_subfolders); } TaskScheduler::TaskScheduler() = default;
diff --git a/chrome/updater/win/task_scheduler.h b/chrome/updater/win/task_scheduler.h index 7e1d99d..ecfa0c0 100644 --- a/chrome/updater/win/task_scheduler.h +++ b/chrome/updater/win/task_scheduler.h
@@ -96,7 +96,15 @@ TriggerType trigger_type = TRIGGER_TYPE_MAX; }; - static scoped_refptr<TaskScheduler> CreateInstance(UpdaterScope scope); + // Creates an instance of the task scheduler for the given `scope`. + // `use_task_subfolders` dictates whether the scheduler creates and works with + // tasks that are created within a subfolder (`true` by default), or tasks + // that are created at the root folder. When `use_task_subfolders` is `true`, + // the tasks are created within the subfolder returned by + // `GetTaskSubfolderName()`. + static scoped_refptr<TaskScheduler> CreateInstance( + UpdaterScope scope, + bool use_task_subfolders = true); TaskScheduler(const TaskScheduler&) = delete; TaskScheduler& operator=(const TaskScheduler&) = delete; @@ -155,7 +163,7 @@ virtual std::wstring GetTaskSubfolderName() = 0; // Runs `callback` for each task that matches `prefix`. - virtual void ForEachTask( + virtual void ForEachTaskWithPrefix( const std::wstring& prefix, base::RepeatingCallback<void(const std::wstring&)> callback) = 0;
diff --git a/chrome/updater/win/task_scheduler_unittest.cc b/chrome/updater/win/task_scheduler_unittest.cc index aab0e10..a9822bb59 100644 --- a/chrome/updater/win/task_scheduler_unittest.cc +++ b/chrome/updater/win/task_scheduler_unittest.cc
@@ -21,6 +21,7 @@ #include "base/memory/scoped_refptr.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind.h" #include "base/test/test_timeouts.h" @@ -471,4 +472,75 @@ } } +TEST(TaskSchedulerTest, NoSubfolders) { + scoped_refptr<TaskScheduler> task_scheduler = TaskScheduler::CreateInstance( + GetTestScope(), /*use_task_subfolders=*/false); + ASSERT_TRUE(task_scheduler); + + constexpr int kNumTasks = 6; + const std::wstring kTaskNamePrefix(base::ASCIIToWide(test::GetTestName())); + + for (int count = 0; count < kNumTasks; ++count) { + std::wstring task_name(kTaskNamePrefix); + task_name.push_back(L'0' + count); + + ASSERT_TRUE(task_scheduler->RegisterTask( + task_name.c_str(), task_name.c_str(), + base::CommandLine::FromString(L"C:\\temp\\temp.exe"), + TaskScheduler::TriggerType::TRIGGER_TYPE_HOURLY, false)); + + ASSERT_TRUE(task_scheduler->DeleteTask(task_name.c_str())); + } +} + +TEST(TaskSchedulerTest, ForEachTaskWithPrefix) { + for (bool use_task_subfolders : {true, false}) { + scoped_refptr<TaskScheduler> task_scheduler = + TaskScheduler::CreateInstance(GetTestScope(), use_task_subfolders); + ASSERT_TRUE(task_scheduler); + + constexpr int kNumTasks = 6; + const std::wstring kTaskNamePrefix(base::ASCIIToWide(test::GetTestName())); + + for (int count = 0; count < kNumTasks; ++count) { + std::wstring task_name(kTaskNamePrefix); + task_name.push_back(L'0' + count); + + EXPECT_TRUE(task_scheduler->RegisterTask( + task_name.c_str(), task_name.c_str(), + base::CommandLine::FromString(L"C:\\temp\\temp.exe"), + TaskScheduler::TriggerType::TRIGGER_TYPE_HOURLY, false)); + } + + scoped_refptr<TaskScheduler> task_scheduler_different_namespace = + TaskScheduler::CreateInstance(GetTestScope(), !use_task_subfolders); + ASSERT_TRUE(task_scheduler_different_namespace); + + int count_entries = 0; + + task_scheduler_different_namespace->ForEachTaskWithPrefix( + kTaskNamePrefix, + base::BindLambdaForTesting( + [&count_entries](const std::wstring& /*task_name*/) { + ++count_entries; + })); + + EXPECT_EQ(count_entries, 0); + + count_entries = 0; + + task_scheduler->ForEachTaskWithPrefix( + kTaskNamePrefix, + base::BindLambdaForTesting( + [&count_entries, &task_scheduler, + kTaskNamePrefix](const std::wstring& task_name) { + EXPECT_TRUE(base::StartsWith(task_name, kTaskNamePrefix)); + ++count_entries; + task_scheduler->DeleteTask(task_name.c_str()); + })); + + EXPECT_EQ(count_entries, kNumTasks); + } +} + } // namespace updater
diff --git a/chromecast/cast_core/OWNERS b/chromecast/cast_core/OWNERS index 1e8ca59..3a59a73 100644 --- a/chromecast/cast_core/OWNERS +++ b/chromecast/cast_core/OWNERS
@@ -1,3 +1,4 @@ +brettk@google.com mfoltz@chromium.org rwkeane@google.com vigeni@google.com
diff --git a/chromecast/cast_core/runtime/renderer/DEPS b/chromecast/cast_core/runtime/renderer/DEPS index 1f17c20..0a4b3bdf 100644 --- a/chromecast/cast_core/runtime/renderer/DEPS +++ b/chromecast/cast_core/runtime/renderer/DEPS
@@ -2,7 +2,7 @@ "+chromecast/cast_core/common", "+chromecast/renderer", "+components/cast_streaming/public", - "+components/cast_streaming/renderer", + "+components/cast_streaming/renderer/public", "+content/public/renderer", "+media/base", "+third_party/blink/public/common",
diff --git a/chromeos/ash/components/device_activity/churn_active_status.cc b/chromeos/ash/components/device_activity/churn_active_status.cc index 62950a62..1d5b4ce4 100644 --- a/chromeos/ash/components/device_activity/churn_active_status.cc +++ b/chromeos/ash/components/device_activity/churn_active_status.cc
@@ -13,11 +13,11 @@ namespace { -// We define the inception date as January 1st 2000, Pacific Time. +// 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 PST"; +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"; @@ -191,7 +191,7 @@ } const base::Time ChurnActiveStatus::GetCurrentActiveMonth() const { - DCHECK_GT(GetMonthsSinceInception(), 0); + DCHECK_GE(GetMonthsSinceInception(), 0); base::Time inception_ts = GetInceptionMonth(); int months_from_inception = GetMonthsSinceInception();
diff --git a/chromeos/ash/components/device_activity/churn_active_status_unittest.cc b/chromeos/ash/components/device_activity/churn_active_status_unittest.cc index a05101c5..6d1e6685 100644 --- a/chromeos/ash/components/device_activity/churn_active_status_unittest.cc +++ b/chromeos/ash/components/device_activity/churn_active_status_unittest.cc
@@ -20,6 +20,9 @@ // 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()); @@ -297,7 +300,6 @@ // 000000000000000000 = No active months // 0000000000000000000000000000 = 0 static constexpr int kInceptionDate = 0; - static constexpr char kInceptionTimeString[] = "01 Jan 2000 00:00:00 PST"; ChurnActiveStatusAtInceptionDate() : ChurnActiveStatusBase(kInceptionDate) {} }; @@ -456,7 +458,7 @@ // 000000000000000001 = Only active in January 2023. // 0100010100000000000000000001 = 72351745 static constexpr int kFixedDate = 72351745; - static constexpr char kFixedDateTimeString[] = "01 Jan 2023 00:00:00 PST"; + static constexpr char kFixedDateTimeString[] = "01 Jan 2023 00:00:00 GMT"; ChurnActiveStatusAtFixedDate() : ChurnActiveStatusBase(kFixedDate) {} }; @@ -567,8 +569,6 @@ class ChurnActiveStatusTest : public testing::TestWithParam<ChurnActiveStatusTestCase> { public: - static constexpr char kInceptionTimeString[] = "01 Jan 2000 00:00:00 PST"; - // Construct ChurnActiveStatusTest object with various ActiveStatus values. ChurnActiveStatusTest() { // Set the fake instance of statistics provider before @@ -606,11 +606,11 @@ ChurnActiveStatusTest, testing::ValuesIn<ChurnActiveStatusTestCase>({ {"FirstNewMonthFromInception", 262145, "2000-01", 1, - "01 Feb 2000 00:00:00 PST", 1, "03 Jan 2000 00:00:00 GMT"}, - {"ArbitraryDate1", 1310721, "2000-01", 5, "01 Jun 2000 00:00:00 PST", 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 PST", 1, "06 Mar 2023 00:00:00 GMT"}, + "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; @@ -624,7 +624,7 @@ EXPECT_EQ(churn_active_status->GetValueAsInt(), GetParam().active_status_value); - // Validate inception month is always Jan 2000 PST. + // 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);
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 index e149b3d..e280bce 100644 --- a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.cc +++ b/chromeos/ash/components/device_activity/churn_observation_use_case_impl.cc
@@ -96,6 +96,66 @@ 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, @@ -143,9 +203,9 @@ SetObservationPeriodWindows(GetActiveTs()); // Verify observation periods were set as expected. - if (observation_window_0_.observation_period.empty() && - observation_window_1_.observation_period.empty() && - observation_window_2_.observation_period.empty()) { + 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; @@ -164,17 +224,20 @@ import_request.set_use_case(GetPsmUseCase()); - // TODO(hirthanan): Selectively DCHECK after adding local state checks. - DCHECK(!observation_window_0_.observation_period.empty()); - DCHECK(!observation_window_1_.observation_period.empty()); - DCHECK(!observation_window_2_.observation_period.empty()); + if (observation_window_0_.IsObservationWindowSet()) { + *import_request.add_import_data() = + GenerateObservationFresnelImportData(observation_window_0_); + } - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_0_); - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_1_); - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_2_); + 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; } @@ -189,6 +252,8 @@ 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; @@ -196,10 +261,19 @@ status.set_use_case(private_computing::PrivateComputingUseCase:: CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION); - // TODO(hirthanan): Add preserved file persistence of 3 observation periods. - std::string last_ping_pt_date = - FormatPTDateString(GetLastKnownPingTimestamp()); - status.set_last_ping_date(last_ping_pt_date); + 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; } @@ -207,9 +281,9 @@ FresnelImportData ChurnObservationUseCaseImpl::GenerateObservationFresnelImportData( const ObservationWindow& observation_window) const { - DCHECK(!observation_window.observation_period.empty()); + DCHECK(observation_window.IsObservationWindowSet()); - std::string observation_window_id = observation_window.observation_period; + 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(); @@ -244,7 +318,7 @@ bool ChurnObservationUseCaseImpl::IsPreviousMonthlyActive( const ObservationWindow& observation_window) const { DCHECK(churn_active_status_ptr_); - DCHECK(!observation_window.observation_period.empty()); + DCHECK(observation_window.IsObservationWindowSet()); int active_month_val = churn_active_status_ptr_->GetActiveMonthBits(); @@ -256,13 +330,13 @@ // For example, for observation window "202303-202305", we would check for // whether "202302" month was active. return active_month_bits.test(kMonthlyChurnActiveStatusOffsetIndex + - observation_window.period); + observation_window.GetPeriod()); } bool ChurnObservationUseCaseImpl::IsPreviousYearlyActive( const ObservationWindow& observation_window) const { DCHECK(churn_active_status_ptr_); - DCHECK(!observation_window.observation_period.empty()); + DCHECK(observation_window.IsObservationWindowSet()); int active_month_val = churn_active_status_ptr_->GetActiveMonthBits(); @@ -274,14 +348,14 @@ // For example, for observation window "202303-202305", we would check for // whether "202202" month was active. return active_month_bits.test(kYearlyChurnActiveStatusOffsetIndex + - observation_window.period); + observation_window.GetPeriod()); } absl::optional<ChurnObservationMetadata::FirstActiveDuringCohort> ChurnObservationUseCaseImpl::GetFirstActiveDuringCohort( const ObservationWindow& observation_window) const { DCHECK(churn_active_status_ptr_); - DCHECK(!observation_window.observation_period.empty()); + 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(); @@ -319,8 +393,8 @@ // 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. - // - for (int i = 0; i <= observation_window.period; i++) { + int observation_window_period = observation_window.GetPeriod(); + for (int i = 0; i <= observation_window_period; i++) { prev_active_month = GetPreviousMonth(prev_active_month); } @@ -357,16 +431,15 @@ return ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET; } -std::string ChurnObservationUseCaseImpl::GetObservationPeriodForTesting( - int period) { +std::string ChurnObservationUseCaseImpl::GetObservationPeriod(int period) { if (period == 0) { - return observation_window_0_.observation_period; + return observation_window_0_.GetObservationPeriod(); } if (period == 1) { - return observation_window_1_.observation_period; + return observation_window_1_.GetObservationPeriod(); } if (period == 2) { - return observation_window_2_.observation_period; + return observation_window_2_.GetObservationPeriod(); } LOG(ERROR) << "Invalid period passed to method. " << "There is only 3 observation periods."; @@ -434,13 +507,37 @@ std::string cur_month_window_id = GenerateWindowIdentifier(ts); - observation_window_0_ = {0, cur_month_window_id + "-" + - GenerateWindowIdentifier(cur_month_plus_2)}; - observation_window_1_ = {1, GenerateWindowIdentifier(cur_month_minus_1) + - "-" + - GenerateWindowIdentifier(cur_month_plus_1)}; - observation_window_2_ = {2, GenerateWindowIdentifier(cur_month_minus_2) + - "-" + cur_month_window_id}; + // 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 index 06cf2ab4..9258676 100644 --- a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.h +++ b/chromeos/ash/components/device_activity/churn_observation_use_case_impl.h
@@ -32,14 +32,36 @@ // (0, 202302-202304) // (1, 202301-202303) // (2, 202212-202302) -struct COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) +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; + int period_ = -1; // String representing the observation period formatted // as "YYYYMM-YYYYMM" where the period length is 3 months. - std::string observation_period; + std::string observation_period_; }; // Contains the methods required to report the churn observation device active. @@ -63,8 +85,7 @@ bool IsEnabledCheckIn() override; bool IsEnabledCheckMembership() override; private_computing::ActiveStatus GenerateActiveStatus() override; - - std::string GetObservationPeriodForTesting(int period); + std::string GetObservationPeriod(int period) override; private: // On successful churn cohort check in, the active status object is updated to
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 index 7756e73..e71e01c 100644 --- 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
@@ -178,11 +178,11 @@ churn_observation_use_case_impl_->GenerateImportRequestBody(); // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(0), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), "202305-202307"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(1), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), "202304-202306"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(2), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), "202303-202305"); } @@ -200,11 +200,11 @@ churn_observation_use_case_impl_->GenerateImportRequestBody(); // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(0), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), "202312-202402"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(1), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), "202311-202401"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(2), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), "202310-202312"); } @@ -222,11 +222,11 @@ churn_observation_use_case_impl_->GenerateImportRequestBody(); // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(0), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), "202301-202303"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(1), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), "202212-202302"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriodForTesting(2), + EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), "202211-202301"); }
diff --git a/chromeos/ash/components/device_activity/device_active_use_case.cc b/chromeos/ash/components/device_activity/device_active_use_case.cc index 90dfc5e1..a809abc0 100644 --- a/chromeos/ash/components/device_activity/device_active_use_case.cc +++ b/chromeos/ash/components/device_activity/device_active_use_case.cc
@@ -44,6 +44,14 @@ 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();
diff --git a/chromeos/ash/components/device_activity/device_active_use_case.h b/chromeos/ash/components/device_activity/device_active_use_case.h index 6e36445..4b50513e 100644 --- a/chromeos/ash/components/device_activity/device_active_use_case.h +++ b/chromeos/ash/components/device_activity/device_active_use_case.h
@@ -85,6 +85,10 @@ // 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();
diff --git a/chromeos/ash/components/device_activity/device_activity_client.cc b/chromeos/ash/components/device_activity/device_activity_client.cc index f96b57af..ff4e0739 100644 --- a/chromeos/ash/components/device_activity/device_activity_client.cc +++ b/chromeos/ash/components/device_activity/device_activity_client.cc
@@ -171,6 +171,34 @@ 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. + exploded.day_of_month = 1; + exploded.month += 1; + exploded.hour = 0; + exploded.minute = 0; + exploded.second = 0; + exploded.millisecond = 0; + + // Handle case when month is December. + if (exploded.month > 12) { + exploded.year += 1; + exploded.month = 1; + } + + base::Time new_month_ts; + bool success = base::Time::FromUTCExploded(exploded, &new_month_ts); + + if (!success) { + return base::Time(); + } + + return new_month_ts; +} + // Generates the full histogram name for histogram variants based on state. std::string HistogramVariantName(const std::string& histogram_prefix, DeviceActivityClient::State state) { @@ -377,6 +405,173 @@ 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_->InitializeValue(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: @@ -392,17 +587,6 @@ return request; } -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::SaveLastPingDatesStatus() { RecordDeviceActivityMethodCalled( DeviceActivityClient::DeviceActivityMethod:: @@ -507,23 +691,9 @@ return; } - // Update the churn active value in local_state_ and ChurnActiveStatus - // if possible. - 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_->InitializeValue(churn_status_value); - local_state_->SetInteger( - prefs::kDeviceActiveLastKnownChurnActiveStatus, - churn_status_value); - } - } + // 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 == @@ -1170,16 +1340,9 @@ current_use_case->SetLastKnownPingTimestamp( last_transition_out_of_idle_time_); - // Update the churn active status after churn cohort ping. - if (current_use_case->GetPsmUseCase() == - private_membership::rlwe::RlweUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - churn_active_status_ptr_->UpdateValue(last_transition_out_of_idle_time_); - // Update the active value in local_state_ as well. - int active_value = churn_active_status_ptr_->GetValueAsInt(); - local_state_->SetInteger(prefs::kDeviceActiveLastKnownChurnActiveStatus, - active_value); - } + // 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());
diff --git a/chromeos/ash/components/device_activity/device_activity_client.h b/chromeos/ash/components/device_activity/device_activity_client.h index 09163f55..9233308 100644 --- a/chromeos/ash/components/device_activity/device_activity_client.h +++ b/chromeos/ash/components/device_activity/device_activity_client.h
@@ -183,6 +183,24 @@ 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();
diff --git a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc b/chromeos/ash/components/device_activity/device_activity_client_unittest.cc index e7b2f95..6abd51f 100644 --- a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc +++ b/chromeos/ash/components/device_activity/device_activity_client_unittest.cc
@@ -474,6 +474,8 @@ features::kDeviceActiveClient28DayActiveCheckMembership, features::kDeviceActiveClientChurnCohortCheckIn, features::kDeviceActiveClientChurnCohortCheckMembership, + features::kDeviceActiveClientChurnObservationCheckIn, + features::kDeviceActiveClientChurnObservationCheckMembership, }, GetPsmNonMemberTestCase(), GetPrivateComputingRegressionTestCase( @@ -571,8 +573,10 @@ kFakeFresnelApiKey, base::Time(), std::move(use_cases)); } + PrefService* GetLocalState() { return &local_state_; } + + // Simulate powerwashing device by removing the local state prefs. void SimulateLocalStateOnPowerwash() { - // Simulate powerwashing device by removing the local state prefs. local_state_.RemoveUserPref( prefs::kDeviceActiveLastKnownDailyPingTimestamp); local_state_.RemoveUserPref( @@ -581,6 +585,13 @@ 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); } void SimulateOprfResponse(const std::string& serialized_response_body, @@ -657,7 +668,7 @@ }; TEST_F(DeviceActivityClientTest, ValidateActiveUseCases) { - EXPECT_EQ(static_cast<int>(device_activity_client_->GetUseCases().size()), 3); + EXPECT_EQ(static_cast<int>(device_activity_client_->GetUseCases().size()), 4); } TEST_F(DeviceActivityClientTest, @@ -1620,7 +1631,7 @@ TEST_F(DeviceActivityClientTest, ChurnActiveStatusTest) { int kFakeBeforeChurnActiveStatus = 71565325; - int kFakeAfterChurnActvieStatus = 72351849; + int kFakeAfterChurnActiveStatus = 72351849; // Set the past ping month to 2022-10. base::Time new_daily_ts = base::Time::Now() - base::Days(70); @@ -1657,16 +1668,307 @@ // Check the new churn active status after ping. int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActvieStatus); + 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(), kFakeAfterChurnActvieStatus); + 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_->InitializeValue(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_->InitializeValue(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_->InitializeValue(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); +} + } // 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 index 8ebdc30f..e0f9826c7 100644 --- a/chromeos/ash/components/device_activity/device_activity_controller.cc +++ b/chromeos/ash/components/device_activity/device_activity_controller.cc
@@ -125,6 +125,12 @@ 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
diff --git a/chromeos/ash/components/device_activity/fresnel_pref_names.cc b/chromeos/ash/components/device_activity/fresnel_pref_names.cc index 1f1ebaf..b4ed0e44 100644 --- a/chromeos/ash/components/device_activity/fresnel_pref_names.cc +++ b/chromeos/ash/components/device_activity/fresnel_pref_names.cc
@@ -29,4 +29,14 @@ 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 index e63f6a1..8333d4bd 100644 --- a/chromeos/ash/components/device_activity/fresnel_pref_names.h +++ b/chromeos/ash/components/device_activity/fresnel_pref_names.h
@@ -23,6 +23,12 @@ 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
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc index 2f3160ca..eb34789 100644 --- a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc +++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
@@ -355,7 +355,7 @@ VLOG(3) << "Considering " << id << " " << Quote(path) << " " << Quote(md); if (!CanPin(md, path)) { - progress_.skipped_files++; + progress_.skipped_items++; return false; } @@ -656,7 +656,10 @@ Add(*item->metadata, item->path); } - VLOG(1) << "Skipped " << progress_.skipped_files << " files, Tracking " + progress_.listed_items += items->size(); + VLOG(1) << "Listed " << progress_.listed_items << " items in " + << timer_.Elapsed().InMilliseconds() << " ms, Skipped " + << progress_.skipped_items << " items, Tracking " << files_to_track_.size() << " files"; NotifyProgress(); DCHECK(search_query_); @@ -697,13 +700,9 @@ void PinManager::StartPinning() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - VLOG(1) << "Listed files in " << timer_.Elapsed().InMilliseconds() << " ms"; - VLOG(1) << "Free space: " << HumanReadableSize(progress_.free_space); - VLOG(1) << "Required space: " << HumanReadableSize(progress_.required_space); - VLOG(1) << "Skipped: " << progress_.skipped_files << " files"; VLOG(1) << "To pin: " << files_to_pin_.size() << " files, " << HumanReadableSize(progress_.bytes_to_pin); - VLOG(1) << "To track: " << files_to_track_.size() << " files"; + VLOG(1) << "Required space: " << HumanReadableSize(progress_.required_space); if (!progress_.HasEnoughFreeSpace()) { return Complete(Stage::kNotEnoughSpace);
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.h b/chromeos/ash/components/drivefs/drivefs_pin_manager.h index 3273086..8bb6138a 100644 --- a/chromeos/ash/components/drivefs/drivefs_pin_manager.h +++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
@@ -95,8 +95,12 @@ // Number of files being synced right now. int syncing_files = 0; - // Number of skipped files, directories and shortcuts. - int skipped_files = 0; + // Number of skipped items (files, directories and shortcuts). + int skipped_items = 0; + + // Number of all listed items (files, directories and shortcuts) seen during + // the kListingFiles stage. + int listed_items = 0; // Number of "useful" (ie non-duplicated) events received from DriveFS so far. int useful_events = 0;
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc index aff67b5..7b2314a 100644 --- a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc +++ b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
@@ -325,7 +325,7 @@ EXPECT_EQ(progress.pinned_bytes, 0); EXPECT_EQ(progress.bytes_to_pin, 0); EXPECT_EQ(progress.required_space, 0); - EXPECT_EQ(progress.skipped_files, 0); + EXPECT_EQ(progress.skipped_items, 0); } const Id id1 = Id(101); @@ -399,7 +399,7 @@ EXPECT_EQ(progress.required_space, 698249216); EXPECT_EQ(progress.syncing_files, 0); EXPECT_EQ(progress.files_to_pin, 1); - EXPECT_EQ(progress.skipped_files, 0); + EXPECT_EQ(progress.skipped_items, 0); } // Add a second item, but which is already pinned this time. @@ -437,7 +437,7 @@ EXPECT_EQ(progress.required_space, 777216000); EXPECT_EQ(progress.syncing_files, 1); EXPECT_EQ(progress.files_to_pin, 2); - EXPECT_EQ(progress.skipped_files, 0); + EXPECT_EQ(progress.skipped_items, 0); } // Add a third item, but which is not pinned yet, although already available @@ -476,7 +476,7 @@ EXPECT_EQ(progress.required_space, 777216000); EXPECT_EQ(progress.syncing_files, 1); EXPECT_EQ(progress.files_to_pin, 3); - EXPECT_EQ(progress.skipped_files, 0); + EXPECT_EQ(progress.skipped_items, 0); } // Try to add a forth item, but which is both pinned and already available @@ -515,7 +515,7 @@ EXPECT_EQ(progress.required_space, 777216000); EXPECT_EQ(progress.syncing_files, 1); EXPECT_EQ(progress.files_to_pin, 3); - EXPECT_EQ(progress.skipped_files, 1); + EXPECT_EQ(progress.skipped_items, 1); } }
diff --git a/chromeos/ash/components/language/language_packs/language_pack_manager.cc b/chromeos/ash/components/language/language_packs/language_pack_manager.cc index 5a31449..f8a9c77 100644 --- a/chromeos/ash/components/language/language_packs/language_pack_manager.cc +++ b/chromeos/ash/components/language/language_packs/language_pack_manager.cc
@@ -169,17 +169,39 @@ {{kHandwritingFeatureId, "zh"}, "handwriting-zh"}, // Text-To-Speech. + {{kTtsFeatureId, "bn-bd"}, "tts-bn-bd"}, + {{kTtsFeatureId, "cs-cz"}, "tts-cs-cz"}, + {{kTtsFeatureId, "da-dk"}, "tts-da-dk"}, {{kTtsFeatureId, "de-de"}, "tts-de-de"}, + {{kTtsFeatureId, "el-gr"}, "tts-el-gr"}, + {{kTtsFeatureId, "en-au"}, "tts-en-au"}, + {{kTtsFeatureId, "en-gb"}, "tts-en-gb"}, {{kTtsFeatureId, "en-us"}, "tts-en-us"}, {{kTtsFeatureId, "es-es"}, "tts-es-es"}, {{kTtsFeatureId, "es-us"}, "tts-es-us"}, + {{kTtsFeatureId, "fi-fi"}, "tts-fi-fi"}, + {{kTtsFeatureId, "fil-ph"}, "tts-fil-ph"}, {{kTtsFeatureId, "fr-fr"}, "tts-fr-fr"}, {{kTtsFeatureId, "hi-in"}, "tts-hi-in"}, + {{kTtsFeatureId, "hu-hu"}, "tts-hu-hu"}, + {{kTtsFeatureId, "id-id"}, "tts-id-id"}, {{kTtsFeatureId, "it-it"}, "tts-it-it"}, {{kTtsFeatureId, "ja-jp"}, "tts-ja-jp"}, + {{kTtsFeatureId, "km-kh"}, "tts-km-kh"}, + {{kTtsFeatureId, "ko-kr"}, "tts-ko-kr"}, + {{kTtsFeatureId, "nb-no"}, "tts-nb-no"}, + {{kTtsFeatureId, "ne-np"}, "tts-ne-np"}, {{kTtsFeatureId, "nl-nl"}, "tts-nl-nl"}, + {{kTtsFeatureId, "pl-pl"}, "tts-pl-pl"}, {{kTtsFeatureId, "pt-br"}, "tts-pt-br"}, + {{kTtsFeatureId, "si-lk"}, "tts-si-lk"}, + {{kTtsFeatureId, "sk-sk"}, "tts-sk-sk"}, {{kTtsFeatureId, "sv-se"}, "tts-sv-se"}, + {{kTtsFeatureId, "th-th"}, "tts-th-th"}, + {{kTtsFeatureId, "tr-tr"}, "tts-tr-tr"}, + {{kTtsFeatureId, "uk-ua"}, "tts-uk-ua"}, + {{kTtsFeatureId, "vi-vn"}, "tts-vi-vn"}, + {{kTtsFeatureId, "yue-hk"}, "tts-yue-hk"}, }); return *all_dlc_ids;
diff --git a/chromeos/ash/components/network/auto_connect_handler.cc b/chromeos/ash/components/network/auto_connect_handler.cc index cd99cec..57f48f6d 100644 --- a/chromeos/ash/components/network/auto_connect_handler.cc +++ b/chromeos/ash/components/network/auto_connect_handler.cc
@@ -410,7 +410,7 @@ const std::string& network_type) { NET_LOG(EVENT) << "Disable auto-connect forced by policy: " << NetworkPathId(service_path); - base::Value properties(base::Value::Type::DICT); + base::Value::Dict properties; std::string autoconnect_path; if (network_type == ::onc::network_config::kWiFi) { @@ -422,7 +422,7 @@ } else { NOTREACHED(); } - properties.SetBoolPath(autoconnect_path, false); + properties.SetByDottedPath(autoconnect_path, false); managed_configuration_handler_->SetProperties( service_path, properties, base::DoNothing(), base::BindOnce(&SetPropertiesErrorCallback));
diff --git a/chromeos/ash/components/network/hidden_network_handler.cc b/chromeos/ash/components/network/hidden_network_handler.cc index 146438f..5e1159bd 100644 --- a/chromeos/ash/components/network/hidden_network_handler.cc +++ b/chromeos/ash/components/network/hidden_network_handler.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/metrics/histogram_functions.h" #include "base/strings/string_number_conversions.h" +#include "base/task/single_thread_task_runner.h" #include "base/timer/timer.h" #include "chromeos/ash/components/network/managed_network_configuration_handler.h" #include "chromeos/ash/components/network/network_handler.h" @@ -24,6 +25,7 @@ constexpr base::TimeDelta kDefaultOverrideInterval = base::Minutes(1); constexpr base::TimeDelta kOneDay = base::Days(1); +constexpr base::TimeDelta kInitialDelay = base::Seconds(30); void OnRemoveConfigurationSuccess(const std::string guid) { base::UmaHistogramBoolean(kRemoveAttemptResultHistogram, true); @@ -72,15 +74,20 @@ void HiddenNetworkHandler::SetNetworkMetadataStore( NetworkMetadataStore* network_metadata_store) { - if (network_metadata_store_) + if (network_metadata_store_) { + initial_delay_timer_.Stop(); daily_event_timer_.Stop(); + } network_metadata_store_ = network_metadata_store; - if (!network_metadata_store_) + if (!network_metadata_store_) { return; + } - CleanHiddenNetworks(); - + initial_delay_timer_.Start( + FROM_HERE, kInitialDelay, + base::BindOnce(&HiddenNetworkHandler::CleanHiddenNetworks, + base::Unretained(this))); daily_event_timer_.Start( FROM_HERE, ComputeMigrationInterval(), base::BindRepeating(&HiddenNetworkHandler::CleanHiddenNetworks, @@ -96,8 +103,9 @@ size_t remove_network_attempts = 0; for (const NetworkState* state : state_list) { - if (!state->hidden_ssid() || state->IsManagedByPolicy()) + if (!state->hidden_ssid() || state->IsManagedByPolicy()) { continue; + } // The last connected timestamp for a network will be zero if the network // has never been connected to.
diff --git a/chromeos/ash/components/network/hidden_network_handler.h b/chromeos/ash/components/network/hidden_network_handler.h index 0f248f20..50f70c84 100644 --- a/chromeos/ash/components/network/hidden_network_handler.h +++ b/chromeos/ash/components/network/hidden_network_handler.h
@@ -38,9 +38,14 @@ private: void CleanHiddenNetworks(); - // Timer ensures that wrongly configured networks are searched for on - // a daily basis. + // Allows us to have an initial delay before the first time we check for + // wrongly configured networks. This delay is important to ensure that + // networks specific to a user are available during our initial check. + base::OneShotTimer initial_delay_timer_; + + // Allows us to check for wrongly configured networks on a daily basis. base::RepeatingTimer daily_event_timer_; + ManagedNetworkConfigurationHandler* managed_network_configuration_handler_ = nullptr; NetworkStateHandler* network_state_handler_ = nullptr;
diff --git a/chromeos/ash/components/network/hidden_network_handler_unittest.cc b/chromeos/ash/components/network/hidden_network_handler_unittest.cc index a7a6a3c3..f9454150 100644 --- a/chromeos/ash/components/network/hidden_network_handler_unittest.cc +++ b/chromeos/ash/components/network/hidden_network_handler_unittest.cc
@@ -35,8 +35,9 @@ // initialized until the next time the timer fires, e.g. the next day. constexpr base::TimeDelta kTwoWeeks = base::Days(15); constexpr base::TimeDelta kArbitraryTime = base::Days(11686); -constexpr base::TimeDelta kMigrationInterval = base::Seconds(5); -constexpr char kMigrationIntervalASCII[] = "5"; +constexpr base::TimeDelta kInitialDelay = base::Seconds(30); +constexpr base::TimeDelta kMigrationInterval = base::Seconds(60); +constexpr char kMigrationIntervalASCII[] = "60"; const char* kWiFiGuid1 = "wifi_guid1"; const char* kWiFiGuid2 = "wifi_guid2"; const char* kWiFiGuid3 = "wifi_guid3"; @@ -228,6 +229,8 @@ switches::kHiddenNetworkMigrationInterval, kMigrationIntervalASCII); MaybeRegisterAndInitializePrefs(); + task_environment()->FastForwardBy(kInitialDelay); + base::RunLoop().RunUntilIdle(); // Verify that the interval we check for networks to remove can be controlled // by the command line flag. We do this by checking before interval @@ -238,7 +241,8 @@ /*total=*/1, /*sum=*/0); - task_environment()->FastForwardBy(kMigrationInterval - base::Seconds(1)); + task_environment()->FastForwardBy(kMigrationInterval - kInitialDelay - + base::Seconds(1)); base::RunLoop().RunUntilIdle(); ExpectRemovalAttemptHistogram(/*bucket=*/0, /*frequency=*/1, @@ -339,18 +343,28 @@ const std::string path = CreateDefaultHiddenWiFiNetwork(); MaybeRegisterAndInitializePrefs(); + task_environment()->FastForwardBy(kInitialDelay); base::RunLoop().RunUntilIdle(); // We explicitly shut down and re-initialize the pref services to test that // whenever they are initialized the HiddenNetworkHandler class will - // immediately check for wrongly configured networks. + // check for wrongly configured networks after an initial delay. NetworkHandler::Get()->ShutdownPrefServices(); base::RunLoop().RunUntilIdle(); ExpectNetworksRemoved(/*service_path=*/std::string(), /*total_removed_count=*/0u); task_environment()->FastForwardBy(kTwoWeeks); + base::RunLoop().RunUntilIdle(); + MaybeRegisterAndInitializePrefs(/*should_register=*/false); base::RunLoop().RunUntilIdle(); + + // The network should not be removed before the initial delay. + ExpectNetworksRemoved(/*service_path=*/std::string(), + /*total_removed_count=*/0u); + + task_environment()->FastForwardBy(kInitialDelay); + base::RunLoop().RunUntilIdle(); ExpectNetworksRemoved(/*service_path=*/path, /*total_removed_count=*/1); ExpectRemovalAttemptHistogram(/*bucket=*/1, @@ -367,12 +381,12 @@ CreateDefaultHiddenWiFiNetwork(); ExpectNetworksRemoved(/*service_path=*/std::string(), /*total_removed_count=*/0u); - task_environment()->FastForwardBy(kTwoWeeks - base::Hours(5)); + task_environment()->FastForwardBy(base::Days(13)); base::RunLoop().RunUntilIdle(); ExpectNetworksRemoved(/*service_path=*/std::string(), /*total_removed_count=*/0u); ExpectRemovalAttemptHistogram(/*bucket=*/1, /*frequency=*/0, - /*total=*/15, + /*total=*/14, /*sum=*/0); ExpectRemovalAttemptResultHistogram( /*success_count=*/0,
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler.h b/chromeos/ash/components/network/managed_network_configuration_handler.h index 8781124..1b75e327 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler.h +++ b/chromeos/ash/components/network/managed_network_configuration_handler.h
@@ -95,7 +95,7 @@ // will be merged with the existing settings, and it won't clear any existing // properties. virtual void SetProperties(const std::string& service_path, - const base::Value& user_settings, + const base::Value::Dict& user_settings, base::OnceClosure callback, network_handler::ErrorCallback error_callback) = 0; @@ -106,7 +106,7 @@ // |userhash| is empty, the new configuration will be shared. virtual void CreateConfiguration( const std::string& userhash, - const base::Value& properties, + const base::Value::Dict& properties, network_handler::ServiceResultCallback callback, network_handler::ErrorCallback error_callback) const = 0;
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc index 49755be..bf9d5e68 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc +++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
@@ -236,7 +236,7 @@ void ManagedNetworkConfigurationHandlerImpl::SetProperties( const std::string& service_path, - const base::Value& user_settings, + const base::Value::Dict& user_settings, base::OnceClosure callback, network_handler::ErrorCallback error_callback) { const NetworkState* state = @@ -276,37 +276,39 @@ // We need to ensure that required configuration properties (e.g. Type) are // included for ONC validation and translation to Shill properties. - base::Value user_settings_copy = user_settings.Clone(); - user_settings_copy.SetKey( - ::onc::network_config::kType, - base::Value(network_util::TranslateShillTypeToONC(state->type()))); - user_settings_copy.MergeDictionary(&user_settings); + base::Value::Dict user_settings_copy = user_settings.Clone(); + if (!user_settings_copy.contains(::onc::network_config::kType)) { + user_settings_copy.Set( + ::onc::network_config::kType, + network_util::TranslateShillTypeToONC(state->type())); + } // Validate the ONC dictionary. We are liberal and ignore unknown field // names. User settings are only partial ONC, thus we ignore missing fields. chromeos::onc::Validator validator( - false, // Ignore unknown fields. - false, // Ignore invalid recommended field names. - false, // Ignore missing fields. - false, // This ONC does not come from policy. - true); // Log warnings. + /*error_on_unknown_field=*/false, + /*error_on_wrong_recommended=*/false, + /*error_on_missing_field=*/false, + /*managed_onc=*/false, + /*log_warnings=*/true); chromeos::onc::Validator::Result validation_result; - base::Value validated_user_settings = validator.ValidateAndRepairObject( - &chromeos::onc::kNetworkConfigurationSignature, user_settings_copy, - &validation_result); + absl::optional<base::Value::Dict> validated_user_settings = + validator.ValidateAndRepairObject( + &chromeos::onc::kNetworkConfigurationSignature, user_settings_copy, + &validation_result); if (validation_result == chromeos::onc::Validator::INVALID) { InvokeErrorCallback(service_path, std::move(error_callback), kInvalidUserSettings); return; } - if (validation_result == chromeos::onc::Validator::VALID_WITH_WARNINGS) + if (validation_result == chromeos::onc::Validator::VALID_WITH_WARNINGS) { NET_LOG(USER) << "Validation of ONC user settings produced warnings."; - DCHECK(validated_user_settings.is_dict()); + } // Don't allow AutoConnect=true for unmanaged wifi networks if // 'AllowOnlyPolicyNetworksToAutoconnect' policy is active. - if (EnablesUnmanagedWifiAutoconnect(validated_user_settings.GetDict()) && + if (EnablesUnmanagedWifiAutoconnect(validated_user_settings.value()) && AllowOnlyPolicyNetworksToAutoconnect()) { InvokeErrorCallback(service_path, std::move(error_callback), kInvalidUserSettings); @@ -316,7 +318,7 @@ // Fill in HexSSID field from contents of SSID field if not set already. chromeos::onc::FillInHexSSIDFieldsInOncObject( chromeos::onc::kNetworkConfigurationSignature, - validated_user_settings.GetDict()); + validated_user_settings.value()); const base::Value::Dict* network_policy = policies->GetPolicyByGuid(guid); if (network_policy) { @@ -325,7 +327,7 @@ base::Value::Dict shill_dictionary = policy_util::CreateShillConfiguration( *profile, guid, policies->GetGlobalNetworkConfig(), network_policy, - &validated_user_settings); + &validated_user_settings.value()); SetShillProperties(service_path, std::move(shill_dictionary), std::move(callback), std::move(error_callback)); @@ -358,19 +360,19 @@ void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration( const std::string& userhash, - const base::Value& properties, + const base::Value::Dict& properties, network_handler::ServiceResultCallback callback, network_handler::ErrorCallback error_callback) const { - std::string guid = GetStringFromDictionary(properties.GetDict(), - ::onc::network_config::kGUID); + std::string guid = + GetStringFromDictionary(properties, ::onc::network_config::kGUID); const NetworkState* network_state = nullptr; if (!guid.empty()) network_state = network_state_handler_->GetNetworkStateFromGuid(guid); if (network_state) { NET_LOG(USER) << "CreateConfiguration for: " << NetworkId(network_state); } else { - std::string type = GetStringFromDictionary(properties.GetDict(), - ::onc::network_config::kType); + std::string type = + GetStringFromDictionary(properties, ::onc::network_config::kType); NET_LOG(USER) << "Create new network configuration, Type: " << type; } @@ -384,22 +386,23 @@ false); // Don't log warnings. chromeos::onc::Validator::Result validation_result; - base::Value validated_properties = validator.ValidateAndRepairObject( - &chromeos::onc::kNetworkConfigurationSignature, properties, - &validation_result); + absl::optional<base::Value::Dict> validated_properties = + validator.ValidateAndRepairObject( + &chromeos::onc::kNetworkConfigurationSignature, properties, + &validation_result); if (validation_result == chromeos::onc::Validator::INVALID) { InvokeErrorCallback("", std::move(error_callback), kInvalidUserSettings); return; } - if (validation_result == chromeos::onc::Validator::VALID_WITH_WARNINGS) + if (validation_result == chromeos::onc::Validator::VALID_WITH_WARNINGS) { NET_LOG(DEBUG) << "Validation of ONC user settings produced warnings."; - DCHECK(validated_properties.is_dict()); + } // Fill in HexSSID field from contents of SSID field if not set already - this // is required to properly match the configuration against existing policies. chromeos::onc::FillInHexSSIDFieldsInOncObject( chromeos::onc::kNetworkConfigurationSignature, - validated_properties.GetDict()); + validated_properties.value()); // Make sure the network is not configured through a user policy. const ProfilePolicies* policies = nullptr; @@ -412,7 +415,7 @@ } if (policies->HasPolicyMatchingShillProperties( - validated_properties.GetDict())) { + validated_properties.value())) { InvokeErrorCallback("", std::move(error_callback), kNetworkAlreadyConfigured); return; @@ -427,7 +430,7 @@ } if (policies->HasPolicyMatchingShillProperties( - validated_properties.GetDict())) { + validated_properties.value())) { InvokeErrorCallback("", std::move(error_callback), kNetworkAlreadyConfigured); return; @@ -448,7 +451,7 @@ // forgotten while the UI is open. Configuration should succeed and the GUID // can be reused. if (network_state) { - if (!MatchesExistingNetworkState(validated_properties.GetDict(), + if (!MatchesExistingNetworkState(validated_properties.value(), network_state)) { InvokeErrorCallback(network_state->path(), std::move(error_callback), kNetworkAlreadyConfigured); @@ -468,7 +471,7 @@ policy_util::CreateShillConfiguration(*profile, guid, nullptr, // no global policy nullptr, // no network policy - &validated_properties); + &validated_properties.value()); network_configuration_handler_->CreateShillConfiguration( shill_dictionary, std::move(callback), std::move(error_callback)); @@ -1286,7 +1289,7 @@ std::unique_ptr<NetworkUIData> ui_data = shill_property_util::GetUIDataFromProperties(shill_properties.value()); - const base::Value* user_settings = nullptr; + const base::Value::Dict* user_settings = nullptr; if (ui_data && profile) { user_settings = ui_data->GetUserSettingsDictionary();
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.h b/chromeos/ash/components/network/managed_network_configuration_handler_impl.h index 9dcb860..8156018 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.h +++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.h
@@ -61,13 +61,13 @@ network_handler::PropertiesCallback callback) override; void SetProperties(const std::string& service_path, - const base::Value& user_settings, + const base::Value::Dict& user_settings, base::OnceClosure callback, network_handler::ErrorCallback error_callback) override; void CreateConfiguration( const std::string& userhash, - const base::Value& properties, + const base::Value::Dict& properties, network_handler::ServiceResultCallback callback, network_handler::ErrorCallback error_callback) const override; @@ -125,7 +125,7 @@ const std::string& profile_path) const override; // This method should be called when the policy has been fully applied and is - // reflected in NetworkStateHandler, so it is safe to notify obserers. + // reflected in NetworkStateHandler, so it is safe to notify observers. // Notifying observers is the last step of policy application to // |service_path|. void NotifyPolicyAppliedToNetwork(
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc index 87b2648..3b63311 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc +++ b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
@@ -290,38 +290,35 @@ if (!policy.has_value()) { return false; } - return SetPolicy(onc_source, userhash, base::Value(std::move(*policy))); + return SetPolicy(onc_source, userhash, std::move(policy.value())); } - base::Value policy_value = test_utils::ReadTestDictionaryValue(path_to_onc); - if (!policy_value.is_dict()) { - return false; - } + base::Value::Dict policy_value = + test_utils::ReadTestDictionary(path_to_onc); return SetPolicy(onc_source, userhash, std::move(policy_value)); } bool SetPolicy(::onc::ONCSource onc_source, const std::string& userhash, - base::Value policy) { - chromeos::onc::Validator validator(true, // error_on_unknown_field - true, // error_on_wrong_recommended - false, // error_on_missing_field - true, // managed_onc - true); // log_warnings + base::Value::Dict policy) { + chromeos::onc::Validator validator(/*error_on_unknown_field=*/true, + /*error_on_wrong_recommended=*/true, + /*error_on_missing_field=*/false, + /*managed_onc=*/true, + /*log_warnings=*/true); validator.SetOncSource(onc_source); chromeos::onc::Validator::Result validation_result; - base::Value validated_policy = validator.ValidateAndRepairObject( - &chromeos::onc::kToplevelConfigurationSignature, policy, - &validation_result); + absl::optional<base::Value::Dict> validated_policy = + validator.ValidateAndRepairObject( + &chromeos::onc::kToplevelConfigurationSignature, policy, + &validation_result); if (validation_result == chromeos::onc::Validator::INVALID) { ADD_FAILURE() << "Network configuration invalid."; return false; } - const base::Value::Dict& validated_policy_dict = validated_policy.GetDict(); base::Value::List network_configs; - const base::Value::List* found_network_configs = - validated_policy_dict.FindList( - ::onc::toplevel_config::kNetworkConfigurations); + const base::Value::List* found_network_configs = validated_policy->FindList( + ::onc::toplevel_config::kNetworkConfigurations); if (found_network_configs) { for (const auto& network_config : *found_network_configs) { network_configs.Append(network_config.Clone()); @@ -329,9 +326,8 @@ } base::Value::Dict global_config; - const base::Value::Dict* found_global_config = - validated_policy_dict.FindDict( - ::onc::toplevel_config::kGlobalNetworkConfiguration); + const base::Value::Dict* found_global_config = validated_policy->FindDict( + ::onc::toplevel_config::kGlobalNetworkConfiguration); if (found_global_config) { global_config = found_global_config->Clone(); } @@ -344,9 +340,9 @@ void SetUpEntry(const std::string& path_to_shill_json, const std::string& profile_path, const std::string& entry_path) { - base::Value entry = test_utils::ReadTestDictionaryValue(path_to_shill_json); - GetShillProfileClient()->AddEntry(profile_path, entry_path, - entry.GetDict()); + base::Value::Dict entry = + test_utils::ReadTestDictionary(path_to_shill_json); + GetShillProfileClient()->AddEntry(profile_path, entry_path, entry); } void ResetManagedNetworkConfigurationHandler() { @@ -462,7 +458,7 @@ "Type": "UnencryptedConfiguration" })"; EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, - base::test::ParseJson(onc_policy))); + base::test::ParseJsonDict(onc_policy))); base::RunLoop().RunUntilIdle(); std::string service_path = @@ -534,7 +530,7 @@ "Type": "UnencryptedConfiguration" })"; EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, - base::test::ParseJson(onc_policy))); + base::test::ParseJsonDict(onc_policy))); base::RunLoop().RunUntilIdle(); std::string service_path = @@ -582,7 +578,7 @@ "Type": "UnencryptedConfiguration" })"; EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, - base::test::ParseJson(onc_policy))); + base::test::ParseJsonDict(onc_policy))); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(managed_handler()->IsAnyPolicyApplicationRunning()); @@ -970,8 +966,8 @@ const NetworkState* network_state = network_state_handler_->GetNetworkStateFromGuid(kTestGuidVpn); ASSERT_TRUE(network_state); - base::Value ui_config = - test_utils::ReadTestDictionaryValue("policy/policy_vpn_ui.json"); + base::Value::Dict ui_config = + test_utils::ReadTestDictionary("policy/policy_vpn_ui.json"); managed_network_configuration_handler_->SetProperties( network_state->path(), ui_config, base::DoNothing(), base::BindOnce(&ErrorCallback)); @@ -1003,8 +999,8 @@ const NetworkState* network_state = network_state_handler_->GetNetworkStateFromGuid(kTestGuidVpn); ASSERT_TRUE(network_state); - base::Value ui_config = - test_utils::ReadTestDictionaryValue("policy/policy_vpn_ipsec_ui.json"); + base::Value::Dict ui_config = + test_utils::ReadTestDictionary("policy/policy_vpn_ipsec_ui.json"); managed_network_configuration_handler_->SetProperties( network_state->path(), ui_config, base::DoNothing(), base::BindOnce(&ErrorCallback)); @@ -1195,7 +1191,7 @@ "Type": "UnencryptedConfiguration" })"; EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1, - base::test::ParseJson(onc_policy))); + base::test::ParseJsonDict(onc_policy))); base::RunLoop().RunUntilIdle(); // Expect that "policy_wifi1" policy has been applied by checking that the
diff --git a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h index 83d9452..69eb7918 100644 --- a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h +++ b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h
@@ -42,12 +42,12 @@ network_handler::PropertiesCallback callback)); MOCK_METHOD4(SetProperties, void(const std::string& service_path, - const base::Value& user_settings, + const base::Value::Dict& user_settings, base::OnceClosure callback, network_handler::ErrorCallback error_callback)); MOCK_CONST_METHOD4(CreateConfiguration, void(const std::string& userhash, - const base::Value& properties, + const base::Value::Dict& properties, network_handler::ServiceResultCallback callback, network_handler::ErrorCallback error_callback)); MOCK_CONST_METHOD2(ConfigurePolicyNetwork,
diff --git a/chromeos/ash/components/network/network_state_handler_unittest.cc b/chromeos/ash/components/network/network_state_handler_unittest.cc index 0cbf15f8..a8da4d9 100644 --- a/chromeos/ash/components/network/network_state_handler_unittest.cc +++ b/chromeos/ash/components/network/network_state_handler_unittest.cc
@@ -447,16 +447,15 @@ kShillManagerClientStubDefaultWifi); } - void SetProperties(NetworkState* network, const base::Value& properties) { + void SetProperties(NetworkState* network, + const base::Value::Dict& properties) { // UpdateNetworkStateProperties expects 'Type' and 'WiFi.HexSSID' to always // be set. - base::Value properties_to_set(properties.Clone()); - properties_to_set.SetKey(shill::kTypeProperty, - base::Value(network->type())); - properties_to_set.SetKey(shill::kWifiHexSsid, - base::Value(network->GetHexSsid())); - network_state_handler_->UpdateNetworkStateProperties( - network, properties_to_set.GetDict()); + base::Value::Dict properties_to_set = properties.Clone(); + properties_to_set.Set(shill::kTypeProperty, network->type()); + properties_to_set.Set(shill::kWifiHexSsid, network->GetHexSsid()); + network_state_handler_->UpdateNetworkStateProperties(network, + properties_to_set); } void GetTetherNetworkList(int limit, @@ -2510,9 +2509,9 @@ // Emulate 'wifi1' being a managed network. std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_USER_POLICY); - base::Value properties(base::Value::Type::DICT); - properties.SetKey(shill::kProfileProperty, base::Value(kProfilePath)); - properties.SetKey(shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + base::Value::Dict properties; + properties.Set(shill::kProfileProperty, kProfilePath); + properties.Set(shill::kUIDataProperty, ui_data->GetAsJson()); SetProperties(wifi1, properties); EXPECT_FALSE(network_state_handler_->OnlyManagedWifiNetworksAllowed()); @@ -2544,9 +2543,9 @@ // Emulate 'wifi1' being a managed network. std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_USER_POLICY); - base::Value properties(base::Value::Type::DICT); - properties.SetKey(shill::kProfileProperty, base::Value(kProfilePath)); - properties.SetKey(shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + base::Value::Dict properties; + properties.Set(shill::kProfileProperty, kProfilePath); + properties.Set(shill::kUIDataProperty, ui_data->GetAsJson()); SetProperties(wifi1, properties); EXPECT_TRUE(network_state_handler_->OnlyManagedWifiNetworksAllowed()); @@ -2582,9 +2581,9 @@ // Emulate 'cellular1' being a managed network. std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY); - base::Value properties(base::Value::Type::DICT); - properties.SetKey(shill::kProfileProperty, base::Value(kProfilePath)); - properties.SetKey(shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + base::Value::Dict properties; + properties.Set(shill::kProfileProperty, kProfilePath); + properties.Set(shill::kUIDataProperty, ui_data->GetAsJson()); SetProperties(cellular1, properties); EXPECT_TRUE(cellular1->IsManagedByPolicy()); @@ -2623,9 +2622,9 @@ // Emulate 'cellular1' being a managed network. std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY); - base::Value properties(base::Value::Type::DICT); - properties.SetKey(shill::kProfileProperty, base::Value(kProfilePath)); - properties.SetKey(shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + base::Value::Dict properties; + properties.Set(shill::kProfileProperty, kProfilePath); + properties.Set(shill::kUIDataProperty, ui_data->GetAsJson()); SetProperties(cellular1, properties); EXPECT_TRUE(cellular1->IsManagedByPolicy()); @@ -2656,9 +2655,9 @@ // Emulate 'wifi1' being a managed network. std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_USER_POLICY); - base::Value properties(base::Value::Type::DICT); - properties.SetKey(shill::kProfileProperty, base::Value(kProfilePath)); - properties.SetKey(shill::kUIDataProperty, base::Value(ui_data->GetAsJson())); + base::Value::Dict properties; + properties.Set(shill::kProfileProperty, kProfilePath); + properties.Set(shill::kUIDataProperty, ui_data->GetAsJson()); SetProperties(wifi1, properties); network_state_handler_->UpdateManagedWifiNetworkAvailable();
diff --git a/chromeos/ash/components/network/network_ui_data.cc b/chromeos/ash/components/network/network_ui_data.cc index 3dbfc1e2..63886f0 100644 --- a/chromeos/ash/components/network/network_ui_data.cc +++ b/chromeos/ash/components/network/network_ui_data.cc
@@ -68,24 +68,23 @@ NetworkUIData& NetworkUIData::operator=(const NetworkUIData& other) { onc_source_ = other.onc_source_; - if (other.user_settings_.is_dict()) { - user_settings_ = other.user_settings_.Clone(); + if (other.user_settings_.has_value()) { + user_settings_ = other.user_settings_->Clone(); } return *this; } -NetworkUIData::NetworkUIData(const base::Value& dict) { - const base::Value* source_value = - dict.FindKeyOfType(kKeyONCSource, base::Value::Type::STRING); +NetworkUIData::NetworkUIData(const base::Value::Dict& dict) { + const std::string* source_value = dict.FindString(kKeyONCSource); if (source_value) { - onc_source_ = StringToEnum(kONCSourceTable, source_value->GetString(), - ::onc::ONC_SOURCE_NONE); + onc_source_ = + StringToEnum(kONCSourceTable, *source_value, ::onc::ONC_SOURCE_NONE); } else { onc_source_ = ::onc::ONC_SOURCE_NONE; } - const base::Value* user_settings_value = - dict.FindKeyOfType(kKeyUserSettings, base::Value::Type::DICT); + const base::Value::Dict* user_settings_value = + dict.FindDict(kKeyUserSettings); if (user_settings_value) { user_settings_ = user_settings_value->Clone(); } @@ -103,24 +102,26 @@ return ui_data; } -const base::Value* NetworkUIData::GetUserSettingsDictionary() const { - if (user_settings_.is_none()) +const base::Value::Dict* NetworkUIData::GetUserSettingsDictionary() const { + if (!user_settings_.has_value()) { return nullptr; - return &user_settings_; + } + return &user_settings_.value(); } -void NetworkUIData::SetUserSettingsDictionary(base::Value dict) { - DCHECK(dict.is_dict()); +void NetworkUIData::SetUserSettingsDictionary(base::Value::Dict dict) { user_settings_ = std::move(dict); } std::string NetworkUIData::GetAsJson() const { - base::Value dict(base::Value::Type::DICT); + base::Value::Dict dict; const std::string source_string = GetONCSourceAsString(); - if (!source_string.empty()) - dict.SetKey(kKeyONCSource, base::Value(source_string)); - if (user_settings_.is_dict()) - dict.SetKey(kKeyUserSettings, user_settings_.Clone()); + if (!source_string.empty()) { + dict.Set(kKeyONCSource, source_string); + } + if (user_settings_.has_value()) { + dict.Set(kKeyUserSettings, user_settings_->Clone()); + } std::string json; base::JSONWriter::Write(dict, &json);
diff --git a/chromeos/ash/components/network/network_ui_data.h b/chromeos/ash/components/network/network_ui_data.h index aae5db1..ffddf92e 100644 --- a/chromeos/ash/components/network/network_ui_data.h +++ b/chromeos/ash/components/network/network_ui_data.h
@@ -11,6 +11,7 @@ #include "base/component_export.h" #include "base/values.h" #include "components/onc/onc_constants.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace ash { @@ -22,7 +23,7 @@ NetworkUIData(); NetworkUIData(const NetworkUIData& other); NetworkUIData& operator=(const NetworkUIData& other); - explicit NetworkUIData(const base::Value& dict); + explicit NetworkUIData(const base::Value::Dict& dict); ~NetworkUIData(); // Creates a NetworkUIData object from |onc_source|. This function is used to @@ -30,11 +31,11 @@ static std::unique_ptr<NetworkUIData> CreateFromONC( ::onc::ONCSource onc_source); - // Returns a |user_settings_| as a base::Value::Type::DICT Value*. - const base::Value* GetUserSettingsDictionary() const; + // Returns a |user_settings_|. + const base::Value::Dict* GetUserSettingsDictionary() const; - // Setus |user_settings_| to the provided value which must be a dictionary. - void SetUserSettingsDictionary(base::Value dict); + // Sets |user_settings_| to the provided value. + void SetUserSettingsDictionary(base::Value::Dict dict); // Returns a JSON string representing currently configured values for storing // in Shill. @@ -46,9 +47,7 @@ std::string GetONCSourceAsString() const; ::onc::ONCSource onc_source_; - // This can be a NONE value if there is no user settings dictionary, or a - // DICTIONARY value otherwise. - base::Value user_settings_; + absl::optional<base::Value::Dict> user_settings_; }; } // namespace ash
diff --git a/chromeos/ash/components/network/network_ui_data_unittest.cc b/chromeos/ash/components/network/network_ui_data_unittest.cc index 2f91294..40baf95 100644 --- a/chromeos/ash/components/network/network_ui_data_unittest.cc +++ b/chromeos/ash/components/network/network_ui_data_unittest.cc
@@ -10,20 +10,20 @@ namespace ash { TEST(NetworkUIDataTest, ONCSource) { - base::Value ui_data_dict(base::Value::Type::DICT); + base::Value::Dict ui_data_dict; - ui_data_dict.SetStringKey("onc_source", "user_import"); + ui_data_dict.Set("onc_source", "user_import"); { NetworkUIData ui_data(ui_data_dict); EXPECT_EQ(::onc::ONC_SOURCE_USER_IMPORT, ui_data.onc_source()); } - ui_data_dict.SetStringKey("onc_source", "device_policy"); + ui_data_dict.Set("onc_source", "device_policy"); { NetworkUIData ui_data(ui_data_dict); EXPECT_EQ(::onc::ONC_SOURCE_DEVICE_POLICY, ui_data.onc_source()); } - ui_data_dict.SetStringKey("onc_source", "user_policy"); + ui_data_dict.Set("onc_source", "user_policy"); { NetworkUIData ui_data(ui_data_dict); EXPECT_EQ(::onc::ONC_SOURCE_USER_POLICY, ui_data.onc_source());
diff --git a/chromeos/ash/components/network/onc/onc_merger.cc b/chromeos/ash/components/network/onc/onc_merger.cc index f2e62f69..45dc96c 100644 --- a/chromeos/ash/components/network/onc/onc_merger.cc +++ b/chromeos/ash/components/network/onc/onc_merger.cc
@@ -545,34 +545,23 @@ base::Value::Dict MergeSettingsAndPoliciesToEffective( const base::Value::Dict* user_policy, const base::Value::Dict* device_policy, - const base::Value* user_settings, - const base::Value* shared_settings) { - const base::Value::Dict* user_settings_dict = - user_settings ? &user_settings->GetDict() : nullptr; - const base::Value::Dict* shared_settings_dict = - shared_settings ? &shared_settings->GetDict() : nullptr; - + const base::Value::Dict* user_settings, + const base::Value::Dict* shared_settings) { MergeToEffective merger; - return merger.MergeDictionaries(user_policy, device_policy, - user_settings_dict, shared_settings_dict, - nullptr); + return merger.MergeDictionaries(user_policy, device_policy, user_settings, + shared_settings, nullptr); } base::Value::Dict MergeSettingsAndPoliciesToAugmented( const chromeos::onc::OncValueSignature& signature, const base::Value::Dict* user_policy, const base::Value::Dict* device_policy, - const base::Value* user_settings, - const base::Value* shared_settings, + const base::Value::Dict* user_settings, + const base::Value::Dict* shared_settings, const base::Value::Dict* active_settings) { - const base::Value::Dict* user_settings_dict = - user_settings ? &user_settings->GetDict() : nullptr; - const base::Value::Dict* shared_settings_dict = - shared_settings ? &shared_settings->GetDict() : nullptr; - MergeToAugmented merger; return merger.MergeDictionaries(signature, user_policy, device_policy, - user_settings_dict, shared_settings_dict, + user_settings, shared_settings, active_settings); }
diff --git a/chromeos/ash/components/network/onc/onc_merger.h b/chromeos/ash/components/network/onc/onc_merger.h index 8f88fd1..d333e209 100644 --- a/chromeos/ash/components/network/onc/onc_merger.h +++ b/chromeos/ash/components/network/onc/onc_merger.h
@@ -27,8 +27,8 @@ base::Value::Dict MergeSettingsAndPoliciesToEffective( const base::Value::Dict* user_policy, const base::Value::Dict* device_policy, - const base::Value* user_settings, - const base::Value* shared_settings); + const base::Value::Dict* user_settings, + const base::Value::Dict* shared_settings); // Like MergeSettingsWithPoliciesToEffective but creates one dictionary in place // of each field that exists in any of the argument dictionaries. Each of these @@ -42,8 +42,8 @@ const chromeos::onc::OncValueSignature& signature, const base::Value::Dict* user_policy, const base::Value::Dict* device_policy, - const base::Value* user_settings, - const base::Value* shared_settings, + const base::Value::Dict* user_settings, + const base::Value::Dict* shared_settings, const base::Value::Dict* active_settings); } // namespace ash::onc
diff --git a/chromeos/ash/components/network/onc/onc_merger_unittest.cc b/chromeos/ash/components/network/onc/onc_merger_unittest.cc index 03cbd42..40ac9c0 100644 --- a/chromeos/ash/components/network/onc/onc_merger_unittest.cc +++ b/chromeos/ash/components/network/onc/onc_merger_unittest.cc
@@ -49,17 +49,17 @@ class ONCMergerTest : public testing::Test { public: - base::Value user_; + base::Value::Dict user_; base::Value::Dict policy_; - base::Value policy_without_recommended_; + base::Value::Dict policy_without_recommended_; base::Value::Dict device_policy_; base::Value::Dict active_; void SetUp() override { policy_ = test_utils::ReadTestDictionary("managed_vpn.onc"); - policy_without_recommended_ = test_utils::ReadTestDictionaryValue( - "managed_vpn_without_recommended.onc"); - user_ = test_utils::ReadTestDictionaryValue("user.onc"); + policy_without_recommended_ = + test_utils::ReadTestDictionary("managed_vpn_without_recommended.onc"); + user_ = test_utils::ReadTestDictionary("user.onc"); device_policy_ = test_utils::ReadTestDictionary("device_policy.onc"); active_ = test_utils::ReadTestDictionary("vpn_active_settings.onc"); } @@ -82,20 +82,20 @@ TEST_F(ONCMergerTest, MandatoryDictionaryAndNoUserValue) { base::Value::Dict merged = MergeSettingsAndPoliciesToEffective(&policy_, nullptr, &user_, nullptr); - EXPECT_TRUE(HaveSameValueAt(merged, policy_without_recommended_.GetDict(), + EXPECT_TRUE(HaveSameValueAt(merged, policy_without_recommended_, "VPN.OpenVPN.ClientCertPattern")); } TEST_F(ONCMergerTest, UserValueOverwritesRecommendedValue) { base::Value::Dict merged = MergeSettingsAndPoliciesToEffective(&policy_, nullptr, &user_, nullptr); - EXPECT_TRUE(HaveSameValueAt(merged, user_.GetDict(), "VPN.Host")); + EXPECT_TRUE(HaveSameValueAt(merged, user_, "VPN.Host")); } TEST_F(ONCMergerTest, UserValueAndRecommendedUnset) { base::Value::Dict merged = MergeSettingsAndPoliciesToEffective(&policy_, nullptr, &user_, nullptr); - EXPECT_TRUE(HaveSameValueAt(merged, user_.GetDict(), "VPN.OpenVPN.Password")); + EXPECT_TRUE(HaveSameValueAt(merged, user_, "VPN.OpenVPN.Password")); } TEST_F(ONCMergerTest, UserDictionaryAndNoPolicyValue) { @@ -114,22 +114,20 @@ TEST_F(ONCMergerTest, MergeWithoutPolicyAllowsAnything) { base::Value::Dict merged = MergeSettingsAndPoliciesToEffective(nullptr, nullptr, &user_, nullptr); - EXPECT_TRUE(test_utils::Equals(&user_.GetDict(), &merged)); + EXPECT_TRUE(test_utils::Equals(&user_, &merged)); } TEST_F(ONCMergerTest, MergeWithoutUserSettings) { - base::Value empty_dict(base::Value::Type::DICT); + base::Value::Dict empty_dict; base::Value::Dict merged; merged = MergeSettingsAndPoliciesToEffective(&policy_, nullptr, &empty_dict, nullptr); - EXPECT_TRUE( - test_utils::Equals(&policy_without_recommended_.GetDict(), &merged)); + EXPECT_TRUE(test_utils::Equals(&policy_without_recommended_, &merged)); merged = MergeSettingsAndPoliciesToEffective(&policy_, nullptr, nullptr, nullptr); - EXPECT_TRUE( - test_utils::Equals(&policy_without_recommended_.GetDict(), &merged)); + EXPECT_TRUE(test_utils::Equals(&policy_without_recommended_, &merged)); } TEST_F(ONCMergerTest, MandatoryUserPolicyOverwritesDevicePolicy) {
diff --git a/chromeos/ash/components/network/policy_applicator.cc b/chromeos/ash/components/network/policy_applicator.cc index 2b4f78c7..c694808 100644 --- a/chromeos/ash/components/network/policy_applicator.cc +++ b/chromeos/ash/components/network/policy_applicator.cc
@@ -284,7 +284,7 @@ } remaining_policy_guids_.erase(new_guid); - const base::Value* user_settings = + const base::Value::Dict* user_settings = ui_data ? ui_data->GetUserSettingsDictionary() : nullptr; base::Value::Dict new_shill_properties = policy_util::CreateShillConfiguration(profile_, new_guid, @@ -341,7 +341,7 @@ // network settings have to be applied. base::Value::Dict shill_properties_to_update; policy_util::SetShillPropertiesForGlobalPolicy( - entry_properties, global_network_config_, &shill_properties_to_update); + entry_properties, global_network_config_, shill_properties_to_update); if (shill_properties_to_update.empty()) { VLOG(2) << "Ignore unmanaged entry."; // Calling a SetProperties of Shill with an empty dictionary is a no op. @@ -443,7 +443,7 @@ base::Value::Dict shill_dictionary = policy_util::CreateShillConfiguration( profile_, guid, &global_network_config_, network_policy, - nullptr /* no user settings */); + /*user_settings=*/nullptr); handler_->CreateConfigurationFromPolicy( shill_dictionary,
diff --git a/chromeos/ash/components/network/policy_util.cc b/chromeos/ash/components/network/policy_util.cc index ecae77c..69f8dab 100644 --- a/chromeos/ash/components/network/policy_util.cc +++ b/chromeos/ash/components/network/policy_util.cc
@@ -153,13 +153,13 @@ base::Value::Dict CreateManagedONC(const base::Value::Dict* global_policy, const base::Value::Dict* network_policy, - const base::Value* user_settings, + const base::Value::Dict* user_settings, const base::Value::Dict* active_settings, const NetworkProfile* profile) { const base::Value::Dict* user_policy = nullptr; const base::Value::Dict* device_policy = nullptr; - const base::Value* nonshared_user_settings = nullptr; - const base::Value* shared_user_settings = nullptr; + const base::Value::Dict* nonshared_user_settings = nullptr; + const base::Value::Dict* shared_user_settings = nullptr; if (profile) { switch (profile->type()) { @@ -206,16 +206,18 @@ // encountered. void FixupEthernetUIDataGUID(const base::Value::Dict& new_policy, const std::string& guid, - base::Value* user_settings) { + base::Value::Dict* user_settings) { DCHECK(user_settings); const std::string* type = new_policy.FindString(::onc::network_config::kType); - if (!type || *type != ::onc::network_type::kEthernet) + if (!type || *type != ::onc::network_type::kEthernet) { return; + } std::string* ui_data_guid = - user_settings->GetDict().FindString(::onc::network_config::kGUID); - if (!ui_data_guid) + user_settings->FindString(::onc::network_config::kGUID); + if (!ui_data_guid) { return; + } if (*ui_data_guid != guid) { LOG(ERROR) << "Fixing Ethernet UIData GUID"; *ui_data_guid = guid; @@ -225,7 +227,7 @@ void SetShillPropertiesForGlobalPolicy( const base::Value::Dict& shill_dictionary, const base::Value::Dict& global_network_policy, - base::Value::Dict* shill_properties_to_update) { + base::Value::Dict& shill_properties_to_update) { // kAllowOnlyPolicyNetworksToAutoconnect is currently the only global config. std::string type = GetString(shill_dictionary, shill::kTypeProperty); @@ -250,7 +252,7 @@ // If autoconnect is not explicitly set yet, it might automatically be enabled // by Shill. To prevent that, disable it explicitly. - shill_properties_to_update->Set(shill::kAutoConnectProperty, false); + shill_properties_to_update.Set(shill::kAutoConnectProperty, false); } base::Value::Dict CreateShillConfiguration( @@ -258,7 +260,7 @@ const std::string& guid, const base::Value::Dict* global_policy, const base::Value::Dict* network_policy, - const base::Value* user_settings) { + const base::Value::Dict* user_settings) { base::Value::Dict effective; ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE; if (network_policy) { @@ -283,7 +285,7 @@ } DCHECK(onc_source != ::onc::ONC_SOURCE_NONE); } else if (user_settings) { - effective = user_settings->GetDict().Clone(); + effective = user_settings->Clone(); // TODO(pneubeck): change to source ONC_SOURCE_USER onc_source = ::onc::ONC_SOURCE_NONE; } else { @@ -321,7 +323,7 @@ if (!network_policy && global_policy) { // The network isn't managed. Global network policies have to be applied. SetShillPropertiesForGlobalPolicy(shill_dictionary, *global_policy, - &shill_dictionary); + shill_dictionary); } std::unique_ptr<NetworkUIData> ui_data( @@ -345,7 +347,7 @@ .value_or(true); const std::string credential_mask = saving_credentials ? kFakeCredential : std::string(); - base::Value sanitized_user_settings = + base::Value::Dict sanitized_user_settings = chromeos::onc::MaskCredentialsInOncObject( chromeos::onc::kNetworkConfigurationSignature, *user_settings, credential_mask);
diff --git a/chromeos/ash/components/network/policy_util.h b/chromeos/ash/components/network/policy_util.h index 7de0d5e..db4f8b2 100644 --- a/chromeos/ash/components/network/policy_util.h +++ b/chromeos/ash/components/network/policy_util.h
@@ -29,7 +29,7 @@ // https://crbug.com/408990 . base::Value::Dict CreateManagedONC(const base::Value::Dict* global_policy, const base::Value::Dict* network_policy, - const base::Value* user_settings, + const base::Value::Dict* user_settings, const base::Value::Dict* active_settings, const NetworkProfile* profile); @@ -39,7 +39,7 @@ void SetShillPropertiesForGlobalPolicy( const base::Value::Dict& shill_dictionary, const base::Value::Dict& global_network_policy, - base::Value::Dict* shill_properties_to_update); + base::Value::Dict& shill_properties_to_update); // Creates a Shill property dictionary from the given arguments. The resulting // dictionary will be sent to Shill by the caller. Depending on the profile @@ -51,7 +51,7 @@ const std::string& guid, const base::Value::Dict* global_policy, const base::Value::Dict* network_policy, - const base::Value* user_settings); + const base::Value::Dict* user_settings); // Returns true if |policy| matches |actual_network|, which must be part of a // ONC NetworkConfiguration. This should be the only such matching function
diff --git a/chromeos/ash/components/network/shill_property_util.cc b/chromeos/ash/components/network/shill_property_util.cc index 59c8087..fd906bcf 100644 --- a/chromeos/ash/components/network/shill_property_util.cc +++ b/chromeos/ash/components/network/shill_property_util.cc
@@ -194,16 +194,18 @@ std::unique_ptr<NetworkUIData> GetUIDataFromValue( const base::Value& ui_data_value) { const std::string* ui_data_str = ui_data_value.GetIfString(); - if (!ui_data_str) + if (!ui_data_str) { return nullptr; - if ((*ui_data_str).empty()) + } + if (ui_data_str->empty()) { return std::make_unique<NetworkUIData>(); + } absl::optional<base::Value::Dict> ui_data_dict = chromeos::onc::ReadDictionaryFromJson(*ui_data_str); if (!ui_data_dict.has_value()) { return nullptr; } - return std::make_unique<NetworkUIData>(base::Value(std::move(*ui_data_dict))); + return std::make_unique<NetworkUIData>(ui_data_dict.value()); } std::unique_ptr<NetworkUIData> GetUIDataFromProperties( @@ -215,8 +217,9 @@ return nullptr; } std::unique_ptr<NetworkUIData> ui_data = GetUIDataFromValue(*ui_data_value); - if (!ui_data) + if (!ui_data) { LOG(ERROR) << "UIData is not a valid JSON dictionary."; + } return ui_data; }
diff --git a/chromeos/ash/services/ime/ime_service.cc b/chromeos/ash/services/ime/ime_service.cc index 7b18a6d541..b8feb77 100644 --- a/chromeos/ash/services/ime/ime_service.cc +++ b/chromeos/ash/services/ime/ime_service.cc
@@ -184,6 +184,9 @@ return base::FeatureList::IsEnabled( features::kSystemJapanesePhysicalTyping); } + if (strcmp(feature_name, features::kImeUsEnglishModelUpdate.name) == 0) { + return base::FeatureList::IsEnabled(features::kImeUsEnglishModelUpdate); + } return false; }
diff --git a/chromeos/ash/services/network_config/cros_network_config.cc b/chromeos/ash/services/network_config/cros_network_config.cc index ee582d06..0ae0740 100644 --- a/chromeos/ash/services/network_config/cros_network_config.cc +++ b/chromeos/ash/services/network_config/cros_network_config.cc
@@ -2724,7 +2724,7 @@ std::string user_id_hash = LoginState::Get()->primary_user_hash(); network_configuration_handler_->CreateConfiguration( - user_id_hash, base::Value(std::move(onc)), + user_id_hash, onc, base::BindOnce(&CrosNetworkConfig::SetPropertiesConfigureSuccess, weak_factory_.GetWeakPtr(), callback_id), base::BindOnce(&CrosNetworkConfig::SetPropertiesFailure, @@ -2733,7 +2733,7 @@ } network_configuration_handler_->SetProperties( - network.path(), base::Value(std::move(onc)), + network.path(), onc, base::BindOnce(&CrosNetworkConfig::SetPropertiesSuccess, weak_factory_.GetWeakPtr(), callback_id), base::BindOnce(&CrosNetworkConfig::SetPropertiesFailure, @@ -2800,7 +2800,7 @@ configure_network_callbacks_[callback_id] = std::move(callback); network_configuration_handler_->CreateConfiguration( - user_id_hash, base::Value(std::move(*onc)), + user_id_hash, onc.value(), base::BindOnce(&CrosNetworkConfig::ConfigureNetworkSuccess, weak_factory_.GetWeakPtr(), callback_id), base::BindOnce(&CrosNetworkConfig::ConfigureNetworkFailure,
diff --git a/chromeos/components/onc/onc_utils.cc b/chromeos/components/onc/onc_utils.cc index a858fc6..ee9d72a7 100644 --- a/chromeos/components/onc/onc_utils.cc +++ b/chromeos/components/onc/onc_utils.cc
@@ -84,13 +84,12 @@ // passphrases) in ONC. class OncMaskValues : public Mapper { public: - static base::Value Mask(const OncValueSignature& signature, - const base::Value& onc_object, - const std::string& mask) { + static base::Value::Dict Mask(const OncValueSignature& signature, + const base::Value::Dict& onc_object, + const std::string& mask) { OncMaskValues masker(mask); bool error = false; - base::Value result( - masker.MapObject(signature, onc_object.GetDict(), &error)); + base::Value::Dict result = masker.MapObject(signature, onc_object, &error); return result; } @@ -582,9 +581,10 @@ wifi_fields.Set(::onc::wifi::kHiddenSSID, false); } -base::Value MaskCredentialsInOncObject(const OncValueSignature& signature, - const base::Value& onc_object, - const std::string& mask) { +base::Value::Dict MaskCredentialsInOncObject( + const OncValueSignature& signature, + const base::Value::Dict& onc_object, + const std::string& mask) { return OncMaskValues::Mask(signature, onc_object, mask); } @@ -664,8 +664,10 @@ validator.SetOncSource(onc_source); Validator::Result validation_result; - base::Value validated_toplevel_onc = validator.ValidateAndRepairObject( - &kToplevelConfigurationSignature, toplevel_onc, &validation_result); + absl::optional<base::Value::Dict> validated_toplevel_onc = + validator.ValidateAndRepairObject(&kToplevelConfigurationSignature, + toplevel_onc.GetDict(), + &validation_result); if (from_policy) { UMA_HISTOGRAM_BOOLEAN("Enterprise.ONC.PolicyValidation", @@ -678,17 +680,15 @@ << GetSourceAsString(onc_source); success = false; } else if (validation_result == Validator::INVALID || - validated_toplevel_onc.is_none()) { + !validated_toplevel_onc.has_value()) { NET_LOG(ERROR) << "ONC is invalid and couldn't be repaired: " << GetSourceAsString(onc_source); return false; } - base::Value::Dict& validated_toplevel_onc_dict = - validated_toplevel_onc.GetDict(); if (certificates) { - base::Value::List* validated_certs = validated_toplevel_onc_dict.FindList( - ::onc::toplevel_config::kCertificates); + base::Value::List* validated_certs = + validated_toplevel_onc->FindList(::onc::toplevel_config::kCertificates); if (validated_certs) *certificates = std::move(*validated_certs); } @@ -697,9 +697,8 @@ // nullptr, because ResolveServerCertRefsInNetworks could affect the return // value of the function (which is supposed to aggregate validation issues in // all segments of the ONC blob). - base::Value::List* validated_networks_list = - validated_toplevel_onc_dict.FindList( - ::onc::toplevel_config::kNetworkConfigurations); + base::Value::List* validated_networks_list = validated_toplevel_onc->FindList( + ::onc::toplevel_config::kNetworkConfigurations); if (validated_networks_list) { FillInHexSSIDFieldsInNetworks(*validated_networks_list); // Set HiddenSSID to default value to solve the issue crbug.com/1171837 @@ -722,7 +721,7 @@ if (global_network_config) { base::Value::Dict* validated_global_config = - validated_toplevel_onc_dict.FindDict( + validated_toplevel_onc->FindDict( ::onc::toplevel_config::kGlobalNetworkConfiguration); if (validated_global_config) { *global_network_config = std::move(*validated_global_config);
diff --git a/chromeos/components/onc/onc_utils.h b/chromeos/components/onc/onc_utils.h index 32a24f7..eb88343 100644 --- a/chromeos/components/onc/onc_utils.h +++ b/chromeos/components/onc/onc_utils.h
@@ -82,9 +82,10 @@ // by |mask|. To find sensitive fields, signature and field name are checked // with the function FieldIsCredential(). COMPONENT_EXPORT(CHROMEOS_ONC) -base::Value MaskCredentialsInOncObject(const OncValueSignature& signature, - const base::Value& onc_object, - const std::string& mask); +base::Value::Dict MaskCredentialsInOncObject( + const OncValueSignature& signature, + const base::Value::Dict& onc_object, + const std::string& mask); // Decrypts |onc_blob| with |passphrase| if necessary. Clears |network_configs|, // |global_network_config| and |certificates| and fills them with the validated
diff --git a/chromeos/components/onc/onc_utils_unittest.cc b/chromeos/components/onc/onc_utils_unittest.cc index e398404..0e0c068 100644 --- a/chromeos/components/onc/onc_utils_unittest.cc +++ b/chromeos/components/onc/onc_utils_unittest.cc
@@ -231,10 +231,10 @@ ASSERT_TRUE(expected_after_masking_value) << "Could not parse " << GetParam().expected_after_masking; - base::Value masked = MaskCredentialsInOncObject(*(GetParam().onc_signature), - *onc_value, "******"); + base::Value::Dict masked = MaskCredentialsInOncObject( + *(GetParam().onc_signature), onc_value->GetDict(), "******"); - EXPECT_EQ(masked, *expected_after_masking_value); + EXPECT_EQ(masked, expected_after_masking_value->GetDict()); } constexpr MaskCredentialsTestCase kMaskCredentialsTestCases[] = {
diff --git a/chromeos/components/onc/onc_validator.cc b/chromeos/components/onc/onc_validator.cc index 43ac36c..6959906 100644 --- a/chromeos/components/onc/onc_validator.cc +++ b/chromeos/components/onc/onc_validator.cc
@@ -25,8 +25,7 @@ #include "components/onc/onc_constants.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { -namespace onc { +namespace chromeos::onc { namespace { @@ -77,20 +76,22 @@ Validator::~Validator() = default; -base::Value Validator::ValidateAndRepairObject( +absl::optional<base::Value::Dict> Validator::ValidateAndRepairObject( const OncValueSignature* object_signature, - const base::Value& onc_object, + const base::Value::Dict& onc_object, Result* result) { CHECK(object_signature); *result = VALID; bool error = false; - base::Value result_value = MapValue(*object_signature, onc_object, &error); + base::Value::Dict result_value = + MapObject(*object_signature, onc_object, &error); if (error) { *result = INVALID; - return {}; + return absl::nullopt; } - if (!validation_issues_.empty()) + if (!validation_issues_.empty()) { *result = VALID_WITH_WARNINGS; + } return result_value; } @@ -244,8 +245,8 @@ const base::Value::Dict& onc_object, base::Value::Dict* result) { bool found_unknown_field = false; - bool nested_error_occured = false; - MapFields(signature, onc_object, &found_unknown_field, &nested_error_occured, + bool nested_error_occurred = false; + MapFields(signature, onc_object, &found_unknown_field, &nested_error_occurred, result); if (found_unknown_field && error_on_unknown_field_) { @@ -253,8 +254,9 @@ return false; } - if (nested_error_occured) + if (nested_error_occurred) { return false; + } return ValidateRecommendedField(signature, result); } @@ -1302,9 +1304,9 @@ // last one because that's the one which would be effective, as it would be // applies last in shill. OnlyKeepLast(network_configurations_list, ethernet_auth_none_guids, - /*type_for_messages=*/"Ethernet"); + /*type=*/"Ethernet"); OnlyKeepLast(network_configurations_list, ethernet_auth_8021x_guids, - /*type_for_messages=*/"Ethernet 802.1x"); + /*type=*/"Ethernet 802.1x"); } void Validator::OnlyKeepLast(base::Value::List* network_configurations_list, @@ -1353,5 +1355,4 @@ validation_issues_.push_back({is_error, message}); } -} // namespace onc -} // namespace chromeos +} // namespace chromeos::onc
diff --git a/chromeos/components/onc/onc_validator.h b/chromeos/components/onc/onc_validator.h index 53200ad..1c7a710 100644 --- a/chromeos/components/onc/onc_validator.h +++ b/chromeos/components/onc/onc_validator.h
@@ -14,9 +14,9 @@ #include "base/values.h" #include "chromeos/components/onc/onc_mapper.h" #include "components/onc/onc_constants.h" +#include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { -namespace onc { +namespace chromeos::onc { struct OncValueSignature; @@ -109,22 +109,23 @@ // Validate the given |onc_object| dictionary according to |object_signature|. // The |object_signature| has to be a pointer to one of the signatures in - // |onc_signature.h|. If an error is found, the function returns a Value of - // type base::Value::type::NONE and sets |result| to INVALID. If possible (no - // error encountered) a Clone is created that contains all but the invalid - // fields and values and returns this "repaired" object. That means, if not - // handled as an error, then the following are dropped from the copy: + // |onc_signature.h|. If an error is found, the function returns nullopt and + // sets |result| to INVALID. If possible (no error encountered) a Clone is + // created that contains all but the invalid fields and values and returns + // this "repaired" object. That means, if not handled as an error, then the + // following are dropped from the copy: // - unknown fields // - invalid field names in kRecommended arrays // - kRecommended fields in an unmanaged ONC // If any of these cases occurred, sets |result| to VALID_WITH_WARNINGS and // otherwise to VALID. // For details, see the class comment. - base::Value ValidateAndRepairObject(const OncValueSignature* object_signature, - const base::Value& onc_object, - Result* result); + absl::optional<base::Value::Dict> ValidateAndRepairObject( + const OncValueSignature* object_signature, + const base::Value::Dict& onc_object, + Result* result); - // Returns the list of validation results that occured within validation + // Returns the list of validation results that occurred within validation // initiated by the last call to |ValidateAndRepairObject|. const std::vector<ValidationIssue>& validation_issues() const { return validation_issues_; @@ -290,12 +291,11 @@ // duplicate GUIDs. std::set<std::string> certificate_guids_; - // List of all validation issues that occured within validation initiated by + // List of all validation issues that occurred within validation initiated by // function ValidateAndRepairObject. std::vector<ValidationIssue> validation_issues_; }; -} // namespace onc -} // namespace chromeos +} // namespace chromeos::onc #endif // CHROMEOS_COMPONENTS_ONC_ONC_VALIDATOR_H_
diff --git a/chromeos/components/onc/onc_validator_fuzzer.cc b/chromeos/components/onc/onc_validator_fuzzer.cc index 6a5fe96..fbbd862 100644 --- a/chromeos/components/onc/onc_validator_fuzzer.cc +++ b/chromeos/components/onc/onc_validator_fuzzer.cc
@@ -46,7 +46,8 @@ error_on_missing_field, managed_onc, /*log_warnings=*/false); Validator::Result validation_result; validator.ValidateAndRepairObject(&kNetworkConfigurationSignature, - *parsed_json, &validation_result); + parsed_json->GetDict(), + &validation_result); } } }
diff --git a/chromeos/components/onc/onc_validator_unittest.cc b/chromeos/components/onc/onc_validator_unittest.cc index f896b577..9c516f8 100644 --- a/chromeos/components/onc/onc_validator_unittest.cc +++ b/chromeos/components/onc/onc_validator_unittest.cc
@@ -18,8 +18,7 @@ #include "components/onc/onc_constants.h" #include "testing/gtest/include/gtest/gtest.h" -namespace chromeos { -namespace onc { +namespace chromeos::onc { namespace { // A valid but empty (no networks and no certificates) and unencrypted @@ -37,7 +36,7 @@ // validation is stored, so that expectations can be checked afterwards using // one of the Expect* functions below. void Validate(bool strict, - base::Value onc_object, + base::Value::Dict onc_object, const OncValueSignature* signature, bool managed_onc, ::onc::ONCSource onc_source) { @@ -67,23 +66,25 @@ void ExpectValid() { EXPECT_EQ(Validator::VALID, validation_result_); - EXPECT_TRUE(test_utils::Equals(&original_object_, &repaired_object_)); + EXPECT_TRUE( + test_utils::Equals(&original_object_, &repaired_object_.value())); } - void ExpectRepairWithWarnings(const base::Value& expected_repaired) { + void ExpectRepairWithWarnings(const base::Value::Dict& expected_repaired) { EXPECT_EQ(Validator::VALID_WITH_WARNINGS, validation_result_); - EXPECT_TRUE(test_utils::Equals(&expected_repaired, &repaired_object_)); + EXPECT_TRUE( + test_utils::Equals(&expected_repaired, &repaired_object_.value())); } void ExpectInvalid() { EXPECT_EQ(Validator::INVALID, validation_result_); - EXPECT_TRUE(repaired_object_.is_none()); + EXPECT_FALSE(repaired_object_.has_value()); } private: Validator::Result validation_result_; - base::Value original_object_; - base::Value repaired_object_; + base::Value::Dict original_object_; + absl::optional<base::Value::Dict> repaired_object_; }; namespace { @@ -120,8 +121,8 @@ absl::optional<base::Value::Dict> dict = ReadDictionaryFromJson(kEmptyUnencryptedConfiguration); EXPECT_TRUE(dict.has_value()); - Validate(true, base::Value(std::move(*dict)), - &kToplevelConfigurationSignature, false, ::onc::ONC_SOURCE_NONE); + Validate(true, std::move(dict.value()), &kToplevelConfigurationSignature, + false, ::onc::ONC_SOURCE_NONE); ExpectValid(); } @@ -133,15 +134,15 @@ TEST_P(ONCValidatorValidTest, StrictValidationValid) { OncParams onc = GetParam(); - Validate(true, test_utils::ReadTestDictionaryValue(onc.location), - onc.signature, onc.is_managed, onc.onc_source); + Validate(true, test_utils::ReadTestDictionary(onc.location), onc.signature, + onc.is_managed, onc.onc_source); ExpectValid(); } TEST_P(ONCValidatorValidTest, LiberalValidationValid) { OncParams onc = GetParam(); - Validate(false, test_utils::ReadTestDictionaryValue(onc.location), - onc.signature, onc.is_managed, onc.onc_source); + Validate(false, test_utils::ReadTestDictionary(onc.location), onc.signature, + onc.is_managed, onc.onc_source); ExpectValid(); } @@ -316,12 +317,12 @@ public: // Load the common test data and return the dictionary at the field with // name |name|. - base::Value GetDictionaryFromTestFile(const std::string& name) { + base::Value::Dict GetDictionaryFromTestFile(const std::string& name) { base::Value dict = test_utils::ReadTestDictionaryValue( "invalid_settings_with_repairs.json"); - base::Value* result = dict.GetDict().Find(name); + base::Value::Dict* result = dict.GetDict().FindDict(name); EXPECT_TRUE(result); - return result ? std::move(*result) : base::Value(); + return result ? std::move(*result) : base::Value::Dict(); } }; @@ -638,5 +639,4 @@ true), ExpectBothNotValid("", "invalid-scope-due-to-missing-type")))); -} // namespace onc -} // namespace chromeos +} // namespace chromeos::onc
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 7e01aee9..28b1abd 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Verskaffertipe</translation> <translation id="7882501334836096755">Publieke sleutel</translation> +<translation id="78957024357676568">links</translation> <translation id="7915220255123750251">Bestuur netwerk-APN-instellings. APN’e vestig ’n verbinding tussen ’n selnetwerk en die internet.</translation> <translation id="7936303884198020182">Geen naambedieners gekry nie</translation> <translation id="7942349550061667556">Rooi</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Kies jou gunstelingfoto's en -albums</translation> <translation id="8227119283605456246">Heg lêer aan</translation> <translation id="8230672074305416752">Kon nie die versteknetwerkdeurgang pieng nie</translation> +<translation id="8242426110754782860">Gaan voort</translation> <translation id="8246209727385807362">Onbekende diensverskaffer</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Koppel asseblief aan 'n netwerk en herlaai die bladsy om muurpapier te bekyk.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Draadloos</translation> <translation id="8936793075252196307">Kliënt-IP-adres</translation> <translation id="894617464444543719">Toestel is 'n foon.</translation> +<translation id="8957423540740801332">regs</translation> <translation id="8968751544471797276">Laaikoers</translation> <translation id="8970109610781093811">Laat loop weer</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index b8e74c4..ec6a6b9 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">ዲኤንኤስ</translation> <translation id="7882358943899516840">የአቅራቢ አይነት</translation> <translation id="7882501334836096755">ይፋዊ ቁልፍ</translation> +<translation id="78957024357676568">ግራ</translation> <translation id="7915220255123750251">የአውታረ መረብ ኤፒኤን ቅንብሮችን ያስተዳድሩ። ኤፒኤኖች በተንቀሳቃሽ ስልክ አውታረ መረብ እና በይነመረብ መካከል ግንኙነት ይመሰርታሉ።</translation> <translation id="7936303884198020182">ምንም የስም አገልጋዮች አልተገኙም</translation> <translation id="7942349550061667556">ቀይ</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">የእርስዎን ተወዳጅ ፎቶዎች እና አልበሞች ይምረጡ</translation> <translation id="8227119283605456246">ፋይል አያይዝ</translation> <translation id="8230672074305416752">ነባሪ የሆነውን የአውታረ መረብ አግባቢ ፍኖት ፒንግ ማድረግ አልተሳካም</translation> +<translation id="8242426110754782860">ቀጥል</translation> <translation id="8246209727385807362">የማይታወቅ አገልግሎት አቅራቢ</translation> <translation id="827422111966801947">ወይን ጠጅ</translation> <translation id="8286154143153872371">ልጣፍን ለማየት እባክዎን ከአውታረ መረብ ጋር ይገናኙ እና ገጹን እንደገና ይጫኑ።</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ገመድአልባ</translation> <translation id="8936793075252196307">የደንበኛ አይፒ አድራሻ</translation> <translation id="894617464444543719">መሣሪያ ስልክ ነው።</translation> +<translation id="8957423540740801332">ቀኝ</translation> <translation id="8968751544471797276">ኃይል መሙላት መጠን</translation> <translation id="8970109610781093811">እንደገና ያሂዱ</translation> <translation id="8983038754672563810">ኤችኤስፒኤ</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index a9267cea..ad51e9d 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">نظام أسماء النطاقات</translation> <translation id="7882358943899516840">نوع مقدم الخدمة</translation> <translation id="7882501334836096755">مفتاح عام</translation> +<translation id="78957024357676568">لليسار</translation> <translation id="7915220255123750251">يمكنك إدارة إعدادات اسم نقطة الوصول (APN) للشبكة. تنشئ أسماء APN اتصالاً بين شبكة الجوّال والإنترنت.</translation> <translation id="7936303884198020182">لم يتم العثور على خوادم الأسماء.</translation> <translation id="7942349550061667556">أحمر</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">اختيار صورك وألبوماتك المفضَّلة</translation> <translation id="8227119283605456246">إرفاق ملف</translation> <translation id="8230672074305416752">تعذَّر فحص اتصال بوابة الشبكة التلقائية.</translation> +<translation id="8242426110754782860">متابعة</translation> <translation id="8246209727385807362">مشغل شبكة جوّال غير معروف</translation> <translation id="827422111966801947">نيلي</translation> <translation id="8286154143153872371">يُرجى الاتصال بإحدى الشبكات وإعادة تحميل الصفحة لعرض الخلفية.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">شبكة لاسلكية</translation> <translation id="8936793075252196307">عنوان IP للعميل</translation> <translation id="894617464444543719">الجهاز هو هاتف.</translation> +<translation id="8957423540740801332">لليمين</translation> <translation id="8968751544471797276">معدّل الشحن</translation> <translation id="8970109610781093811">إعادة التشغيل مرة أخرى</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 39fa701f..66c6eada 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -780,6 +780,7 @@ <translation id="8226628635270268143">আপোনাৰ প্ৰিয় ফট’ আৰু এলবামসমূহ বাছনি কৰক</translation> <translation id="8227119283605456246">ফাইল সংলগ্ন কৰক</translation> <translation id="8230672074305416752">ডিফ'ল্ট নেটৱৰ্কৰ গে’টৱে’টো পিং কৰাত বিফল হ'ল</translation> +<translation id="8242426110754782860">আগবাঢ়ক</translation> <translation id="8246209727385807362">অজ্ঞাত বাহক</translation> <translation id="827422111966801947">ইণ্ডিগ'</translation> <translation id="8286154143153872371">অনুগ্ৰহ কৰি এটা নেটৱৰ্কৰ সৈতে সংযোগ কৰক আৰু ৱালপেপাৰ চাবলৈ পৃষ্ঠাখন পুনৰ ল’ড কৰক।</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index fd04dc0..232d9f80 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Provayder növü</translation> <translation id="7882501334836096755">İctimai açar</translation> +<translation id="78957024357676568">sol</translation> <translation id="7915220255123750251">Şəbəkə APN ayarlarını idarə edin. APN-lər mobil şəbəkə ilə internet arasında əlaqə yaradır.</translation> <translation id="7936303884198020182">Ad serveri tapılmadı</translation> <translation id="7942349550061667556">Qırmızı</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Sevimli fotolarınızı və albomlarınızı seçin</translation> <translation id="8227119283605456246">Fayl qoşun</translation> <translation id="8230672074305416752">Defolt şəbəkə girişini yoxlamaq alınmadı</translation> +<translation id="8242426110754782860">Davam edin</translation> <translation id="8246209727385807362">Naməlum operator</translation> <translation id="827422111966801947">İndiqo</translation> <translation id="8286154143153872371">Divar kağızı görmək üçün şəbəkəyə qoşulun və səhifəni yenidən yükləyin.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Simsiz</translation> <translation id="8936793075252196307">Müştərinin IP ünvanı</translation> <translation id="894617464444543719">Cihaz telefondur.</translation> +<translation id="8957423540740801332">sağ</translation> <translation id="8968751544471797276">Şarj sürəti</translation> <translation id="8970109610781093811">Yenidən icra edin</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index 9a250a6..bbc2580 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -780,6 +780,7 @@ <translation id="8226628635270268143">Выберыце любімыя фота і альбомы</translation> <translation id="8227119283605456246">Далучыць файл</translation> <translation id="8230672074305416752">Не ўдалося праверыць сувязь са стандартным сеткавым шлюзам</translation> +<translation id="8242426110754782860">Працягнуць</translation> <translation id="8246209727385807362">Невядомы аператар</translation> <translation id="827422111966801947">Індыга</translation> <translation id="8286154143153872371">Каб праглядаць шпалеры, падключыце прыладу да інтэрнэту і перазагрузіце старонку.</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index b409c9d..e8a1e88b 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Тип на доставчика</translation> <translation id="7882501334836096755">Публичен ключ</translation> +<translation id="78957024357676568">наляво</translation> <translation id="7915220255123750251">Управление на настройките за името на точката за достъп (APN) за мрежата. Чрез APN се установява връзка между мобилна мрежа и интернет.</translation> <translation id="7936303884198020182">Не са намерени сървъри за имена</translation> <translation id="7942349550061667556">червено</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Изберете любимите си снимки и албуми</translation> <translation id="8227119283605456246">Прикачване на файл</translation> <translation id="8230672074305416752">Неуспех при команда ping към шлюза на основната мрежа</translation> +<translation id="8242426110754782860">Продължаване</translation> <translation id="8246209727385807362">Неизвестен оператор</translation> <translation id="827422111966801947">индиго</translation> <translation id="8286154143153872371">Моля, свържете се с мрежа и презаредете страницата, за да прегледате тапета.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Безжична</translation> <translation id="8936793075252196307">IP адрес на клиентската програма</translation> <translation id="894617464444543719">Устройството е телефон.</translation> +<translation id="8957423540740801332">надясно</translation> <translation id="8968751544471797276">Скорост на зареждане</translation> <translation id="8970109610781093811">Повторно изпълняване</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index 40c119f..8973367c 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">পরিষেবা প্রদানকারীর ধরন</translation> <translation id="7882501334836096755">সর্বজনীন 'কী'</translation> +<translation id="78957024357676568">বাঁ</translation> <translation id="7915220255123750251">নেটওয়ার্ক APN সেটিংস ম্যানেজ করুন। APN একটি সেলুলার নেটওয়ার্ক এবং ইন্টারনেটের মধ্যে কানেকশন তৈরি করে।</translation> <translation id="7936303884198020182">ডোমেন নেম সার্ভার খুঁজে পাওয়া যায়নি</translation> <translation id="7942349550061667556">লাল</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">আপনার পছন্দের ফটো ও অ্যালবাম বাছুন</translation> <translation id="8227119283605456246">ফাইল সংযুক্ত করুন</translation> <translation id="8230672074305416752">ডিফল্ট নেটওয়ার্ক গেটওয়েতে পিং করা যায়নি</translation> +<translation id="8242426110754782860">এগিয়ে যান</translation> <translation id="8246209727385807362">অজানা পরিষেবা প্রদানকারী</translation> <translation id="827422111966801947">নীল</translation> <translation id="8286154143153872371">ওয়ালপেপার দেখার জন্য কোনও নেটওয়ার্কে কানেক্ট করে পৃষ্ঠা আবার লোড করুন।</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ওয়্যারলেস</translation> <translation id="8936793075252196307">ক্লায়েন্ট IP অ্যাড্রেস</translation> <translation id="894617464444543719">ডিভাইস একটি ফোন।</translation> +<translation id="8957423540740801332">ডান</translation> <translation id="8968751544471797276">চর্জিং রেট</translation> <translation id="8970109610781093811">আবার চালান</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 231b7f8..7edcd34 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Vrsta pružaoca usluge</translation> <translation id="7882501334836096755">Javni ključ</translation> +<translation id="78957024357676568">lijevo</translation> <translation id="7915220255123750251">Upravljajte mrežnim postavkama za APN. APN-ovi uspostavljaju vezu između mobilne mreže i interneta.</translation> <translation id="7936303884198020182">Nije pronađen nijedan server naziva</translation> <translation id="7942349550061667556">Crvena</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Odaberite omiljene fotografije i albume</translation> <translation id="8227119283605456246">Priloži fajl</translation> <translation id="8230672074305416752">Provjera pingom zadanog mrežnog pristupnika nije uspjela</translation> +<translation id="8242426110754782860">Nastavi</translation> <translation id="8246209727385807362">Nepoznat mobilni operater</translation> <translation id="827422111966801947">Indigo plava</translation> <translation id="8286154143153872371">Povežite se s mrežom i ponovo učitajte stranicu da vidite pozadinsku sliku.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bežično</translation> <translation id="8936793075252196307">IP adresa klijenta</translation> <translation id="894617464444543719">Uređaj je telefon.</translation> +<translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Brzina punjenja</translation> <translation id="8970109610781093811">Ponovo pokreni</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index f3fc7dc..2b1f2bdf 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipus de proveïdor</translation> <translation id="7882501334836096755">Clau pública</translation> +<translation id="78957024357676568">esquerra</translation> <translation id="7915220255123750251">Gestiona la configuració de l'APN de la xarxa. Els APN defineixen una connexió entre una xarxa mòbil i Internet.</translation> <translation id="7936303884198020182">No s'han trobat servidors de noms</translation> <translation id="7942349550061667556">Vermell</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Tria les teves fotos i els teus àlbums preferits</translation> <translation id="8227119283605456246">Adjunta un fitxer</translation> <translation id="8230672074305416752">No s'ha pogut fer ping a la passarel·la de xarxa predeterminada</translation> +<translation id="8242426110754782860">Continua</translation> <translation id="8246209727385807362">Operador de telefonia mòbil desconegut</translation> <translation id="827422111966801947">Anyil</translation> <translation id="8286154143153872371">Connecta't a una xarxa i torna a carregar la pàgina per veure el fons de pantalla.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sense fil</translation> <translation id="8936793075252196307">Adreça IP del client</translation> <translation id="894617464444543719">El dispositiu és un telèfon.</translation> +<translation id="8957423540740801332">dreta</translation> <translation id="8968751544471797276">Percentatge de càrrega</translation> <translation id="8970109610781093811">Torna a executar</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 7a2617b..ebbe8af 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Typ poskytovatele</translation> <translation id="7882501334836096755">Veřejný klíč</translation> +<translation id="78957024357676568">vlevo</translation> <translation id="7915220255123750251">Spravovat nastavení názvů přístupových bodů sítě. Názvy přístupových bodů umožňují navázat spojení mezi mobilní sítí a internetem.</translation> <translation id="7936303884198020182">Nebyly nalezeny žádné názvové servery</translation> <translation id="7942349550061667556">Červená</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Vyberte své oblíbené fotky a alba</translation> <translation id="8227119283605456246">Přiložit soubor</translation> <translation id="8230672074305416752">Nepodařilo se pingnout bránu výchozí sítě</translation> +<translation id="8242426110754782860">Pokračovat</translation> <translation id="8246209727385807362">Neznámý operátor</translation> <translation id="827422111966801947">Indigová</translation> <translation id="8286154143153872371">Pokud chcete zobrazit tapetu, připojte se k síti a znovu načtěte stránku.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bezdrátové připojení</translation> <translation id="8936793075252196307">IP adresa klienta</translation> <translation id="894617464444543719">Zařízení je telefon.</translation> +<translation id="8957423540740801332">vpravo</translation> <translation id="8968751544471797276">Rychlost nabíjení</translation> <translation id="8970109610781093811">Spustit znovu</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index 9e2113b..51abd13 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -780,6 +780,7 @@ <translation id="8226628635270268143">Dewiswch eich hoff luniau ac albymau</translation> <translation id="8227119283605456246">Atodi ffeil</translation> <translation id="8230672074305416752">Wedi methu â phingio porth y rhwydwaith diofyn</translation> +<translation id="8242426110754782860">Parhau</translation> <translation id="8246209727385807362">Cludwr anhysbys</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Cysylltwch â rhwydwaith ac ail-lwythwch y dudalen i weld y papur wal.</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 4fec9c22..c7fd318 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Udbydertype</translation> <translation id="7882501334836096755">Offentlig nøgle</translation> +<translation id="78957024357676568">venstre</translation> <translation id="7915220255123750251">Administrer indstillinger for netværksadgangspunkter. Adgangspunkter opretter forbindelse mellem et mobilnetværk og internettet.</translation> <translation id="7936303884198020182">Der blev ikke fundet nogen navneservere</translation> <translation id="7942349550061667556">Rød</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Vælg dine foretrukne billeder og album</translation> <translation id="8227119283605456246">Vedhæft fil</translation> <translation id="8230672074305416752">Kunne ikke pinge standardnetværkets gateway</translation> +<translation id="8242426110754782860">Fortsæt</translation> <translation id="8246209727385807362">Ukendt mobilselskab</translation> <translation id="827422111966801947">Indigoblå</translation> <translation id="8286154143153872371">Opret forbindelse til et netværk, og genindlæs siden for at se baggrunden.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Trådløs</translation> <translation id="8936793075252196307">Klient-IP-adresse</translation> <translation id="894617464444543719">Enheden er en telefon.</translation> +<translation id="8957423540740801332">højre</translation> <translation id="8968751544471797276">Opladningshastighed</translation> <translation id="8970109610781093811">Kør igen</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 269a6ff..0f989be 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Providertyp</translation> <translation id="7882501334836096755">Öffentlicher Schlüssel</translation> +<translation id="78957024357676568">Links</translation> <translation id="7915220255123750251">Hier kannst du die APN-Netzwerkeinstellungen verwalten. APNs stellen eine Verbindung zwischen einem Mobilfunknetz und dem Internet her.</translation> <translation id="7936303884198020182">Es wurden keine Nameserver gefunden</translation> <translation id="7942349550061667556">Rot</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Hier kannst du deine bevorzugten Fotos und Alben auswählen</translation> <translation id="8227119283605456246">Datei anhängen</translation> <translation id="8230672074305416752">Das standardmäßige Netzwerk-Gateway konnte nicht kontaktiert werden</translation> +<translation id="8242426110754782860">Fortfahren</translation> <translation id="8246209727385807362">Unbekannter Mobilfunkanbieter</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Stelle bitte eine Verbindung zu einem Netzwerk her und lade die Seite neu, um den Hintergrund anzusehen.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Drahtlos</translation> <translation id="8936793075252196307">IP-Adresse des Clients</translation> <translation id="894617464444543719">Das Gerät ist ein Smartphone.</translation> +<translation id="8957423540740801332">Rechts</translation> <translation id="8968751544471797276">Ladestrom</translation> <translation id="8970109610781093811">Erneut ausführen</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 57effbd..b102ff85 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Τύπος παρόχου</translation> <translation id="7882501334836096755">Δημόσιο κλειδί</translation> +<translation id="78957024357676568">αριστερά</translation> <translation id="7915220255123750251">Διαχείριση ρυθμίσεων APN δικτύου. Τα APN δημιουργούν μια σύνδεση μεταξύ ενός δικτύου κινητής τηλεφωνίας και του διαδικτύου.</translation> <translation id="7936303884198020182">Δεν βρέθηκαν διακομιστές ονομάτων.</translation> <translation id="7942349550061667556">Κόκκινο</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Επιλέξτε τις αγαπημένες σας φωτογραφίες και λευκώματα.</translation> <translation id="8227119283605456246">Επισύναψη αρχείου</translation> <translation id="8230672074305416752">Αποτυχία ping της προεπιλεγμένης πύλης δικτύου.</translation> +<translation id="8242426110754782860">Συνέχεια</translation> <translation id="8246209727385807362">Άγνωστη εταιρεία κινητής τηλεφωνίας</translation> <translation id="827422111966801947">Λουλάκι</translation> <translation id="8286154143153872371">Συνδεθείτε σε ένα δίκτυο και επαναφορτώστε τη σελίδα για να δείτε την ταπετσαρία.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Ασύρματο</translation> <translation id="8936793075252196307">Διεύθυνση IP εφαρμογής-πελάτη</translation> <translation id="894617464444543719">Η συσκευή είναι τηλέφωνο.</translation> +<translation id="8957423540740801332">δεξιά</translation> <translation id="8968751544471797276">Ρυθμός φόρτισης</translation> <translation id="8970109610781093811">Επανεκτέλεση</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index ca131600..88863103 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Provider type</translation> <translation id="7882501334836096755">Public key</translation> +<translation id="78957024357676568">left</translation> <translation id="7915220255123750251">Manage network APN settings. APNs establish a connection between a mobile network and the Internet.</translation> <translation id="7936303884198020182">No name servers found</translation> <translation id="7942349550061667556">Red</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Choose your favourite photos and albums</translation> <translation id="8227119283605456246">Attach file</translation> <translation id="8230672074305416752">Failed to ping the default network gateway</translation> +<translation id="8242426110754782860">Proceed</translation> <translation id="8246209727385807362">Unknown operator</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Please connect to a network and reload the page to view wallpaper.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">Client IP address</translation> <translation id="894617464444543719">Device is a phone.</translation> +<translation id="8957423540740801332">right</translation> <translation id="8968751544471797276">Charging rate</translation> <translation id="8970109610781093811">Run again</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 93ba8ad8..16406df 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de proveedor</translation> <translation id="7882501334836096755">Clave pública</translation> +<translation id="78957024357676568">izquierda</translation> <translation id="7915220255123750251">Administra la configuración del APN de red. Los APNs establecen una conexión entre Internet y una red móvil.</translation> <translation id="7936303884198020182">no se encontraron servidores de nombres</translation> <translation id="7942349550061667556">Rojo</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Elige tus fotos y álbumes favoritos</translation> <translation id="8227119283605456246">Adjuntar un archivo</translation> <translation id="8230672074305416752">no se pudo hacer ping en la puerta de enlace de la red predeterminada</translation> +<translation id="8242426110754782860">Continuar</translation> <translation id="8246209727385807362">El proveedor es desconocido</translation> <translation id="827422111966801947">Índigo</translation> <translation id="8286154143153872371">Conéctate a una red y vuelve a cargar la página para ver el fondo de pantalla.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Inalámbrico</translation> <translation id="8936793075252196307">Dirección IP de cliente</translation> <translation id="894617464444543719">El dispositivo es un teléfono.</translation> +<translation id="8957423540740801332">derecha</translation> <translation id="8968751544471797276">Velocidad de carga</translation> <translation id="8970109610781093811">Volver a ejecutar</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 229038ce..58953bd2 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de proveedor</translation> <translation id="7882501334836096755">Clave pública</translation> +<translation id="78957024357676568">izquierda</translation> <translation id="7915220255123750251">Gestiona los ajustes de APN de la red. Los APNs establecen una conexión entre una red móvil e Internet.</translation> <translation id="7936303884198020182">No se han encontrado servidores de nombres</translation> <translation id="7942349550061667556">Rojo</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Elige tus fotos y álbumes favoritos</translation> <translation id="8227119283605456246">Adjuntar archivo</translation> <translation id="8230672074305416752">Se ha producido un error al hacer ping en la puerta de enlace de red predeterminada</translation> +<translation id="8242426110754782860">Continuar</translation> <translation id="8246209727385807362">Operador desconocido</translation> <translation id="827422111966801947">Índigo</translation> <translation id="8286154143153872371">Conéctate a una red y vuelve a cargar la página para ver el fondo de pantalla.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Conexión inalámbrica</translation> <translation id="8936793075252196307">Dirección IP de cliente</translation> <translation id="894617464444543719">El dispositivo es un teléfono.</translation> +<translation id="8957423540740801332">derecha</translation> <translation id="8968751544471797276">Velocidad de carga</translation> <translation id="8970109610781093811">Volver a ejecutar</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 7920434..ed728b2 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Teenusepakkuja tüüp</translation> <translation id="7882501334836096755">Avalik võti</translation> +<translation id="78957024357676568">vasakule</translation> <translation id="7915220255123750251">Hallake võrgu APN-ide seadeid. APN-id loovad ühenduse mobiilsidevõrgu ja interneti vahel.</translation> <translation id="7936303884198020182">Ei leitud ühtegi nimeserverit</translation> <translation id="7942349550061667556">Punane</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Valige oma lemmikfotod ja -albumid</translation> <translation id="8227119283605456246">Manusta fail</translation> <translation id="8230672074305416752">Vaikevõrgulüüsi pingimine ebaõnnestus</translation> +<translation id="8242426110754782860">Jätka</translation> <translation id="8246209727385807362">Tundmatu operaator</translation> <translation id="827422111966801947">Indigosinine</translation> <translation id="8286154143153872371">Taustapildi vaatamiseks looge ühendus võrguga ja laadige leht uuesti.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Raadiovõrk</translation> <translation id="8936793075252196307">Kliendi IP-aadress</translation> <translation id="894617464444543719">Seade on telefon.</translation> +<translation id="8957423540740801332">paremale</translation> <translation id="8968751544471797276">Laadimiskiirus</translation> <translation id="8970109610781093811">Käita uuesti</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index 7762b1f..c751385f 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Hornitzaile mota</translation> <translation id="7882501334836096755">Gako publikoa</translation> +<translation id="78957024357676568">ezkerrera</translation> <translation id="7915220255123750251">Kudeatu sarearen APNaren ezarpenak. Sare mugikorren eta Interneten arteko konexioak ezartzen dituzte APNek.</translation> <translation id="7936303884198020182">Ez da aurkitu izenen zerbitzaririk</translation> <translation id="7942349550061667556">Gorria</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Aukeratu gogoko dituzun argazki eta albumak</translation> <translation id="8227119283605456246">Erantsi fitxategia</translation> <translation id="8230672074305416752">Ezin izan da egin ping sarerako atebide lehenetsian</translation> +<translation id="8242426110754782860">Egin aurrera</translation> <translation id="8246209727385807362">Operadore ezezaguna</translation> <translation id="827422111966801947">Anila</translation> <translation id="8286154143153872371">Konektatu sare batera eta kargatu orria berriro horma-papera ikusteko.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Hari gabekoa</translation> <translation id="8936793075252196307">Bezeroaren IP helbidea</translation> <translation id="894617464444543719">Gailua telefono bat da.</translation> +<translation id="8957423540740801332">eskuinera</translation> <translation id="8968751544471797276">Kargatze-abiadura</translation> <translation id="8970109610781093811">Abiarazi berriro</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index c38d534..135c9dc 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">نوع ارائهدهنده</translation> <translation id="7882501334836096755">کلید عمومی</translation> +<translation id="78957024357676568">چپ</translation> <translation id="7915220255123750251">مدیریت تنظیمات APN شبکه. APN اتصالی میان شبکه تلفن همراه و اینترنت برقرار میکند.</translation> <translation id="7936303884198020182">سرور نام دامنه پیدا نشد</translation> <translation id="7942349550061667556">قرمز</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">انتخاب عکسها و آلبومهای دلخواه</translation> <translation id="8227119283605456246">پیوست کردن فایل</translation> <translation id="8230672074305416752">پینگ کردن دروازه شبکه پیشفرض انجام نشد</translation> +<translation id="8242426110754782860">ادامه دادن</translation> <translation id="8246209727385807362">شرکت مخابراتی ناشناس</translation> <translation id="827422111966801947">نیلی سیر</translation> <translation id="8286154143153872371">لطفاً برای مشاهده کاغذدیواری، به شبکه متصل شوید و صفحه را بار کردن مجدد کنید.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">بی سیم</translation> <translation id="8936793075252196307">نشانی IP کارخواه</translation> <translation id="894617464444543719">دستگاه تلفن است.</translation> +<translation id="8957423540740801332">راست</translation> <translation id="8968751544471797276">سرعت شارژ کردن</translation> <translation id="8970109610781093811">اجرای دوباره</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index a91fab2b..eb8000f 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Palveluntarjoajan tyyppi</translation> <translation id="7882501334836096755">Julkinen avain</translation> +<translation id="78957024357676568">vasemmalle</translation> <translation id="7915220255123750251">Muuta verkon APN-asetuksia. APN:t luovat yhteyden mobiiliverkkon ja internetin välille.</translation> <translation id="7936303884198020182">Nimipalvelimia ei löydy</translation> <translation id="7942349550061667556">Punainen</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Valitse suosikkikuvat ja ‑albumit</translation> <translation id="8227119283605456246">Liitä tiedosto</translation> <translation id="8230672074305416752">Oletusarvoisen verkkoyhdyskäytävän ping epäonnistui</translation> +<translation id="8242426110754782860">Jatka</translation> <translation id="8246209727385807362">Tuntematon operaattori</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Yhdistä verkkoon ja päivitä sivu nähdäksesi taustakuvan.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Langaton</translation> <translation id="8936793075252196307">Asiakkaan IP-osoite</translation> <translation id="894617464444543719">Laite on puhelin.</translation> +<translation id="8957423540740801332">oikealle</translation> <translation id="8968751544471797276">Latausnopeus</translation> <translation id="8970109610781093811">Suorita uudelleen</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index fbdaa051..414ca1f 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Uri ng provider</translation> <translation id="7882501334836096755">Pampublikong key</translation> +<translation id="78957024357676568">pakaliwa</translation> <translation id="7915220255123750251">Pamahalaan ang mga setting ng APN ng network. Nagtatatag ang mga APN ng koneksyon sa pagitan ng isang cellular network at internet.</translation> <translation id="7936303884198020182">Walang nakitang name server</translation> <translation id="7942349550061667556">Pula</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Piliin ang iyong mga paboritong larawan at album</translation> <translation id="8227119283605456246">Mag-attach ng file</translation> <translation id="8230672074305416752">Hindi na-ping ang default na network gateway</translation> +<translation id="8242426110754782860">Magpatuloy</translation> <translation id="8246209727385807362">Hindi kilalang carrier</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Kumonekta sa network at i-reload ang page para makita ang wallpaper.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">IP address ng client</translation> <translation id="894617464444543719">Telepono ang device.</translation> +<translation id="8957423540740801332">pakanan</translation> <translation id="8968751544471797276">Rate ng Pag-charge</translation> <translation id="8970109610781093811">Patakbuhing muli</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index 8fb64d0..9f2a45b 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Type de fournisseur</translation> <translation id="7882501334836096755">Clé publique</translation> +<translation id="78957024357676568">gauche</translation> <translation id="7915220255123750251">Gérez les paramètres de NPA du réseau. Les NPA établissent une connexion entre un réseau cellulaire et Internet.</translation> <translation id="7936303884198020182">Aucun serveur de nom n'a été trouvé</translation> <translation id="7942349550061667556">Rouge</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Sélectionner vos photos et vos albums préférés</translation> <translation id="8227119283605456246">Joindre un fichier</translation> <translation id="8230672074305416752">Impossible d'effectuer un ping avec la passerelle réseau par défaut</translation> +<translation id="8242426110754782860">Continuer</translation> <translation id="8246209727385807362">Opérateur inconnu</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Veuillez vous connecter au réseau et actualiser la page pour afficher le fond d'écran.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sans fil</translation> <translation id="8936793075252196307">Adresse IP du client</translation> <translation id="894617464444543719">L'appareil est un téléphone.</translation> +<translation id="8957423540740801332">droite</translation> <translation id="8968751544471797276">Vitesse de recharge</translation> <translation id="8970109610781093811">Exécuter de nouveau</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 2d4315f..64b0638 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Type de fournisseur</translation> <translation id="7882501334836096755">Clé publique</translation> +<translation id="78957024357676568">gauche</translation> <translation id="7915220255123750251">Gérer les paramètres APN du réseau. Les APN établissent une connexion entre un réseau mobile et Internet.</translation> <translation id="7936303884198020182">Aucun serveur de noms trouvé</translation> <translation id="7942349550061667556">Rouge</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Choisir vos photos et vos albums préférés</translation> <translation id="8227119283605456246">Joindre un fichier</translation> <translation id="8230672074305416752">Impossible de pinguer la passerelle du réseau par défaut</translation> +<translation id="8242426110754782860">Continuer</translation> <translation id="8246209727385807362">Opérateur inconnu</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Connectez-vous à un réseau et actualisez la page pour voir le fond d'écran.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sans fil</translation> <translation id="8936793075252196307">Adresse IP du client</translation> <translation id="894617464444543719">L'appareil est un téléphone.</translation> +<translation id="8957423540740801332">droite</translation> <translation id="8968751544471797276">Vitesse de recharge</translation> <translation id="8970109610781093811">Exécuter à nouveau</translation> <translation id="8983038754672563810">3G+</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 0280608..2048364e 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de fornecedor</translation> <translation id="7882501334836096755">Clave pública</translation> +<translation id="78957024357676568">esquerda</translation> <translation id="7915220255123750251">Xestiona a configuración do APN da rede. Os APN establecen unha conexión entre unha rede de telefonía móbil e Internet.</translation> <translation id="7936303884198020182">Non se atoparon servidores de nomes</translation> <translation id="7942349550061667556">Vermello</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Escolle as fotos e os álbums que máis che gustan</translation> <translation id="8227119283605456246">Anexar ficheiro</translation> <translation id="8230672074305416752">Produciuse un erro ao facer ping na pasarela de rede predeterminada</translation> +<translation id="8242426110754782860">Continuar</translation> <translation id="8246209727385807362">Operador descoñecido</translation> <translation id="827422111966801947">Índigo</translation> <translation id="8286154143153872371">Para ver o fondo de pantalla, conéctate a unha rede e volve cargar a páxina.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sen fíos</translation> <translation id="8936793075252196307">Enderezo IP do cliente</translation> <translation id="894617464444543719">O dispositivo é un teléfono.</translation> +<translation id="8957423540740801332">dereita</translation> <translation id="8968751544471797276">Taxa de carga</translation> <translation id="8970109610781093811">Repetir proba</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 4f67a01b..286b56d 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">પ્રદાતાનો પ્રકાર</translation> <translation id="7882501334836096755">જાહેર કી</translation> +<translation id="78957024357676568">ડાબી</translation> <translation id="7915220255123750251">નેટવર્ક APN સેટિંગ મેનેજ કરો. APN સેલ્યુલર નેટવર્ક અને ઇન્ટરનેટ વચ્ચે કનેક્શન સ્થાપિત કરે છે.</translation> <translation id="7936303884198020182">IP કન્ફિગ્યુરેશનમાં કોઈ નામ સર્વર મળ્યા નથી</translation> <translation id="7942349550061667556">લાલ</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">તમારા મનગમતા ફોટા અને આલ્બમ પસંદ કરો</translation> <translation id="8227119283605456246">ફાઇલ જોડો</translation> <translation id="8230672074305416752">ડિફૉલ્ટ નેટવર્ક ગેટવેને પિંગ કરવામાં નિષ્ફળ રહ્યાં</translation> +<translation id="8242426110754782860">આગળ વધો</translation> <translation id="8246209727385807362">અજાણ કૅરિઅર</translation> <translation id="827422111966801947">ઘેરો ભૂરો</translation> <translation id="8286154143153872371">કૃપા કરીને નેટવર્ક સાથે કનેક્ટ કરો અને વૉલપેપર જોવા માટે પેજને ફરીથી લોડ કરો.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">વાયરલેસ</translation> <translation id="8936793075252196307">ક્લાયન્ટનું IP ઍડ્રેસ</translation> <translation id="894617464444543719">ડિવાઇસ એક ફોન છે.</translation> +<translation id="8957423540740801332">જમણી</translation> <translation id="8968751544471797276">ચાર્જ થવાની ટકાવારી</translation> <translation id="8970109610781093811">ફરીથી ચલાવો</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index cef32c1c..2f68670e 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">डीएनएस</translation> <translation id="7882358943899516840">कंपनी का प्रकार</translation> <translation id="7882501334836096755">सार्वजनिक कुंजी</translation> +<translation id="78957024357676568">बाईं</translation> <translation id="7915220255123750251">नेटवर्क एपीएन सेटिंग मैनेज करें. एपीएन, मोबाइल नेटवर्क और इंटरनेट के बीच कनेक्शन बनाते हैं.</translation> <translation id="7936303884198020182">कोई भी नाम सर्वर नहीं मिला</translation> <translation id="7942349550061667556">लाल</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">अपनी पसंदीदा फ़ोटो और एल्बम चुनें</translation> <translation id="8227119283605456246">फ़ाइल अटैच करें</translation> <translation id="8230672074305416752">डिफ़ॉल्ट नेटवर्क गेटवे को पिंग नहीं किया जा सका</translation> +<translation id="8242426110754782860">आगे बढ़ें</translation> <translation id="8246209727385807362">अज्ञात वाहक</translation> <translation id="827422111966801947">गहरा नीला</translation> <translation id="8286154143153872371">वॉलपेपर देखने के लिए, नेटवर्क से कनेक्ट करें और पेज को फिर से लोड करें.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">वायरलेस</translation> <translation id="8936793075252196307">क्लाइंट का आईपी पता</translation> <translation id="894617464444543719">डिवाइस एक फ़ोन है.</translation> +<translation id="8957423540740801332">दाईं</translation> <translation id="8968751544471797276">चार्ज होने की दर</translation> <translation id="8970109610781093811">फिर से चलाएं</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index bf2df52a..f9aa0c5e 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Vrsta davatelja usluge</translation> <translation id="7882501334836096755">Javni ključ</translation> +<translation id="78957024357676568">lijevo</translation> <translation id="7915220255123750251">Upravljajte postavkama APN-a mreže. APN-ovi uspostavljaju vezu između mobilne mreže i interneta.</translation> <translation id="7936303884198020182">Nije pronađen nijedan poslužitelj naziva</translation> <translation id="7942349550061667556">Crvena</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Odaberite svoje omiljene fotografije i albume</translation> <translation id="8227119283605456246">Priloži datoteku</translation> <translation id="8230672074305416752">Pinganje pristupnika zadane mreže nije uspjelo</translation> +<translation id="8242426110754782860">Nastavi</translation> <translation id="8246209727385807362">Nepoznat mobilni operater</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Povežite se s mrežom i ponovo učitajte stranicu da biste pregledali pozadinu.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bežično</translation> <translation id="8936793075252196307">IP adresa klijenta</translation> <translation id="894617464444543719">Uređaj je telefon.</translation> +<translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Brzina punjenja</translation> <translation id="8970109610781093811">Pokreni ponovo</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index 7e1cdfe..d6d8e6e 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Szolgáltató típusa</translation> <translation id="7882501334836096755">Nyilvános kulcs</translation> +<translation id="78957024357676568">balra</translation> <translation id="7915220255123750251">Kezelheti a hálózati APN-beállításokat. Az APN-ek kapcsolatot létesítenek a mobilhálózat és az internet között.</translation> <translation id="7936303884198020182">Nem találhatók névszerverek</translation> <translation id="7942349550061667556">Piros</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Kedvenc fotók és albumok kiválasztása</translation> <translation id="8227119283605456246">Fájl csatolása</translation> <translation id="8230672074305416752">Nem sikerült az alapértelmezett hálózati átjáró pingelése</translation> +<translation id="8242426110754782860">Folytatás</translation> <translation id="8246209727385807362">Ismeretlen szolgáltató</translation> <translation id="827422111966801947">Indigókék</translation> <translation id="8286154143153872371">A háttérkép megtekintése érdekében csatlakozzon egy hálózathoz, majd töltse be újra az oldalt.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Vezeték nélküli</translation> <translation id="8936793075252196307">Ügyfél IP-címe</translation> <translation id="894617464444543719">Az eszköz egy telefon.</translation> +<translation id="8957423540740801332">jobbra</translation> <translation id="8968751544471797276">Töltési sebesség</translation> <translation id="8970109610781093811">Futtatás újra</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb index 833297d..b2b53ec 100644 --- a/chromeos/strings/chromeos_strings_hy.xtb +++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Մատակարարի տեսակը</translation> <translation id="7882501334836096755">Բաց բանալի</translation> +<translation id="78957024357676568">ձախ</translation> <translation id="7915220255123750251">Կառավարեք ցանցի APN կարգավորումները։ APN-ները կապ են հաստատում բջջային ցանցի և համացանցի միջև։</translation> <translation id="7936303884198020182">DNS սերվերներ չեն գտնվել</translation> <translation id="7942349550061667556">Կարմիր</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Ընտրեք ձեր սիրած լուսանկարներն ու ալբոմները</translation> <translation id="8227119283605456246">Կցել ֆայլ</translation> <translation id="8230672074305416752">Չհաջողվեց փինգ ուղարկել կանխադրված ցանցի անցախուցին</translation> +<translation id="8242426110754782860">Շարունակել</translation> <translation id="8246209727385807362">Անհայտ օպերատոր</translation> <translation id="827422111966801947">Ինդիգո</translation> <translation id="8286154143153872371">Միացեք որևէ ցանցի և վերաբեռնեք էջը՝ պաստառը դիտելու համար։</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Անլար</translation> <translation id="8936793075252196307">Սպասառուի IP հասցե</translation> <translation id="894617464444543719">Սարքը հեռախոս է։</translation> +<translation id="8957423540740801332">աջ</translation> <translation id="8968751544471797276">Լիցքավորման արագությունը</translation> <translation id="8970109610781093811">Կրկնել</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index 13d057e..eb24d89 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Jenis penyedia</translation> <translation id="7882501334836096755">Kunci publik</translation> +<translation id="78957024357676568">ke kiri</translation> <translation id="7915220255123750251">Kelola setelan APN jaringan. APN membuat koneksi antara jaringan seluler dan internet.</translation> <translation id="7936303884198020182">Tidak ada server nama yang ditemukan</translation> <translation id="7942349550061667556">Merah</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Pilih foto dan album favorit</translation> <translation id="8227119283605456246">Lampirkan file</translation> <translation id="8230672074305416752">Gagal melakukan ping ke gateway jaringan default</translation> +<translation id="8242426110754782860">Lanjutkan</translation> <translation id="8246209727385807362">Operator tidak diketahui</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Hubungkan ke jaringan dan muat ulang halaman untuk melihat wallpaper.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Nirkabel</translation> <translation id="8936793075252196307">Alamat IP klien</translation> <translation id="894617464444543719">Perangkat adalah ponsel.</translation> +<translation id="8957423540740801332">ke kanan</translation> <translation id="8968751544471797276">Kecepatan pengisian daya</translation> <translation id="8970109610781093811">Jalankan lagi</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index e9dcfb0..ca95c5f7 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Gerð veitu</translation> <translation id="7882501334836096755">Opinber lykill</translation> +<translation id="78957024357676568">vinstri</translation> <translation id="7915220255123750251">Stjórna stillingum aðgangsstaðar netkerfis. Aðgangsstaðir tengja saman farsímakerfi og internetið.</translation> <translation id="7936303884198020182">Engir nafnaþjónar fundust</translation> <translation id="7942349550061667556">Rauður</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Veldu uppáhaldsmyndir og -möppur</translation> <translation id="8227119283605456246">Hengja skrá við</translation> <translation id="8230672074305416752">Ping-prófun sjálfvalinnar netkerfisgáttar mistókst</translation> +<translation id="8242426110754782860">Halda áfram</translation> <translation id="8246209727385807362">Óþekkt símafyrirtæki</translation> <translation id="827422111966801947">Dimmfjólublár</translation> <translation id="8286154143153872371">Tengstu neti og endurhladdu síðuna til að sjá veggfóður.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Þráðlaust</translation> <translation id="8936793075252196307">IP-tala biðlara</translation> <translation id="894617464444543719">Tækið er sími.</translation> +<translation id="8957423540740801332">hægri</translation> <translation id="8968751544471797276">Hleðsluhraði</translation> <translation id="8970109610781093811">Keyra aftur</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index d6b7146..a84015f 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo di provider</translation> <translation id="7882501334836096755">Chiave pubblica</translation> +<translation id="78957024357676568">sinistra</translation> <translation id="7915220255123750251">Gestisci le impostazioni APN di rete. Gli APN stabiliscono una connessione tra una rete mobile e Internet.</translation> <translation id="7936303884198020182">nessun server dei nomi trovato</translation> <translation id="7942349550061667556">Rosso</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Scegli le tue foto e i tuoi album preferiti</translation> <translation id="8227119283605456246">Allega file</translation> <translation id="8230672074305416752">impossibile eseguire il ping del gateway di rete predefinito</translation> +<translation id="8242426110754782860">Procedi</translation> <translation id="8246209727385807362">Operatore sconosciuto</translation> <translation id="827422111966801947">Indaco</translation> <translation id="8286154143153872371">Connettiti a una rete e ricarica la pagina per visualizzare lo sfondo.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">Indirizzo IP client</translation> <translation id="894617464444543719">Il dispositivo è un telefono.</translation> +<translation id="8957423540740801332">destra</translation> <translation id="8968751544471797276">Velocità di ricarica</translation> <translation id="8970109610781093811">Esegui di nuovo</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index f4e8c5e9..9ac1e02 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">סוג ספק</translation> <translation id="7882501334836096755">מפתח ציבורי</translation> +<translation id="78957024357676568">שמאל</translation> <translation id="7915220255123750251">ניהול הגדרות APN של הרשת. נקודות APN יוצרות חיבור בין רשת סלולרית לבין האינטרנט.</translation> <translation id="7936303884198020182">לא נמצאו שרתי שמות</translation> <translation id="7942349550061667556">אדום</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">בחירת התמונות והאלבומים האהובים עליך</translation> <translation id="8227119283605456246">צירוף קובץ</translation> <translation id="8230672074305416752">לא ניתן היה לבצע פינג לשער הרשת המוגדרת כברירת מחדל</translation> +<translation id="8242426110754782860">המשך</translation> <translation id="8246209727385807362">ספק לא ידוע</translation> <translation id="827422111966801947">כחול כהה</translation> <translation id="8286154143153872371">כדי לצפות בטפט, מתחברים לרשת וטוענים מחדש את הדף.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">אלחוטי</translation> <translation id="8936793075252196307">כתובת ה-IP של הלקוח</translation> <translation id="894617464444543719">המכשיר הוא טלפון.</translation> +<translation id="8957423540740801332">ימין</translation> <translation id="8968751544471797276">שיעור הטעינה</translation> <translation id="8970109610781093811">הפעל שוב</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 2c3b30bf..c3255f6e 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">プロバイダの種類</translation> <translation id="7882501334836096755">公開鍵</translation> +<translation id="78957024357676568">左</translation> <translation id="7915220255123750251">ネットワークの APN 設定を管理します。APN は、モバイル ネットワークとインターネットの間の接続を確立します。</translation> <translation id="7936303884198020182">ネームサーバーが見つかりませんでした</translation> <translation id="7942349550061667556">赤</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">お気に入りの写真やアルバムを選択してください</translation> <translation id="8227119283605456246">添付ファイル</translation> <translation id="8230672074305416752">デフォルトのネットワーク ゲートウェイに向けた ping が失敗しました</translation> +<translation id="8242426110754782860">続行</translation> <translation id="8246209727385807362">不明な携帯通信会社</translation> <translation id="827422111966801947">インディゴ</translation> <translation id="8286154143153872371">壁紙を表示するには、ネットワークに接続してページを再読み込みしてください。</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ワイヤレス</translation> <translation id="8936793075252196307">クライアント IP アドレス</translation> <translation id="894617464444543719">デバイスの種類はスマートフォンです。</translation> +<translation id="8957423540740801332">右</translation> <translation id="8968751544471797276">充電率</translation> <translation id="8970109610781093811">再実行</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index a7d8e35..57bd51b 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">პროვაიდერის ტიპი</translation> <translation id="7882501334836096755">საჯარო გასაღები</translation> +<translation id="78957024357676568">მარცხნივ</translation> <translation id="7915220255123750251">მართეთ ქსელის APN-ის პარამეტრები. APN ამყარებს კავშირს ფიჭურ ქსელსა და ინტერნეტს შორის.</translation> <translation id="7936303884198020182">სახელების სერვერი ვერ მოიძებნა</translation> <translation id="7942349550061667556">წითელი</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">აირჩიეთ თქვენი რჩეული ფოტოები და ალბომები</translation> <translation id="8227119283605456246">ფაილის მიმაგრება</translation> <translation id="8230672074305416752">ნაგულისხმევი ქსელის გეითვეისთან კავშირის შემოწმება ვერ მოხერხდა</translation> +<translation id="8242426110754782860">გაგრძელება</translation> <translation id="8246209727385807362">უცნობი ოპერატორი</translation> <translation id="827422111966801947">ინდიგო</translation> <translation id="8286154143153872371">ფონის სანახავად დაუკავშირდით ქსელს და გადატვირთეთ გვერდი.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">უსადენო</translation> <translation id="8936793075252196307">კლიენტის IP მისამართი</translation> <translation id="894617464444543719">მოწყობილობა არის ტელეფონი.</translation> +<translation id="8957423540740801332">მარჯვნივ</translation> <translation id="8968751544471797276">დატენის სიჩქარე</translation> <translation id="8970109610781093811">ხელახლა გაშვება</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index ab91d5f..3336d807 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Провайдер түрі</translation> <translation id="7882501334836096755">Ашық кілт</translation> +<translation id="78957024357676568">сол</translation> <translation id="7915220255123750251">Желінің APN параметрлерін басқарыңыз. APN аттары ұялы желі мен интернет арасында байланыс орнатады.</translation> <translation id="7936303884198020182">Атау серверлері табылмады.</translation> <translation id="7942349550061667556">Қызыл</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Өзіңізге ұнайтын фотосуреттер мен альбомдарды таңдау</translation> <translation id="8227119283605456246">Файл тіркеу</translation> <translation id="8230672074305416752">Әдепкі желі шлюзінің байланысы тексерілмеді.</translation> +<translation id="8242426110754782860">Жалғастыру</translation> <translation id="8246209727385807362">Белгісіз оператор</translation> <translation id="827422111966801947">Индиго</translation> <translation id="8286154143153872371">Тұсқағазды көру үшін желіге қосылып, бетті қайта жүктеңіз.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Сымсыз</translation> <translation id="8936793075252196307">Клиенттің IP мекенжайы</translation> <translation id="894617464444543719">Бұл — телефон.</translation> +<translation id="8957423540740801332">оң</translation> <translation id="8968751544471797276">Зарядталу жылдамдығы</translation> <translation id="8970109610781093811">Қайта тексеру</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index efb94d18a..d1982a2 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ប្រភេទអ្នកផ្តល់សេវាកម្ម</translation> <translation id="7882501334836096755">សោសាធារណៈ</translation> +<translation id="78957024357676568">ឆ្វេង</translation> <translation id="7915220255123750251">គ្រប់គ្រងការកំណត់ APN បណ្ដាញ។ APN បង្កើតការតភ្ជាប់រវាងបណ្ដាញចល័ត និងអ៊ីនធឺណិត។</translation> <translation id="7936303884198020182">រកមិនឃើញ DNS ទេ</translation> <translation id="7942349550061667556">ក្រហម</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">ជ្រើសរើសរូបថត និងអាល់ប៊ុមដែលអ្នកចូលចិត្ត</translation> <translation id="8227119283605456246">ភ្ជាប់ឯកសារ</translation> <translation id="8230672074305416752">មិនអាចភីងច្រកបណ្ដាញលំនាំដើមបានទេ</translation> +<translation id="8242426110754782860">បន្ត</translation> <translation id="8246209727385807362">ក្រុមហ៊ុនបម្រើសេវាទូរសព្ទដែលមិនស្គាល់</translation> <translation id="827422111966801947">ទឹកប៊ិក</translation> <translation id="8286154143153872371">សូមភ្ជាប់បណ្ដាញ រួចផ្ទុកទំព័រឡើងវិញ ដើម្បីមើលផ្ទាំងរូបភាព។</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ឥតខ្សែ</translation> <translation id="8936793075252196307">អាសយដ្ឋាន IP របស់កម្មវិធីភ្ញៀវ</translation> <translation id="894617464444543719">ឧបករណ៍គឺជាទូរសព្ទ។</translation> +<translation id="8957423540740801332">ស្តាំ</translation> <translation id="8968751544471797276">អត្រាសាកថ្ម</translation> <translation id="8970109610781093811">ដំណើរការម្ដងទៀត</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index fdec4b16..90c55be 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ಪೂರೈಕೆದಾರರ ಪ್ರಕಾರ</translation> <translation id="7882501334836096755">ಸಾರ್ವಜನಿಕ ಕೀ</translation> +<translation id="78957024357676568">ಎಡಕ್ಕೆ</translation> <translation id="7915220255123750251">ನೆಟ್ವರ್ಕ್ APN ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ. APN ಗಳು ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಹಾಗೂ ಇಂಟರ್ನೆಟ್ ನಡುವೆ ಕನೆಕ್ಷನ್ ಅನ್ನು ಸ್ಥಾಪಿಸುತ್ತವೆ.</translation> <translation id="7936303884198020182">ಹೆಸರು ಇಲ್ಲದ ಸರ್ವರ್ಗಳು ಕಂಡುಬಂದಿವೆ.</translation> <translation id="7942349550061667556">ಕೆಂಪು</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">ನಿಮ್ಮ ಮೆಚ್ಚಿನ ಫೋಟೋಗಳು ಮತ್ತು ಆಲ್ಬಮ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="8227119283605456246">ಫೈಲ್ ಲಗತ್ತಿಸಿ</translation> <translation id="8230672074305416752">ಡೀಫಾಲ್ಟ್ ನೆಟ್ವರ್ಕ್ ಗೇಟ್ವೇಗೆ ಪಿಂಗ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ</translation> +<translation id="8242426110754782860">ಮುಂದುವರಿಸು</translation> <translation id="8246209727385807362">ಅಪರಿಚಿತ ವಾಹಕ</translation> <translation id="827422111966801947">ಇಂಡಿಗೊ</translation> <translation id="8286154143153872371">ನೆಟ್ವರ್ಕ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ ಹಾಗೂ ವಾಲ್ಪೇಪರ್ ವೀಕ್ಷಿಸಲು ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ವೈರ್ಲೆಸ್</translation> <translation id="8936793075252196307">ಕ್ಲೈಂಟ್ IP ವಿಳಾಸ</translation> <translation id="894617464444543719">ಸಾಧನವು ಫೋನ್ ಆಗಿದೆ.</translation> +<translation id="8957423540740801332">ಬಲಕ್ಕೆ</translation> <translation id="8968751544471797276">ಚಾರ್ಜಿಂಗ್ ರೇಟ್</translation> <translation id="8970109610781093811">ಮತ್ತೆ ಚಾಲನೆ ಮಾಡಿ</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index ea320cd..0b922c2 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">공급자 유형</translation> <translation id="7882501334836096755">공개 키</translation> +<translation id="78957024357676568">왼쪽</translation> <translation id="7915220255123750251">네트워크 APN 설정을 관리하세요. APN은 셀룰러 네트워크와 인터넷 간의 연결을 설정합니다.</translation> <translation id="7936303884198020182">네임서버를 찾을 수 없습니다.</translation> <translation id="7942349550061667556">빨간색</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">좋아하는 사진 및 앨범을 선택합니다.</translation> <translation id="8227119283605456246">파일 첨부</translation> <translation id="8230672074305416752">기본 네트워크 게이트웨이를 핑할 수 없습니다.</translation> +<translation id="8242426110754782860">계속</translation> <translation id="8246209727385807362">알 수 없는 이동통신사</translation> <translation id="827422111966801947">인디고</translation> <translation id="8286154143153872371">배경화면을 보려면 네트워크에 연결하고 페이지를 새로고침하세요.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">무선</translation> <translation id="8936793075252196307">클라이언트 IP 주소</translation> <translation id="894617464444543719">휴대전화 기기입니다.</translation> +<translation id="8957423540740801332">오른쪽</translation> <translation id="8968751544471797276">충전 속도</translation> <translation id="8970109610781093811">다시 실행</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index 03c6282..5ed31528 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Жабдуучунун түрү</translation> <translation id="7882501334836096755">Жалпыга ачык ачкыч</translation> +<translation id="78957024357676568">сол</translation> <translation id="7915220255123750251">Тармактын APN параметрлерин тескеңиз. APN'дер мобилдик тармак менен Интернеттин ортосундагы байланышты түзүшөт.</translation> <translation id="7936303884198020182">Ысым серверлери табылган жок</translation> <translation id="7942349550061667556">Кызыл</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Сүйүктүү сүрөттөр менен альбомдорду тандоо</translation> <translation id="8227119283605456246">Файл тиркөө</translation> <translation id="8230672074305416752">Демейки тармактын шлюзуна ping сурамы жөнөтүлгөн жок</translation> +<translation id="8242426110754782860">Улантуу</translation> <translation id="8246209727385807362">Белгисиз байланыш оператору</translation> <translation id="827422111966801947">Индиго</translation> <translation id="8286154143153872371">Тушкагазды көрүү үчүн тармакка туташып, баракты кайра жүктөңүз.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Зымсыз</translation> <translation id="8936793075252196307">Кардардын IP-дареги</translation> <translation id="894617464444543719">Түзмөк — телефон.</translation> +<translation id="8957423540740801332">оң</translation> <translation id="8968751544471797276">Батареянын кубатталышы көрсөткүчү</translation> <translation id="8970109610781093811">Кайра сыноо</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index b694f4f..947049d 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -750,6 +750,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ປະເພດຜູ້ໃຫ້ບໍລິການ</translation> <translation id="7882501334836096755">ກະແຈສາທາລະນະ</translation> +<translation id="78957024357676568">ເບື້ອງຊ້າຍ</translation> <translation id="7915220255123750251">ຈັດການການຕັ້ງຄ່າ APN ຂອງເຄືອຂ່າຍ. APN ສ້າງການເຊື່ອມຕໍ່ລະຫວ່າງເຄືອຂ່າຍມືຖື ແລະ ອິນເຕີເນັດ.</translation> <translation id="7936303884198020182">ບໍ່ພົບເຊີບເວີຊື່</translation> <translation id="7942349550061667556">ສີແດງ</translation> @@ -781,6 +782,7 @@ <translation id="8226628635270268143">ເລືອກຮູບພາບ ແລະ ອະລະບໍ້າທີ່ທ່ານມັກ</translation> <translation id="8227119283605456246">ຄັດຕິດໄຟລ໌</translation> <translation id="8230672074305416752">ໃຊ້ຄຳສັ່ງ ping ກັບເກດເວເຄືອຂ່າຍຄ່າເລີ່ມຕົ້ນບໍ່ໄດ້</translation> +<translation id="8242426110754782860">ດຳເນີນຕໍ່</translation> <translation id="8246209727385807362">ຜູ້ໃຫ້ບໍລິການທີ່ບໍ່ຮູ້ຈັກ</translation> <translation id="827422111966801947">ສີຄາມ</translation> <translation id="8286154143153872371">ກະລຸນາເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍແລ້ວໂຫຼດໜ້າຄືນໃໝ່ເພື່ອເບິ່ງຮູບພື້ນຫຼັງ.</translation> @@ -858,6 +860,7 @@ <translation id="8930622219860340959">ໄຮ້ສາຍ</translation> <translation id="8936793075252196307">ທີ່ຢູ່ IP ລູກຂ່າຍ</translation> <translation id="894617464444543719">ອຸປະກອນແມ່ນໂທລະສັບ.</translation> +<translation id="8957423540740801332">ເບື້ອງຂວາ</translation> <translation id="8968751544471797276">ອັດຕາການສາກ</translation> <translation id="8970109610781093811">ເອີ້ນໃຊ້ອີກຄັ້ງ</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 01c38a4..018e133a 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Teikėjo tipas</translation> <translation id="7882501334836096755">Viešasis raktas</translation> +<translation id="78957024357676568">kairėn</translation> <translation id="7915220255123750251">Tvarkyti tinklo APN nustatymus. APN užmezga ryšį tarp mobiliojo ryšio tinklo ir interneto.</translation> <translation id="7936303884198020182">Domenų pavadinimų serverių nerasta</translation> <translation id="7942349550061667556">Raudona</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Pasirinkite mėgstamiausias nuotraukas ir albumus</translation> <translation id="8227119283605456246">Pridėtas failas</translation> <translation id="8230672074305416752">Nepavyko patikrinti ryšio su numatytuoju tinklų sietuvu</translation> +<translation id="8242426110754782860">Tęsti</translation> <translation id="8246209727385807362">Nežinomas operatorius</translation> <translation id="827422111966801947">Indigo spalva</translation> <translation id="8286154143153872371">Jei norite peržiūrėti ekrano foną, prisijunkite prie tinklo ir iš naujo įkelkite puslapį.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Belaidis</translation> <translation id="8936793075252196307">Kliento IP adresas</translation> <translation id="894617464444543719">Įrenginys yra telefonas.</translation> +<translation id="8957423540740801332">dešinėn</translation> <translation id="8968751544471797276">Įkrovimo rodiklis</translation> <translation id="8970109610781093811">Paleisti dar kartą</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 9ed6c7c..a0fbcd4 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Pakalpojumu sniedzēja veids</translation> <translation id="7882501334836096755">Publiskā atslēga</translation> +<translation id="78957024357676568">pa kreisi</translation> <translation id="7915220255123750251">Pārvaldiet tīkla APN iestatījumus. APN izveido savienojumu starp mobilo tīklu un internetu.</translation> <translation id="7936303884198020182">Netika atrasts neviens nosaukumu serveris</translation> <translation id="7942349550061667556">Sarkana</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Izvēlieties savus iecienītākos fotoattēlus un albumus.</translation> <translation id="8227119283605456246">Pievienot failu</translation> <translation id="8230672074305416752">Neizdevās ehotestēt noklusējuma tīkla vārteju</translation> +<translation id="8242426110754782860">Turpināt</translation> <translation id="8246209727385807362">Nezināms operators</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Izveidojiet savienojumu ar tīklu un atkārtoti ielādējiet lapu, lai skatītu fona tapeti.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bezvadu</translation> <translation id="8936793075252196307">Klienta IP adrese</translation> <translation id="894617464444543719">Ierīce ir tālrunis.</translation> +<translation id="8957423540740801332">pa labi</translation> <translation id="8968751544471797276">Uzlādes ātrums</translation> <translation id="8970109610781093811">Izpildīt vēlreiz</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index 66b1195..84b1690 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Тип оператор</translation> <translation id="7882501334836096755">Јавен клуч</translation> +<translation id="78957024357676568">лево</translation> <translation id="7915220255123750251">Управувајте со поставките за APN на мрежата. APN воспоставуваат врска помеѓу мобилната мрежа и интернетот.</translation> <translation id="7936303884198020182">Не се најдени сервери за име</translation> <translation id="7942349550061667556">Црвена</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Изберете ги омилените фотографии и албуми</translation> <translation id="8227119283605456246">Прикачи датотека</translation> <translation id="8230672074305416752">Не успеа да се пингува стандардниот мрежен портал</translation> +<translation id="8242426110754782860">Продолжи</translation> <translation id="8246209727385807362">Непознат оператор</translation> <translation id="827422111966801947">Индиго</translation> <translation id="8286154143153872371">Поврзете се на мрежа и повторно вчитајте ја страницата за да се прикаже тапетот.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Безжична</translation> <translation id="8936793075252196307">IP адреса на клиент</translation> <translation id="894617464444543719">Уредот е телефон.</translation> +<translation id="8957423540740801332">десно</translation> <translation id="8968751544471797276">Брзина на полнење</translation> <translation id="8970109610781093811">Изврши повторно</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 449e404..6577e81b 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">പ്രൊവൈഡര് തരം:</translation> <translation id="7882501334836096755">എല്ലാവർക്കുമായുള്ള കീ</translation> +<translation id="78957024357676568">ഇടത്തേക്ക്</translation> <translation id="7915220255123750251">നെറ്റ്വർക്ക് APN ക്രമീകരണം മാനേജ് ചെയ്യുക. സെല്ലുലാർ നെറ്റ്വർക്കിനും ഇന്റർനെറ്റിനും ഇടയിൽ APN-കൾ കണക്ഷൻ സ്ഥാപിക്കുന്നു.</translation> <translation id="7936303884198020182">നെയിം സെർവറുകളൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="7942349550061667556">ചുവപ്പ്</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">നിങ്ങളുടെ പ്രിയപ്പെട്ട ഫോട്ടോകളും ആൽബങ്ങളും തിരഞ്ഞെടുക്കുക</translation> <translation id="8227119283605456246">ഫയൽ അറ്റാച്ചുചെയ്യുക</translation> <translation id="8230672074305416752">ഡിഫോൾട്ട് നെറ്റ്വർക്ക് ഗേറ്റ്വേ പിംഗ് ചെയ്യാനായില്ല</translation> +<translation id="8242426110754782860">തുടരുക</translation> <translation id="8246209727385807362">അജ്ഞാത സേവനദാതാവ്</translation> <translation id="827422111966801947">ഇൻഡിഗോ</translation> <translation id="8286154143153872371">വാൾപേപ്പർ കാണാൻ ഒരു നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്ത് പേജ് റീലോഡ് ചെയ്യുക.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">വയര്ലെസ്സ്</translation> <translation id="8936793075252196307">ക്ലയന്റിന്റെ IP വിലാസം</translation> <translation id="894617464444543719">ഉപകരണം ഒരു ഫോണാണ്.</translation> +<translation id="8957423540740801332">വലത്തേക്ക്</translation> <translation id="8968751544471797276">ചാർജ് ചെയ്യൽ റേറ്റ്</translation> <translation id="8970109610781093811">വീണ്ടും പ്രവർത്തിപ്പിക്കുക</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index b9973833..dbe5587 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Нийлүүлэгчийн төрөл</translation> <translation id="7882501334836096755">Нийтийн түлхүүр</translation> +<translation id="78957024357676568">зүүн</translation> <translation id="7915220255123750251">Сүлжээний APN-н тохиргоог удирдана уу. APN үүрэн холбооны сүлжээ болон интернэтийн хооронд холболт тогтоодог.</translation> <translation id="7936303884198020182">DNS олдсонгүй</translation> <translation id="7942349550061667556">Улаан</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Дуртай зураг, цомгуудаа сонгоно уу</translation> <translation id="8227119283605456246">Файл хавсаргах</translation> <translation id="8230672074305416752">Сүлжээний өгөгдмөл гэйтвэйд пин илгээж чадсангүй</translation> +<translation id="8242426110754782860">Үргэлжлүүлнэ үү</translation> <translation id="8246209727385807362">Тодорхойгүй оператор компани</translation> <translation id="827422111966801947">Хөхөвтөр нил ягаан</translation> <translation id="8286154143153872371">Дэлгэцийн зургийг үзэхийн тулд сүлжээнд холбогдож, хуудсыг дахин ачаална уу.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Утасгүй</translation> <translation id="8936793075252196307">Клиентийн IP хаяг</translation> <translation id="894617464444543719">Төхөөрөмж нь утас байна.</translation> +<translation id="8957423540740801332">баруун</translation> <translation id="8968751544471797276">Цэнэглэх хурд</translation> <translation id="8970109610781093811">Дахин ажиллуулах</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index ff1e3de..e74439d 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">प्रदाता प्रकार</translation> <translation id="7882501334836096755">सार्वजनिक की</translation> +<translation id="78957024357676568">डावे</translation> <translation id="7915220255123750251">नेटवर्क APN सेटिंग्ज व्यवस्थापित करा. APNs ही मोबाइल नेटवर्क आणि इंटरनेट यांदरम्यान कनेक्शन जोडतात.</translation> <translation id="7936303884198020182">नेम सर्व्हर आढळले नाहीत</translation> <translation id="7942349550061667556">लाल</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">तुमचे आवडते फोटो आणि अल्बम निवडा</translation> <translation id="8227119283605456246">फाईल संलग्न करा</translation> <translation id="8230672074305416752">डीफॉल्ट नेटवर्क गेटवे पिंग करता आला नाही</translation> +<translation id="8242426110754782860">पुढे जा</translation> <translation id="8246209727385807362">माहीत नसलेला वाहक</translation> <translation id="827422111966801947">नीळ</translation> <translation id="8286154143153872371">कृपया वॉलपेपर पाहण्यासाठी नेटवर्कशी कनेक्ट करा आणि पेज रीलोड करा.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">बिनतारी</translation> <translation id="8936793075252196307">क्लायंटचा आयपी अॅड्रेस</translation> <translation id="894617464444543719">डिव्हाइस हे फोन आहे.</translation> +<translation id="8957423540740801332">उजवे</translation> <translation id="8968751544471797276">चार्ज करण्याचा रेट</translation> <translation id="8970109610781093811">पुन्हा चालवा</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 1649030..3d1509b 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Jenis penyedia</translation> <translation id="7882501334836096755">Kunci awam</translation> +<translation id="78957024357676568">kiri</translation> <translation id="7915220255123750251">Urus tetapan APN rangkaian. APN mewujudkan sambungan antara rangkaian selular dan Internet.</translation> <translation id="7936303884198020182">Pelayan tanpa nama ditemukan</translation> <translation id="7942349550061667556">Merah</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Pilih foto dan album kegemaran anda</translation> <translation id="8227119283605456246">Lampirkan fail</translation> <translation id="8230672074305416752">Gagal untuk ping get laluan rangkaian lalai</translation> +<translation id="8242426110754782860">Teruskan</translation> <translation id="8246209727385807362">Pembawa tidak diketahui</translation> <translation id="827422111966801947">Biru Nila</translation> <translation id="8286154143153872371">Sila sambung kepada rangkaian dan muatkan semula halaman untuk melihat kertas dinding.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Wayarles</translation> <translation id="8936793075252196307">Alamat IP klien</translation> <translation id="894617464444543719">Peranti ialah telefon.</translation> +<translation id="8957423540740801332">kanan</translation> <translation id="8968751544471797276">Kadar pengecasan</translation> <translation id="8970109610781093811">Jalankan sekali lagi</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 020cf972..b32bc10 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ထောက်ပံ့သူအမျိုးစား</translation> <translation id="7882501334836096755">အများသုံးကီး</translation> +<translation id="78957024357676568">ဘယ်</translation> <translation id="7915220255123750251">ကွန်ရက် APN ဆက်တင်များကို စီမံနိုင်သည်။ APN များက ဆယ်လူလာ ကွန်ရက်နှင့် အင်တာနက်အကြား ချိတ်ဆက်ပေးသည်။</translation> <translation id="7936303884198020182">အမည်ဆာဗာတစ်ခုမျှ ရှာမတွေ့ပါ</translation> <translation id="7942349550061667556">အနီရောင်</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">သင့်အကြိုက်ဆုံး ဓာတ်ပုံနှင့် အယ်လ်ဘမ်များ ရွေးချယ်ရန်</translation> <translation id="8227119283605456246">ပူးတွဲဖိုင်</translation> <translation id="8230672074305416752">မူလကွန်ရက်ဂိတ်ဝကို ပင်လုပ်၍မရပါ</translation> +<translation id="8242426110754782860">ဆက်လက်လုပ်ဆောင်ပါ</translation> <translation id="8246209727385807362">အမျိုးအမည်မသိရသော ဝန်ဆောင်မှုပေးသူ</translation> <translation id="827422111966801947">မဲနယ်</translation> <translation id="8286154143153872371">နောက်ခံကိုကြည့်ရန် ကွန်ရက်ချိတ်ဆက်၍ စာမျက်နှာကို ပြန်လည် စတင်ပါ။</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ကြိုးမဲ့</translation> <translation id="8936793075252196307">ကလိုင်းယင့် အိုင်ပီ (IP) လိပ်စာ</translation> <translation id="894617464444543719">ကိရိယာသည် ဖုန်းဖြစ်သည်။</translation> +<translation id="8957423540740801332">ညာ</translation> <translation id="8968751544471797276">အားသွင်းနှုန်း</translation> <translation id="8970109610781093811">ထပ်လုပ်ဆောင်ရန်</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index a6cf9c97..f155c12 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">प्रदायकको प्रकार</translation> <translation id="7882501334836096755">सार्वजनिक की</translation> +<translation id="78957024357676568">बायाँ</translation> <translation id="7915220255123750251">नेटवर्क APN सम्बन्धी सेटिङ मिलाउनुहोस्। APN ले मोबाइल नेटवर्क र इन्टरनेटबिचको कनेक्सन बनाउँछ।</translation> <translation id="7936303884198020182">कुनै पनि डोमेन नेम सर्भर फेला परेन</translation> <translation id="7942349550061667556">रातो</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">आफूलाई मन पर्ने फोटो र एल्बमहरू छनौट गर्नुहोस्</translation> <translation id="8227119283605456246">फाइल समावेश गर्नुहोस्</translation> <translation id="8230672074305416752">डिफल्ट नेटवर्कको गेटवे पिङ गर्न सकिएन</translation> +<translation id="8242426110754782860">अगाडि बढ्नुहोस्</translation> <translation id="8246209727385807362">अज्ञात सेवा प्रदायक</translation> <translation id="827422111966801947">इन्डिगो</translation> <translation id="8286154143153872371">वालपेपर हेर्न कृपया इन्टरनेटमा कनेक्ट गर्नुहोस् र पेज रिलोड गर्नुहोस्।</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">वायरलेस</translation> <translation id="8936793075252196307">क्लाइन्टको IP ठेगाना</translation> <translation id="894617464444543719">यो डिभाइस फोन हो।</translation> +<translation id="8957423540740801332">दायाँ</translation> <translation id="8968751544471797276">चार्ज भइरहेको दर</translation> <translation id="8970109610781093811">फेरि गर्नुहोस्</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index b927fe21..d3e8eec7 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Type provider</translation> <translation id="7882501334836096755">Openbare sleutel</translation> +<translation id="78957024357676568">links</translation> <translation id="7915220255123750251">Beheer de APN-instellingen voor het netwerk. APN's maken verbinding tussen een mobiel netwerk en internet.</translation> <translation id="7936303884198020182">Geen naamservers gevonden</translation> <translation id="7942349550061667556">Rood</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Kies je favoriete foto's en albums</translation> <translation id="8227119283605456246">Bestand bijvoegen</translation> <translation id="8230672074305416752">Kan de standaard netwerkgateway niet pingen</translation> +<translation id="8242426110754782860">Doorgaan</translation> <translation id="8246209727385807362">Onbekende provider</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Maak verbinding met een netwerk en laad de pagina opnieuw om de achtergrond te bekijken.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Draadloos</translation> <translation id="8936793075252196307">IP-adres van client</translation> <translation id="894617464444543719">Apparaat is een telefoon.</translation> +<translation id="8957423540740801332">rechts</translation> <translation id="8968751544471797276">Oplaadsnelheid</translation> <translation id="8970109610781093811">Opnieuw uitvoeren</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index 10c5d11..5a37521 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Leverandørtype</translation> <translation id="7882501334836096755">Offentlig nøkkel</translation> +<translation id="78957024357676568">venstre</translation> <translation id="7915220255123750251">Administrer APN-innstillingene for nettverket. APN oppretter en tilkobling mellom et mobilnettverk og internett.</translation> <translation id="7936303884198020182">Fant ingen navnetjenere</translation> <translation id="7942349550061667556">Rød</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Velg favorittbildene og -albumene dine</translation> <translation id="8227119283605456246">Legg ved fil</translation> <translation id="8230672074305416752">Kunne ikke pinge gatewayen for standardnettverket</translation> +<translation id="8242426110754782860">Gå videre</translation> <translation id="8246209727385807362">Ukjent operatør</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Koble til et nettverk og last inn siden på nytt for å se bakgrunnsbildet.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Trådløs</translation> <translation id="8936793075252196307">Klient-IP-adresse</translation> <translation id="894617464444543719">Enheten er en telefon.</translation> +<translation id="8957423540740801332">høyre</translation> <translation id="8968751544471797276">Ladefrekvens</translation> <translation id="8970109610781093811">Kjør på nytt</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb index 1fc32ba..82108b0 100644 --- a/chromeos/strings/chromeos_strings_or.xtb +++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -780,6 +780,7 @@ <translation id="8226628635270268143">ଆପଣଙ୍କ ପସନ୍ଦର ଫଟୋ ଏବଂ ଆଲବମଗୁଡ଼ିକ ବାଛନ୍ତୁ</translation> <translation id="8227119283605456246">ଫାଇଲ୍ ସଂଲଗ୍ନ କରନ୍ତୁ</translation> <translation id="8230672074305416752">ଡିଫଲ୍ଟ ନେଟୱାର୍କ ଗେଟୱେକୁ ପିଙ୍ଗ୍ କରିବାରେ ବିଫଳ ହୋଇଛି</translation> +<translation id="8242426110754782860">ଆଗକୁ ବଢ଼ନ୍ତୁ</translation> <translation id="8246209727385807362">ଅଜଣା ବାହକ</translation> <translation id="827422111966801947">ଘନନୀଳ</translation> <translation id="8286154143153872371">ୱାଲପେପର୍ ଦେଖିବାକୁ ଦୟାକରି ଏକ ନେଟୱାର୍କରେ ସଂଯୋଗ କରି ପୃଷ୍ଠାଟିକୁ ପୁଣି ଲୋଡ୍ କରନ୍ତୁ।</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 833751a9..19d5a2c 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ਪ੍ਰਦਾਨਕ ਕਿਸਮ</translation> <translation id="7882501334836096755">ਜਨਤਕ ਕੁੰਜੀ</translation> +<translation id="78957024357676568">ਖੱਬਾ</translation> <translation id="7915220255123750251">ਨੈੱਟਵਰਕ APN ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। APN ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ ਵਿਚਕਾਰ ਕਨੈਕਸ਼ਨ ਸਥਾਪਤ ਕਰਦੇ ਹਨ।</translation> <translation id="7936303884198020182">ਕੋਈ ਨਾਮ ਸਰਵਰ ਨਹੀਂ ਮਿਲਿਆ</translation> <translation id="7942349550061667556">ਲਾਲ</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">ਆਪਣੀਆਂ ਮਨਪਸੰਦ ਫ਼ੋਟੋਆਂ ਅਤੇ ਐਲਬਮਾਂ ਚੁਣੋ</translation> <translation id="8227119283605456246">ਫ਼ਾਈਲ ਨੱਥੀ ਕਰੋ</translation> <translation id="8230672074305416752">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਨੈੱਟਵਰਕ ਗੇਟਵੇ ਨੂੰ ਪਿੰਗ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> +<translation id="8242426110754782860">ਜਾਰੀ ਰੱਖੋ</translation> <translation id="8246209727385807362">ਅਗਿਆਤ ਕੈਰੀਅਰ</translation> <translation id="827422111966801947">ਜਾਮਨੀ ਨੀਲਾ</translation> <translation id="8286154143153872371">ਵਾਲਪੇਪਰ ਦੇਖਣ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਅਤੇ ਪੰਨੇ ਨੂੰ ਰੀਲੋਡ ਕਰੋ।</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ਵਾਇਰਲੈੱਸ</translation> <translation id="8936793075252196307">ਕਲਾਇੰਟ ਦਾ IP ਪਤਾ</translation> <translation id="894617464444543719">ਡੀਵਾਈਸ ਇੱਕ ਫ਼ੋਨ ਹੈ।</translation> +<translation id="8957423540740801332">ਸੱਜਾ</translation> <translation id="8968751544471797276">ਚਾਰਜਿੰਗ ਦਰ</translation> <translation id="8970109610781093811">ਦੁਬਾਰਾ ਚਲਾਓ</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index 77019c6..26a2e36f 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Typ dostawcy</translation> <translation id="7882501334836096755">Klucz publiczny</translation> +<translation id="78957024357676568">w lewo</translation> <translation id="7915220255123750251">Zarządzaj ustawieniami APN sieci. Punkty APN nawiązują połączenie między siecią komórkową a internetem.</translation> <translation id="7936303884198020182">Nie znaleziono serwerów nazw</translation> <translation id="7942349550061667556">Czerwony</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Wybierz ulubione zdjęcia i albumy</translation> <translation id="8227119283605456246">Załącz plik</translation> <translation id="8230672074305416752">Nie udało się sprawdzić pingiem domyślnej bramy sieciowej</translation> +<translation id="8242426110754782860">Dalej</translation> <translation id="8246209727385807362">Nieznany operator</translation> <translation id="827422111966801947">Indygo</translation> <translation id="8286154143153872371">Aby wyświetlić tapetę, połącz się z siecią i załaduj ponownie stronę.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sieć bezprzewodowa</translation> <translation id="8936793075252196307">Adres IP klienta</translation> <translation id="894617464444543719">Urządzenie to telefon.</translation> +<translation id="8957423540740801332">w prawo</translation> <translation id="8968751544471797276">Szybkość ładowania</translation> <translation id="8970109610781093811">Uruchom ponownie</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 0049ff66..6e5a3cc1 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de provedor</translation> <translation id="7882501334836096755">Chave pública</translation> +<translation id="78957024357676568">para a esquerda</translation> <translation id="7915220255123750251">Gerenciar configurações do APN de rede. Os APNs estabelecem uma conexão entre a rede celular e a Internet.</translation> <translation id="7936303884198020182">Nenhum servidor de nomes encontrado</translation> <translation id="7942349550061667556">Vermelho</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Escolher seus álbuns e fotos favoritos</translation> <translation id="8227119283605456246">Anexar arquivo</translation> <translation id="8230672074305416752">Falha no ping do gateway de rede padrão</translation> +<translation id="8242426110754782860">Continuar</translation> <translation id="8246209727385807362">Operadora desconhecida</translation> <translation id="827422111966801947">Índigo</translation> <translation id="8286154143153872371">Conecte-se a uma rede e atualize a página para ver o plano de fundo.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Rede sem fio</translation> <translation id="8936793075252196307">Endereço IP do cliente</translation> <translation id="894617464444543719">Este dispositivo é um smartphone.</translation> +<translation id="8957423540740801332">para a direita</translation> <translation id="8968751544471797276">Taxa de carregamento</translation> <translation id="8970109610781093811">Executar novamente</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index de6010c..1aabe2a4 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tipo de fornecedor</translation> <translation id="7882501334836096755">Chave pública</translation> +<translation id="78957024357676568">esquerda</translation> <translation id="7915220255123750251">Faça a gestão das definições do APN (Nome do Ponto de Acesso) da rede. Os APNs estabelecem uma ligação entre uma rede móvel e a Internet.</translation> <translation id="7936303884198020182">Não foram encontrados servidores de nomes.</translation> <translation id="7942349550061667556">Vermelho</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Escolha os seus álbuns ou fotos favoritos.</translation> <translation id="8227119283605456246">Anexar ficheiro</translation> <translation id="8230672074305416752">Falha ao enviar ping ao gateway da rede predefinida.</translation> +<translation id="8242426110754782860">Continuar</translation> <translation id="8246209727385807362">Operador desconhecido</translation> <translation id="827422111966801947">Índigo</translation> <translation id="8286154143153872371">Estabeleça ligação a uma rede e atualize a página para ver a imagem de fundo.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Sem fios</translation> <translation id="8936793075252196307">Endereço IP do cliente</translation> <translation id="894617464444543719">O dispositivo é um telemóvel.</translation> +<translation id="8957423540740801332">direita</translation> <translation id="8968751544471797276">Velocidade de carregamento</translation> <translation id="8970109610781093811">Executar novamente</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 3531fc2..578c374 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tip furnizor</translation> <translation id="7882501334836096755">Cheie publică</translation> +<translation id="78957024357676568">stânga</translation> <translation id="7915220255123750251">Gestionează setările APN ale rețelei. APN-urile stabilesc o conexiune între o rețea de date mobile și internet.</translation> <translation id="7936303884198020182">Nu s-au găsit servere de nume</translation> <translation id="7942349550061667556">Roșu</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Alege fotografiile și albumele preferate</translation> <translation id="8227119283605456246">Atașează un fișier</translation> <translation id="8230672074305416752">Nu s-a putut da ping către gateway-ul de rețea prestabilit</translation> +<translation id="8242426110754782860">Continuă</translation> <translation id="8246209727385807362">Operator necunoscut</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Conectează-te la o rețea și reîncarcă pagina pentru a vedea imaginea de fundal.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">Adresa IP a clientului</translation> <translation id="894617464444543719">Dispozitivul este un telefon.</translation> +<translation id="8957423540740801332">dreapta</translation> <translation id="8968751544471797276">Rata de încărcare</translation> <translation id="8970109610781093811">Rulați din nou</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 909212f..af5299fd 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Тип провайдера</translation> <translation id="7882501334836096755">Открытый ключ</translation> +<translation id="78957024357676568">влево</translation> <translation id="7915220255123750251">Управление настройками точки доступа. С помощью точек доступа устанавливается подключение между мобильной сетью и интернетом.</translation> <translation id="7936303884198020182">Не найдены серверы доменных имен.</translation> <translation id="7942349550061667556">Красный</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Выберите любимые фото и альбомы</translation> <translation id="8227119283605456246">Прикрепить файл</translation> <translation id="8230672074305416752">Не удалось выполнить проверку ping сетевого шлюза, заданного по умолчанию.</translation> +<translation id="8242426110754782860">Продолжить</translation> <translation id="8246209727385807362">Неизвестный оператор</translation> <translation id="827422111966801947">Индиго</translation> <translation id="8286154143153872371">Чтобы посмотреть обои, подключитесь к сети и обновите страницу.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Беспроводная связь</translation> <translation id="8936793075252196307">IP-адрес клиента</translation> <translation id="894617464444543719">Это телефон.</translation> +<translation id="8957423540740801332">вправо</translation> <translation id="8968751544471797276">Скорость зарядки</translation> <translation id="8970109610781093811">Выполнить ещё раз</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index e6c5028..5be60a8f 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">සැපයුම්කරු වර්ගය</translation> <translation id="7882501334836096755">පොදු යතුර</translation> +<translation id="78957024357676568">වම</translation> <translation id="7915220255123750251">ජාල APN සැකසීම් කළමනාකරණය කරන්න. APN සෙලියුලර් ජාලයක් සහ අන්තර්ජාලය අතර සම්බන්ධතාවයක් ඇති කරයි.</translation> <translation id="7936303884198020182">නම් සේවාදායක හමු නොවීය</translation> <translation id="7942349550061667556">රතු</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">ඔබේ ප්රියතම ඡායාරූප සහ ඇල්බම තෝරන්න</translation> <translation id="8227119283605456246">ගොනුව අමුණන්න</translation> <translation id="8230672074305416752">පෙරනිමි ජාල වාහල පින්ග් කිරීම අසාර්ථක විය</translation> +<translation id="8242426110754782860">ඉදිරියට</translation> <translation id="8246209727385807362">නොදන්නා වාහකයෙකි</translation> <translation id="827422111966801947">අවරිය</translation> <translation id="8286154143153872371">වෝල්පේපරය බැලීමට කරුණාකර ජාලයකට සම්බන්ධ වී පිටුව නැවත පූරණය කරන්න.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">නොරැහැන්</translation> <translation id="8936793075252196307">සේවාලාභී IP ලිපිනය</translation> <translation id="894617464444543719">උපාංගය දුරකථනයකි.</translation> +<translation id="8957423540740801332">දකුණු</translation> <translation id="8968751544471797276">ආරෝපණ වේගය</translation> <translation id="8970109610781093811">නැවත ධාවනය කරන්න</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index b703e90b0..9cf3a62 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Typ poskytovateľa</translation> <translation id="7882501334836096755">Verejný kľúč</translation> +<translation id="78957024357676568">doľava</translation> <translation id="7915220255123750251">Spravujte nastavenia názvov prístupových bodov (APN) siete. Názvy prístupových bodov umožňujú nadviazať pripojenie medzi mobilnou sieťou a internetom.</translation> <translation id="7936303884198020182">Nenašli sa žiadne servery DNS</translation> <translation id="7942349550061667556">Červená</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Vyberte svoje obľúbené fotky a albumy</translation> <translation id="8227119283605456246">Pripojiť súbor</translation> <translation id="8230672074305416752">Predvolenú bránu siete sa nepodarilo otestovať</translation> +<translation id="8242426110754782860">Pokračovať</translation> <translation id="8246209727385807362">Neznámy operátor</translation> <translation id="827422111966801947">Indigová</translation> <translation id="8286154143153872371">Pripojte sa k sieti a opätovným načítaním stránky zobrazte tapetu.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bezdrôtové pripojenie</translation> <translation id="8936793075252196307">Adresa IP klienta</translation> <translation id="894617464444543719">Zariadenie je telefón.</translation> +<translation id="8957423540740801332">doprava</translation> <translation id="8968751544471797276">Rýchlosť nabíjania</translation> <translation id="8970109610781093811">Spustiť znova</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index d7dd26b..c8de2cf 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Vrsta ponudnika</translation> <translation id="7882501334836096755">Javni ključ</translation> +<translation id="78957024357676568">levo</translation> <translation id="7915220255123750251">Upravljanje nastavitev APN-ja. APN-ji vzpostavijo povezavo med mobilnim omrežjem in internetom.</translation> <translation id="7936303884198020182">Najden ni bil noben imenski strežnik</translation> <translation id="7942349550061667556">Rdeča</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Izberite priljubljene fotografije in albume</translation> <translation id="8227119283605456246">Prilaganje datoteke</translation> <translation id="8230672074305416752">Ni mogoče preveriti privzetega prehoda omrežja</translation> +<translation id="8242426110754782860">Naprej</translation> <translation id="8246209727385807362">Neznani operater</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Povežite se z omrežjem in znova naložite stran, če si želite ogledati zaslonsko ozadje.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Brezžično</translation> <translation id="8936793075252196307">Naslov IP odjemalca</translation> <translation id="894617464444543719">Naprava je telefon.</translation> +<translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Hitrost polnjenja</translation> <translation id="8970109610781093811">Znova zaženi</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb index 9b9212b..f6ff7ea 100644 --- a/chromeos/strings/chromeos_strings_sq.xtb +++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Lloji i ofruesit</translation> <translation id="7882501334836096755">Çelës publik</translation> +<translation id="78957024357676568">majtas</translation> <translation id="7915220255123750251">Menaxho cilësimet e APN-së së rrjetit. APN-të vendosin një lidhje mes një rrjeti celular dhe internetit.</translation> <translation id="7936303884198020182">Nuk u gjetën serverë DNS</translation> <translation id="7942349550061667556">E kuqe</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Zgjidh fotografitë dhe albumet e tua të preferuara</translation> <translation id="8227119283605456246">Bashkëngjit skedarin</translation> <translation id="8230672074305416752">Dështoi verifikimi "ping" për portën e parazgjedhur të kalimit</translation> +<translation id="8242426110754782860">Vazhdo</translation> <translation id="8246209727385807362">Operator celular i panjohur</translation> <translation id="827422111966801947">Indigo</translation> <translation id="8286154143153872371">Lidhu në një rrjet dhe ringarko faqen për të parë imazhin e sfondit.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Me valë</translation> <translation id="8936793075252196307">Adresa IP e klientit</translation> <translation id="894617464444543719">Pajisja është një telefon.</translation> +<translation id="8957423540740801332">djathtas</translation> <translation id="8968751544471797276">Shpejtësia e karikimit</translation> <translation id="8970109610781093811">Ekzekuto përsëri</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index c4239fd..c4e94d4 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Tip dobavljača</translation> <translation id="7882501334836096755">Javni ključ</translation> +<translation id="78957024357676568">levo</translation> <translation id="7915220255123750251">Upravljajte podešavanjima naziva pristupne tačke mreže. Nazivi pristupnih tačaka uspostavljaju vezu između mobilne mreže i interneta.</translation> <translation id="7936303884198020182">Nije pronađen nijedan server za imena</translation> <translation id="7942349550061667556">Crvena</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Odaberite omiljene slike i albume</translation> <translation id="8227119283605456246">Priloži datoteku</translation> <translation id="8230672074305416752">Pingovanje podrazumevanog mrežnog prolaza nije uspelo</translation> +<translation id="8242426110754782860">Nastavi</translation> <translation id="8246209727385807362">Nepoznat mobilni operater</translation> <translation id="827422111966801947">Tamnoplava</translation> <translation id="8286154143153872371">Povežite se na mrežu i ponovo učitajte stranicu da biste videli pozadinu.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Bežično</translation> <translation id="8936793075252196307">IP adresa klijenta</translation> <translation id="894617464444543719">Uređaj je telefon.</translation> +<translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Brzina punjenja</translation> <translation id="8970109610781093811">Ponovo pokreni</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index f7050e92..eacd2af 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Тип добављача</translation> <translation id="7882501334836096755">Јавни кључ</translation> +<translation id="78957024357676568">лево</translation> <translation id="7915220255123750251">Управљајте подешавањима назива приступне тачке мреже. Називи приступних тачака успостављају везу између мобилне мреже и интернета.</translation> <translation id="7936303884198020182">Није пронађен ниједан сервер за имена</translation> <translation id="7942349550061667556">Црвена</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Одаберите омиљене слике и албуме</translation> <translation id="8227119283605456246">Приложи датотеку</translation> <translation id="8230672074305416752">Пинговање подразумеваног мрежног пролаза није успело</translation> +<translation id="8242426110754782860">Настави</translation> <translation id="8246209727385807362">Непознат мобилни оператер</translation> <translation id="827422111966801947">Тамноплава</translation> <translation id="8286154143153872371">Повежите се на мрежу и поново учитајте страницу да бисте видели позадину.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Бежично</translation> <translation id="8936793075252196307">IP адреса клијента</translation> <translation id="894617464444543719">Уређај је телефон.</translation> +<translation id="8957423540740801332">десно</translation> <translation id="8968751544471797276">Брзина пуњења</translation> <translation id="8970109610781093811">Поново покрени</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index dd96b2f..23a1e4f4 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Leverantörstyp</translation> <translation id="7882501334836096755">Offentlig nyckel</translation> +<translation id="78957024357676568">vänster</translation> <translation id="7915220255123750251">Hantera APN-inställningar för nätverket. APN upprättar en anslutning mellan ett mobilnätverk och internet.</translation> <translation id="7936303884198020182">Inga namnservrar hittades</translation> <translation id="7942349550061667556">Röd</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Välj favoritfoton och favoritalbum</translation> <translation id="8227119283605456246">Bifoga fil</translation> <translation id="8230672074305416752">Det gick inte att pinga standardnätverkets gateway</translation> +<translation id="8242426110754782860">Fortsätt</translation> <translation id="8246209727385807362">Okänd operatör</translation> <translation id="827422111966801947">Indigoblå</translation> <translation id="8286154143153872371">Anslut till ett nätverk och läs in sidan igen för att se bakgrunden.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Trådlöst</translation> <translation id="8936793075252196307">Klientens IP-adress</translation> <translation id="894617464444543719">Enheten är en telefon.</translation> +<translation id="8957423540740801332">höger</translation> <translation id="8968751544471797276">Laddningshastighet</translation> <translation id="8970109610781093811">Kör igen</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index ec41c9d..a72e8f2 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -520,6 +520,7 @@ <translation id="576835345334454681">Ongeza mwangaza wa skrini</translation> <translation id="57838592816432529">Zima sauti</translation> <translation id="5784136236926853061">Muda mwingi wa kusubiri maombi ya HTTP</translation> +<translation id="5826644637650799838">Kuhusu sanaa hii</translation> <translation id="5832805196449965646">Ongeza Mtumiaji Mwingine</translation> <translation id="583281660410589416">Haijulikani</translation> <translation id="5843706793424741864">Farenhaiti</translation> @@ -748,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Aina ya mtoa huduma</translation> <translation id="7882501334836096755">Ufunguo wa umma</translation> +<translation id="78957024357676568">kushoto</translation> <translation id="7915220255123750251">Dhibiti mipangilio ya APN ya mtandao. APN huanzisha muunganisho kati ya mtandao wa simu na Intaneti.</translation> <translation id="7936303884198020182">Hakuna seva za majina zilizopatikana</translation> <translation id="7942349550061667556">Nyekundu</translation> @@ -779,6 +781,7 @@ <translation id="8226628635270268143">Chagua picha na albamu uzipendazo zaidi</translation> <translation id="8227119283605456246">Ambatisha faili</translation> <translation id="8230672074305416752">Imeshindwa kuita lango la mtandao chaguomsingi</translation> +<translation id="8242426110754782860">Endelea</translation> <translation id="8246209727385807362">Mtoa huduma asiyejulikana</translation> <translation id="827422111966801947">Nili</translation> <translation id="8286154143153872371">Tafadhali unganisha kwenye mtandao kisha upakie ukurasa upya ili uangalie mandhari.</translation> @@ -856,6 +859,7 @@ <translation id="8930622219860340959">Bila Waya</translation> <translation id="8936793075252196307">Anwani ya IP ya programu teja</translation> <translation id="894617464444543719">Kifaa hiki ni simu.</translation> +<translation id="8957423540740801332">kulia</translation> <translation id="8968751544471797276">Kasi ya kuchaji</translation> <translation id="8970109610781093811">Endesha tena</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index ed18525b..d91d8acf 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">வழங்குநர் வகை</translation> <translation id="7882501334836096755">பொதுக் குறியீடு</translation> +<translation id="78957024357676568">இடது</translation> <translation id="7915220255123750251">நெட்வொர்க் APN அமைப்புகளை நிர்வகிக்கலாம். மொபைல் நெட்வொர்க் மற்றும் இணையத்திற்கு இடையில் APNகள் இணைப்பை உருவாக்கும்.</translation> <translation id="7936303884198020182">பெயர் சேவையகங்கள் எதுவும் இல்லை</translation> <translation id="7942349550061667556">சிவப்பு</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">உங்களுக்குப் பிடித்த படங்களையும் ஆல்பங்களையும் தேர்வுசெய்க</translation> <translation id="8227119283605456246">ஃபைலை இணை</translation> <translation id="8230672074305416752">இயல்புநிலை நெட்வொர்க் கேட்வேயைப் பிங் செய்ய முடியவில்லை</translation> +<translation id="8242426110754782860">தொடருக</translation> <translation id="8246209727385807362">அறியப்படாத தொலைத்தொடர்பு நிறுவனம்</translation> <translation id="827422111966801947">இண்டிகோ</translation> <translation id="8286154143153872371">வால்பேப்பரைப் பார்க்க நெட்வொர்க்குடன் இணைத்து, பக்கத்தை ரெஃப்ரெஷ் செய்யவும்.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">கம்பியில்லா</translation> <translation id="8936793075252196307">கிளையண்ட் IP முகவரி</translation> <translation id="894617464444543719">சாதனம் ஒரு மொபைல்.</translation> +<translation id="8957423540740801332">வலது</translation> <translation id="8968751544471797276">சார்ஜிங் விகிதம்</translation> <translation id="8970109610781093811">மீண்டும் இயக்கு</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index adb0f08b..cebe0fa 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ప్రదాత రకం</translation> <translation id="7882501334836096755">పబ్లిక్ కీ</translation> +<translation id="78957024357676568">ఎడమ</translation> <translation id="7915220255123750251">నెట్వర్క్ APN సెట్టింగ్లను మేనేజ్ చేయండి. APNలు సెల్యులార్ నెట్వర్క్కు, ఇంటర్నెట్కు మధ్య కనెక్షన్ను ఏర్పరుస్తాయి.</translation> <translation id="7936303884198020182">పేరుతో సర్వర్లు కనుగొనబడలేదు</translation> <translation id="7942349550061667556">ఎరుపు</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">మీకు ఇష్టమైన ఫోటోలు, ఆల్బమ్లను ఎంచుకోండి</translation> <translation id="8227119283605456246">ఫైల్ను జోడించండి</translation> <translation id="8230672074305416752">డిఫాల్ట్ నెట్వర్క్ గేట్వేను పింగ్ చేయడంలో విఫలమైంది</translation> +<translation id="8242426110754782860">కొనసాగు</translation> <translation id="8246209727385807362">తెలియని క్యారియర్</translation> <translation id="827422111966801947">నీలిమందు రంగు</translation> <translation id="8286154143153872371">వాల్పేపర్ను చూడటానికి, దయచేసి నెటవర్క్కు కనెక్ట్ చేసి, పేజీని రీలోడ్ చేయండి.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">వైర్లెస్</translation> <translation id="8936793075252196307">క్లయింట్ IP అడ్రస్</translation> <translation id="894617464444543719">పరికర రకం ఫోన్.</translation> +<translation id="8957423540740801332">కుడి</translation> <translation id="8968751544471797276">ఛార్జింగ్ రేట్</translation> <translation id="8970109610781093811">మళ్లీ అమలు చేయి</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 05b63ca..83431e3 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">ประเภทผู้ให้บริการ</translation> <translation id="7882501334836096755">คีย์สาธารณะ</translation> +<translation id="78957024357676568">ซ้าย</translation> <translation id="7915220255123750251">จัดการการตั้งค่า APN ของเครือข่าย APN จะเริ่มการเชื่อมต่อระหว่างเครือข่ายมือถือกับอินเทอร์เน็ต</translation> <translation id="7936303884198020182">ไม่พบเนมเซิร์ฟเวอร์</translation> <translation id="7942349550061667556">สีแดง</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">เลือกรูปภาพและอัลบั้มที่ชื่นชอบ</translation> <translation id="8227119283605456246">แนบไฟล์</translation> <translation id="8230672074305416752">ใช้คำสั่ง ping กับเกตเวย์เครือข่ายเริ่มต้นไม่สำเร็จ</translation> +<translation id="8242426110754782860">ดำเนินการต่อ</translation> <translation id="8246209727385807362">ผู้ให้บริการที่ไม่รู้จัก</translation> <translation id="827422111966801947">สีคราม</translation> <translation id="8286154143153872371">โปรดเชื่อมต่อเครือข่ายและโหลดหน้าซ้ำเพื่อดูวอลเปเปอร์</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">ไร้สาย</translation> <translation id="8936793075252196307">ที่อยู่ IP ของไคลเอ็นต์</translation> <translation id="894617464444543719">อุปกรณ์เป็นโทรศัพท์</translation> +<translation id="8957423540740801332">ด้านขวา</translation> <translation id="8968751544471797276">อัตราการชาร์จ</translation> <translation id="8970109610781093811">ทำงานอีกครั้ง</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 5840e040..fc5129194 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Sağlayıcı türü</translation> <translation id="7882501334836096755">Ortak anahtar</translation> +<translation id="78957024357676568">sol</translation> <translation id="7915220255123750251">Ağ APN ayarlarını yönetin. APN'ler, hücresel ağ ve internet arasında bir bağlantı oluşturur.</translation> <translation id="7936303884198020182">Alan adı sunucusu bulunamadı</translation> <translation id="7942349550061667556">Kırmızı</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">En beğendiğiniz fotoğraf ve albümleri seçin</translation> <translation id="8227119283605456246">Dosya ekle</translation> <translation id="8230672074305416752">Varsayılan ağ geçidi pinglenemedi</translation> +<translation id="8242426110754782860">Devam et</translation> <translation id="8246209727385807362">Bilinmeyen operatör</translation> <translation id="827422111966801947">Çivit Mavisi</translation> <translation id="8286154143153872371">Duvar kağıdını görmek için lütfen bir ağa bağlanıp sayfayı yeniden yükleyin.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">WiFi (Kablosuz)</translation> <translation id="8936793075252196307">İstemci IP adresleri</translation> <translation id="894617464444543719">Cihazın türü telefon.</translation> +<translation id="8957423540740801332">sağ</translation> <translation id="8968751544471797276">Şarj olma hızı</translation> <translation id="8970109610781093811">Yeniden çalıştır</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 38a7cd8..0db1772 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Тип постачальника</translation> <translation id="7882501334836096755">Відкритий ключ</translation> +<translation id="78957024357676568">ліворуч</translation> <translation id="7915220255123750251">Керуйте налаштуваннями APN мережі: за допомогою ідентифікаторів APN установлюється зв’язок між мобільною мережею й Інтернетом.</translation> <translation id="7936303884198020182">не знайдено серверів імен</translation> <translation id="7942349550061667556">Червоний</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Вибрати улюблені фотографії й альбоми</translation> <translation id="8227119283605456246">Вкласти файл</translation> <translation id="8230672074305416752">Не вдалося надіслати запит ping шлюзу мережі за умовчанням</translation> +<translation id="8242426110754782860">Продовжити</translation> <translation id="8246209727385807362">Невідомий оператор</translation> <translation id="827422111966801947">Індиго</translation> <translation id="8286154143153872371">Щоб переглянути фоновий малюнок, підключіться до мережі й оновіть сторінку.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Бездротове</translation> <translation id="8936793075252196307">IP-адреса клієнта</translation> <translation id="894617464444543719">Це телефон.</translation> +<translation id="8957423540740801332">праворуч</translation> <translation id="8968751544471797276">Швидкість заряджання</translation> <translation id="8970109610781093811">Запустити знову</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 836db90..cd58d37b 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">فراہم کنندہ کی قسم</translation> <translation id="7882501334836096755">عوامی کلید</translation> +<translation id="78957024357676568">بائیں</translation> <translation id="7915220255123750251">نیٹ ورک APN کی ترتیبات کا نظم کریں۔ APNs سیلولر نیٹ ورک اور انٹرنیٹ کے درمیان رابطہ قائم کرتے ہیں۔</translation> <translation id="7936303884198020182">کوئی نام سرور نہیں ملا</translation> <translation id="7942349550061667556">سرخ</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">اپنی پسندیدہ تصاویر اور البمز منتخب کریں</translation> <translation id="8227119283605456246">فائل منسلک کریں</translation> <translation id="8230672074305416752">ڈیفالٹ نیٹ ورک گیٹ وے کو پنگ کرنے میں ناکام</translation> +<translation id="8242426110754782860">آگے بڑھیں</translation> <translation id="8246209727385807362">نامعلوم کیریئر</translation> <translation id="827422111966801947">گہرا نیلا</translation> <translation id="8286154143153872371">براہ کرم کسی نیٹ ورک سے منسلک ہوں اور وال پیپر دیکھنے کے لیے صفحے کو دوبارہ لوڈ کریں۔</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">وائرلیس</translation> <translation id="8936793075252196307">کلائنٹ IP پتہ</translation> <translation id="894617464444543719">آلہ ایک فون ہے۔</translation> +<translation id="8957423540740801332">دایاں</translation> <translation id="8968751544471797276">چارج ہونے کی شرح</translation> <translation id="8970109610781093811">دوبارہ چلائيں</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index c4774cec..b76af1f 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Ta’minot turi</translation> <translation id="7882501334836096755">Ochiq kalit</translation> +<translation id="78957024357676568">chapga</translation> <translation id="7915220255123750251">Tarmoq APN sozlamalarini boshqarish. APN sozlamalari mobil tarmoq va internet orasida aloqani taʼminlaydi.</translation> <translation id="7936303884198020182">Nom serverlari topilmadi</translation> <translation id="7942349550061667556">Qizil</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Sevimli suratlar va albomlaringizni tanlang</translation> <translation id="8227119283605456246">Fayl biriktirish</translation> <translation id="8230672074305416752">Birlamchi tarmoq shlyuzi ping qilinmadi</translation> +<translation id="8242426110754782860">Davom etish</translation> <translation id="8246209727385807362">Noma’lum provayder</translation> <translation id="827422111966801947">Toʻq siyohrang</translation> <translation id="8286154143153872371">Fon rasmini koʻrish uchun tarmoqqa ulaning va sahifani yangilang.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Simsiz</translation> <translation id="8936793075252196307">Mijoz IP manzili</translation> <translation id="894617464444543719">Qurilma — telefon.</translation> +<translation id="8957423540740801332">o‘ngga</translation> <translation id="8968751544471797276">Quvvatlash tezligi</translation> <translation id="8970109610781093811">Qayta tekshirish</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 3e3f39f..e0649e72 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">Loại nhà mạng</translation> <translation id="7882501334836096755">Khóa công khai</translation> +<translation id="78957024357676568">trái</translation> <translation id="7915220255123750251">Quản lý chế độ cài đặt APN của mạng. APN thiết lập kết nối giữa mạng di động và Internet.</translation> <translation id="7936303884198020182">Không tìm thấy máy chủ định danh</translation> <translation id="7942349550061667556">Đỏ</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Chọn ảnh và album bạn yêu thích</translation> <translation id="8227119283605456246">Đính kèm tệp</translation> <translation id="8230672074305416752">Không ping được cổng của mạng mặc định</translation> +<translation id="8242426110754782860">Tiếp tục</translation> <translation id="8246209727385807362">Nhà cung cấp dịch vụ không xác định</translation> <translation id="827422111966801947">Màu chàm</translation> <translation id="8286154143153872371">Vui lòng kết nối mạng và tải lại trang để xem hình nền.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Không dây</translation> <translation id="8936793075252196307">Địa chỉ IP khách hàng</translation> <translation id="894617464444543719">Thiết bị là điện thoại.</translation> +<translation id="8957423540740801332">phải</translation> <translation id="8968751544471797276">Tốc độ sạc</translation> <translation id="8970109610781093811">Chạy lại</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index 63eef028..7cb4324f 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">提供商类型</translation> <translation id="7882501334836096755">公钥</translation> +<translation id="78957024357676568">向左</translation> <translation id="7915220255123750251">管理网络 APN 设置。APN 会在移动网络和互联网之间建立连接。</translation> <translation id="7936303884198020182">找不到任何域名服务器</translation> <translation id="7942349550061667556">红色</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">选择您喜爱的照片和影集</translation> <translation id="8227119283605456246">附上文件</translation> <translation id="8230672074305416752">未能对默认网关执行 ping 操作</translation> +<translation id="8242426110754782860">继续</translation> <translation id="8246209727385807362">未知运营商</translation> <translation id="827422111966801947">靛青色</translation> <translation id="8286154143153872371">若要查看壁纸,请连接到网络并重新加载这个页面。</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">无线</translation> <translation id="8936793075252196307">客户端 IP 地址</translation> <translation id="894617464444543719">设备类型是手机。</translation> +<translation id="8957423540740801332">向右</translation> <translation id="8968751544471797276">充电速率</translation> <translation id="8970109610781093811">重新运行</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index 9712437..f69611a 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">供應商類型</translation> <translation id="7882501334836096755">公開金鑰</translation> +<translation id="78957024357676568">向左</translation> <translation id="7915220255123750251">管理網絡 APN 設定。APN 會在流動網絡和互聯網之間建立連線。</translation> <translation id="7936303884198020182">找不到域名伺服器</translation> <translation id="7942349550061667556">紅色</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">選擇喜愛的相片和相簿</translation> <translation id="8227119283605456246">附加檔案</translation> <translation id="8230672074305416752">無法連線偵測預設的網絡閘道</translation> +<translation id="8242426110754782860">繼續</translation> <translation id="8246209727385807362">不明流動網絡供應商</translation> <translation id="827422111966801947">靛藍色</translation> <translation id="8286154143153872371">如要查看桌布,請連線至網絡,然後重新整理頁面。</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">無線網絡</translation> <translation id="8936793075252196307">用戶端 IP 位址</translation> <translation id="894617464444543719">裝置類型係手機。</translation> +<translation id="8957423540740801332">向右</translation> <translation id="8968751544471797276">充電率</translation> <translation id="8970109610781093811">再次執行</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 2a12703d..04b97c6 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">DNS</translation> <translation id="7882358943899516840">供應商類型</translation> <translation id="7882501334836096755">公開金鑰</translation> +<translation id="78957024357676568">向左鍵</translation> <translation id="7915220255123750251">管理網路 APN 設定。APN 會在行動網路和網際網路之間建立連線。</translation> <translation id="7936303884198020182">找不到任何名稱伺服器</translation> <translation id="7942349550061667556">紅色</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">選擇你最喜愛的相片和相簿</translation> <translation id="8227119283605456246">附加檔案</translation> <translation id="8230672074305416752">無法連線偵測預設的網路閘道</translation> +<translation id="8242426110754782860">Proceed</translation> <translation id="8246209727385807362">不明電信業者</translation> <translation id="827422111966801947">靛藍</translation> <translation id="8286154143153872371">如要查看桌布,請連上網路並重新載入網頁。</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">無線</translation> <translation id="8936793075252196307">用戶端 IP 位址</translation> <translation id="894617464444543719">裝置類型為手機。</translation> +<translation id="8957423540740801332">向右鍵</translation> <translation id="8968751544471797276">充電率</translation> <translation id="8970109610781093811">再執行一次</translation> <translation id="8983038754672563810">HSPA</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index e3c72f5..2445867 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -749,6 +749,7 @@ <translation id="7881066108824108340">I-DNS</translation> <translation id="7882358943899516840">Uhlobo lomhlinzeki</translation> <translation id="7882501334836096755">Ukhiye wasesidlangalaleni</translation> +<translation id="78957024357676568">kwesokunxele</translation> <translation id="7915220255123750251">Phatha amasethingi enethiwekhi ye-APN. Ama-APN asungula ukuxhumana phakathi kwenethiwekhi yeselula ne-inthanethi.</translation> <translation id="7936303884198020182">Awekho amaseva wegama atholakele</translation> <translation id="7942349550061667556">Okubomvu</translation> @@ -780,6 +781,7 @@ <translation id="8226628635270268143">Khetha izithombe zakho eziyintandokazi kanye nama-albhamu</translation> <translation id="8227119283605456246">Namathisela ifayela</translation> <translation id="8230672074305416752">Yehlulekile ukuqhweba umasango wenethiwekhi yokuzenzakalelayo</translation> +<translation id="8242426110754782860">Qhubeka</translation> <translation id="8246209727385807362">Inkampani yenethiwekhi engaziwa</translation> <translation id="827422111966801947">I-Indigo</translation> <translation id="8286154143153872371">Sicela uxhume kunethiwekhi uphinde ulayishe kabusha ikhasi ukuze ubuke isithombe sangemuva.</translation> @@ -857,6 +859,7 @@ <translation id="8930622219860340959">Okungenantambo</translation> <translation id="8936793075252196307">Ikheli lasesizindeni se-intanethi leklayenti</translation> <translation id="894617464444543719">Idivayisi iyifoni.</translation> +<translation id="8957423540740801332">kwesokudla</translation> <translation id="8968751544471797276">Isilinganisela sokushaja</translation> <translation id="8970109610781093811">Sebenzisa futhi</translation> <translation id="8983038754672563810">I-HSPA</translation>
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 83e02a7..a98d0cb 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -308,10 +308,6 @@ "crostini.ResizeRestart.bullseye_stable", "crostini.ResizeRestart.buster_stable", - # https://crbug.com/1416610 - "enterprise.ARCBlockedAppInstall", - "enterprise.ARCPlayStoreModeBlocklist", - # http://b/270400217 "login.AuthError",
diff --git a/chromeos/tools/onc_validator/onc_validator.cc b/chromeos/tools/onc_validator/onc_validator.cc index 68912d02..97cf489 100644 --- a/chromeos/tools/onc_validator/onc_validator.cc +++ b/chromeos/tools/onc_validator/onc_validator.cc
@@ -63,14 +63,16 @@ " onc_validator [OPTION]... [TYPE] onc_file\n" "\n" "Valid TYPEs are:\n"); - for (size_t i = 0; i < std::size(kTypes); ++i) - fprintf(stderr, " %s\n", kTypes[i]); + for (auto& type : kTypes) { + fprintf(stderr, " %s\n", type); + } fprintf(stderr, "\n" "Valid OPTIONs are:\n"); - for (size_t i = 0; i < std::size(kSwitches); ++i) - fprintf(stderr, " --%s\n", kSwitches[i]); + for (auto& switch_val : kSwitches) { + fprintf(stderr, " --%s\n", switch_val); + } fprintf(stderr, "\n" @@ -88,18 +90,18 @@ kStatusArgumentError); } -base::Value::Dict ReadDictionary(const std::string& filename) { +absl::optional<base::Value::Dict> ReadDictionary(const std::string& filename) { base::FilePath path(filename); JSONFileValueDeserializer deserializer(path, base::JSON_ALLOW_TRAILING_COMMAS); std::string json_error; std::unique_ptr<base::Value> value = - deserializer.Deserialize(NULL, &json_error); + deserializer.Deserialize(nullptr, &json_error); if (!value) { LOG(ERROR) << "Couldn't json-deserialize file '" << filename << "': " << json_error; - return nullptr; + return absl::nullopt; } if (!value->is_dict()) { @@ -122,10 +124,11 @@ return kStatusArgumentError; } - base::Value::Dict onc_object = ReadDictionary(args[1]); + absl::optional<base::Value::Dict> onc_object = ReadDictionary(args[1]); - if (!onc_object) + if (!onc_object) { return kStatusJsonError; + } chromeos::onc::Validator validator( command_line.HasSwitch(kSwitchErrorOnUnknownField), @@ -141,7 +144,7 @@ validator.SetOncSource(::onc::ONC_SOURCE_USER_IMPORT); std::string type_arg(args[0]); - const chromeos::onc::OncValueSignature* signature = NULL; + const chromeos::onc::OncValueSignature* signature = nullptr; if (type_arg == kToplevelConfiguration) { signature = &chromeos::onc::kToplevelConfigurationSignature; } else if (type_arg == kNetworkConfiguration) { @@ -154,8 +157,7 @@ } chromeos::onc::Validator::Result result; - validator.ValidateAndRepairObject( - signature, Base::Value(std::move(onc_object)), &result); + validator.ValidateAndRepairObject(signature, onc_object.value(), &result); switch (result) { case chromeos::onc::Validator::VALID:
diff --git a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc index bd5c1f6..971ad00a 100644 --- a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc +++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -704,6 +704,11 @@ kDefaultSnapRatio); } +MultitaskMenuNudgeController* +FrameCaptionButtonContainerView::GetMultitaskMenuNudgeController() { + return &nudge_controller_; +} + BEGIN_METADATA(FrameCaptionButtonContainerView, views::View) END_METADATA
diff --git a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h index a019c02..16820ba3 100644 --- a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h +++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h
@@ -195,6 +195,7 @@ bool CanSnap() override; void ShowSnapPreview(SnapDirection snap, bool allow_haptic_feedback) override; void CommitSnap(SnapDirection snap) override; + MultitaskMenuNudgeController* GetMultitaskMenuNudgeController() override; // The widget that the buttons act on. raw_ptr<views::Widget> frame_;
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.cc b/chromeos/ui/frame/caption_buttons/frame_size_button.cc index 74ca8ac..b183ade 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button.cc +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
@@ -14,6 +14,7 @@ #include "chromeos/ui/frame/caption_buttons/snap_controller.h" #include "chromeos/ui/frame/frame_utils.h" #include "chromeos/ui/frame/multitask_menu/multitask_menu.h" +#include "chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h" #include "chromeos/ui/wm/features.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" @@ -247,6 +248,8 @@ multitask_menu_->multitask_menu_view()->feedback_button()->SetCallback( feedback_callback_); multitask_menu_->ShowBubble(); + delegate_->GetMultitaskMenuNudgeController()->OnMenuOpened( + /*tablet_mode=*/false); } } @@ -261,6 +264,8 @@ weak_factory_.GetWeakPtr())); multitask_menu_->multitask_menu_view()->feedback_button()->SetCallback( feedback_callback_); + delegate_->GetMultitaskMenuNudgeController()->OnMenuOpened( + /*tablet_mode=*/false); } multitask_menu_->ToggleBubble(); }
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.h b/chromeos/ui/frame/caption_buttons/frame_size_button.h index 0ecc582..9be9604 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button.h +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.h
@@ -83,7 +83,7 @@ set_buttons_to_snap_mode_delay_ms_ = delay_ms; } - bool in_snap_mode_for_testing() { return in_snap_mode_; } + bool in_snap_mode_for_testing() const { return in_snap_mode_; } private: class PieAnimationView; @@ -92,7 +92,7 @@ // Starts |set_buttons_to_snap_mode_timer_|. void StartSetButtonsToSnapModeTimer(const ui::LocatedEvent& event); - // Starts the pie animation, which gives a visual inidicator of when the + // Starts the pie animation, which gives a visual indicator of when the // multitask menu will show up on long press or long touch, where `entry_type` // indicates the method the user started this animation (but hasn't shown the // menu yet).
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h b/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h index 5477cd1d..cef83ae 100644 --- a/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h +++ b/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h
@@ -18,6 +18,7 @@ namespace chromeos { +class MultitaskMenuNudgeController; enum class SnapDirection; // Delegate interface for FrameSizeButton. @@ -55,6 +56,8 @@ bool allow_haptic_feedback) = 0; virtual void CommitSnap(SnapDirection snap) = 0; + virtual MultitaskMenuNudgeController* GetMultitaskMenuNudgeController() = 0; + protected: virtual ~FrameSizeButtonDelegate() {} };
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc index ae670c0..aba6911 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc +++ b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc
@@ -50,6 +50,7 @@ // Clock that can be overridden for testing. base::Clock* g_clock_override = nullptr; +// May be null in tests. MultitaskMenuNudgeController::Delegate* g_delegate_instance = nullptr; base::Time GetTime() { @@ -172,6 +173,15 @@ } } +void MultitaskMenuNudgeController::OnMenuOpened(bool tablet_mode) { + DismissNudge(); + + if (g_delegate_instance) { + g_delegate_instance->SetNudgePreferences(tablet_mode, kNudgeMaxShownCount, + GetTime()); + } +} + void MultitaskMenuNudgeController::OnWindowParentChanged(aura::Window* window, aura::Window* parent) { if (!parent) { @@ -265,11 +275,6 @@ return; } - // TODO(b/267787811): When the multitask menu has been opened in tablet - // mode, don't show the tablet nudge anymore. - // TODO(sammiequon|hewer): When the multitask menu has been opened in - // clamshell mode, don't show the clamshell nudge anymore. - // Nudge has already been shown three times. No need to educate anymore. if (shown_count >= kNudgeMaxShownCount) { return;
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h index 7e41019b..9c4128af 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h +++ b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.h
@@ -86,6 +86,10 @@ // Closes the widget and cleans up all pointers in this class. void DismissNudge(); + // Called when the menu is opened. Marks the pref as seen so it does not show + // up again. + void OnMenuOpened(bool tablet_mode); + // aura::WindowObserver: void OnWindowParentChanged(aura::Window* window, aura::Window* parent) override;
diff --git a/components/attribution_reporting/trigger_attestation.cc b/components/attribution_reporting/trigger_attestation.cc deleted file mode 100644 index 4679f57..0000000 --- a/components/attribution_reporting/trigger_attestation.cc +++ /dev/null
@@ -1,47 +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 "components/attribution_reporting/trigger_attestation.h" - -#include <string> -#include <utility> - -#include "base/check.h" -#include "base/guid.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace attribution_reporting { - -TriggerAttestation::TriggerAttestation() = default; -TriggerAttestation::~TriggerAttestation() = default; - -TriggerAttestation::TriggerAttestation(const TriggerAttestation&) = default; -TriggerAttestation& TriggerAttestation::operator=(const TriggerAttestation&) = - default; - -TriggerAttestation::TriggerAttestation(TriggerAttestation&&) = default; -TriggerAttestation& TriggerAttestation::operator=(TriggerAttestation&&) = - default; - -// static -absl::optional<TriggerAttestation> TriggerAttestation::Create( - std::string token, - const std::string& aggregatable_report_id) { - base::GUID id = base::GUID::ParseLowercase(aggregatable_report_id); - if (!id.is_valid() || token.empty()) { - return absl::nullopt; - } - - return TriggerAttestation(std::move(token), std::move(id)); -} - -TriggerAttestation::TriggerAttestation(std::string token, - base::GUID aggregatable_report_id) - : token_(std::move(token)), - aggregatable_report_id_(std::move(aggregatable_report_id)) { - DCHECK(aggregatable_report_id_.is_valid()); - DCHECK(!token_.empty()); -} - -} // namespace attribution_reporting
diff --git a/components/attribution_reporting/trigger_attestation.h b/components/attribution_reporting/trigger_attestation.h deleted file mode 100644 index af908a2e..0000000 --- a/components/attribution_reporting/trigger_attestation.h +++ /dev/null
@@ -1,51 +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 COMPONENTS_ATTRIBUTION_REPORTING_TRIGGER_ATTESTATION_H_ -#define COMPONENTS_ATTRIBUTION_REPORTING_TRIGGER_ATTESTATION_H_ - -#include <string> - -#include "base/component_export.h" -#include "base/guid.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace attribution_reporting { - -class COMPONENT_EXPORT(ATTRIBUTION_REPORTING) TriggerAttestation { - public: - // Creates a TriggerAttestation instance if the `aggregatable_report_id` is a - // valid id and `token` is not empty. - static absl::optional<TriggerAttestation> Create( - std::string token, - const std::string& aggregatable_report_id); - - // Creates an invalid instance for use with Mojo deserialization, which - // requires types to be default-constructible. - // TODO(crbug.com/1408442): Avoid exposing default constructor - TriggerAttestation(); - - ~TriggerAttestation(); - - TriggerAttestation(const TriggerAttestation&); - TriggerAttestation& operator=(const TriggerAttestation&); - - TriggerAttestation(TriggerAttestation&&); - TriggerAttestation& operator=(TriggerAttestation&&); - - const std::string& token() const { return token_; } - const base::GUID& aggregatable_report_id() const { - return aggregatable_report_id_; - } - - private: - TriggerAttestation(std::string token, base::GUID aggregatable_report_id); - - std::string token_; - base::GUID aggregatable_report_id_; -}; - -} // namespace attribution_reporting - -#endif // COMPONENTS_ATTRIBUTION_REPORTING_TRIGGER_ATTESTATION_H_
diff --git a/components/attribution_reporting/trigger_attestation_unittest.cc b/components/attribution_reporting/trigger_attestation_unittest.cc deleted file mode 100644 index 79ea49b..0000000 --- a/components/attribution_reporting/trigger_attestation_unittest.cc +++ /dev/null
@@ -1,61 +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 "components/attribution_reporting/trigger_attestation.h" - -#include <string> - -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace attribution_reporting { -namespace { - -TEST(TriggerAttestationTest, Create) { - const struct { - std::string id; - std::string token; - bool expected_created; - } kTestCases[] = { - { - "a2ab30b9-d664-4dfc-a9db-85f9729b9a30", - "token", - true, - }, - { - // not a uuid - "not-a-uuid", - "token", - false, - }, - { - // not lowercased uuid - "A2AB30B9-d664-4dFC-a9db-85f9729b9a30", - "token", - false, - }, - { - // empty token - "a2ab30b9-d664-4dfc-a9db-85f9729b9a30", - "", - false, - }, - }; - - for (const auto& test_case : kTestCases) { - absl::optional<TriggerAttestation> actual = - TriggerAttestation::Create(test_case.token, test_case.id); - - EXPECT_EQ(test_case.expected_created, actual.has_value()) - << "id: " << test_case.id << " token: " << test_case.token; - if (test_case.expected_created) { - EXPECT_EQ(actual->token(), test_case.token); - EXPECT_EQ(actual->aggregatable_report_id().AsLowercaseString(), - test_case.id); - } - } -} - -} // namespace -} // namespace attribution_reporting
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 47df881..0efeb47f 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -636,22 +636,6 @@ } } -if (is_android) { - java_cpp_enum("java_enum_srcjar") { - # External code should depend on ":card_unmask_challenge_option_type_java" instead. - visibility = [ ":*" ] - sources = [ "payments/card_unmask_challenge_option.h" ] - } - - android_library("card_unmask_challenge_option_type_java") { - srcjar_deps = [ ":java_enum_srcjar" ] - - # Important: the generated enum uses the @IntDef annotation provided by - # this dependency. - deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ] - } -} - static_library("test_support") { testonly = true sources = [
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index c13d668c..59d9144 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -506,11 +506,9 @@ field.global_id()); if (!base::FeatureList::IsEnabled(features::kAutofillParseAsync) #if BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/1379149) Asynchronous parsing breaks Touch To Fill's - // keyboard suppression mechanism. Fast Checkout uses the same mechanism. - // Also see crbug.com/1375966. - || client()->IsTouchToFillCreditCardSupported() || - client()->IsFastCheckoutSupported() + // TODO(crbug.com/1375966,crbug.com/1379149) Asynchronous parsing breaks + // FastCheckout's keyboard suppression mechanism. + || client()->IsFastCheckoutSupported() #endif ) { OnAskForValuesToFillImpl(form, field, bounding_box,
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index 9ae707e5..43970570 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -298,8 +298,8 @@ void LogContextMenuImpressionsForSubmittedField(const AutofillField& field) { auto autocomplete_state = AutocompleteStateForSubmittedField(field); - AutofillMetrics::LogContextMenuImpressions(field.Type().GetStorableType(), - autocomplete_state); + AutofillMetrics::LogContextMenuImpressionsForField( + field.Type().GetStorableType(), autocomplete_state); } // Finds the first field in |form_structure| with |field.value|=|value|. @@ -795,6 +795,7 @@ } FormData form_for_autocomplete = submitted_form->ToFormData(); + int num_fields_where_context_menu_was_shown = 0; for (size_t i = 0; i < submitted_form->field_count(); ++i) { if (submitted_form->field(i)->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE) { @@ -823,9 +824,15 @@ // The context menu was shown in this field, log the metrics by // autocomplete type, form type and autofill type prediction of the field. - if (submitted_form->field(i)->was_context_menu_shown()) + if (submitted_form->field(i)->was_context_menu_shown()) { + num_fields_where_context_menu_was_shown++; LogContextMenuImpressionsForSubmittedField(*submitted_form->field(i)); + } } + + AutofillMetrics::LogContextMenuImpressionsForForm( + num_fields_where_context_menu_was_shown); + single_field_form_fill_router_->OnWillSubmitForm( form_for_autocomplete, submitted_form.get(), client()->IsAutocompleteEnabled());
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index a8709b8..5731af8 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -9685,6 +9685,10 @@ EXPECT_THAT(histogram_tester.GetAllSamples( "Autofill.FieldContextMenuImpressions.ByAutofillType"), BucketsAre(base::Bucket(test_case.expected_autofill_type, 1))); + + EXPECT_THAT(histogram_tester.GetAllSamples( + "Autofill.FormContextMenuImpressions.ByNumberOfFields"), + BucketsAre(base::Bucket(1, 1))); } // Test that if a form is mixed content we show a warning instead of any
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc index 23be3c5..550e8b25 100644 --- a/components/autofill/core/browser/data_model/credit_card.cc +++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -157,8 +157,7 @@ server_id_ = server_id; } -CreditCard::CreditCard(RecordType type, const int64_t& instrument_id) - : CreditCard() { +CreditCard::CreditCard(RecordType type, int64_t instrument_id) : CreditCard() { DCHECK(type == MASKED_SERVER_CARD || type == FULL_SERVER_CARD); record_type_ = type; instrument_id_ = instrument_id; @@ -166,9 +165,10 @@ CreditCard::CreditCard() : CreditCard(base::GenerateGUID(), std::string()) {} -CreditCard::CreditCard(const CreditCard& credit_card) : CreditCard() { - operator=(credit_card); -} +CreditCard::CreditCard(const CreditCard& credit_card) = default; +CreditCard::CreditCard(CreditCard&& credit_card) = default; +CreditCard& CreditCard::operator=(const CreditCard& credit_card) = default; +CreditCard& CreditCard::operator=(CreditCard&& credit_card) = default; CreditCard::~CreditCard() = default; @@ -607,38 +607,6 @@ base::TrimString(nickname_, u" ", &nickname_); } -void CreditCard::operator=(const CreditCard& credit_card) { - set_use_count(credit_card.use_count()); - set_use_date(credit_card.use_date()); - set_modification_date(credit_card.modification_date()); - - if (this == &credit_card) - return; - - record_type_ = credit_card.record_type_; - number_ = credit_card.number_; - name_on_card_ = credit_card.name_on_card_; - network_ = credit_card.network_; - expiration_month_ = credit_card.expiration_month_; - expiration_year_ = credit_card.expiration_year_; - server_id_ = credit_card.server_id_; - billing_address_id_ = credit_card.billing_address_id_; - bank_name_ = credit_card.bank_name_; - temp_card_first_name_ = credit_card.temp_card_first_name_; - temp_card_last_name_ = credit_card.temp_card_last_name_; - nickname_ = credit_card.nickname_; - card_issuer_ = credit_card.card_issuer_; - issuer_id_ = credit_card.issuer_id_; - instrument_id_ = credit_card.instrument_id_; - virtual_card_enrollment_state_ = credit_card.virtual_card_enrollment_state_; - virtual_card_enrollment_type_ = credit_card.virtual_card_enrollment_type_; - card_art_url_ = GURL(credit_card.card_art_url_); - product_description_ = credit_card.product_description_; - - set_guid(credit_card.guid()); - set_origin(credit_card.origin()); -} - bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card, const std::string& app_locale) { if (this->GetInfo(AutofillType(CREDIT_CARD_NUMBER), app_locale) !=
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h index 37b2777a..41cea2f7 100644 --- a/components/autofill/core/browser/data_model/credit_card.h +++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -20,9 +20,6 @@ struct AutofillMetadata; -// A midline horizontal ellipsis (U+22EF). -extern const char16_t kMidlineEllipsisDot[]; - namespace internal { // Returns an obfuscated representation of a credit card number given its last @@ -105,11 +102,13 @@ // Creates a server card with non-legacy instrument id. The type must be // MASKED_SERVER_CARD or FULL_SERVER_CARD. - CreditCard(RecordType type, const int64_t& instrument_id); + CreditCard(RecordType type, int64_t instrument_id); - // For use in STL containers. CreditCard(); CreditCard(const CreditCard& credit_card); + CreditCard(CreditCard&& credit_card); + CreditCard& operator=(const CreditCard& credit_card); + CreditCard& operator=(CreditCard&& credit_card); ~CreditCard() override; // Returns a version of |number| that has any separator characters removed. @@ -198,9 +197,6 @@ const std::string& issuer_id() const { return issuer_id_; } void set_issuer_id(const std::string& issuer_id) { issuer_id_ = issuer_id; } - // For use in STL containers. - void operator=(const CreditCard& credit_card); - // If the card numbers for |this| and |imported_card| match, and merging the // two wouldn't result in unverified data overwriting verified data, // overwrites |this| card's data with the data in |imported_card|. Returns
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc index ed035b2..65d38ca 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -3057,7 +3057,7 @@ } // static -void AutofillMetrics::LogContextMenuImpressions( +void AutofillMetrics::LogContextMenuImpressionsForField( ServerFieldType field_type, AutocompleteState autocomplete_state) { base::UmaHistogramEnumeration( @@ -3067,6 +3067,15 @@ "Autofill.FieldContextMenuImpressions.ByAutofillType", field_type); } +// static +void AutofillMetrics::LogContextMenuImpressionsForForm( + int num_of_fields_with_context_menu_shown) { + base::UmaHistogramSparse( + "Autofill.FormContextMenuImpressions.ByNumberOfFields", + base::ranges::clamp(num_of_fields_with_context_menu_shown, 0, + kMaxBucketsCount)); +} + const std::string PaymentsRpcResultToMetricsSuffix( AutofillClient::PaymentsRpcResult result) { std::string result_suffix;
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h index 8b1a546c..9faedea 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.h +++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -1286,8 +1286,14 @@ // Logs the context menu impressions based on the autofill type as well as // based on the autocomplete type. - static void LogContextMenuImpressions(ServerFieldType field_type, - AutocompleteState autocomplete_state); + static void LogContextMenuImpressionsForField( + ServerFieldType field_type, + AutocompleteState autocomplete_state); + + // Logs the context menu impressions for a submitted form. Mainly logs the + // number of fields in the form where the context menu was shown. + static void LogContextMenuImpressionsForForm( + int num_of_fields_with_context_menu_shown); // Returns 64-bit hash of the string of form global id, which consists of // |frame_token| and |renderer_id|.
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc index c1383490..677449b 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl.cc +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl.cc
@@ -33,6 +33,7 @@ BrowserAutofillManager* manager) : manager_(manager) { DCHECK(manager); + autofill_manager_observation_.Observe(manager); } TouchToFillDelegateImpl::~TouchToFillDelegateImpl() { @@ -104,6 +105,45 @@ } manager_->SetShouldSuppressKeyboard(suppress); keyboard_is_suppressed_ = suppress; + if (suppress) { + keyboard_unsuppress_timer_.Start( + FROM_HERE, base::Seconds(1), + base::BindOnce( + [](base::WeakPtr<TouchToFillDelegateImpl> self) { + if (self) { + self->SetShouldSuppressKeyboard(false); + } + }, + GetWeakPtr())); + } else { + keyboard_unsuppress_timer_.Stop(); + } +} + +void TouchToFillDelegateImpl::OnAutofillManagerDestroyed( + AutofillManager& manager) { + autofill_manager_observation_.Reset(); +} + +void TouchToFillDelegateImpl::OnBeforeAskForValuesToFill( + AutofillManager& manager, + FormGlobalId form_id, + FieldGlobalId field_id) { + if (ttf_credit_card_state_ != TouchToFillState::kIsShowing) { + SetShouldSuppressKeyboard(DryRun(form_id, field_id).outcome == + TriggerOutcome::kShown); + } +} + +void TouchToFillDelegateImpl::OnAfterAskForValuesToFill( + AutofillManager& manager, + FormGlobalId form_id, + FieldGlobalId field_id) { + if (ttf_credit_card_state_ != TouchToFillState::kIsShowing) { + SetShouldSuppressKeyboard(false); + } else { + keyboard_unsuppress_timer_.Stop(); + } } bool TouchToFillDelegateImpl::TryToShowTouchToFill(const FormData& form, @@ -114,21 +154,16 @@ query_form_ = form; query_field_ = field; DryRunResult dry_run = DryRun(form.global_id(), field.global_id()); - if (dry_run.outcome == TriggerOutcome::kShown) { - SetShouldSuppressKeyboard(true); - if (manager_->client()->ShowTouchToFillCreditCard( - GetWeakPtr(), std::move(dry_run.cards_to_suggest))) { - // Success. - } else { - dry_run.outcome = TriggerOutcome::kFailedToDisplayBottomSheet; - } + if (dry_run.outcome == TriggerOutcome::kShown && keyboard_is_suppressed_ && + !manager_->client()->ShowTouchToFillCreditCard( + GetWeakPtr(), std::move(dry_run.cards_to_suggest))) { + dry_run.outcome = TriggerOutcome::kFailedToDisplayBottomSheet; } if (dry_run.outcome != TriggerOutcome::kUnsupportedFieldType) { base::UmaHistogramEnumeration(kUmaTouchToFillCreditCardTriggerOutcome, dry_run.outcome); } if (dry_run.outcome != TriggerOutcome::kShown) { - SetShouldSuppressKeyboard(false); return false; }
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl.h b/components/autofill/core/browser/touch_to_fill_delegate_impl.h index a690c42..dd5a07f 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl.h +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl.h
@@ -6,6 +6,9 @@ #define COMPONENTS_AUTOFILL_CORE_BROWSER_TOUCH_TO_FILL_DELEGATE_IMPL_H_ #include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" +#include "base/timer/timer.h" +#include "components/autofill/core/browser/autofill_manager.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/ui/touch_to_fill_delegate.h" @@ -49,7 +52,13 @@ // TouchToFill is not supported for this field type. This value is not logged // to UMA. kUnsupportedFieldType = 9, - kMaxValue = kUnsupportedFieldType + // Keyboard is not suppressed (anymore). This can happen due to race + // conditions involving the form parse that may happen between + // OnBeforeAskForValuesToFill() and TryToShowTouchToFill(). In particular, the + // focused field's type may change (changing DryRun()'s value from a + // non-`kShown` value to `kShown`). + kKeyboardNotSuppressed = 10, + kMaxValue = kKeyboardNotSuppressed }; constexpr const char kUmaTouchToFillCreditCardTriggerOutcome[] = @@ -70,7 +79,8 @@ // // Public methods are marked virtual for testing. // TODO(crbug.com/1324900): Consider using more descriptive name. -class TouchToFillDelegateImpl : public TouchToFillDelegate { +class TouchToFillDelegateImpl : public TouchToFillDelegate, + public AutofillManager::Observer { public: explicit TouchToFillDelegateImpl(BrowserAutofillManager* manager); TouchToFillDelegateImpl(const TouchToFillDelegateImpl&) = delete; @@ -100,6 +110,15 @@ void SuggestionSelected(std::string unique_id) override; void OnDismissed(bool dismissed_by_user) override; + // AutofillManager::Observer: + void OnAutofillManagerDestroyed(AutofillManager& manager) override; + void OnBeforeAskForValuesToFill(AutofillManager& manager, + FormGlobalId form_id, + FieldGlobalId field_id) override; + void OnAfterAskForValuesToFill(AutofillManager& manager, + FormGlobalId form_id, + FieldGlobalId field_id) override; + void LogMetricsAfterSubmission(const FormStructure& submitted_form) const; base::WeakPtr<TouchToFillDelegateImpl> GetWeakPtr(); @@ -134,6 +153,10 @@ // Sets whether or not to suppress the on-screen keyboard in following // requests that would usually display the keyboard. // + // If `suppress == true` and had been false before, starts a timer to reset it + // again. This timer is stopped by subsequent calls where `suppress == false` + // or when TTF is indeed shown. + // // No-op if `suppress` if the previous call had the same value as `suppress`. void SetShouldSuppressKeyboard(bool suppress); @@ -151,10 +174,13 @@ const raw_ptr<BrowserAutofillManager> manager_; bool keyboard_is_suppressed_ = false; + base::OneShotTimer keyboard_unsuppress_timer_; FormData query_form_; FormFieldData query_field_; bool dismissed_by_user_; + base::ScopedObservation<AutofillManager, AutofillManager::Observer> + autofill_manager_observation_{this}; base::WeakPtrFactory<TouchToFillDelegateImpl> weak_ptr_factory_{this}; };
diff --git a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc index 95dbdac..24d44d0 100644 --- a/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc +++ b/components/autofill/core/browser/touch_to_fill_delegate_impl_unittest.cc
@@ -102,12 +102,19 @@ const FormFieldData& field), (override)); MOCK_METHOD(bool, CanShowAutofillUi, (), (const, override)); + MOCK_METHOD(void, SetShouldSuppressKeyboard, (bool suppress), (override)); }; } // namespace class TouchToFillDelegateImplUnitTest : public testing::Test { - protected: + public: + TouchToFillDelegateImplUnitTest() { + // Some date after in the 2000s because Autofill doesn't allow expiration + // dates before 2000. + task_environment_.AdvanceClock(base::Days(365 * 50)); + } + void SetUp() override { autofill_client_.SetPrefs(test::PrefServiceForTesting()); autofill_client_.GetPersonalDataManager()->SetPrefService( @@ -161,17 +168,23 @@ if (!browser_autofill_manager_->FindCachedFormById(form_.global_id())) { browser_autofill_manager_->OnFormsSeen({form_}, {}); } + touch_to_fill_delegate_->OnBeforeAskForValuesToFill( + *browser_autofill_manager_, form_.global_id(), + form_.fields[0].global_id()); EXPECT_EQ(expected_success, touch_to_fill_delegate_->TryToShowTouchToFill( form_, form_.fields[0])); + touch_to_fill_delegate_->OnAfterAskForValuesToFill( + *browser_autofill_manager_, form_.global_id(), + form_.fields[0].global_id()); EXPECT_EQ(expected_success, touch_to_fill_delegate_->IsShowingTouchToFill()); } FormData form_; - base::test::TaskEnvironment task_environment_; + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; test::AutofillEnvironment autofill_environment_; - TestAutofillClock test_autofill_clock_{AutofillClock::Now()}; NiceMock<MockAutofillClient> autofill_client_; std::unique_ptr<TestAutofillDriver> autofill_driver_; std::unique_ptr<MockBrowserAutofillManager> browser_autofill_manager_; @@ -221,7 +234,7 @@ TryToShowTouchToFillFailsIfNotSupported) { ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); EXPECT_CALL(autofill_client_, IsTouchToFillCreditCardSupported) - .WillOnce(Return(false)); + .WillRepeatedly(Return(false)); TryToShowTouchToFill(/*expected_success=*/false); } @@ -274,8 +287,14 @@ autofill_client_, HideAutofillPopup(PopupHidingReason::kOverlappingWithTouchToFillSurface)) .Times(0); + touch_to_fill_delegate_->OnBeforeAskForValuesToFill( + *browser_autofill_manager_, form_.global_id(), + form_.fields[0].global_id()); EXPECT_FALSE( touch_to_fill_delegate_->TryToShowTouchToFill(form_, form_.fields[0])); + touch_to_fill_delegate_->OnAfterAskForValuesToFill( + *browser_autofill_manager_, form_.global_id(), + form_.fields[0].global_id()); } TEST_F(TouchToFillDelegateImplUnitTest, TryToShowTouchToFillFailsIfWasShown) { @@ -398,7 +417,7 @@ TryToShowTouchToFillFailsIfCanNotShowUi) { ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); EXPECT_CALL(*browser_autofill_manager_, CanShowAutofillUi) - .WillOnce(Return(false)); + .WillRepeatedly(Return(false)); TryToShowTouchToFill(/*expected_success=*/false); histogram_tester_.ExpectUniqueSample( @@ -448,9 +467,9 @@ autofill_client_.GetPersonalDataManager()->ClearCreditCards(); CreditCard credit_card = autofill::test::GetCreditCard(); CreditCard disused_expired_card = test::GetExpiredCreditCard(); - disused_expired_card.set_use_date(AutofillClock::Now()); - test_autofill_clock_.Advance(kDisusedDataModelTimeDelta * 2); credit_card.set_use_date(AutofillClock::Now()); + disused_expired_card.set_use_date(AutofillClock::Now() - + kDisusedDataModelTimeDelta * 2); autofill_client_.GetPersonalDataManager()->AddCreditCard(credit_card); autofill_client_.GetPersonalDataManager()->AddCreditCard( disused_expired_card); @@ -587,4 +606,88 @@ true, 1); } +class TouchToFillDelegateImplUnitTest_KeyboardSuppression + : public TouchToFillDelegateImplUnitTest { + public: + // Parses a form and triggers the On{Before,After}AskForValuesToFill() events + // and runs TryToShowTouchToFill() in between. Before TryToShowTouchToFill(), + // the simulated parse takes `parse_duration`. + void TriggerTouchToFill( + const FormData& form, + base::TimeDelta parsing_duration, + base::OnceCallback<void(FormStructure*)> mutate_form) { + browser_autofill_manager_->OnFormsSeen({form}, {}); + FormStructure* form_structure = + browser_autofill_manager_->FindCachedFormById(form.global_id()); + ASSERT_TRUE(form_structure); + + touch_to_fill_delegate_->OnBeforeAskForValuesToFill( + *browser_autofill_manager_, form.global_id(), + form.fields[0].global_id()); + task_environment_.FastForwardBy(parsing_duration); + std::move(mutate_form).Run(form_structure); + touch_to_fill_delegate_->TryToShowTouchToFill(form, form.fields[0]); + touch_to_fill_delegate_->OnAfterAskForValuesToFill( + *browser_autofill_manager_, form.global_id(), + form.fields[0].global_id()); + task_environment_.RunUntilIdle(); + } +}; + +TEST_F(TouchToFillDelegateImplUnitTest_KeyboardSuppression, + SuppressedIfAllGoesWell) { + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(true)); + EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard); + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(false)) + .Times(0); + TriggerTouchToFill(form_, base::Milliseconds(30), base::DoNothing()); +} + +TEST_F(TouchToFillDelegateImplUnitTest_KeyboardSuppression, + UnsuppressedIfFormIsNonCreditCard) { + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(true)) + .Times(0); + EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard).Times(0); + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(false)) + .Times(0); + FormData address_form; + test::CreateTestAddressFormData(&address_form); + TriggerTouchToFill(address_form, base::Milliseconds(30), base::DoNothing()); +} + +TEST_F(TouchToFillDelegateImplUnitTest_KeyboardSuppression, + UnsuppressedIfFormBecomesNonCreditCard) { + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(true)) + .Times(1); + EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard).Times(0); + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(false)) + .Times(1); + TriggerTouchToFill(form_, base::Milliseconds(30), + base::BindOnce([](FormStructure* form_structure) { + for (auto& field : *form_structure) { + field->SetTypeTo(AutofillType(NAME_FIRST)); + } + })); +} + +TEST_F(TouchToFillDelegateImplUnitTest_KeyboardSuppression, + UnsuppressedIfControllerFails) { + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(true)); + EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard) + .Times(1) + .WillOnce(Return(false)); + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(false)); + TriggerTouchToFill(form_, base::Milliseconds(30), base::DoNothing()); +} + +TEST_F(TouchToFillDelegateImplUnitTest_KeyboardSuppression, + UnsuppressedIfParseIsSlow) { + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(true)) + .Times(1); + EXPECT_CALL(autofill_client_, ShowTouchToFillCreditCard).Times(0); + EXPECT_CALL(*browser_autofill_manager_, SetShouldSuppressKeyboard(false)) + .Times(1); + TriggerTouchToFill(form_, base::Seconds(2), base::DoNothing()); +} + } // namespace autofill
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index ec6540a0..5011394 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -677,6 +677,12 @@ "AutofillDisableSilentProfileUpdates", base::FEATURE_DISABLED_BY_DEFAULT); +// If enabled, any new profiles created from the settings are of type kAccount. +// TODO(crbug.com/1348294): Remove once the migration UI exists. +BASE_FEATURE(kAutofillCreateAccountProfilesFromSettings, + "AutofillCreateAccountProfilesFromSettings", + base::FEATURE_DISABLED_BY_DEFAULT); + // If enabled, three address profiles are created for testing. BASE_FEATURE(kAutofillCreateDataForTest, "AutofillCreateDataForTest",
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 7a1e4bd..6301145 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -244,6 +244,8 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillDisableProfileUpdates); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillDisableSilentProfileUpdates); +COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillCreateAccountProfilesFromSettings); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillCreateDataForTest); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillServerCommunication); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillShowTypePredictions);
diff --git a/components/bookmarks/managed/managed_bookmarks_policy_handler.cc b/components/bookmarks/managed/managed_bookmarks_policy_handler.cc index 59bd3bf..2bf63f26 100644 --- a/components/bookmarks/managed/managed_bookmarks_policy_handler.cc +++ b/components/bookmarks/managed/managed_bookmarks_policy_handler.cc
@@ -10,6 +10,7 @@ #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/bookmarks/managed/managed_bookmarks_tracker.h" #include "components/policy/core/browser/policy_error_map.h" +#include "components/policy/core/common/policy_logger.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_value_map.h" @@ -33,8 +34,11 @@ const policy::PolicyMap& policies, PrefValueMap* prefs) { std::unique_ptr<base::Value> value; - if (!CheckAndGetValue(policies, nullptr, &value)) + if (!CheckAndGetValue(policies, nullptr, &value)) { + LOG_POLICY(ERROR, POLICY_PROCESSING) + << "Failed to validate bookmarks policy schema."; return; + } if (!value || !value->is_list()) return; @@ -57,6 +61,8 @@ if (name) return *name; } + LOG_POLICY(WARNING, POLICY_PROCESSING) + << "Bookmarks policy has no top_level name"; // FolderName not present. return std::string(); @@ -76,10 +82,18 @@ const std::string* url = dict.FindString(ManagedBookmarksTracker::kUrl); base::Value::List* children = dict.FindList(ManagedBookmarksTracker::kChildren); - // Every bookmark must have a name, and then either a URL of a list of + // Every bookmark must have a name, and then either a URL or a list of // child bookmarks. - if (!name || (!url && !children)) + if (!name || (!url && !children)) { + // Do not log error for the {"top_level name": "value"} dictionary + if (!dict.contains(ManagedBookmarksTracker::kFolderName)) { + LOG_POLICY(ERROR, POLICY_PROCESSING) + << "Error in bookmark policy item: " << dict.DebugString() + << ". Item must have a name and a URL or a list of child " + "bookmarks."; + } continue; + } if (children) { *children = FilterBookmarks(std::move(*children)); @@ -92,6 +106,8 @@ dict.Remove(ManagedBookmarksTracker::kChildren); GURL gurl = url_formatter::FixupURL(*url, std::string()); if (!gurl.is_valid()) { + LOG_POLICY(ERROR, POLICY_PROCESSING) + << "Invalid bookmark URL: " << *url; continue; } dict.Set(ManagedBookmarksTracker::kUrl, gurl.spec());
diff --git a/components/browser_sync/sync_api_component_factory_impl.cc b/components/browser_sync/sync_api_component_factory_impl.cc index bdc7f4b..72ac85e5 100644 --- a/components/browser_sync/sync_api_component_factory_impl.cc +++ b/components/browser_sync/sync_api_component_factory_impl.cc
@@ -406,8 +406,7 @@ } // Register reading list unless explicitly disabled. - if (!disabled_types.Has(syncer::READING_LIST) && - reading_list::switches::IsReadingListEnabled()) { + if (!disabled_types.Has(syncer::READING_LIST)) { // The transport-mode delegate may or may not be null depending on // platform and feature toggle state. syncer::ModelTypeControllerDelegate* delegate_for_transport_mode =
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 d712e5a..bf99bf0c 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Mute sites that play sound</translation> <translation id="3602290021589620013">Preview</translation> <translation id="3628308229821498208">Suggested searches</translation> +<translation id="3636279694100170143">Sites you visit can validate that you're a real user and not a bot</translation> +<translation id="3649190289964910441">A site that you visit can save info with Chrome that validates that you're a real user. As you keep browsing, sites can check with Chrome and verify from the first site that you're likely a trusted user.</translation> <translation id="3744111561329211289">Background sync</translation> <translation id="3763247130972274048">Double-tap video left or right to skip 10s</translation> <translation id="3794286421982011626">A site that you visit can save info about what you’re doing so that it works as you would expect – for example, to keep you signed in to a site or to save items in your shopping basket. Often sites save this info temporarily on your device.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Managed by your parent</translation> <translation id="4670064810192446073">Virtual reality</translation> <translation id="4751476147751820511">Motion or light sensors</translation> +<translation id="477781522763920796">This setting works without identifying you or allowing sites to see your browsing history.</translation> <translation id="4779083564647765204">Zoom</translation> <translation id="4811450222531576619">Learn about its source and topic</translation> <translation id="4836046166855586901">Ask when a site wants to know when you're actively using this device</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Allowed for current search engine</translation> <translation id="702275896380648118">This site determines things that you like and then suggests ads to other sites. This site also gets your ad topics from Chrome to show you more relevant ads.</translation> <translation id="702463548815491781">Recommended when TalkBack or Switch Access are on</translation> +<translation id="7050519587566342213">Browsing is smoother, as you're more likely trusted from one site to the next.</translation> <translation id="7053983685419859001">Block</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 selected}other{# selected}}</translation> <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> selected. Options available near top of the screen</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 aa2fed87a..9ab4aa8 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Сайттардың дыбысы өшірілді</translation> <translation id="3602290021589620013">Алдын ала көру</translation> <translation id="3628308229821498208">Ұсынылған іздеу сұраулары</translation> +<translation id="3636279694100170143">Сіз кірген сайттар сіздің бот емес, нақты пайдаланушы екеніңізді тексере алады</translation> +<translation id="3649190289964910441">Сіз кірген сайт нақты пайдаланушы екеніңізді растайтын ақпаратты Chrome-мен сақтай алады. Шолуды жалғастырсаңыз, сайттар Chrome-мен тексеріп, бірінші сайттан сенімді пайдаланушы екеніңізді растай алады.</translation> <translation id="3744111561329211289">Фондық синхрондау</translation> <translation id="3763247130972274048">10 секунд уақытты өткізіп жіберу үшін бейнені солға немесе оңға қарай екі рет түртіңіз.</translation> <translation id="3794286421982011626">Сіз кірген сайт не істеп жатқаныңыз туралы ақпаратты сақтай алады, осылайша ол сіз күткендей жұмыс істейді, мысалы, аккаунтқа кірген күйде қалады немесе сатып алу себетіндегі элементтерді сақтап қояды. Сайттар көбінесе бұл ақпаратты құрылғыда уақытша сақтайды.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Ата-ана басқарады</translation> <translation id="4670064810192446073">Виртуалдық шындық</translation> <translation id="4751476147751820511">Қозғалыс не жарық датчиктері</translation> +<translation id="477781522763920796">Бұл параметр жеке басыңызды көрсетпей немесе сайттардың браузерді қолдану тарихын көруіне рұқсат етпей жұмыс істейді.</translation> <translation id="4779083564647765204">Масштабтау</translation> <translation id="4811450222531576619">Бет дереккөзі мен тақырыбы туралы ақпарат алыңыз.</translation> <translation id="4836046166855586901">Сайт сіз құрылғыңызды қашан белсенді пайдаланатыныңыз туралы білгісі келгенде, рұқсат сұралады.</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Ағымдағы іздеу жүйесіне рұқсат берілген</translation> <translation id="702275896380648118">Бұл сайт сізге ұнайтын нәрселерді анықтайды, одан кейін басқа сайттарға жарнамалар ұсынады. Сонымен қатар бұл сайт сізге көбірек сәйкес жарнамаларды көрсету үшін Chrome браузерінен жарнама тақырыптарын алады.</translation> <translation id="702463548815491781">TalkBack не Ауыстырғышпен кіру қосулы кезде пайдалануға ұсынылады</translation> +<translation id="7050519587566342213">Шолу бірқалыптырақ, себебі бір сайттан екіншісіне өткенде сенімдірек бола аласыз.</translation> <translation id="7053983685419859001">Бөгеу</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 таңдалды}other{# таңдалды}}</translation> <translation id="7087918508125750058"><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 f8001ad..e739cc8 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">បិទសំឡេងទំព័រដែលចាក់សំឡេង</translation> <translation id="3602290021589620013">ពិនិត្យមើល</translation> <translation id="3628308229821498208">ការស្វែងរកដែលបានណែនាំ</translation> +<translation id="3636279694100170143">គេហទំព័រដែលអ្នកចូលមើលអាចបញ្ជាក់ភាពត្រឹមត្រូវថា អ្នកជាអ្នកប្រើប្រាស់ពិតប្រាកដ និងមិនមែនជាបូតទេ</translation> +<translation id="3649190289964910441">គេហទំព័រដែលអ្នកចូលមើលអាចរក្សាទុកព័ត៌មានជាមួយ Chrome ដែលបញ្ជាក់ភាពត្រឹមត្រូវថា អ្នកជាអ្នកប្រើប្រាស់ពិតប្រាកដ។ នៅពេលអ្នកបន្តរុករក គេហទំព័រអាចសាកសួរ Chrome និងផ្ទៀងផ្ទាត់តាំងពីគេហទំព័រដំបូងថា អ្នកទំនងជាអ្នកប្រើប្រាស់ដែលទុកចិត្តបាន។</translation> <translation id="3744111561329211289">សមកាលកម្មផ្ទៃខាងក្រោយ</translation> <translation id="3763247130972274048">ចុចខាងឆ្វេង ឬខាងស្ដាំពីរដងលើវីដេអូ ដើម្បីរំលង 10 វិ</translation> <translation id="3794286421982011626">គេហទំព័រដែលអ្នកចូលមើលអាចរក្សាទុកព័ត៌មានអំពីអ្វីដែលអ្នកកំពុងធ្វើ ដើម្បីឱ្យវាដំណើរការដូចដែលអ្នករំពឹងទុក — ឧទាហរណ៍ ដើម្បីឱ្យអ្នកបន្តចូលគេហទំព័រ ឬដើម្បីរក្សាទុកទំនិញនៅក្នុងកន្ត្រកទិញទំនិញរបស់អ្នក។ ជារឿយៗ គេហទំព័ររក្សាទុកព័ត៌មាននេះជាបណ្ដោះអាសន្ននៅលើឧបករណ៍របស់អ្នក។</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">គ្រប់គ្រងដោយឪពុកម្តាយរបស់អ្នក</translation> <translation id="4670064810192446073">VR</translation> <translation id="4751476147751820511">ឧបករណ៍ចាប់សញ្ញាពន្លឺ ឬចលនា</translation> +<translation id="477781522763920796">ការកំណត់នេះដំណើរការដោយមិនកំណត់អត្តសញ្ញាណអ្នក ឬអនុញ្ញាតឱ្យគេហទំព័រមើលឃើញប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នក។</translation> <translation id="4779083564647765204">ពង្រីក</translation> <translation id="4811450222531576619">ស្វែងយល់អំពីប្រភព និងប្រធានបទរបស់ទំព័រនេះ</translation> <translation id="4836046166855586901">សួរនៅពេលគេហទំព័រចង់ដឹងអំពីពេលវេលាដែលអ្នកកំពុងប្រើឧបករណ៍នេះយ៉ាងសកម្ម</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">បានអនុញ្ញាតសម្រាប់ម៉ាស៊ីនស្វែងរកបច្ចុប្បន្ន</translation> <translation id="702275896380648118">គេហទំព័រនេះកំណត់អ្វីៗដែលអ្នកចូលចិត្ត រួចណែនាំការផ្សាយពាណិជ្ជកម្មដល់គេហទំព័រផ្សេងទៀត។ គេហទំព័រនេះក៏ប្រមូលប្រធានបទនៃការផ្សាយពាណិជ្ជកម្មរបស់អ្នកពី Chrome ផងដែរ ដើម្បីបង្ហាញការផ្សាយពាណិជ្ជកម្មកាន់តែពាក់ព័ន្ធដល់អ្នក។</translation> <translation id="702463548815491781">បានណែនាំ នៅពេលបើកកម្មវិធីតបវិញ ឬមុខងារប្រើប៊ូតុងចុច</translation> +<translation id="7050519587566342213">ការរុករកមានលក្ខណៈកាន់តែរលូន ដោយសារអ្នកកាន់តែទំនងជាទទួលបានការទុកចិត្ត ពេលរុករកពីគេហទំព័រមួយទៅគេហទំព័រមួយទៀត។</translation> <translation id="7053983685419859001">ទប់ស្កាត់</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{បានជ្រើសរើស 1}other{បានជ្រើសរើស #}}</translation> <translation id="7087918508125750058">បានជ្រើសរើស <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 0b91714..0041317 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Nutildyti svetaines, kurios leidžia garsą</translation> <translation id="3602290021589620013">Peržiūra</translation> <translation id="3628308229821498208">Siūlomos paieškos</translation> +<translation id="3636279694100170143">Svetainės, kuriose lankotės, gali patvirtinti, kad esate tikras naudotojas, o ne robotas</translation> +<translation id="3649190289964910441">Svetainė, kurioje lankotės, gali išsaugoti informaciją sistemoje „Chrome“, pagal kurią patvirtinama, kad esate tikras naudotojas. Jums naršant toliau, svetainės gali tikrinti sistemoje „Chrome“ ir iš pirmosios svetainės patvirtinti, kad esate patikimas naudotojas.</translation> <translation id="3744111561329211289">Fono sinchronizavimas</translation> <translation id="3763247130972274048">Dukart palieskite vaizdo įrašą, kad praleistumėte 10 sek.</translation> <translation id="3794286421982011626">Svetainė, kurioje lankotės, gali išsaugoti informaciją apie jūsų atliktus veiksmus, kad ji galėtų veikti taip, kaip tikitės, pvz., kad liktumėte prisijungę prie svetainės arba galėtumėte išsaugoti prekes pirkinių krepšelyje. Dažnai svetainės laikinai išsaugo šią informaciją įrenginyje.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Tvarko vienas iš jūsų tėvų</translation> <translation id="4670064810192446073">Virtualioji realybė</translation> <translation id="4751476147751820511">Judesio arba šviesos jutikliai</translation> +<translation id="477781522763920796">Šis nustatymas veikia jūsų neidentifikuojant ir neleidžiant svetainėms matyti jūsų naršymo istorijos.</translation> <translation id="4779083564647765204">Keisti mastelį</translation> <translation id="4811450222531576619">Sužinokite apie jo šaltinį ir temą</translation> <translation id="4836046166855586901">Klausti, kai svetainė nori žinoti, kada aktyviai naudojate šį įrenginį</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Leidžiama dabartiniam paieškos varikliui</translation> <translation id="702275896380648118">Ši svetainė nustato, kas jums patinka, ir siūlo skelbimus, nukreipiančius į kitas svetaines. Ši svetainė taip pat gauna informaciją apie skelbimų temas iš „Chrome“, kad galėtų rodyti jums aktualesnius skelbimus.</translation> <translation id="702463548815491781">Rekomenduojama, kai įjungta „TalkBack“ arba prieiga jungikliu</translation> +<translation id="7050519587566342213">Naršymas bus tolygesnis, nes didesnė tikimybė, kad būsite laikomas patikimu naudotoju, nukreipiant iš vienos svetainės į kitą.</translation> <translation id="7053983685419859001">Blokuoti</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Pasirinktas 1 elementas}one{Pasirinktas # elementas}few{Pasirinkti # elementai}many{Pasirinkta # elemento}other{Pasirinkta # elementų}}</translation> <translation id="7087918508125750058">Pasirinkta: <ph name="ITEM_COUNT" />. Parinktys pasiekiamos netoli ekrano viršaus</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 148ac26..d6f056e 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Wycisz strony, które odtwarzają dźwięk</translation> <translation id="3602290021589620013">Podgląd</translation> <translation id="3628308229821498208">Sugerowane wyszukiwania</translation> +<translation id="3636279694100170143">Odwiedzane przez Ciebie witryny mogą potwierdzić, że jesteś rzeczywistym użytkownikiem, a nie botem</translation> +<translation id="3649190289964910441">Strona, którą odwiedzasz, może zapisywać w Chrome informacje, że jesteś prawdziwym użytkownikiem. Podczas przeglądania witryny mogą sprawdzać je w Chrome i potwierdzać w pierwszej odwiedzonej witrynie, że prawdopodobnie jesteś zaufanym użytkownikiem.</translation> <translation id="3744111561329211289">Synchronizacja w tle</translation> <translation id="3763247130972274048">Kliknij dwukrotnie z lewej lub prawej strony filmu, by przewinąć o 10 s</translation> <translation id="3794286421982011626">Aby strona, na którą wchodzisz, działała zgodnie z oczekiwaniami – na przykład nie wylogowywała Cię lub pokazywała produkty w koszyku na zakupy – może ona zapisywać informacje o tym, co robisz. Często witryny zapisują te informacje tymczasowo na Twoim urządzeniu.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Zarządzany przez Twojego rodzica</translation> <translation id="4670064810192446073">Rzeczywistość wirtualna</translation> <translation id="4751476147751820511">Czujniki ruchu lub światła</translation> +<translation id="477781522763920796">To ustawienie działa bez ujawniania Twojej tożsamości i udzielania witrynom dostępu do Twojej historii przeglądania.</translation> <translation id="4779083564647765204">Powiększ</translation> <translation id="4811450222531576619">Poznaj jej źródło i temat</translation> <translation id="4836046166855586901">Pytaj, gdy strona chce wiedzieć, kiedy aktywnie korzystasz z urządzenia</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Zezwolono na dostęp obecnej wyszukiwarce</translation> <translation id="702275896380648118">Witryna określa Twoje zainteresowania, a potem sugeruje reklamy innym witrynom. Witryna wykorzystuje też gromadzone przez Chrome informacje o interesujących Cię tematach, aby wyświetlać trafniejsze reklamy.</translation> <translation id="702463548815491781">Zalecane, gdy włączono TalkBack lub Switch Access</translation> +<translation id="7050519587566342213">Przeglądanie działa płynniej, ponieważ jesteś bardziej wiarygodnym użytkownikiem dla kolejnych witryn.</translation> <translation id="7053983685419859001">Blokuj</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Wybrano 1}few{Wybrano #}many{Wybrano #}other{Wybrano #}}</translation> <translation id="7087918508125750058">Wybrano <ph name="ITEM_COUNT" />. Opcje dostępne na górze ekranu</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 436ad2e..fc6a798 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
@@ -147,7 +147,7 @@ <translation id="3628308229821498208">Navrhované vyhľadávania</translation> <translation id="3744111561329211289">Synchronizácia na pozadí</translation> <translation id="3763247130972274048">Dvojitým klepnutím doľava alebo doprava preskočíte vo videu o 10 s</translation> -<translation id="3794286421982011626">Web, ktorý navštívite, môže ukladať informácie o tom, čo robíte, aby fungoval podľa vašich očakávaní. Vďaka tomu si napríklad môžete na ňom uchovať aktívne prihlásenie alebo ukladať položky do nákupného košíka. Weby často ukladajú tieto informácie vo vašom zariadení dočasne.</translation> +<translation id="3794286421982011626">Web, ktorý navštívite, môže uchovávať informácie o tom, čo robíte, aby fungoval podľa očakávaní. Vďaka tomu na ňom napríklad môže zostať prihlásený váš účet alebo môžete ukladať položky do nákupného košíka. Weby tieto informácie často ukladajú dočasne vo vašom zariadení.</translation> <translation id="3797520601150691162">Nepoužívať tmavý motív pre konkrétny web</translation> <translation id="3803367742635802571">Weby, ktoré navštívite, môžu prestať fungovať podľa plánu</translation> <translation id="3804247818991980532"><ph name="TYPE_1" />. <ph name="TYPE_2" />.</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 b35fbd411..f0913dc 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Isključi zvuk sajtova koji puštaju zvuk</translation> <translation id="3602290021589620013">Pregled</translation> <translation id="3628308229821498208">Predložene pretrage</translation> +<translation id="3636279694100170143">Sajtovi koje posećujete mogu da potvrde da ste stvarni korisnik, a ne robot</translation> +<translation id="3649190289964910441">Sajt koji posetite može da čuva informacije pomoću Chrome-a koje potvrđuju da ste stvarni korisnik. Dok nastavljate da pregledate, sajtovi mogu da proveravaju sa Chrome-om i uveravaju se na prvom sajtu da ste verovatno pouzdani korisnik.</translation> <translation id="3744111561329211289">Sinhronizacija u pozadini</translation> <translation id="3763247130972274048">Dvaput dodirnite video levo ili desno da biste preskočili 10 sek</translation> <translation id="3794286421982011626">Sajt koji posećujete može da čuva informacije o tome šta radite kako bi radio na očekivani način – na primer, da biste ostali prijavljeni na sajt ili da biste sačuvali stavke u korpi za kupovinu. Sajtovi često privremeno čuvaju te informacije na uređaju.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Ovim upravlja tvoj roditelj</translation> <translation id="4670064810192446073">Virtuelna realnost</translation> <translation id="4751476147751820511">Senzori za pokret ili svetlo</translation> +<translation id="477781522763920796">Ovo podešavanje radi, a da ne mora da vas identifikuje ili da dozvoli sajtovima da vide istoriju pregledanja.</translation> <translation id="4779083564647765204">Zumiranje</translation> <translation id="4811450222531576619">Saznajte više o njenom izvoru i temi</translation> <translation id="4836046166855586901">Pitaj kada sajt želi da zna kada aktivno koristim ovaj uređaj</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Dozvoljeno je za aktuelni pretraživač</translation> <translation id="702275896380648118">Ovaj sajt određuje stvari koje vam se sviđaju, a zatim predlaže oglase za druge sajtove. Ovaj sajt takođe prima podatke o vašim temama oglasa iz Chrome-a da bi vam prikazivao relevantnije oglase.</translation> <translation id="702463548815491781">Preporučujemo vam kada uključite TalkBack ili pristup pomoću prekidača</translation> +<translation id="7050519587566342213">Pregledanje je bolje jer će vam više verovati kada prelazite sa jednog sajta na drugi.</translation> <translation id="7053983685419859001">Blokiraj</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Izabrano: 1}one{Izabrano: #}few{Izabrano: #}other{Izabrano: #}}</translation> <translation id="7087918508125750058">Izabrali ste <ph name="ITEM_COUNT" />. Opcije su dostupne pri vrhu ekrana</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 771831b..fcb8310 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">Искључи звук сајтова који пуштају звук</translation> <translation id="3602290021589620013">Преглед</translation> <translation id="3628308229821498208">Предложене претраге</translation> +<translation id="3636279694100170143">Сајтови које посећујете могу да потврде да сте стварни корисник, а не робот</translation> +<translation id="3649190289964910441">Сајт који посетите може да чува информације помоћу Chrome-а које потврђују да сте стварни корисник. Док настављате да прегледате, сајтови могу да проверавају са Chrome-ом и уверавају се на првом сајту да сте вероватно поуздани корисник.</translation> <translation id="3744111561329211289">Синхронизација у позадини</translation> <translation id="3763247130972274048">Двапут додирните видео лево или десно да бисте прескочили 10 сек</translation> <translation id="3794286421982011626">Сајт који посећујете може да чува информације о томе шта радите како би радио на очекивани начин – на пример, да бисте остали пријављени на сајт или да бисте сачували ставке у корпи за куповину. Сајтови често привремено чувају те информације на уређају.</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">Овим управља твој родитељ</translation> <translation id="4670064810192446073">Виртуелна реалност</translation> <translation id="4751476147751820511">Сензори за покрет или светло</translation> +<translation id="477781522763920796">Ово подешавање ради, а да не мора да вас идентификује или да дозволи сајтовима да виде историју прегледања.</translation> <translation id="4779083564647765204">Зумирање</translation> <translation id="4811450222531576619">Сазнајте више о њеном извору и теми</translation> <translation id="4836046166855586901">Питај када сајт жели да зна када активно користим овај уређај</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">Дозвољено је за актуелни претраживач</translation> <translation id="702275896380648118">Овај сајт одређује ствари које вам се свиђају, а затим предлаже огласе за друге сајтове. Овај сајт такође прима податке о вашим темама огласа из Chrome-а да би вам приказивао релевантније огласе.</translation> <translation id="702463548815491781">Препоручујемо вам када укључите TalkBack или приступ помоћу прекидача</translation> +<translation id="7050519587566342213">Прегледање је боље јер ће вам више веровати када прелазите са једног сајта на други.</translation> <translation id="7053983685419859001">Блокирај</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Изабрано: 1}one{Изабрано: #}few{Изабрано: #}other{Изабрано: #}}</translation> <translation id="7087918508125750058">Изабрали сте <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 e0f755f..64e21df 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
@@ -145,6 +145,8 @@ <translation id="3600792891314830896">آواز چلانے والی سائٹس کی آواز بند کریں</translation> <translation id="3602290021589620013">پیش منظر</translation> <translation id="3628308229821498208">تجویز کردہ تلاشیں</translation> +<translation id="3636279694100170143">آپ کی ملاحظہ کردہ سائٹس اس بات کی توثیق کر سکتی ہیں کہ آپ ایک بوٹ نہیں بلکہ ایک حقیقی صارف ہیں</translation> +<translation id="3649190289964910441">آپ کی ملاحظہ کردہ ایک ایسی سائٹ Chrome کے ساتھ معلومات کو محفوظ کر سکتی ہے جو یہ توثیق کرتی ہے کہ آپ ایک حقیقی صارف ہیں۔ چونکہ آپ براؤز کرتے رہتے ہیں، اس لیے سائٹس Chrome سے رابطہ کر کے پہلی سائٹ سے یہ توثیق کر سکتی ہیں کہ ہو سکتا ہے آپ ایک بھروسہ مند صارف ہوں۔</translation> <translation id="3744111561329211289">پس منظر کی مطابقت پذیری</translation> <translation id="3763247130972274048">10 سیکنڈ کو نظر انداز کرنے کے لیے، دائیں یا بائیں ویڈیو پر دوبار تھپتھپائیں</translation> <translation id="3794286421982011626">آپ کی ملاحظہ کی جانے والی سائٹ اس بارے میں معلومات محفوظ کر سکتی ہے کہ آپ کیا کر رہے ہیں تاکہ وہ آپ کی توقع کے مطابق کام کرے — مثال کے طور پر، آپ کو کسی سائٹ میں سائن ان رکھنے یا آپ کے شاپنگ کارٹ میں آئٹمز کو محفوظ کرنے کے لیے۔ اکثر سائٹس اس معلومات کو آپ کے آلے پر عارضی طور پر محفوظ کرتی ہیں۔</translation> @@ -197,6 +199,7 @@ <translation id="4645575059429386691">آپ کے والدین کے زیر انتظام</translation> <translation id="4670064810192446073">ورچوئل رئیلٹی</translation> <translation id="4751476147751820511">موشن یا لائٹ سینسرز</translation> +<translation id="477781522763920796">یہ ترتیب آپ کی شناخت کیے بغیر یا سائٹس کو آپ کی براؤزنگ کی سرگزشت دیکھنے کی اجازت دیے بغیر کام کرتی ہے۔</translation> <translation id="4779083564647765204">زوم</translation> <translation id="4811450222531576619">اس کے ماخذ اور موضوع کے بارے میں جانیں</translation> <translation id="4836046166855586901">پوچھیں کہ کب کوئی سائٹ یہ جاننا چاہتی ہے کہ فعال طور پر آپ اس آلہ کا استعمال کب کر رہے ہیں</translation> @@ -324,6 +327,7 @@ <translation id="7016516562562142042">موجودہ سرچ انجن کیلئے اجازت یافتہ</translation> <translation id="702275896380648118">یہ سائٹ آپ کی پسندیدہ چیزوں کا تعین کرتی ہے اور پھر دیگر سائٹس کو اشتہارات تجویز کرتی ہے۔ آپ کو مزید متعلقہ اشتہارات دکھانے کیلئے، یہ سائٹ Chrome سے آپ کے اشتہار کے موضوعات بھی وصول کرتی ہے۔</translation> <translation id="702463548815491781">TalkBack یا سوئچ رسائی آن ہونے پر تجویز کردہ</translation> +<translation id="7050519587566342213">براؤز کرنا زیادہ ہموار ہے کیونکہ زیادہ امکان ہے کہ آپ پر ایک سائٹ سے دوسری سائٹ پر جانے کے لیے بھروسہ کیا جائے۔</translation> <translation id="7053983685419859001">مسدود کریں</translation> <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 منتخب ہے}other{# منتخب کردہ}}</translation> <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> منتخب ہو گئے۔ اختیارات اسکرین کے اوپری حصہ کے قریب دستیاب ہیں</translation>
diff --git a/components/cast_streaming/renderer/BUILD.gn b/components/cast_streaming/renderer/BUILD.gn index 27e0205..fe268ef7 100644 --- a/components/cast_streaming/renderer/BUILD.gn +++ b/components/cast_streaming/renderer/BUILD.gn
@@ -2,8 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//testing/test.gni") - visibility = [ ":*" ] # Public target on which all external code requiring a resource_provider @@ -12,22 +10,17 @@ visibility += [ "*" ] public = [ "public/resource_provider_factory.h" ] sources = [ - "control/renderer_controller_proxy.cc", - "control/renderer_controller_proxy.h", - "frame/demuxer_connector.cc", - "frame/demuxer_connector.h", - "frame/frame_injecting_demuxer.cc", - "frame/frame_injecting_demuxer.h", "resource_provider_impl.cc", "resource_provider_impl.h", ] public_deps = [ ":resource_provider" ] deps = [ - ":buffer_requester", "//base", "//components/cast_streaming/public", "//components/cast_streaming/public:demuxer_stream_traits", "//components/cast_streaming/public/mojom", + "//components/cast_streaming/renderer/control", + "//components/cast_streaming/renderer/frame", "//media", "//media/mojo/common", "//media/mojo/mojom", @@ -40,122 +33,56 @@ # cast_streaming operations. This target is included in ALL chromium builds # that use the Chromium media pipeline, so be careful when adding new # dependencies here. -# TODO(crbug.com/1357085): Move the code that //content depends on to its -# own folder and enforce use via DEPS file(s). -source_set("wrapping_renderer_factory_selector") { - visibility += [ "*" ] - public = [ "public/wrapping_renderer_factory_selector.h" ] - sources = [ - "control/playback_command_forwarding_renderer.cc", - "control/playback_command_forwarding_renderer.h", - "control/playback_command_forwarding_renderer_factory.cc", - "control/playback_command_forwarding_renderer_factory.h", - "control/wrapping_renderer_factory_selector.cc", - ] - public_deps = [ "//media" ] - deps = [ - ":resource_provider", - "//base", - "//media", - "//media/mojo/mojom", - "//mojo/public/cpp/bindings", - ] - friend = [ ":unit_tests" ] -} - -# This target is a dependency of :wrapping_renderer_factory_selector, which is -# included in ALL chromium builds that use the Chromium media pipeline. -# Be careful when adding new dependencies here. source_set("resource_provider") { - visibility += [ "*" ] - public = [ "public/resource_provider.h" ] - sources = [ "resource_provider.cc" ] - public_deps = [ - "//base", - "//components/cast_streaming/public/mojom", - "//media/mojo/mojom", - "//mojo/public/cpp/bindings", + visibility += [ + "//components/cast_streaming/renderer/*", + "//content/renderer:renderer", ] -} - -# TODO(crbug.com/1357085): Once WebCodecs work is complete, see if this target -# can be merged into :renderer. -source_set("buffer_requester") { public = [ - "frame/buffer_requester.h", - "public/decoder_buffer_provider.h", + "public/resource_provider.h", + "public/wrapping_renderer_factory_selector.h", ] - sources = [ "frame/decoder_buffer_provider_impl.h" ] + sources = [ + "resource_provider.cc", + "wrapping_renderer_factory_selector.cc", + ] public_deps = [ "//base", - "//components/cast_streaming/public:demuxer_stream_traits", "//components/cast_streaming/public/mojom", "//media/mojo/mojom", "//mojo/public/cpp/bindings", - "//mojo/public/cpp/system", ] deps = [ - "//base", - "//components/cast_streaming/public:decoder_buffer_reader", + "//components/cast_streaming/renderer/control:renderer", "//media", - "//media/mojo/common", - "//mojo/public/cpp/system", ] - friend = [ ":unit_tests" ] } -source_set("web_codecs") { - # TODO(crbug.com/1357085): Move public headers here when they are used and move - # associated `deps` to `public_deps`. - public = [] - sources = [ - "web_codecs/delegating_decoder_buffer_provider.h", - "web_codecs/stream_control_channel.cc", - "web_codecs/stream_control_channel.h", - ] - deps = [ - ":buffer_requester", - "//base", - "//components/cast_streaming/public/mojom", - "//media/mojo/common", - "//media/mojo/mojom", - "//mojo/public/cpp/bindings", - ] - friend = [ ":unit_tests" ] +# This file is to be used with the WebCodecs-based receiver. An instance of this +# type will be directly handled by blink. +source_set("decoder_buffer_provider") { + visibility += [ "*" ] + public = [ "public/decoder_buffer_provider.h" ] + public_deps = [ "//base" ] } source_set("unit_tests") { testonly = true visibility += [ "//components/cast_streaming:unit_tests" ] - public = [] - sources = [ - "control/playback_command_forwarding_renderer_factory_unittest.cc", - "control/playback_command_forwarding_renderer_unittest.cc", - "frame/buffer_requester_unittest.cc", - "frame/decoder_buffer_provider_impl_unittest.cc", - "web_codecs/delegating_decoder_buffer_provider_unittest.cc", - ] + sources = [] deps = [ - ":buffer_requester", - ":web_codecs", - ":wrapping_renderer_factory_selector", - "//base", - "//base/test:test_support", - "//components/cast_streaming/public/mojom", - "//media:test_support", - "//media/", - "//media/mojo/common", - "//media/mojo/mojom", - "//mojo/public/cpp/bindings", - "//testing/gmock", - "//testing/gtest", - "//ui/gfx", + "//components/cast_streaming/renderer/common:unit_tests", + "//components/cast_streaming/renderer/control:unit_tests", + "//components/cast_streaming/renderer/web_codecs:unit_tests", ] - # The following are not used by the tests but have no explicit deps path on - # platforms that do not use this functionality. Add a deps here to ensure that - # they are built on all platforms even when bots don't build "all". + # The following are not used by the tests, but have been explicitly added + # as deps to ensure changes outside of this component do not remove their CQ + # coverage. # TODO(crbug.com/1357085): Add tests or handle this in a more appropriate way. - # Merging of other targets (see other TODOs) may address this. - deps += [ ":renderer" ] + deps += [ + ":decoder_buffer_provider", + ":renderer", + ":resource_provider", + ] }
diff --git a/components/cast_streaming/renderer/common/BUILD.gn b/components/cast_streaming/renderer/common/BUILD.gn new file mode 100644 index 0000000..8af60577 --- /dev/null +++ b/components/cast_streaming/renderer/common/BUILD.gn
@@ -0,0 +1,51 @@ +# 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. + +visibility = [ "//components/cast_streaming/renderer/*" ] + +source_set("common") { + public = [ + "buffer_requester.h", + "decoder_buffer_provider_impl.h", + ] + public_deps = [ + "//base", + "//components/cast_streaming/public:demuxer_stream_traits", + "//components/cast_streaming/public/mojom", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + "//mojo/public/cpp/system", + ] + deps = [ + "//base", + "//components/cast_streaming/public:decoder_buffer_reader", + "//components/cast_streaming/renderer:decoder_buffer_provider", + "//media", + "//media/mojo/common", + "//mojo/public/cpp/system", + ] +} + +source_set("unit_tests") { + testonly = true + public = [] + sources = [ + "buffer_requester_unittest.cc", + "decoder_buffer_provider_impl_unittest.cc", + ] + deps = [ + ":common", + "//base", + "//base/test:test_support", + "//components/cast_streaming/public/mojom", + "//media:test_support", + "//media/", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + "//testing/gmock", + "//testing/gtest", + "//ui/gfx", + ] +}
diff --git a/components/cast_streaming/renderer/common/DEPS b/components/cast_streaming/renderer/common/DEPS new file mode 100644 index 0000000..f1419a0d --- /dev/null +++ b/components/cast_streaming/renderer/common/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + "-components/cast_streaming/renderer", + "+components/cast_streaming/renderer/common", + "+components/cast_streaming/renderer/public", +]
diff --git a/components/cast_streaming/renderer/frame/buffer_requester.h b/components/cast_streaming/renderer/common/buffer_requester.h similarity index 95% rename from components/cast_streaming/renderer/frame/buffer_requester.h rename to components/cast_streaming/renderer/common/buffer_requester.h index c489e8c..b14db61 100644 --- a/components/cast_streaming/renderer/frame/buffer_requester.h +++ b/components/cast_streaming/renderer/common/buffer_requester.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 COMPONENTS_CAST_STREAMING_RENDERER_FRAME_BUFFER_REQUESTER_H_ -#define COMPONENTS_CAST_STREAMING_RENDERER_FRAME_BUFFER_REQUESTER_H_ +#ifndef COMPONENTS_CAST_STREAMING_RENDERER_COMMON_BUFFER_REQUESTER_H_ +#define COMPONENTS_CAST_STREAMING_RENDERER_COMMON_BUFFER_REQUESTER_H_ #include <memory> @@ -15,7 +15,7 @@ #include "base/task/sequenced_task_runner.h" #include "components/cast_streaming/public/demuxer_stream_traits.h" #include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" -#include "components/cast_streaming/renderer/frame/decoder_buffer_provider_impl.h" +#include "components/cast_streaming/renderer/common/decoder_buffer_provider_impl.h" #include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" #include "media/mojo/mojom/media_types.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/components/cast_streaming/renderer/frame/buffer_requester_unittest.cc b/components/cast_streaming/renderer/common/buffer_requester_unittest.cc similarity index 98% rename from components/cast_streaming/renderer/frame/buffer_requester_unittest.cc rename to components/cast_streaming/renderer/common/buffer_requester_unittest.cc index 747d1f45..874b795 100644 --- a/components/cast_streaming/renderer/frame/buffer_requester_unittest.cc +++ b/components/cast_streaming/renderer/common/buffer_requester_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 "components/cast_streaming/renderer/frame/buffer_requester.h" +#include "components/cast_streaming/renderer/common/buffer_requester.h" #include <utility>
diff --git a/components/cast_streaming/renderer/frame/decoder_buffer_provider_impl.h b/components/cast_streaming/renderer/common/decoder_buffer_provider_impl.h similarity index 94% rename from components/cast_streaming/renderer/frame/decoder_buffer_provider_impl.h rename to components/cast_streaming/renderer/common/decoder_buffer_provider_impl.h index 45bc8d46..02a2fcd7 100644 --- a/components/cast_streaming/renderer/frame/decoder_buffer_provider_impl.h +++ b/components/cast_streaming/renderer/common/decoder_buffer_provider_impl.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 COMPONENTS_CAST_STREAMING_RENDERER_FRAME_DECODER_BUFFER_PROVIDER_IMPL_H_ -#define COMPONENTS_CAST_STREAMING_RENDERER_FRAME_DECODER_BUFFER_PROVIDER_IMPL_H_ +#ifndef COMPONENTS_CAST_STREAMING_RENDERER_COMMON_DECODER_BUFFER_PROVIDER_IMPL_H_ +#define COMPONENTS_CAST_STREAMING_RENDERER_COMMON_DECODER_BUFFER_PROVIDER_IMPL_H_ #include <memory> @@ -143,4 +143,4 @@ } // namespace cast_streaming -#endif // COMPONENTS_CAST_STREAMING_RENDERER_FRAME_DECODER_BUFFER_PROVIDER_IMPL_H_ +#endif // COMPONENTS_CAST_STREAMING_RENDERER_COMMON_DECODER_BUFFER_PROVIDER_IMPL_H_
diff --git a/components/cast_streaming/renderer/frame/decoder_buffer_provider_impl_unittest.cc b/components/cast_streaming/renderer/common/decoder_buffer_provider_impl_unittest.cc similarity index 97% rename from components/cast_streaming/renderer/frame/decoder_buffer_provider_impl_unittest.cc rename to components/cast_streaming/renderer/common/decoder_buffer_provider_impl_unittest.cc index 5aac8dd1..6d43aaf 100644 --- a/components/cast_streaming/renderer/frame/decoder_buffer_provider_impl_unittest.cc +++ b/components/cast_streaming/renderer/common/decoder_buffer_provider_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 "components/cast_streaming/renderer/frame/decoder_buffer_provider_impl.h" +#include "components/cast_streaming/renderer/common/decoder_buffer_provider_impl.h" #include <memory>
diff --git a/components/cast_streaming/renderer/control/BUILD.gn b/components/cast_streaming/renderer/control/BUILD.gn new file mode 100644 index 0000000..29d2eed --- /dev/null +++ b/components/cast_streaming/renderer/control/BUILD.gn
@@ -0,0 +1,63 @@ +# 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. + +visibility = [ "//components/cast_streaming/renderer/*" ] + +source_set("control") { + public = [ "renderer_controller_proxy.h" ] + sources = [ "renderer_controller_proxy.cc" ] + public_deps = [ "//components/cast_streaming/renderer:resource_provider" ] + deps = [ + "//base", + "//components/cast_streaming/public", + "//components/cast_streaming/public:demuxer_stream_traits", + "//components/cast_streaming/public/mojom", + "//components/cast_streaming/renderer/frame", + "//media", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + "//url", + ] +} + +source_set("renderer") { + public = [ "playback_command_forwarding_renderer_factory.h" ] + sources = [ + "playback_command_forwarding_renderer.cc", + "playback_command_forwarding_renderer.h", + "playback_command_forwarding_renderer_factory.cc", + ] + deps = [ + "//base", + "//media", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + ] + friend = [ ":unit_tests" ] +} + +source_set("unit_tests") { + testonly = true + public = [] + sources = [ + "playback_command_forwarding_renderer_factory_unittest.cc", + "playback_command_forwarding_renderer_unittest.cc", + ] + deps = [ + ":control", + ":renderer", + "//base", + "//base/test:test_support", + "//components/cast_streaming/public/mojom", + "//media:test_support", + "//media/", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + "//testing/gmock", + "//testing/gtest", + "//ui/gfx", + ] +}
diff --git a/components/cast_streaming/renderer/control/DEPS b/components/cast_streaming/renderer/control/DEPS index 63bad46..08875a9 100644 --- a/components/cast_streaming/renderer/control/DEPS +++ b/components/cast_streaming/renderer/control/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "-components/cast_streaming/renderer", + "+components/cast_streaming/renderer/common", "+components/cast_streaming/renderer/control", "+components/cast_streaming/renderer/public", ]
diff --git a/components/cast_streaming/renderer/frame/BUILD.gn b/components/cast_streaming/renderer/frame/BUILD.gn new file mode 100644 index 0000000..20a8614be --- /dev/null +++ b/components/cast_streaming/renderer/frame/BUILD.gn
@@ -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. + +visibility = [ "//components/cast_streaming/renderer/*" ] + +source_set("frame") { + public = [ + "demuxer_connector.h", + "frame_injecting_demuxer.h", + ] + sources = [ + "demuxer_connector.cc", + "frame_injecting_demuxer.cc", + ] + public_deps = [ "//components/cast_streaming/renderer:resource_provider" ] + deps = [ + "//base", + "//components/cast_streaming/public:demuxer_stream_traits", + "//components/cast_streaming/public/mojom", + "//components/cast_streaming/renderer/common", + "//media", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + ] +}
diff --git a/components/cast_streaming/renderer/frame/DEPS b/components/cast_streaming/renderer/frame/DEPS index c70112f..910aedbda 100644 --- a/components/cast_streaming/renderer/frame/DEPS +++ b/components/cast_streaming/renderer/frame/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "-components/cast_streaming/renderer", + "+components/cast_streaming/renderer/common", "+components/cast_streaming/renderer/frame", "+components/cast_streaming/renderer/public", ]
diff --git a/components/cast_streaming/renderer/frame/frame_injecting_demuxer.cc b/components/cast_streaming/renderer/frame/frame_injecting_demuxer.cc index d75e324..d631458f 100644 --- a/components/cast_streaming/renderer/frame/frame_injecting_demuxer.cc +++ b/components/cast_streaming/renderer/frame/frame_injecting_demuxer.cc
@@ -12,7 +12,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "components/cast_streaming/public/demuxer_stream_traits.h" -#include "components/cast_streaming/renderer/frame/buffer_requester.h" +#include "components/cast_streaming/renderer/common/buffer_requester.h" #include "components/cast_streaming/renderer/frame/demuxer_connector.h" #include "media/base/audio_decoder_config.h" #include "media/base/decoder_buffer.h"
diff --git a/components/cast_streaming/renderer/web_codecs/BUILD.gn b/components/cast_streaming/renderer/web_codecs/BUILD.gn new file mode 100644 index 0000000..eed04ba --- /dev/null +++ b/components/cast_streaming/renderer/web_codecs/BUILD.gn
@@ -0,0 +1,47 @@ +# 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. + +visibility = [ "//components/cast_streaming/renderer/*" ] + +source_set("web_codecs") { + # TODO(crbug.com/1357085): Move public headers here when they are used and move + # associated `deps` to `public_deps`. + public = [] + sources = [ + "delegating_decoder_buffer_provider.h", + "stream_control_channel.cc", + "stream_control_channel.h", + ] + deps = [ + "//base", + "//components/cast_streaming/public/mojom", + "//components/cast_streaming/renderer:decoder_buffer_provider", + "//components/cast_streaming/renderer/common", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + ] + friend = [ ":unit_tests" ] +} + +source_set("unit_tests") { + testonly = true + public = [] + sources = [ "delegating_decoder_buffer_provider_unittest.cc" ] + deps = [ + ":web_codecs", + "//base", + "//base/test:test_support", + "//components/cast_streaming/public/mojom", + "//components/cast_streaming/renderer:decoder_buffer_provider", + "//media:test_support", + "//media/", + "//media/mojo/common", + "//media/mojo/mojom", + "//mojo/public/cpp/bindings", + "//testing/gmock", + "//testing/gtest", + "//ui/gfx", + ] +}
diff --git a/components/cast_streaming/renderer/web_codecs/stream_control_channel.h b/components/cast_streaming/renderer/web_codecs/stream_control_channel.h index ecd5fa3..1a6dfe9 100644 --- a/components/cast_streaming/renderer/web_codecs/stream_control_channel.h +++ b/components/cast_streaming/renderer/web_codecs/stream_control_channel.h
@@ -11,7 +11,7 @@ #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" -#include "components/cast_streaming/renderer/frame/buffer_requester.h" +#include "components/cast_streaming/renderer/common/buffer_requester.h" #include "components/cast_streaming/renderer/public/decoder_buffer_provider.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
diff --git a/components/cast_streaming/renderer/control/wrapping_renderer_factory_selector.cc b/components/cast_streaming/renderer/wrapping_renderer_factory_selector.cc similarity index 100% rename from components/cast_streaming/renderer/control/wrapping_renderer_factory_selector.cc rename to components/cast_streaming/renderer/wrapping_renderer_factory_selector.cc
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc index be028177..7b551c9 100644 --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -1015,11 +1015,6 @@ continue; } - // Users were never allowed to add user-specified patterns for these types - // so we can assume they are all origin scoped. - DCHECK(GURL(pattern.primary_pattern.ToString()).is_valid()); - DCHECK(GURL(pattern.secondary_pattern.ToString()).is_valid()); - if (pattern.secondary_pattern.IsValid() && pattern.secondary_pattern != pattern.primary_pattern) { SetContentSettingCustomScope(pattern.primary_pattern,
diff --git a/components/cronet/network_tasks_unittest.cc b/components/cronet/network_tasks_unittest.cc index 7422838..74e91e1 100644 --- a/components/cronet/network_tasks_unittest.cc +++ b/components/cronet/network_tasks_unittest.cc
@@ -121,15 +121,17 @@ } ~NetworkTasksTest() override { - PostToNetworkThreadSync( - base::BindLambdaForTesting([&]() { delete network_tasks_; })); + PostToNetworkThreadSync(base::BindOnce( + // Deletion ocurrs as a result of the argument going out of scope. + [](std::unique_ptr<CronetContext::NetworkTasks> tasks_to_be_deleted) {}, + std::move(network_tasks_))); } void Initialize() { PostToNetworkThreadSync( base::BindOnce(&CronetContext::NetworkTasks::Initialize, - base::Unretained(network_tasks_), network_task_runner_, - file_task_runner_, + base::Unretained(network_tasks_.get()), + network_task_runner_, file_task_runner_, std::make_unique<net::ProxyConfigServiceFixed>( net::ProxyConfigWithAnnotation::CreateDirect()))); } @@ -188,7 +190,7 @@ std::unique_ptr<base::Thread> file_thread_; scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; - raw_ptr<CronetContext::NetworkTasks> network_tasks_; + std::unique_ptr<CronetContext::NetworkTasks> network_tasks_; std::unique_ptr<net::URLRequest> url_request_; };
diff --git a/components/cronet/stale_host_resolver_unittest.cc b/components/cronet/stale_host_resolver_unittest.cc index 0de9a62..90371d1c 100644 --- a/components/cronet/stale_host_resolver_unittest.cc +++ b/components/cronet/stale_host_resolver_unittest.cc
@@ -215,8 +215,8 @@ void DestroyResolver() { DCHECK(stale_resolver_); - stale_resolver_ = nullptr; resolver_ = nullptr; + stale_resolver_.reset(); } void SetResolver(StaleHostResolver* stale_resolver, @@ -227,6 +227,8 @@ resolver_ = stale_resolver; } + void DropResolver() { resolver_ = nullptr; } + // Creates a cache entry for |kHostname| that is |age_sec| seconds old. void CreateCacheEntry(int age_sec, int error) { DCHECK(resolver_); @@ -359,10 +361,13 @@ scoped_refptr<MockHostResolverProc> mock_proc_; - raw_ptr<net::HostResolver> resolver_; StaleHostResolver::StaleOptions options_; + + // Must outlive `resolver_`. std::unique_ptr<StaleHostResolver> stale_resolver_; + raw_ptr<net::HostResolver> resolver_; + base::TimeTicks now_; std::unique_ptr<net::HostResolver::ResolveHostRequest> request_; bool resolve_pending_; @@ -725,6 +730,10 @@ EXPECT_EQ(1u, resolve_addresses().size()); EXPECT_EQ(kCacheAddress, resolve_addresses()[0].ToStringWithoutPort()); WaitForNetworkResolveComplete(); + + // Drop reference to resolver owned by local `context` above before + // it goes out-of-scope. + DropResolver(); } } // namespace
diff --git a/components/download/public/common/download_features.cc b/components/download/public/common/download_features.cc index fc7ffef..2c27ca1 100644 --- a/components/download/public/common/download_features.cc +++ b/components/download/public/common/download_features.cc
@@ -13,15 +13,6 @@ "UseDownloadOfflineContentProvider", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kDownloadAutoResumptionNative, - "DownloadsAutoResumptionNative", -#if BUILDFLAG(IS_ANDROID) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif -); - BASE_FEATURE(kParallelDownloading, "ParallelDownloading", #if BUILDFLAG(IS_ANDROID)
diff --git a/components/download/public/common/download_features.h b/components/download/public/common/download_features.h index e774fec0..7356d94 100644 --- a/components/download/public/common/download_features.h +++ b/components/download/public/common/download_features.h
@@ -16,9 +16,6 @@ COMPONENTS_DOWNLOAD_EXPORT BASE_DECLARE_FEATURE( kUseDownloadOfflineContentProvider); -// Whether download auto-resumptions are enabled in native. -COMPONENTS_DOWNLOAD_EXPORT BASE_DECLARE_FEATURE(kDownloadAutoResumptionNative); - // Whether a download can be handled by parallel jobs. COMPONENTS_DOWNLOAD_EXPORT BASE_DECLARE_FEATURE(kParallelDownloading);
diff --git a/components/enterprise/browser/reporting/report_uploader_unittest.cc b/components/enterprise/browser/reporting/report_uploader_unittest.cc index bea355de..bdec1776 100644 --- a/components/enterprise/browser/reporting/report_uploader_unittest.cc +++ b/components/enterprise/browser/reporting/report_uploader_unittest.cc
@@ -32,17 +32,26 @@ constexpr const char* kBrowserVersionNames[] = {"name1", "name2"}; constexpr char kResponseMetricsName[] = "Enterprise.CloudReportingResponse"; +// Returns a function that schedules a callback it is passed as second parameter +// with the given result. Useful to test `UploadReport` function. +auto ScheduleResponse(policy::CloudPolicyClient::Result result) { + return [result](auto /*report*/, auto callback) { + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); + }; +} + } // namespace class ReportUploaderTest : public ::testing::Test { public: - // Different CloudPolicyClient proxy function will be used in test cases based + // Different CloudPolicyClient functions will be used in test cases based // on the current operation system. They share same retry and error handling // behaviors provided by ReportUploader. #if BUILDFLAG(IS_CHROMEOS_ASH) -#define UploadReportProxy UploadChromeOsUserReportProxy +#define UploadReport UploadChromeOsUserReport #else -#define UploadReportProxy UploadChromeDesktopReportProxy +#define UploadReport UploadChromeDesktopReport #endif ReportUploaderTest() @@ -139,10 +148,9 @@ #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) TEST_F(ReportUploaderTest, NotRegisteredCrashes) { CreateUploader(/* retry_count = */ 1); - EXPECT_CALL(client_, UploadReportProxy(_, _)) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::CloudPolicyClient::NotRegistered())))); + EXPECT_CALL(client_, UploadReport) + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::CloudPolicyClient::NotRegistered()))); ReportRequestQueue requests; requests.push(std::make_unique<ReportRequest>(GetReportType())); base::test::TestFuture<ReportUploader::ReportStatus> future; @@ -154,10 +162,9 @@ TEST_F(ReportUploaderTest, PersistentError) { CreateUploader(/* retry_count = */ 1); - EXPECT_CALL(client_, UploadReportProxy(_, _)) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_SERVICE_DEVICE_NOT_FOUND)))); + EXPECT_CALL(client_, UploadReport) + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_SERVICE_DEVICE_NOT_FOUND))); UploadReportAndSetExpectation(/*number_of_request=*/2, ReportUploader::kPersistentError); RunNextTask(); @@ -169,14 +176,12 @@ TEST_F(ReportUploaderTest, RequestTooBigError) { CreateUploader(/* *retry_count = */ 2); - EXPECT_CALL(client_, UploadReportProxy(_, _)) + EXPECT_CALL(client_, UploadReport) .Times(2) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_REQUEST_TOO_LARGE)))) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_REQUEST_TOO_LARGE)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_REQUEST_TOO_LARGE))) + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_REQUEST_TOO_LARGE))); UploadReportAndSetExpectation(/*number_of_request=*/2, ReportUploader::kSuccess); RunNextTask(); @@ -188,13 +193,12 @@ } TEST_F(ReportUploaderTest, RetryAndSuccess) { - EXPECT_CALL(client_, UploadReportProxy(_, _)) + EXPECT_CALL(client_, UploadReport) .Times(2) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))) - .WillOnce(WithArgs<1>(policy::ScheduleResultCallback( - policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))) + .WillOnce(ScheduleResponse( + policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS))); CreateUploader(/* retry_count = */ 1); UploadReportAndSetExpectation(/*number_of_request=*/1, ReportUploader::kSuccess); @@ -214,11 +218,10 @@ } TEST_F(ReportUploaderTest, RetryAndFailedWithPersistentError) { - EXPECT_CALL(client_, UploadReportProxy(_, _)) + EXPECT_CALL(client_, UploadReport) .Times(1) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))); CreateUploader(/* retry_count = */ 1); UploadReportAndSetExpectation(/*number_of_request=*/1, ReportUploader::kPersistentError); @@ -231,11 +234,10 @@ // No response, request is retried. EXPECT_FALSE(has_responded_); // Error is changed. - EXPECT_CALL(client_, UploadReportProxy(_, _)) + EXPECT_CALL(client_, UploadReport) .Times(1) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_SERVICE_DEVICE_NOT_FOUND)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_SERVICE_DEVICE_NOT_FOUND))); RunNextTask(); EXPECT_TRUE(has_responded_); ::testing::Mock::VerifyAndClearExpectations(&client_); @@ -245,11 +247,10 @@ } TEST_F(ReportUploaderTest, RetryAndFailedWithTransientError) { - EXPECT_CALL(client_, UploadReportProxy(_, _)) + EXPECT_CALL(client_, UploadReport) .Times(2) - .WillRepeatedly(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))); + .WillRepeatedly(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))); CreateUploader(/* retry_count = */ 1); UploadReportAndSetExpectation(/*number_of_request=*/1, ReportUploader::kTransientError); @@ -275,35 +276,33 @@ // First report EXPECT_CALL( client_, - UploadReportProxy( - Property(&ReportRequest::DeviceReportRequestProto::browser_report, - Property(&em::BrowserReport::browser_version, - Eq(kBrowserVersionNames[0]))), + UploadReport( + Pointee(Property( + &ReportRequest::DeviceReportRequestProto::browser_report, + Property(&em::BrowserReport::browser_version, + Eq(kBrowserVersionNames[0])))), _)) .Times(3) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))) - .WillOnce(WithArgs<1>(policy::ScheduleResultCallback( - policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))) + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))) + .WillOnce(ScheduleResponse( + policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS))); // Second report EXPECT_CALL( client_, - UploadReportProxy( - Property(&ReportRequest::DeviceReportRequestProto::browser_report, - Property(&em::BrowserReport::browser_version, - Eq(kBrowserVersionNames[1]))), + UploadReport( + Pointee(Property( + &ReportRequest::DeviceReportRequestProto::browser_report, + Property(&em::BrowserReport::browser_version, + Eq(kBrowserVersionNames[1])))), _)) .Times(2) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))) - .WillOnce(WithArgs<1>( - policy::ScheduleResultCallback(policy::CloudPolicyClient::Result( - policy::DM_STATUS_TEMPORARY_UNAVAILABLE)))); + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))) + .WillOnce(ScheduleResponse(policy::CloudPolicyClient::Result( + policy::DM_STATUS_TEMPORARY_UNAVAILABLE))); } CreateUploader(/* retry_count = */ 2); UploadReportAndSetExpectation(/*number_of_request=*/2, @@ -334,9 +333,9 @@ // Verified three DM server error that is transient. TEST_P(ReportUploaderTestWithTransientError, WithoutRetry) { - EXPECT_CALL(client_, UploadReportProxy(_, _)) - .WillOnce(WithArgs<1>(policy::ScheduleResultCallback( - policy::CloudPolicyClient::Result(GetParam())))); + EXPECT_CALL(client_, UploadReport) + .WillOnce( + ScheduleResponse(policy::CloudPolicyClient::Result(GetParam()))); UploadReportAndSetExpectation(/*number_of_request=*/2, ReportUploader::kTransientError); task_environment_.FastForwardBy(base::TimeDelta()); @@ -355,14 +354,14 @@ switch (GetReportType()) { case ReportType::kFull: case ReportType::kBrowserVersion: - EXPECT_CALL(client_, UploadReportProxy(_, _)) - .WillOnce(WithArgs<1>(policy::ScheduleResultCallback( - policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS)))); + EXPECT_CALL(client_, UploadReport) + .WillOnce(ScheduleResponse( + policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS))); break; case ReportType::kProfileReport: - EXPECT_CALL(client_, UploadChromeProfileReportProxy(_, _)) - .WillOnce(WithArgs<1>(policy::ScheduleResultCallback( - policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS)))); + EXPECT_CALL(client_, UploadChromeProfileReport) + .WillOnce(ScheduleResponse( + policy::CloudPolicyClient::Result(policy::DM_STATUS_SUCCESS))); break; }
diff --git a/components/enterprise/common/proto/connectors.proto b/components/enterprise/common/proto/connectors.proto index e1fe6cd..a53feaf 100644 --- a/components/enterprise/common/proto/connectors.proto +++ b/components/enterprise/common/proto/connectors.proto
@@ -194,6 +194,8 @@ // to the OU-based message found in the client-side policy or at the // top-level of the Result message. optional CustomMessage custom_message = 4; + // Matched URL Category of the URL. + optional string url_category = 5; } repeated TriggeredRule triggered_rules = 3;
diff --git a/components/exo/surface.cc b/components/exo/surface.cc index 213c410..514c5b12 100644 --- a/components/exo/surface.cc +++ b/components/exo/surface.cc
@@ -1784,4 +1784,16 @@ return nullptr; } +void Surface::SetClientAccessibilityId(int id) { + if (!window_) { + return; + } + + if (id >= 0) { + exo::SetShellClientAccessibilityId(window_.get(), id); + } else { + exo::SetShellClientAccessibilityId(window_.get(), absl::nullopt); + } +} + } // namespace exo
diff --git a/components/exo/surface.h b/components/exo/surface.h index 9f3b572..a670aa9 100644 --- a/components/exo/surface.h +++ b/components/exo/surface.h
@@ -450,6 +450,10 @@ // if one can not be determined. See go/secure-exo-ids for more details. SecurityDelegate* GetSecurityDelegate(); + // Sets the accessibility window ID sent from the shell client to the window. + // A negative number removes it. + void SetClientAccessibilityId(int id); + private: struct State { State();
diff --git a/components/exo/wayland/protocol/aura-shell.xml b/components/exo/wayland/protocol/aura-shell.xml index 7a55295b..f889bf0 100644 --- a/components/exo/wayland/protocol/aura-shell.xml +++ b/components/exo/wayland/protocol/aura-shell.xml
@@ -24,7 +24,7 @@ DEALINGS IN THE SOFTWARE. </copyright> - <interface name="zaura_shell" version="50"> + <interface name="zaura_shell" version="51"> <description summary="aura_shell"> The global interface exposing aura shell capabilities is used to instantiate an interface extension for a wl_surface object. @@ -160,7 +160,7 @@ </request> </interface> - <interface name="zaura_surface" version="47"> + <interface name="zaura_surface" version="51"> <description summary="aura shell interface to a wl_surface"> An additional interface to a wl_surface object, which allows the client to access aura shell specific functionality for surface. @@ -588,6 +588,15 @@ Informs the client that the tooltip is hidden. </description> </event> + + <!-- Version 51 additions --> + <request name="set_accessibility_id" since="51"> + <description summary="set accessibility ID to the surface"> + Set accessibility window ID to the surface. A negative number removes + the existing accessibility ID from the surface. + </description> + <arg name="id" type="int" summary="Accessibility ID. Negative number removes existing accessibility ID from the surface."/> + </request> </interface> <interface name="zaura_output" version="45">
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc index 97fa7ac..f3152ed 100644 --- a/components/exo/wayland/zaura_shell.cc +++ b/components/exo/wayland/zaura_shell.cc
@@ -297,6 +297,12 @@ GetUserDataAs<AuraSurface>(resource)->HideTooltip(); } +void aura_surface_set_accessibility_id(wl_client* client, + wl_resource* resource, + int32_t id) { + GetUserDataAs<AuraSurface>(resource)->SetAccessibilityId(id); +} + const struct zaura_surface_interface aura_surface_implementation = { aura_surface_set_frame, aura_surface_set_parent, @@ -328,6 +334,7 @@ aura_surface_release, aura_surface_show_tooltip, aura_surface_hide_tooltip, + aura_surface_set_accessibility_id, }; } // namespace @@ -709,6 +716,10 @@ ash::Shell::Get()->tooltip_controller()->UpdateTooltip(window); } +void AuraSurface::SetAccessibilityId(int id) { + surface_->SetClientAccessibilityId(id); +} + chromeos::OrientationType OrientationLock(uint32_t orientation_lock) { switch (orientation_lock) { case ZAURA_TOPLEVEL_ORIENTATION_LOCK_NONE:
diff --git a/components/exo/wayland/zaura_shell.h b/components/exo/wayland/zaura_shell.h index 2c682a82..1c253a9 100644 --- a/components/exo/wayland/zaura_shell.h +++ b/components/exo/wayland/zaura_shell.h
@@ -31,7 +31,7 @@ namespace wayland { class SerialTracker; -constexpr uint32_t kZAuraShellVersion = 50; +constexpr uint32_t kZAuraShellVersion = 51; // Adds bindings to the Aura Shell. Normally this implies Ash on ChromeOS // builds. On non-ChromeOS builds the protocol provides access to Aura windowing @@ -83,6 +83,7 @@ const base::TimeDelta& show_delay, const base::TimeDelta& hide_delay); void HideTooltip(); + void SetAccessibilityId(int id); // Overridden from SurfaceObserver: void OnSurfaceDestroying(Surface* surface) override;
diff --git a/components/exo/wayland/zaura_shell_unittest.cc b/components/exo/wayland/zaura_shell_unittest.cc index 9f80972e..e359c6d5 100644 --- a/components/exo/wayland/zaura_shell_unittest.cc +++ b/components/exo/wayland/zaura_shell_unittest.cc
@@ -17,6 +17,7 @@ #include "base/time/time.h" #include "components/exo/buffer.h" #include "components/exo/shell_surface.h" +#include "components/exo/shell_surface_util.h" #include "components/exo/test/exo_test_base.h" #include "components/exo/test/shell_surface_builder.h" #include "components/exo/wayland/scoped_wl.h" @@ -426,6 +427,19 @@ aura_surface().SetFullscreenMode(ZAURA_SURFACE_FULLSCREEN_MODE_IMMERSIVE); } +TEST_F(ZAuraSurfaceTest, CanSetAccessibilityId) { + aura_surface().SetAccessibilityId(123); + + EXPECT_EQ(123, exo::GetShellClientAccessibilityId(surface().window())); +} + +TEST_F(ZAuraSurfaceTest, CanUnsetAccessibilityId) { + aura_surface().SetAccessibilityId(-1); + + EXPECT_FALSE( + exo::GetShellClientAccessibilityId(surface().window()).has_value()); +} + // Test without setting surfaces on SetUp(). using ZAuraSurfaceCustomTest = test::ExoTestBase;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java index 6890490..dff348fb 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -87,7 +87,8 @@ */ @IntDef({InterceptScheme.NOT_INTERCEPTED, InterceptScheme.UNKNOWN_SCHEME, InterceptScheme.ACCEPTED_SCHEME, InterceptScheme.INTENT_SCHEME, - InterceptScheme.MDOC_SCHEME, InterceptScheme.NUM_ENTRIES}) + InterceptScheme.MDOC_SCHEME, InterceptScheme.OPENID4VP_SCHEME, + InterceptScheme.NUM_ENTRIES}) @Retention(RetentionPolicy.SOURCE) public @interface InterceptScheme { int NOT_INTERCEPTED = 0; @@ -95,10 +96,12 @@ int ACCEPTED_SCHEME = 2; int INTENT_SCHEME = 3; int MDOC_SCHEME = 4; - int NUM_ENTRIES = 5; + int OPENID4VP_SCHEME = 5; + int NUM_ENTRIES = 6; } private static final List<String> MDOC_SCHEMES = new ArrayList<String>(Arrays.asList("mdoc", "mdl-openid4vp", "mdoc-openid4vp")); + private static final String OPENID4VP_SCHEME = "openid4vp"; private static final String MAIN_FRAME_INTENT_LAUNCH_NAME = "Android.Intent.MainFrameIntentLaunch"; @@ -284,6 +287,8 @@ scheme = InterceptScheme.INTENT_SCHEME; } else if (MDOC_SCHEMES.contains(escapedUrl.getScheme())) { scheme = InterceptScheme.MDOC_SCHEME; + } else if (OPENID4VP_SCHEME.equals(escapedUrl.getScheme())) { + scheme = InterceptScheme.OPENID4VP_SCHEME; } RecordHistogram.recordEnumeratedHistogram( "Android.TabNavigationIntercept.Scheme", scheme, InterceptScheme.NUM_ENTRIES);
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc index 441482a0..3675349 100644 --- a/components/feed/core/v2/proto_util.cc +++ b/components/feed/core/v2/proto_util.cc
@@ -162,11 +162,7 @@ feed_request.add_client_capability(Capability::AMP_GROUP_DATASTORE); } - if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater)) { - feed_request.add_client_capability(Capability::READ_LATER); - } else { - feed_request.add_client_capability(Capability::DOWNLOAD_LINK); - } + feed_request.add_client_capability(Capability::READ_LATER); #if BUILDFLAG(IS_ANDROID) // Note that the Crow feature is referenced as THANK_CREATOR within the feed.
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc index bcfef80..d27ab441 100644 --- a/components/feed/core/v2/proto_util_unittest.cc +++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -222,10 +222,11 @@ Contains(feedwire::Capability::AMP_GROUP_DATASTORE)); } +// ReadLater is enabled by default everywhere with the exception of iOS which +// has a build-flag to enable it. +#if !BUILDFLAG(IS_IOS) + TEST(ProtoUtilTest, ReadLaterEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures({reading_list::switches::kReadLater}, - {}); feedwire::FeedRequest request = CreateFeedQueryRefreshRequest( StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH, @@ -239,22 +240,7 @@ Not(Contains((feedwire::Capability::DOWNLOAD_LINK)))); } -TEST(ProtoUtilTest, ReadLaterDisabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures({}, - {reading_list::switches::kReadLater}); - feedwire::FeedRequest request = - CreateFeedQueryRefreshRequest( - StreamType(StreamKind::kForYou), feedwire::FeedQuery::MANUAL_REFRESH, - /*request_metadata=*/{}, - /*consistency_token=*/std::string(), SingleWebFeedEntryPoint::kOther) - .feed_request(); - - ASSERT_THAT(request.client_capability(), - Contains(feedwire::Capability::DOWNLOAD_LINK)); - ASSERT_THAT(request.client_capability(), - Not(Contains((feedwire::Capability::READ_LATER)))); -} +#endif #if BUILDFLAG(IS_ANDROID) TEST(ProtoUtilTest, CrowButtonEnabled) {
diff --git a/components/history_clusters/core/filter_cluster_processor.cc b/components/history_clusters/core/filter_cluster_processor.cc index afecf1dc..5035a75 100644 --- a/components/history_clusters/core/filter_cluster_processor.cc +++ b/components/history_clusters/core/filter_cluster_processor.cc
@@ -10,18 +10,29 @@ #include "components/history_clusters/core/config.h" #include "components/history_clusters/core/history_clusters_types.h" #include "components/history_clusters/core/history_clusters_util.h" +#include "components/history_clusters/core/on_device_clustering_util.h" namespace history_clusters { namespace { +void RecordClusterFilterReasonHistogram( + ClusteringRequestSource clustering_request_source, + ClusterFilterReason reason) { + base::UmaHistogramEnumeration( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason" + + GetHistogramNameSliceForRequestSource(clustering_request_source), + reason); +} + // Returns whether `filter_params` is a filter that would actually filter // clusters out. bool IsFunctionalFilter(QueryClustersFilterParams filter_params) { return filter_params.min_visits_with_images > 0 || !filter_params.categories.empty() || filter_params.is_search_initiated || - filter_params.has_related_searches; + filter_params.has_related_searches || + filter_params.is_shown_on_prominent_ui_surfaces; } // Returns whether `visit` could possibly be classified as one of the categories @@ -37,66 +48,16 @@ return false; } -// Returns whether `cluster` is included in filter as specified by -// `filter_params`. -bool IsIncludedInFilter( - const history::Cluster& cluster, - const raw_ref<QueryClustersFilterParams> filter_params) { - int num_visits_with_images = 0; - size_t num_visits_in_allowed_categories = 0; - bool is_search_initiated = false; - bool has_related_searches = false; - - for (const auto& visit : cluster.visits) { - if (visit.annotated_visit.content_annotations.has_url_keyed_image) { - num_visits_with_images++; - } - if (!filter_params->categories.empty() && - IsVisitInCategories(visit, filter_params->categories)) { - num_visits_in_allowed_categories++; - } - if (!is_search_initiated && - !visit.annotated_visit.content_annotations.search_terms.empty()) { - is_search_initiated = true; - } - if (!has_related_searches && - !visit.annotated_visit.content_annotations.related_searches.empty()) { - has_related_searches = true; - } - } - - // TODO(b/265301309): Figure out if we should just incorporate the - // sensitivity, single visit, and other filters here instead. - - // TODO(b/265301309): Add filter reason metrics. - - if (num_visits_with_images < filter_params->min_visits_with_images) { - return false; - } - if (!filter_params->categories.empty() && - num_visits_in_allowed_categories < - GetConfig().number_interesting_visits_filter_threshold) { - return false; - } - if (filter_params->is_search_initiated && !is_search_initiated) { - return false; - } - if (filter_params->has_related_searches && !has_related_searches) { - return false; - } - - // If it gets here, the cluster has passed all filter conditions. - return true; -} - } // namespace FilterClusterProcessor::FilterClusterProcessor( ClusteringRequestSource clustering_request_source, - QueryClustersFilterParams& filter_params) + QueryClustersFilterParams& filter_params, + bool engagement_score_provider_is_valid) : clustering_request_source_(clustering_request_source), should_run_filter_(IsFunctionalFilter(filter_params)), - filter_params_(filter_params) {} + filter_params_(filter_params), + engagement_score_provider_is_valid_(engagement_score_provider_is_valid) {} FilterClusterProcessor::~FilterClusterProcessor() = default; void FilterClusterProcessor::ProcessClusters( @@ -110,12 +71,11 @@ GetHistogramNameSliceForRequestSource(clustering_request_source_), clusters->size()); - clusters->erase(base::ranges::remove_if(*clusters, - [&](auto& cluster) { - return !IsIncludedInFilter( - cluster, filter_params_); - }), - clusters->end()); + clusters->erase( + base::ranges::remove_if( + *clusters, + [&](auto& cluster) { return !DoesClusterMatchFilter(cluster); }), + clusters->end()); base::UmaHistogramCounts1000( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter" + @@ -123,4 +83,94 @@ clusters->size()); } +bool FilterClusterProcessor::DoesClusterMatchFilter( + const history::Cluster& cluster) const { + int num_visits_with_images = 0; + size_t num_visits_in_allowed_categories = 0; + bool is_search_initiated = false; + bool has_related_searches = false; + size_t num_interesting_visits = 0; + bool is_content_visible = true; + + for (const auto& visit : cluster.visits) { + if (visit.annotated_visit.content_annotations.has_url_keyed_image) { + num_visits_with_images++; + } + if (!filter_params_->categories.empty() && + IsVisitInCategories(visit, filter_params_->categories)) { + num_visits_in_allowed_categories++; + } + if (!is_search_initiated && + !visit.annotated_visit.content_annotations.search_terms.empty()) { + is_search_initiated = true; + } + if (!has_related_searches && + !visit.annotated_visit.content_annotations.related_searches.empty()) { + has_related_searches = true; + } + if (engagement_score_provider_is_valid_ && !IsNoisyVisit(visit)) { + num_interesting_visits++; + } + if (is_content_visible) { + float visibility_score = visit.annotated_visit.content_annotations + .model_annotations.visibility_score; + if (visibility_score >= 0 && + visibility_score < GetConfig().content_visibility_threshold) { + is_content_visible = false; + } + } + } + + bool matches_filter = true; + if (num_visits_with_images < filter_params_->min_visits_with_images) { + RecordClusterFilterReasonHistogram(clustering_request_source_, + ClusterFilterReason::kNotEnoughImages); + matches_filter = false; + } + if (!filter_params_->categories.empty() && + num_visits_in_allowed_categories < + GetConfig().number_interesting_visits_filter_threshold) { + RecordClusterFilterReasonHistogram(clustering_request_source_, + ClusterFilterReason::kNoCategoryMatch); + matches_filter = false; + } + if (filter_params_->is_search_initiated && !is_search_initiated) { + RecordClusterFilterReasonHistogram( + clustering_request_source_, ClusterFilterReason::kNotSearchInitiated); + matches_filter = false; + } + if (filter_params_->has_related_searches && !has_related_searches) { + RecordClusterFilterReasonHistogram(clustering_request_source_, + ClusterFilterReason::kNoRelatedSearches); + matches_filter = false; + } + if (filter_params_->is_shown_on_prominent_ui_surfaces) { + if (engagement_score_provider_is_valid_ && + num_interesting_visits < + GetConfig().number_interesting_visits_filter_threshold) { + RecordClusterFilterReasonHistogram( + clustering_request_source_, + ClusterFilterReason::kNotEnoughInterestingVisits); + matches_filter = false; + } + if (cluster.visits.size() <= 1) { + RecordClusterFilterReasonHistogram(clustering_request_source_, + ClusterFilterReason::kSingleVisit); + matches_filter = false; + } + if (!is_content_visible) { + RecordClusterFilterReasonHistogram( + clustering_request_source_, ClusterFilterReason::kNotContentVisible); + matches_filter = false; + } + } + + if (matches_filter) { + RecordClusterFilterReasonHistogram(clustering_request_source_, + ClusterFilterReason::kNotFiltered); + } + + return matches_filter; +} + } // namespace history_clusters
diff --git a/components/history_clusters/core/filter_cluster_processor.h b/components/history_clusters/core/filter_cluster_processor.h index fc47f18..05bdda3 100644 --- a/components/history_clusters/core/filter_cluster_processor.h +++ b/components/history_clusters/core/filter_cluster_processor.h
@@ -13,18 +13,40 @@ enum class ClusteringRequestSource; struct QueryClustersFilterParams; +// The reasons why a cluster can be filtered via this processor. +enum class ClusterFilterReason { + kNotFiltered = 0, + kNotEnoughImages = 1, + kNoCategoryMatch = 2, + kNotSearchInitiated = 3, + kNoRelatedSearches = 4, + kNotEnoughInterestingVisits = 5, + kSingleVisit = 6, + kNotContentVisible = 7, + + // Add above here and make sure to keep `ClusterFilterReason` up to date in + // enums.xml. + + kMaxValue = kNotContentVisible +}; + // A cluster processor that removes clusters that do not match the filter. class FilterClusterProcessor : public ClusterProcessor { public: explicit FilterClusterProcessor( ClusteringRequestSource clustering_request_source, - QueryClustersFilterParams& filter_params); + QueryClustersFilterParams& filter_params, + bool engagement_score_provider_is_valid); ~FilterClusterProcessor() override; // ClusterProcessor: void ProcessClusters(std::vector<history::Cluster>* clusters) override; private: + // Returns whether `cluster` matches the filter as specified by + // `filter_params_`. + bool DoesClusterMatchFilter(const history::Cluster& cluster) const; + // The clustering request source that requires this filtering. Used for // metrics purposes. ClusteringRequestSource clustering_request_source_; @@ -35,6 +57,11 @@ // The parameters that the clusters are filtered with. const raw_ref<QueryClustersFilterParams> filter_params_; + + // Whether the engagement score provider is valid and the "noisiness" of a + // visit should be considered as a filter for showing on prominent UI + // surfaces. + bool engagement_score_provider_is_valid_; }; } // namespace history_clusters
diff --git a/components/history_clusters/core/filter_cluster_processor_unittest.cc b/components/history_clusters/core/filter_cluster_processor_unittest.cc index 86d5547..7b03abde 100644 --- a/components/history_clusters/core/filter_cluster_processor_unittest.cc +++ b/components/history_clusters/core/filter_cluster_processor_unittest.cc
@@ -6,6 +6,7 @@ #include "base/test/metrics/histogram_tester.h" #include "components/history_clusters/core/clustering_test_utils.h" +#include "components/history_clusters/core/config.h" #include "components/history_clusters/core/history_clusters_types.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -13,6 +14,8 @@ namespace history_clusters { namespace { +using ::testing::ElementsAre; + std::vector<history::Cluster> GetTestClusters() { history::Cluster meets_no_criteria; meets_no_criteria.cluster_id = 1; @@ -59,11 +62,28 @@ no_related_searches.visits[1] .annotated_visit.content_annotations.related_searches.clear(); - return {meets_no_criteria, meets_all_criteria, not_enough_images, - no_categories, no_search_terms, no_related_searches}; -} + history::Cluster noisy_cluster = meets_all_criteria; + noisy_cluster.cluster_id = 7; + for (auto& noisy_cluster_visit : noisy_cluster.visits) { + noisy_cluster_visit.engagement_score = + GetConfig().noisy_cluster_visits_engagement_threshold + 1; + noisy_cluster_visit.annotated_visit.content_annotations.search_terms = u""; + } -using ::testing::ElementsAre; + history::Cluster single_visit_cluster = meets_all_criteria; + single_visit_cluster.cluster_id = 8; + single_visit_cluster.visits = {meets_all_criteria.visits[0]}; + + history::Cluster non_visible_cluster = meets_all_criteria; + non_visible_cluster.cluster_id = 9; + non_visible_cluster.visits[0] + .annotated_visit.content_annotations.model_annotations.visibility_score = + GetConfig().content_visibility_threshold - 0.1; + + return {meets_no_criteria, meets_all_criteria, not_enough_images, + no_categories, no_search_terms, no_related_searches, + noisy_cluster, single_visit_cluster, non_visible_cluster}; +} class FilterClusterProcessorTest : public ::testing::Test { public: @@ -73,9 +93,11 @@ // Runs the test clusters through a `FilterClusterProcessor` with // `filter_params`. Returns the ids of the clusters that remain. std::vector<int64_t> GetTestClusterIdsThatPassFilter( - QueryClustersFilterParams& filter_params) { + QueryClustersFilterParams& filter_params, + bool engagement_score_provider_is_valid = true) { auto cluster_processor = std::make_unique<FilterClusterProcessor>( - ClusteringRequestSource::kNewTabPage, filter_params); + ClusteringRequestSource::kNewTabPage, filter_params, + engagement_score_provider_is_valid); std::vector<history::Cluster> clusters = GetTestClusters(); cluster_processor->ProcessClusters(&clusters); @@ -95,7 +117,7 @@ QueryClustersFilterParams params; EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), - ElementsAre(1, 2, 3, 4, 5, 6)); + ElementsAre(1, 2, 3, 4, 5, 6, 7, 8, 9)); // Filter should not have been run, so expect these counts to be 0. histogram_tester.ExpectTotalCount( @@ -106,6 +128,10 @@ "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", 0); + histogram_tester.ExpectTotalCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + 0); } TEST_F(FilterClusterProcessorTest, OnlyImageConstraint) { @@ -114,16 +140,25 @@ QueryClustersFilterParams params; params.min_visits_with_images = 2; - EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), ElementsAre(2, 4, 5, 6)); + EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), + ElementsAre(2, 4, 5, 6, 7, 9)); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." "NewTabPage", - 6, 1); + 9, 1); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", - 4, 1); + 6, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 6); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotEnoughImages, 3); } TEST_F(FilterClusterProcessorTest, OnlyCategoryConstraint) { @@ -132,16 +167,25 @@ QueryClustersFilterParams params; params.categories = {"category1", "category2"}; - EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), ElementsAre(2, 3, 5, 6)); + EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), + ElementsAre(2, 3, 5, 6, 7, 8, 9)); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." "NewTabPage", - 6, 1); + 9, 1); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", - 4, 1); + 7, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 7); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNoCategoryMatch, 2); } TEST_F(FilterClusterProcessorTest, OnlySearchInitiated) { @@ -150,16 +194,25 @@ QueryClustersFilterParams params; params.is_search_initiated = true; - EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), ElementsAre(2, 3, 4, 6)); + EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), + ElementsAre(2, 3, 4, 6, 9)); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." "NewTabPage", - 6, 1); + 9, 1); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", - 4, 1); + 5, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 5); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotSearchInitiated, 4); } TEST_F(FilterClusterProcessorTest, OnlyRelatedSearches) { @@ -168,16 +221,98 @@ QueryClustersFilterParams params; params.has_related_searches = true; - EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), ElementsAre(2, 3, 4, 5)); + EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), + ElementsAre(2, 3, 4, 5, 7, 9)); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." "NewTabPage", - 6, 1); + 9, 1); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", - 4, 1); + 6, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 6); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNoRelatedSearches, 3); +} + +TEST_F(FilterClusterProcessorTest, OnlyShownOnProminentUiSurfacesNoEngagement) { + base::HistogramTester histogram_tester; + + QueryClustersFilterParams params; + params.is_shown_on_prominent_ui_surfaces = true; + + EXPECT_THAT(GetTestClusterIdsThatPassFilter( + params, /*engagement_score_provider_is_valid=*/false), + ElementsAre(2, 3, 4, 5, 6, 7)); + + histogram_tester.ExpectUniqueSample( + "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." + "NewTabPage", + 9, 1); + histogram_tester.ExpectUniqueSample( + "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." + "NewTabPage", + 6, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 6); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotEnoughInterestingVisits, 0); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kSingleVisit, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotContentVisible, 1); +} + +TEST_F(FilterClusterProcessorTest, + OnlyShownOnProminentUiSurfacesWithEngagement) { + base::HistogramTester histogram_tester; + + QueryClustersFilterParams params; + params.is_shown_on_prominent_ui_surfaces = true; + + EXPECT_THAT(GetTestClusterIdsThatPassFilter( + params, /*engagement_score_provider_is_valid=*/true), + ElementsAre(2, 3, 4, 5, 6)); + + histogram_tester.ExpectUniqueSample( + "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." + "NewTabPage", + 9, 1); + histogram_tester.ExpectUniqueSample( + "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." + "NewTabPage", + 5, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 5); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotEnoughInterestingVisits, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kSingleVisit, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotContentVisible, 1); } TEST_F(FilterClusterProcessorTest, FullFilter) { @@ -188,17 +323,50 @@ params.categories = {"category1", "category2"}; params.is_search_initiated = true; params.has_related_searches = true; + params.is_shown_on_prominent_ui_surfaces = true; EXPECT_THAT(GetTestClusterIdsThatPassFilter(params), ElementsAre(2)); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PreFilter." "NewTabPage", - 6, 1); + 9, 1); histogram_tester.ExpectUniqueSample( "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter." "NewTabPage", 1, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotFiltered, 1); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotEnoughImages, 3); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNoCategoryMatch, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotSearchInitiated, 4); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNoRelatedSearches, 3); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotEnoughInterestingVisits, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kSingleVisit, 2); + histogram_tester.ExpectBucketCount( + "History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason." + "NewTabPage", + ClusterFilterReason::kNotContentVisible, 1); } } // namespace
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc index 929dcd7b..a0bbf04 100644 --- a/components/history_clusters/core/on_device_clustering_backend.cc +++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -443,7 +443,10 @@ clustering_request_source, base::OwnedRef(std::move(filter_params)), engagement_score_provider_ != nullptr, std::move(clusters), base::OwnedRef(std::move(entity_metadata_map)), - /*calculate_triggerability=*/true), + // Only Journeys has both non-prominent and prominent UI surfaces and + // requires searchability. + /*calculate_triggerability=*/clustering_request_source == + ClusteringRequestSource::kJourneysPage), std::move(callback)); } @@ -534,7 +537,8 @@ &entity_id_to_entity_metadata_map)); } cluster_processors.push_back(std::make_unique<FilterClusterProcessor>( - clustering_request_source, filter_params)); + clustering_request_source, filter_params, + engagement_score_provider_is_valid)); // TODO(b/265301309): Figure out if we should dedupe in the clustering // processing step instead so that the filter is applied correctly.
diff --git a/components/image_service/BUILD.gn b/components/image_service/BUILD.gn index 2559db5..94666ebc 100644 --- a/components/image_service/BUILD.gn +++ b/components/image_service/BUILD.gn
@@ -17,6 +17,8 @@ "//components/google/core/common", "//components/keyed_service/core", "//components/omnibox/browser", + "//components/optimization_guide/core", + "//components/optimization_guide/proto:optimization_guide_proto", "//components/search_engines", "//components/sync/driver", "//components/unified_consent", @@ -32,7 +34,11 @@ ":image_service", "//base/test:test_support", "//components/omnibox/browser", + "//components/optimization_guide/core", + "//components/optimization_guide/core:test_support", + "//components/optimization_guide/proto:optimization_guide_proto", "//components/sync:test_support", + "//testing/gmock", "//testing/gtest", ] }
diff --git a/components/image_service/DEPS b/components/image_service/DEPS index 547be81..780994bca 100644 --- a/components/image_service/DEPS +++ b/components/image_service/DEPS
@@ -4,6 +4,7 @@ "+components/search_engines", "+components/sync/driver", "+components/sync/test", + "+components/optimization_guide", "+components/unified_consent", "+mojo/public/cpp", "+services/network/public/cpp",
diff --git a/components/image_service/image_service.cc b/components/image_service/image_service.cc index a617c32..39fc0d6 100644 --- a/components/image_service/image_service.cc +++ b/components/image_service/image_service.cc
@@ -13,6 +13,10 @@ #include "components/image_service/features.h" #include "components/omnibox/browser/remote_suggestions_service.h" #include "components/omnibox/browser/search_suggestion_parser.h" +#include "components/optimization_guide/core/new_optimization_guide_decider.h" +#include "components/optimization_guide/proto/common_types.pb.h" +#include "components/optimization_guide/proto/hints.pb.h" +#include "components/optimization_guide/proto/salient_image_metadata.pb.h" #include "components/search_engines/search_engine_type.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" @@ -141,11 +145,20 @@ ImageService::ImageService( std::unique_ptr<AutocompleteProviderClient> autocomplete_provider_client, + optimization_guide::NewOptimizationGuideDecider* opt_guide, syncer::SyncService* sync_service) : autocomplete_provider_client_(std::move(autocomplete_provider_client)), personalized_data_collection_consent_helper_( unified_consent::UrlKeyedDataCollectionConsentHelper:: - NewPersonalizedDataCollectionConsentHelper(sync_service)) {} + NewPersonalizedDataCollectionConsentHelper(sync_service)) { + if (opt_guide && base::FeatureList::IsEnabled( + kImageServiceOptimizationGuideSalientImages)) { + opt_guide_ = opt_guide; + // OptimizationGuide requires registering all desired types in advance. + opt_guide_->RegisterOptimizationTypes( + {optimization_guide::proto::SALIENT_IMAGE}); + } +} ImageService::~ImageService() = default; @@ -198,36 +211,37 @@ search_metadata->template_url->GetEngineType( template_url_service->search_terms_data()) == SEARCH_ENGINE_GOOGLE) { - return FetchImageFor(/*search_query=*/search_metadata->search_terms, - /*entity_id=*/"", std::move(callback)); + return FetchSuggestImage(/*search_query=*/search_metadata->search_terms, + /*entity_id=*/"", std::move(callback)); } } } - if (options.optimization_guide_images && + if (options.optimization_guide_images && opt_guide_ && base::FeatureList::IsEnabled( kImageServiceOptimizationGuideSalientImages)) { - // TODO(b/248367751): Insert OptimizationGuide Salient Image call here. + return FetchOptimizationGuideImage(client_id, page_url, + std::move(callback)); } std::move(callback).Run(GURL()); } -void ImageService::FetchImageFor(const std::u16string& search_query, - const std::string& entity_id, - ResultCallback callback) { +void ImageService::FetchSuggestImage(const std::u16string& search_query, + const std::string& entity_id, + ResultCallback callback) { auto fetcher = std::make_unique<SuggestEntityImageURLFetcher>( autocomplete_provider_client_.get(), search_query, entity_id); // Use a raw pointer temporary so we can give ownership of the unique_ptr to // the callback and have a well defined SuggestEntityImageURLFetcher lifetime. auto* fetcher_raw_ptr = fetcher.get(); - fetcher_raw_ptr->Start( - base::BindOnce(&ImageService::OnImageFetched, weak_factory_.GetWeakPtr(), - std::move(fetcher), std::move(callback))); + fetcher_raw_ptr->Start(base::BindOnce( + &ImageService::OnSuggestImageFetched, weak_factory_.GetWeakPtr(), + std::move(fetcher), std::move(callback))); } -void ImageService::OnImageFetched( +void ImageService::OnSuggestImageFetched( std::unique_ptr<SuggestEntityImageURLFetcher> fetcher, ResultCallback callback, const GURL& image_url) { @@ -236,4 +250,94 @@ // `fetcher` is owned by this method and will be deleted now. } +void ImageService::FetchOptimizationGuideImage(mojom::ClientId client_id, + const GURL& page_url, + ResultCallback callback) { + if (!opt_guide_) { + return std::move(callback).Run(GURL()); + } + + optimization_guide::proto::RequestContext request_context; + switch (client_id) { + case mojom::ClientId::Journeys: + case mojom::ClientId::JourneysSidePanel: { + request_context = optimization_guide::proto::CONTEXT_JOURNEYS; + break; + } + case mojom::ClientId::NtpQuests: + case mojom::ClientId::NtpRealbox: { + request_context = optimization_guide::proto::CONTEXT_NEW_TAB_PAGE; + break; + } + case mojom::ClientId::Bookmarks: { + request_context = optimization_guide::proto::CONTEXT_BOOKMARKS; + break; + } + } + + // TODO(b/244507194): Consider batching requests in the future. + opt_guide_->CanApplyOptimizationOnDemand( + {page_url}, {optimization_guide::proto::OptimizationType::SALIENT_IMAGE}, + request_context, + // Note: This is subtle and nasty. OptimizationGuide demands a + // RepeatingCallback because it takes a vector of URLs and plans to call + // the callback once per URL. But we are only passing in a single URL, and + // we only possess the OnceCallback that the original caller gave us. + // The callback.md documentation says this is subtle, not ideal, but OK, + // so long as the RepeatingCallback is only ever called once in practice. + base::BindRepeating(&ImageService::OnOptimizationGuideImageFetched, + weak_factory_.GetWeakPtr(), + base::Passed(std::move(callback)))); +} + +void ImageService::OnOptimizationGuideImageFetched( + ResultCallback callback, + const GURL& url, + const base::flat_map< + optimization_guide::proto::OptimizationType, + optimization_guide::OptimizationGuideDecisionWithMetadata>& decisions) { + if (callback.is_null()) { + // This shouldn't happen, but maybe it can if OptimizationGuide decides to + // call the repeating callback more than once. Probably a programmer error + // in this case, but early exit and mark with NOTREACHED(). + NOTREACHED() << "Called OnOptimizationGuideImageFetched more than once " + << "while only having a single OnceCallback to respond with."; + return; + } + + auto iter = decisions.find(optimization_guide::proto::SALIENT_IMAGE); + if (iter == decisions.end()) { + return std::move(callback).Run(GURL()); + } + + optimization_guide::OptimizationGuideDecisionWithMetadata decision = + iter->second; + if ((decision.decision != + optimization_guide::OptimizationGuideDecision::kTrue) || + !decision.metadata.any_metadata().has_value()) { + return std::move(callback).Run(GURL()); + } + + auto parsed_any = optimization_guide::ParsedAnyMetadata< + optimization_guide::proto::SalientImageMetadata>( + decision.metadata.any_metadata().value()); + if (!parsed_any) { + return std::move(callback).Run(GURL()); + } + + // Look through the metadata, returning the first valid image URL. + auto salient_image_metadata = *parsed_any; + for (const auto& thumbnail : salient_image_metadata.thumbnails()) { + if (thumbnail.has_image_url()) { + GURL image_url(thumbnail.image_url()); + if (image_url.is_valid()) { + return std::move(callback).Run(image_url); + } + } + } + + // Fail if we can't find any. + std::move(callback).Run(GURL()); +} + } // namespace image_service
diff --git a/components/image_service/image_service.h b/components/image_service/image_service.h index da7d4521..5a5c2db9 100644 --- a/components/image_service/image_service.h +++ b/components/image_service/image_service.h
@@ -13,9 +13,14 @@ #include "components/image_service/mojom/image_service.mojom.h" #include "components/keyed_service/core/keyed_service.h" #include "components/omnibox/browser/autocomplete_provider_client.h" +#include "components/optimization_guide/core/optimization_guide_decision.h" #include "components/sync/driver/sync_service.h" #include "components/unified_consent/url_keyed_data_collection_consent_helper.h" +namespace optimization_guide { +class NewOptimizationGuideDecider; +} // namespace optimization_guide + namespace image_service { // Used to get the image URL associated with a cluster. It doesn't actually @@ -26,6 +31,7 @@ ImageService( std::unique_ptr<AutocompleteProviderClient> autocomplete_provider_client, + optimization_guide::NewOptimizationGuideDecider* opt_guide, syncer::SyncService* sync_service); ImageService(const ImageService&) = delete; ImageService& operator=(const ImageService&) = delete; @@ -50,18 +56,40 @@ private: class SuggestEntityImageURLFetcher; - // Fetches an image appropriate for `search_query` and `entity_id`, returning - // the result asynchronously to `callback`. - void FetchImageFor(const std::u16string& search_query, - const std::string& entity_id, - ResultCallback callback); + // Fetches an image from Suggest appropriate for `search_query` and + // `entity_id`, returning the result asynchronously to `callback`. + void FetchSuggestImage(const std::u16string& search_query, + const std::string& entity_id, + ResultCallback callback); - // Callback for `FetchImageFor`. - void OnImageFetched(std::unique_ptr<SuggestEntityImageURLFetcher> fetcher, - ResultCallback callback, - const GURL& image_url); + // Callback for `FetchSuggestImage`. + void OnSuggestImageFetched( + std::unique_ptr<SuggestEntityImageURLFetcher> fetcher, + ResultCallback callback, + const GURL& image_url); + // Fetches an image from Optimization Guide appropriate for the parameters. + virtual void FetchOptimizationGuideImage(mojom::ClientId client_id, + const GURL& page_url, + ResultCallback callback); + + // Callback for `FetchOptimizationGuideImage`. + void OnOptimizationGuideImageFetched( + ResultCallback callback, + const GURL& url, + const base::flat_map< + optimization_guide::proto::OptimizationType, + optimization_guide::OptimizationGuideDecisionWithMetadata>& + decisions); + + // Autocomplete provider client used to make Suggest image requests. std::unique_ptr<AutocompleteProviderClient> autocomplete_provider_client_; + + // Non-owning pointer to the Optimization Guide source of images. + // Will be left as nullptr if the OptimizationGuide feature is disabled. + raw_ptr<optimization_guide::NewOptimizationGuideDecider> opt_guide_ = nullptr; + + // The History consent filter, used for most clients. std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper> personalized_data_collection_consent_helper_;
diff --git a/components/image_service/image_service_unittest.cc b/components/image_service/image_service_unittest.cc index fc3e586..4bb0e4e5 100644 --- a/components/image_service/image_service_unittest.cc +++ b/components/image_service/image_service_unittest.cc
@@ -5,10 +5,49 @@ #include "components/image_service/image_service.h" #include <memory> +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "components/image_service/features.h" +#include "components/image_service/mojom/image_service.mojom-shared.h" +#include "components/image_service/mojom/image_service.mojom.h" +#include "components/optimization_guide/core/optimization_guide_decision.h" +#include "components/optimization_guide/core/test_new_optimization_guide_decider.h" +#include "components/optimization_guide/proto/common_types.pb.h" +#include "components/optimization_guide/proto/hints.pb.h" +#include "components/optimization_guide/proto/salient_image_metadata.pb.h" #include "components/sync/test/test_sync_service.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using testing::ElementsAre; + +namespace optimization_guide { +namespace { + +class ImageServiceTestOptGuide : public TestNewOptimizationGuideDecider { + public: + void CanApplyOptimizationOnDemand( + const std::vector<GURL>& urls, + const base::flat_set<proto::OptimizationType>& optimization_types, + proto::RequestContext request_context, + OnDemandOptimizationGuideDecisionRepeatingCallback callback) override { + // For this test, we just want to store the parameters which were used in + // the call, and the test will manually send a response to `callback`. + on_demand_call_urls_ = urls; + on_demand_call_optimization_types_ = optimization_types; + on_demand_call_request_context_ = request_context; + on_demand_call_callback_ = std::move(callback); + } + + std::vector<GURL> on_demand_call_urls_; + base::flat_set<proto::OptimizationType> on_demand_call_optimization_types_; + proto::RequestContext on_demand_call_request_context_; + OnDemandOptimizationGuideDecisionRepeatingCallback on_demand_call_callback_; +}; + +} // namespace +} // namespace optimization_guide + namespace image_service { class ImageServiceTest : public testing::Test { @@ -16,19 +55,41 @@ ImageServiceTest() = default; void SetUp() override { + scoped_feature_list_.InitWithFeatures( + {kImageService, kImageServiceSuggestPoweredImages, + kImageServiceOptimizationGuideSalientImages}, + {}); + + test_opt_guide_ = + std::make_unique<optimization_guide::ImageServiceTestOptGuide>(); test_sync_service_ = std::make_unique<syncer::TestSyncService>(); - image_service_ = - std::make_unique<ImageService>(nullptr, test_sync_service_.get()); + image_service_ = std::make_unique<ImageService>( + nullptr, test_opt_guide_.get(), test_sync_service_.get()); } ImageServiceTest(const ImageServiceTest&) = delete; ImageServiceTest& operator=(const ImageServiceTest&) = delete; protected: + base::test::ScopedFeatureList scoped_feature_list_; + + std::unique_ptr<optimization_guide::ImageServiceTestOptGuide> test_opt_guide_; std::unique_ptr<syncer::TestSyncService> test_sync_service_; std::unique_ptr<ImageService> image_service_; }; +// Helper method that stores `image_url` into `out_image_url`. +void StoreImageUrlResponse(GURL* out_image_url, const GURL& image_url) { + DCHECK(out_image_url); + *out_image_url = image_url; +} + +TEST_F(ImageServiceTest, RegisteredSalientImageType) { + ASSERT_EQ(test_opt_guide_->registered_optimization_types().size(), 1U); + EXPECT_EQ(test_opt_guide_->registered_optimization_types()[0], + optimization_guide::proto::SALIENT_IMAGE); +} + TEST_F(ImageServiceTest, HasPermissionToFetchImage) { test_sync_service_->GetUserSettings()->SetSelectedTypes( /*sync_everything=*/false, @@ -64,4 +125,43 @@ image_service_->HasPermissionToFetchImage(mojom::ClientId::Bookmarks)); } +TEST_F(ImageServiceTest, OptimizationGuideSalientImagesEndToEnd) { + mojom::Options options; + options.suggest_images = false; + options.optimization_guide_images = true; + + GURL image_url_response; + image_service_->FetchImageFor( + mojom::ClientId::Journeys, GURL("https://page-url.com"), options, + base::BindOnce(&StoreImageUrlResponse, &image_url_response)); + + // Verify that the OptimizationGuide backend got one appropriate call. + EXPECT_THAT(test_opt_guide_->on_demand_call_urls_, + ElementsAre(GURL("https://page-url.com"))); + EXPECT_THAT(test_opt_guide_->on_demand_call_optimization_types_, + ElementsAre(optimization_guide::proto::SALIENT_IMAGE)); + EXPECT_EQ(test_opt_guide_->on_demand_call_request_context_, + optimization_guide::proto::CONTEXT_JOURNEYS); + + // Verify the decision can be parsed and sent back to the original caller. + optimization_guide::OptimizationGuideDecisionWithMetadata decision; + { + decision.decision = optimization_guide::OptimizationGuideDecision::kTrue; + + optimization_guide::proto::SalientImageMetadata salient_image_metadata; + auto* thumbnail = salient_image_metadata.add_thumbnails(); + thumbnail->set_image_url("https://image-url.com/foo.png"); + + optimization_guide::proto::Any any; + any.set_type_url(salient_image_metadata.GetTypeName()); + salient_image_metadata.SerializeToString(any.mutable_value()); + decision.metadata.set_any_metadata(any); + } + + test_opt_guide_->on_demand_call_callback_.Run( + GURL("https://page-url.com"), + {{optimization_guide::proto::SALIENT_IMAGE, decision}}); + EXPECT_EQ(image_url_response, GURL("https://image-url.com/foo.png")); +} + } // namespace image_service
diff --git a/components/metrics/content/content_stability_metrics_provider.cc b/components/metrics/content/content_stability_metrics_provider.cc index 7e6881a..cc243a9 100644 --- a/components/metrics/content/content_stability_metrics_provider.cc +++ b/components/metrics/content/content_stability_metrics_provider.cc
@@ -97,7 +97,6 @@ } case content::NOTIFICATION_RENDER_WIDGET_HOST_HANG: { - helper_.LogRendererHang(); break; }
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc index 88dfbd2..dc5e4111 100644 --- a/components/metrics/file_metrics_provider.cc +++ b/components/metrics/file_metrics_provider.cc
@@ -25,6 +25,7 @@ #include "base/metrics/persistent_memory_allocator.h" #include "base/metrics/ranges_manager.h" #include "base/strings/string_piece.h" +#include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_runner.h" #include "base/task/task_traits.h" @@ -418,7 +419,15 @@ if (source->association == ASSOCIATE_INTERNAL_PROFILE_SAMPLES_COUNTER) { samples_counts.push_back(CollectFileMetadataFromSource(source.get())); } else { - MergeHistogramDeltasFromSource(source.get()); + size_t histograms_count = + MergeHistogramDeltasFromSource(source.get()); + if (!source->prefs_key.empty()) { + base::UmaHistogramCounts1000( + base::StringPrintf( + "UMA.FileMetricsProvider.%s.MergedHistogramsCount", + source->prefs_key.c_str()), + histograms_count); + } } DCHECK(source->read_complete); } @@ -567,13 +576,13 @@ } // static -void FileMetricsProvider::MergeHistogramDeltasFromSource(SourceInfo* source) { +size_t FileMetricsProvider::MergeHistogramDeltasFromSource(SourceInfo* source) { DCHECK(source->allocator); base::PersistentHistogramAllocator::Iterator histogram_iter( source->allocator.get()); const bool read_only = kSourceOptions[source->type].is_read_only; - int histogram_count = 0; + size_t histogram_count = 0; while (true) { std::unique_ptr<base::HistogramBase> histogram = histogram_iter.GetNext(); if (!histogram) @@ -592,6 +601,7 @@ source->read_complete = true; DVLOG(1) << "Reported " << histogram_count << " histograms from " << source->path.value(); + return histogram_count; } // static
diff --git a/components/metrics/file_metrics_provider.h b/components/metrics/file_metrics_provider.h index e2ef96a..5d7a6b96 100644 --- a/components/metrics/file_metrics_provider.h +++ b/components/metrics/file_metrics_provider.h
@@ -280,7 +280,8 @@ static AccessResult CheckAndMapMetricSource(SourceInfo* source); // Merges all of the histograms from a |source| to the StatisticsRecorder. - static void MergeHistogramDeltasFromSource(SourceInfo* source); + // Returns the number of histograms merged. + static size_t MergeHistogramDeltasFromSource(SourceInfo* source); // Records all histograms from a given source via a snapshot-manager. static void RecordHistogramSnapshotsFromSource(
diff --git a/components/metrics/file_metrics_provider_unittest.cc b/components/metrics/file_metrics_provider_unittest.cc index 8d8b43d9c..f8e5236 100644 --- a/components/metrics/file_metrics_provider_unittest.cc +++ b/components/metrics/file_metrics_provider_unittest.cc
@@ -23,6 +23,7 @@ #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/test_simple_task_runner.h" #include "base/time/time.h" #include "components/metrics/metrics_pref_names.h" @@ -35,6 +36,8 @@ namespace { const char kMetricsName[] = "TestMetrics"; +const char kMergedCountHistogramName[] = + "UMA.FileMetricsProvider.TestMetrics.MergedHistogramsCount"; const char kMetricsFilename[] = "file.metrics"; } // namespace @@ -283,6 +286,7 @@ TEST_P(FileMetricsProviderTest, AccessMetrics) { ASSERT_FALSE(PathExists(metrics_file())); + base::HistogramTester histogram_tester; base::Time metrics_time = base::Time::Now() - base::Minutes(5); std::unique_ptr<base::PersistentHistogramAllocator> histogram_allocator = @@ -294,11 +298,15 @@ provider()->RegisterSource(FileMetricsProvider::Params( metrics_file(), FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, FileMetricsProvider::ASSOCIATE_CURRENT_RUN, kMetricsName)); + histogram_tester.ExpectTotalCount(kMergedCountHistogramName, + /*expected_count=*/0); // Record embedded snapshots via snapshot-manager. OnDidCreateMetricsLog(); RunTasks(); EXPECT_EQ(2U, GetSnapshotHistogramCount()); + histogram_tester.ExpectUniqueSample(kMergedCountHistogramName, /*sample=*/2, + /*expected_bucket_count=*/1); EXPECT_FALSE(base::PathExists(metrics_file())); // Make sure a second call to the snapshot-recorder doesn't break anything. @@ -315,6 +323,8 @@ OnDidCreateMetricsLog(); RunTasks(); EXPECT_EQ(0U, GetSnapshotHistogramCount()); + histogram_tester.ExpectUniqueSample(kMergedCountHistogramName, /*sample=*/2, + /*expected_bucket_count=*/1); EXPECT_FALSE(base::PathExists(metrics_file())); // Recreate the file to indicate that it is "new" and must be recorded. @@ -326,6 +336,8 @@ OnDidCreateMetricsLog(); RunTasks(); EXPECT_EQ(2U, GetSnapshotHistogramCount()); + histogram_tester.ExpectUniqueSample(kMergedCountHistogramName, /*sample=*/2, + /*expected_bucket_count=*/2); EXPECT_FALSE(base::PathExists(metrics_file())); }
diff --git a/components/metrics/persistent_histograms.cc b/components/metrics/persistent_histograms.cc index 95647a2b..cdd9bd79 100644 --- a/components/metrics/persistent_histograms.cc +++ b/components/metrics/persistent_histograms.cc
@@ -230,6 +230,7 @@ kPersistentHistogramStorageMappedFile}; const char kBrowserMetricsName[] = "BrowserMetrics"; +const char kDeferredBrowserMetricsName[] = "DeferredBrowserMetrics"; void InstantiatePersistentHistograms(const base::FilePath& metrics_dir, bool persistent_histograms_enabled, @@ -292,3 +293,21 @@ kPersistentHistogramsStorage.Get()); PersistentHistogramsCleanup(metrics_dir); } + +bool DeferBrowserMetrics(const base::FilePath& metrics_dir) { + base::GlobalHistogramAllocator* allocator = + base::GlobalHistogramAllocator::Get(); + + if (!allocator || !allocator->HasPersistentLocation()) { + return false; + } + + base::FilePath deferred_metrics_dir = + metrics_dir.AppendASCII(kDeferredBrowserMetricsName); + + if (!base::CreateDirectory(deferred_metrics_dir)) { + return false; + } + + return allocator->MovePersistentFile(deferred_metrics_dir); +}
diff --git a/components/metrics/persistent_histograms.h b/components/metrics/persistent_histograms.h index 39ba267..fac682f 100644 --- a/components/metrics/persistent_histograms.h +++ b/components/metrics/persistent_histograms.h
@@ -34,12 +34,16 @@ extern const base::FeatureParam<std::string> kPersistentHistogramsStorage; // Persistent browser metrics need to be persisted somewhere. This constant -// provides a known string to be used for both the allocator's internal name -// and for a file on disk (relative to metrics_dir) to which they -// can be saved. This is exported so the name can also be used as a "pref" -// during configuration. +// provides a known string to be used for both the allocator's internal name and +// for a file on disk (relative to metrics_dir) to which they can be saved. This +// is exported so the name can also be used as a "pref" during configuration. extern const char kBrowserMetricsName[]; +// Like above, this provides a known string to be used for persistent browser +// metrics. However, metrics under this are "deferred" and sent along with a +// future session's metrics instead of independently. +extern const char kDeferredBrowserMetricsName[]; + // Do all the checking and work necessary to enable persistent histograms. // `metrics_dir` specifies the root directory where persistent histograms will // live. If `persistent_histograms_enabled` is false, this is essentially a @@ -62,4 +66,20 @@ void InstantiatePersistentHistogramsWithFeaturesAndCleanup( const base::FilePath& metrics_dir); +// After calling this, histograms from this session that were not sent (i.e., +// unlogged samples) will be sent along with a future session's metrics. +// Normally, those unlogged samples are sent as an "independent log", which uses +// the system profile in the persistent file. However, there are scenarios where +// the browser must exit before a system profile is written to the file, which +// results in the metrics from that session being lost. Calling this function +// will make so that the unlogged samples are sent with a future session's +// metrics (whichever is the first to read the file). Note that this may come at +// the cost of associating the metrics with an incorrect system profile. Returns +// whether the operation was successful. +// Note: If you plan on using this, please make sure to get a review from the +// metrics team. Using this may lead to reporting additional histograms that +// may not be relevant to what is being experimented with, which can cause +// confusing/disruptive data. +bool DeferBrowserMetrics(const base::FilePath& metrics_dir); + #endif // COMPONENTS_METRICS_PERSISTENT_HISTOGRAMS_H_
diff --git a/components/metrics/stability_metrics_helper.cc b/components/metrics/stability_metrics_helper.cc index a3cb802..b3ab91b 100644 --- a/components/metrics/stability_metrics_helper.cc +++ b/components/metrics/stability_metrics_helper.cc
@@ -255,21 +255,6 @@ local_state_->SetInteger(path, value + 1); } -void StabilityMetricsHelper::LogRendererHang() { -#if BUILDFLAG(IS_ANDROID) - base::android::ApplicationState app_state = - base::android::ApplicationStatusListener::GetState(); - bool is_foreground = - app_state == base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES || - app_state == base::android::APPLICATION_STATE_HAS_PAUSED_ACTIVITIES; - base::UmaHistogramBoolean("ChildProcess.HungRendererInForeground", - is_foreground); -#endif - base::UmaHistogramMemoryMB( - "ChildProcess.HungRendererAvailableMemoryMB", - base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024); -} - // static void StabilityMetricsHelper::RecordStabilityEvent( StabilityEventType stability_event_type) {
diff --git a/components/metrics/stability_metrics_helper.h b/components/metrics/stability_metrics_helper.h index 0649a78..0b46f2e 100644 --- a/components/metrics/stability_metrics_helper.h +++ b/components/metrics/stability_metrics_helper.h
@@ -100,9 +100,6 @@ // Records that a new renderer process was successfully launched. void LogRendererLaunched(bool was_extension_process); - // Records a renderer process hang. - void LogRendererHang(); - // Registers local state prefs used by this class. static void RegisterPrefs(PrefRegistrySimple* registry);
diff --git a/components/new_or_sad_tab_strings.grdp b/components/new_or_sad_tab_strings.grdp index b61151d..2b8f466 100644 --- a/components/new_or_sad_tab_strings.grdp +++ b/components/new_or_sad_tab_strings.grdp
@@ -152,9 +152,11 @@ <message name="IDS_NEW_TAB_OTR_TITLE" desc="Title of the Incognito new tab page. The Incognito mode provides private browsing experience by hiding browsing activity from other people using the same device. However, it does not make the user completely invisible or anonymous; please don't translate it as such." formatter_data="android_java"> You’ve gone Incognito </message> - <message name="IDS_NEW_TAB_OTR_SUBTITLE" desc="Subtitle of the Incognito new tab page, explaining to the user that the Incognito mode hides their browsing activity from other people using the same device. The second sentence clarifies that there are two important exceptions from this rule - downloaded files and added bookmarks will be persisted even after the Incognito session is closed." formatter_data="android_java"> - Now you can browse privately, and other people who use this device won’t see your activity. However, downloads and bookmarks will be saved. - </message> + <if expr="not is_android"> + <message name="IDS_NEW_TAB_OTR_SUBTITLE" desc="Subtitle of the Incognito new tab page, explaining to the user that the Incognito mode hides their browsing activity from other people using the same device. The second sentence clarifies that there are two important exceptions from this rule - downloaded files and added bookmarks will be persisted even after the Incognito session is closed."> + Now you can browse privately, and other people who use this device won’t see your activity. However, downloads and bookmarks will be saved. + </message> + </if> <message name="IDS_NEW_TAB_OTR_SUBTITLE_WITH_READING_LIST" desc="Subtitle of the Incognito new tab page, explaining to the user that the Incognito mode hides their browsing activity from other people using the same device. The second sentence clarifies that there are two important exceptions from this rule - downloaded files and added bookmarks will be persisted even after the Incognito session is closed." formatter_data="android_java"> Now you can browse privately, and other people who use this device won’t see your activity. However, downloads, bookmarks and reading list items will be saved. </message>
diff --git a/components/omnibox/browser/autocomplete_classifier.cc b/components/omnibox/browser/autocomplete_classifier.cc index 1ded88e7..0cc659d6 100644 --- a/components/omnibox/browser/autocomplete_classifier.cc +++ b/components/omnibox/browser/autocomplete_classifier.cc
@@ -9,6 +9,7 @@ #include "base/auto_reset.h" #include "base/feature_list.h" #include "base/ios/ios_util.h" +#include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "components/omnibox/browser/autocomplete_controller.h" #include "components/omnibox/browser/autocomplete_input.h" @@ -88,6 +89,8 @@ metrics::OmniboxEventProto::PageClassification page_classification, AutocompleteMatch* match, GURL* alternate_nav_url) { + TRACE_EVENT1("omnibox", "AutocompleteClassifier::Classify", "text", + base::UTF16ToUTF8(text)); DCHECK(!inside_classify_); base::AutoReset<bool> reset(&inside_classify_, true); AutocompleteInput input(text, page_classification, *scheme_classifier_);
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index f339bef3..e71e8fc8 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -581,6 +581,7 @@ } void AutocompleteController::DeleteMatch(const AutocompleteMatch& match) { + TRACE_EVENT0("omnibox", "AutocompleteController::DeleteMatch"); DCHECK(match.SupportsDeletion()); // Delete duplicate matches attached to the main match first. @@ -623,6 +624,7 @@ void AutocompleteController::OnProviderUpdate( bool updated_matches, const AutocompleteProvider* provider) { + TRACE_EVENT0("omnibox", "AutocompleteController::OnProviderUpdate"); // Should be called even if `in_start_` is true in order to include early // exited async providers. If the provider is done, will log how long the // provider took. @@ -648,6 +650,8 @@ void AutocompleteController::AddProviderAndTriggeringLogs( OmniboxLog* logs) const { + TRACE_EVENT0("omnibox", + "AutocompleteController::AddProviderAndTriggeringLogs"); logs->providers_info.clear(); for (const auto& provider : providers_) { if (!ShouldRunProvider(provider.get())) @@ -674,6 +678,9 @@ UpdateMatchDestinationURLWithAdditionalAssistedQueryStats( base::TimeDelta query_formulation_time, AutocompleteMatch* match) const { + TRACE_EVENT0("omnibox", + "AutocompleteController::" + "UpdateMatchDestinationURLWithAdditionalAssistedQueryStats"); // The assisted_query_stats is expected to have been previously set when this // method is called. If that is not the case, this method is being called by // mistake and assisted_query_stats (and searchbox_stats) should not be @@ -745,6 +752,7 @@ void AutocompleteController::SetMatchDestinationURL( AutocompleteMatch* match) const { + TRACE_EVENT0("omnibox", "AutocompleteController::SetMatchDestinationURL"); const TemplateURL* template_url = match->GetTemplateURL(template_url_service_, false); if (!template_url) @@ -765,6 +773,8 @@ size_t end) { if (begin == end) return; + TRACE_EVENT0("omnibox", + "AutocompleteController::GroupSuggestionsBySearchVsURL"); const size_t num_elements = result_.size(); if (begin < 0 || end <= begin || end > num_elements) { DCHECK(false) << "Range [" << begin << "; " << end @@ -1222,6 +1232,7 @@ } void AutocompleteController::NotifyChanged() { + TRACE_EVENT0("omnibox", "AutocompleteController::NotifyChanged"); // Will log metrics for how many matches changed. Will also log timing metrics // for the current request if it's complete; otherwise, will just update // timestamps of when the last update changed any or the default suggestion.
diff --git a/components/omnibox/browser/omnibox_controller.cc b/components/omnibox/browser/omnibox_controller.cc index 8a482e8..c7a422d 100644 --- a/components/omnibox/browser/omnibox_controller.cc +++ b/components/omnibox/browser/omnibox_controller.cc
@@ -6,6 +6,7 @@ #include "base/functional/bind.h" #include "base/metrics/histogram.h" +#include "base/trace_event/trace_event.h" #include "components/omnibox/browser/autocomplete_classifier.h" #include "components/omnibox/browser/autocomplete_controller_emitter.h" #include "components/omnibox/browser/autocomplete_match.h" @@ -35,6 +36,7 @@ void OmniboxController::StartAutocomplete( const AutocompleteInput& input) const { + TRACE_EVENT0("omnibox", "OmniboxController::StartAutocomplete"); ClearPopupKeywordMode(); // We don't explicitly clear OmniboxPopupModel::manually_selected_match, as @@ -44,6 +46,7 @@ void OmniboxController::OnResultChanged(AutocompleteController* controller, bool default_match_changed) { + TRACE_EVENT0("omnibox", "OmniboxController::OnResultChanged"); DCHECK(controller == autocomplete_controller_.get()); const bool was_open = omnibox_edit_model_->PopupIsOpen(); @@ -93,6 +96,7 @@ } void OmniboxController::ClearPopupKeywordMode() const { + TRACE_EVENT0("omnibox", "OmniboxController::ClearPopupKeywordMode"); if (omnibox_edit_model_->PopupIsOpen()) { OmniboxPopupSelection selection = omnibox_edit_model_->GetPopupSelection(); if (selection.state == OmniboxPopupSelection::KEYWORD_MODE) {
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc index 1c170e8..f5acbb59c 100644 --- a/components/omnibox/browser/omnibox_edit_model.cc +++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -1154,6 +1154,8 @@ bool OmniboxEditModel::AcceptKeyword( OmniboxEventProto::KeywordModeEntryMethod entry_method) { + TRACE_EVENT0("omnibox", "OmniboxEditModel::AcceptKeyword"); + DCHECK(is_keyword_hint_ && !keyword_.empty()); autocomplete_controller()->Stop(false); @@ -1223,6 +1225,7 @@ if (!is_keyword_selected()) return; + TRACE_EVENT0("omnibox", "OmniboxEditModel::ClearKeyword"); autocomplete_controller()->Stop(false); // While we're always in keyword mode upon reaching here, sometimes we've just @@ -1325,10 +1328,12 @@ } void OmniboxEditModel::ClearAdditionalText() { + TRACE_EVENT0("omnibox", "OmniboxEditModel::ClearAdditionalText"); view_->SetAdditionalText(std::u16string()); } void OmniboxEditModel::OnSetFocus(bool control_down) { + TRACE_EVENT0("omnibox", "OmniboxEditModel::OnSetFocus"); last_omnibox_focus_ = base::TimeTicks::Now(); user_input_since_focus_ = false; focus_resulted_in_navigation_ = false; @@ -1363,6 +1368,8 @@ if (user_input_in_progress_ && !user_clobbered_permanent_text) return; + TRACE_EVENT0("omnibox", "OmniboxEditModel::StartZeroSuggestRequest"); + // Send the textfield contents exactly as-is, as otherwise the verbatim // match can be wrong. The full page URL is anyways in set_current_url(). // Don't attempt to use https as the default scheme for these requests.
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn index 926f0180..5a5ff570 100644 --- a/components/optimization_guide/core/BUILD.gn +++ b/components/optimization_guide/core/BUILD.gn
@@ -315,6 +315,8 @@ "test_model_handler.h", "test_model_info_builder.cc", "test_model_info_builder.h", + "test_new_optimization_guide_decider.cc", + "test_new_optimization_guide_decider.h", "test_optimization_guide_model_provider.cc", "test_optimization_guide_model_provider.h", ]
diff --git a/components/optimization_guide/core/new_optimization_guide_decider.h b/components/optimization_guide/core/new_optimization_guide_decider.h index abd9e79..d74e2dfd 100644 --- a/components/optimization_guide/core/new_optimization_guide_decider.h +++ b/components/optimization_guide/core/new_optimization_guide_decider.h
@@ -19,6 +19,10 @@ class ShoppingService; } // namespace commerce +namespace image_service { +class ImageService; +} // namespace image_service + namespace optimization_guide { // WARNING: This class is not quite ready for use yet -- use @@ -55,9 +59,9 @@ virtual ~NewOptimizationGuideDecider() = default; private: - // ShoppingService is a friend class since it is a consumer of the - // CanApplyOptimizationOnDemand API. + // These friend are consumers of the CanApplyOptimizationOnDemand API. friend class commerce::ShoppingService; + friend class image_service::ImageService; // Invokes |callback| with the decision for all types contained in // |optimization_types| for each URL contained in |urls|, when sufficient
diff --git a/components/optimization_guide/core/test_new_optimization_guide_decider.cc b/components/optimization_guide/core/test_new_optimization_guide_decider.cc new file mode 100644 index 0000000..195127c --- /dev/null +++ b/components/optimization_guide/core/test_new_optimization_guide_decider.cc
@@ -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. + +#include "components/optimization_guide/core/test_new_optimization_guide_decider.h" + +namespace optimization_guide { + +TestNewOptimizationGuideDecider::TestNewOptimizationGuideDecider() = default; +TestNewOptimizationGuideDecider::~TestNewOptimizationGuideDecider() = default; + +void TestNewOptimizationGuideDecider::RegisterOptimizationTypes( + const std::vector<proto::OptimizationType>& optimization_types) { + registered_optimization_types_.insert(registered_optimization_types_.end(), + optimization_types.begin(), + optimization_types.end()); +} + +void TestNewOptimizationGuideDecider::CanApplyOptimization( + const GURL& url, + proto::OptimizationType optimization_type, + OptimizationGuideDecisionCallback callback) { + std::move(callback).Run(OptimizationGuideDecision::kFalse, + /*optimization_metadata=*/{}); +} + +OptimizationGuideDecision TestNewOptimizationGuideDecider::CanApplyOptimization( + const GURL& url, + proto::OptimizationType optimization_type, + OptimizationMetadata* optimization_metadata) { + return OptimizationGuideDecision::kFalse; +} + +void TestNewOptimizationGuideDecider::CanApplyOptimizationOnDemand( + const std::vector<GURL>& urls, + const base::flat_set<proto::OptimizationType>& optimization_types, + proto::RequestContext request_context, + OnDemandOptimizationGuideDecisionRepeatingCallback callback) { + for (const auto& url : urls) { + base::flat_map<proto::OptimizationType, + OptimizationGuideDecisionWithMetadata> + decisions; + for (const auto optimization_type : optimization_types) { + decisions[optimization_type] = {OptimizationGuideDecision::kFalse, + /*optimization_metadata=*/{}}; + } + callback.Run(url, decisions); + } +} + +} // namespace optimization_guide
diff --git a/components/optimization_guide/core/test_new_optimization_guide_decider.h b/components/optimization_guide/core/test_new_optimization_guide_decider.h new file mode 100644 index 0000000..cf0d384d --- /dev/null +++ b/components/optimization_guide/core/test_new_optimization_guide_decider.h
@@ -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. + +#ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_TEST_NEW_OPTIMIZATION_GUIDE_DECIDER_H_ +#define COMPONENTS_OPTIMIZATION_GUIDE_CORE_TEST_NEW_OPTIMIZATION_GUIDE_DECIDER_H_ + +#include "base/functional/callback.h" +#include "components/optimization_guide/core/new_optimization_guide_decider.h" +#include "components/optimization_guide/proto/hints.pb.h" + +namespace optimization_guide { + +// Meant to be used in unit tests for services that use the decider. +class TestNewOptimizationGuideDecider : public NewOptimizationGuideDecider { + public: + TestNewOptimizationGuideDecider(); + ~TestNewOptimizationGuideDecider() override; + + const std::vector<proto::OptimizationType>& registered_optimization_types() + const { + return registered_optimization_types_; + } + + // NewOptimizationGuideDecider: + void RegisterOptimizationTypes( + const std::vector<proto::OptimizationType>& optimization_types) override; + void CanApplyOptimization( + const GURL& url, + proto::OptimizationType optimization_type, + OptimizationGuideDecisionCallback callback) override; + OptimizationGuideDecision CanApplyOptimization( + const GURL& url, + proto::OptimizationType optimization_type, + OptimizationMetadata* optimization_metadata) override; + void CanApplyOptimizationOnDemand( + const std::vector<GURL>& urls, + const base::flat_set<proto::OptimizationType>& optimization_types, + proto::RequestContext request_context, + OnDemandOptimizationGuideDecisionRepeatingCallback callback) override; + + private: + // Stored calls to these methods, for testing usage. + std::vector<proto::OptimizationType> registered_optimization_types_; +}; + +} // namespace optimization_guide + +#endif // COMPONENTS_OPTIMIZATION_GUIDE_CORE_TEST_NEW_OPTIMIZATION_GUIDE_DECIDER_H_
diff --git a/components/optimization_guide/proto/salient_image_metadata.proto b/components/optimization_guide/proto/salient_image_metadata.proto index ae6fd9c..d197bcf 100644 --- a/components/optimization_guide/proto/salient_image_metadata.proto +++ b/components/optimization_guide/proto/salient_image_metadata.proto
@@ -4,6 +4,8 @@ syntax = "proto2"; +import "components/optimization_guide/proto/common_types.proto"; + option optimize_for = LITE_RUNTIME; option java_package = "org.chromium.components.optimization_guide.proto"; option java_outer_classname = "SalientImageMetadataProto"; @@ -12,6 +14,12 @@ message Thumbnail { optional string image_url = 1; + // The time for which the associated image URL expires. + // + // Querying the image_url beyond this time will result in errors. + // Additionally, the image may not be available even if not expired (ex: + // takedowns). + optional Timestamp expiration_timestamp = 2; } message SalientImageMetadata {
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc index 837e6f2..974b14e 100644 --- a/components/payments/content/payment_request_spec.cc +++ b/components/payments/content/payment_request_spec.cc
@@ -337,6 +337,15 @@ .empty(); } +bool PaymentRequestSpec::IsPaymentHandlerMinimalHeaderUXEnabled() const { + // PaymentHandlerMinimalHeaderUX is enabled when both the browser feature + // (enabled by default) and the blink feature (as indicated in the details) + // are enabled. + return base::FeatureList::IsEnabled( + features::kPaymentHandlerMinimalHeaderUX) && + details_->payment_handler_minimal_header_ux_enabled; +} + base::WeakPtr<PaymentRequestSpec> PaymentRequestSpec::AsWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); }
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h index 17ca4bf..68efdd25 100644 --- a/components/payments/content/payment_request_spec.h +++ b/components/payments/content/payment_request_spec.h
@@ -194,6 +194,9 @@ // billing method, such as "https://play.google.com/billing". bool IsAppStoreBillingAlsoRequested() const; + // Returns true if the PaymentHandlerMinimalHeaderUX feature is enabled. + bool IsPaymentHandlerMinimalHeaderUXEnabled() const; + base::WeakPtr<PaymentRequestSpec> AsWeakPtr(); private:
diff --git a/components/payments/core/features.cc b/components/payments/core/features.cc index 73e5f9ca..cdb2487 100644 --- a/components/payments/core/features.cc +++ b/components/payments/core/features.cc
@@ -82,9 +82,11 @@ #endif ); +// The blink-side feature of the same name is disabled by default, and can be +// enabled directly or via origin trial. BASE_FEATURE(kPaymentHandlerMinimalHeaderUX, "PaymentHandlerMinimalHeaderUX", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); } // namespace features } // namespace payments
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc index 196cef7..fd5ab77 100644 --- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -1680,7 +1680,7 @@ CloudPolicyClient::Result(CloudPolicyClient::NotRegistered())); } -TEST_F(CloudPolicyClientTest, UploadChromeProfileReport) { +TEST_F(CloudPolicyClientTest, UploadChromeProfile) { RegisterClient(); em::DeviceManagementRequest device_managment_request; @@ -1710,7 +1710,7 @@ EXPECT_EQ(DM_STATUS_SUCCESS, client_->last_dm_status()); } -TEST_F(CloudPolicyClientTest, UploadChromeProfileReportNotRegistered) { +TEST_F(CloudPolicyClientTest, UploadChromeProfileNotRegistered) { base::test::TestFuture<CloudPolicyClient::Result> result_future; auto chrome_profile_report = std::make_unique<em::ChromeProfileReportRequest>();
diff --git a/components/policy/core/common/cloud/mock_cloud_policy_client.h b/components/policy/core/common/cloud/mock_cloud_policy_client.h index b0e899d..f2a8ca5 100644 --- a/components/policy/core/common/cloud/mock_cloud_policy_client.h +++ b/components/policy/core/common/cloud/mock_cloud_policy_client.h
@@ -45,123 +45,98 @@ MockCloudPolicyClient& operator=(const MockCloudPolicyClient&) = delete; ~MockCloudPolicyClient() override; - MOCK_METHOD3(SetupRegistration, - void(const std::string&, - const std::string&, - const std::vector<std::string>&)); - MOCK_METHOD3(Register, - void(const RegistrationParameters&, - const std::string&, - const std::string&)); - MOCK_METHOD0(FetchPolicy, void(void)); - MOCK_METHOD0(Unregister, void(void)); - MOCK_METHOD2(UploadEnterpriseMachineCertificate, - void(const std::string&, ResultCallback)); - MOCK_METHOD2(UploadEnterpriseEnrollmentCertificate, - void(const std::string&, ResultCallback)); - MOCK_METHOD2(UploadEnterpriseEnrollmentId, - void(const std::string&, ResultCallback)); - void UploadDeviceStatus( - const enterprise_management::DeviceStatusReportRequest* device_status, - const enterprise_management::SessionStatusReportRequest* session_status, - const enterprise_management::ChildStatusReportRequest* child_status, - ResultCallback callback) override { - UploadDeviceStatus_(device_status, session_status, child_status, callback); - } - - MOCK_METHOD4(UploadDeviceStatus_, - void(const enterprise_management::DeviceStatusReportRequest*, - const enterprise_management::SessionStatusReportRequest*, - const enterprise_management::ChildStatusReportRequest*, - ResultCallback&)); - MOCK_METHOD0(CancelAppInstallReportUpload, void(void)); - MOCK_METHOD0(CancelExtensionInstallReportUpload, void(void)); - void UpdateGcmId(const std::string& id, StatusCallback callback) override { - UpdateGcmId_(id, callback); - } - MOCK_METHOD2(UpdateGcmId_, void(const std::string&, StatusCallback&)); - MOCK_METHOD4(UploadPolicyValidationReport, - void(CloudPolicyValidatorBase::Status, - const std::vector<ValueValidationIssue>&, - const std::string&, - const std::string&)); - - void UploadChromeDesktopReport( - std::unique_ptr<enterprise_management::ChromeDesktopReportRequest> - request, - ResultCallback callback) override { - UploadChromeDesktopReportProxy(request.get(), callback); - } - // Use Proxy function because unique_ptr can't be used in mock function. - MOCK_METHOD2(UploadChromeDesktopReportProxy, - void(enterprise_management::ChromeDesktopReportRequest*, - ResultCallback&)); - - void UploadChromeOsUserReport( - std::unique_ptr<enterprise_management::ChromeOsUserReportRequest> request, - ResultCallback callback) override { - UploadChromeOsUserReportProxy(request.get(), callback); - } - // Use Proxy function because unique_ptr can't be used in mock function. - MOCK_METHOD2(UploadChromeOsUserReportProxy, - void(enterprise_management::ChromeOsUserReportRequest*, - ResultCallback&)); - - void UploadChromeProfileReport( - std::unique_ptr<enterprise_management::ChromeProfileReportRequest> - request, - ResultCallback callback) override { - UploadChromeProfileReportProxy(request.get(), callback); - } - // Use Proxy function because unique_ptr can't be used in mock function. - MOCK_METHOD2(UploadChromeProfileReportProxy, - void(enterprise_management::ChromeProfileReportRequest*, - ResultCallback&)); - - void UploadEuiccInfo( - std::unique_ptr<enterprise_management::UploadEuiccInfoRequest> request, - StatusCallback callback) override { - UploadEuiccInfoProxy(request.get(), callback); - } - // Use Proxy function because unique_ptr can't be used in mock function. - MOCK_METHOD2(UploadEuiccInfoProxy, - void(enterprise_management::UploadEuiccInfoRequest*, - StatusCallback&)); - - void UploadSecurityEventReport(content::BrowserContext* context, - bool include_device_info, - base::Value::Dict value, - ResultCallback callback) override { - UploadSecurityEventReport_(context, include_device_info, value, callback); - } - MOCK_METHOD4(UploadSecurityEventReport_, - void(content::BrowserContext* context, - bool include_device_info, - base::Value::Dict&, - ResultCallback&)); - - MOCK_METHOD3(UploadEncryptedReport, - void(base::Value::Dict, - absl::optional<base::Value::Dict>, - ResponseCallback)); - - void UploadAppInstallReport(base::Value::Dict value, - ResultCallback callback) override { - UploadAppInstallReport_(value, callback); - } - MOCK_METHOD2(UploadAppInstallReport_, - void(base::Value::Dict&, ResultCallback&)); - void UploadExtensionInstallReport(base::Value::Dict value, - ResultCallback callback) override { - UploadExtensionInstallReport_(value, callback); - } - MOCK_METHOD2(UploadExtensionInstallReport_, - void(base::Value::Dict&, ResultCallback&)); - - MOCK_METHOD2( - ClientCertProvisioningRequest, - void(enterprise_management::ClientCertificateProvisioningRequest request, - ClientCertProvisioningRequestCallback callback)); + MOCK_METHOD(void, + SetupRegistration, + (const std::string&, + const std::string&, + const std::vector<std::string>&), + (override)); + MOCK_METHOD(void, + Register, + (const RegistrationParameters&, + const std::string&, + const std::string&), + (override)); + MOCK_METHOD(void, FetchPolicy, (), (override)); + MOCK_METHOD(void, + UploadEnterpriseMachineCertificate, + (const std::string&, ResultCallback), + (override)); + MOCK_METHOD(void, + UploadEnterpriseEnrollmentCertificate, + (const std::string&, ResultCallback), + (override)); + MOCK_METHOD(void, + UploadEnterpriseEnrollmentId, + (const std::string&, ResultCallback), + (override)); + MOCK_METHOD(void, + UploadDeviceStatus, + (const enterprise_management::DeviceStatusReportRequest*, + const enterprise_management::SessionStatusReportRequest*, + const enterprise_management::ChildStatusReportRequest*, + ResultCallback), + (override)); + MOCK_METHOD(void, CancelAppInstallReportUpload, (), (override)); + MOCK_METHOD(void, CancelExtensionInstallReportUpload, (), (override)); + MOCK_METHOD(void, + UpdateGcmId, + (const std::string&, StatusCallback), + (override)); + MOCK_METHOD(void, + UploadPolicyValidationReport, + (CloudPolicyValidatorBase::Status, + const std::vector<ValueValidationIssue>&, + const std::string&, + const std::string&), + (override)); + MOCK_METHOD( + void, + UploadChromeDesktopReport, + (std::unique_ptr<enterprise_management::ChromeDesktopReportRequest>, + ResultCallback), + (override)); + MOCK_METHOD( + void, + UploadChromeOsUserReport, + (std::unique_ptr<enterprise_management::ChromeOsUserReportRequest>, + ResultCallback), + (override)); + MOCK_METHOD( + void, + UploadChromeProfileReport, + (std::unique_ptr<enterprise_management::ChromeProfileReportRequest>, + ResultCallback), + (override)); + MOCK_METHOD(void, + UploadEuiccInfo, + (std::unique_ptr<enterprise_management::UploadEuiccInfoRequest>, + StatusCallback), + (override)); + MOCK_METHOD( + void, + UploadSecurityEventReport, + (content::BrowserContext*, bool, base::Value::Dict, ResultCallback), + (override)); + MOCK_METHOD(void, + UploadEncryptedReport, + (base::Value::Dict, + absl::optional<base::Value::Dict>, + ResponseCallback), + (override)); + MOCK_METHOD(void, + UploadAppInstallReport, + (base::Value::Dict value, ResultCallback callback), + (override)); + MOCK_METHOD(void, + UploadExtensionInstallReport, + (base::Value::Dict, ResultCallback), + (override)); + MOCK_METHOD(void, + ClientCertProvisioningRequest, + (enterprise_management::ClientCertificateProvisioningRequest, + ClientCertProvisioningRequestCallback), + (override)); // Sets the DMToken. void SetDMToken(const std::string& token); @@ -201,9 +176,12 @@ const MockCloudPolicyClientObserver&) = delete; ~MockCloudPolicyClientObserver() override; - MOCK_METHOD1(OnPolicyFetched, void(CloudPolicyClient*)); - MOCK_METHOD1(OnRegistrationStateChanged, void(CloudPolicyClient*)); - MOCK_METHOD1(OnClientError, void(CloudPolicyClient*)); + MOCK_METHOD(void, OnPolicyFetched, (CloudPolicyClient*), (override)); + MOCK_METHOD(void, + OnRegistrationStateChanged, + (CloudPolicyClient*), + (override)); + MOCK_METHOD(void, OnClientError, (CloudPolicyClient*), (override)); }; } // namespace policy
diff --git a/components/policy/core/common/policy_logger.h b/components/policy/core/common/policy_logger.h index 3baba5c..2c2f9950 100644 --- a/components/policy/core/common/policy_logger.h +++ b/components/policy/core/common/policy_logger.h
@@ -16,37 +16,39 @@ #include "base/values.h" #include "components/policy/policy_export.h" -namespace policy { - // Note: the DLOG_POLICY macro has no "#if DCHECK_IS_ON()" check because some // messages logged with DLOG are still important to be seen on the // chrome://policy/logs page in release mode. The DLOG call in StreamLog() will // do the check as usual for command line logging. #if BUILDFLAG(IS_ANDROID) -#define LOG_POLICY(log_severity, log_source) \ - LOG_POLICY_##log_severity(PolicyLogger::LogHelper::LogType::kLog, log_source) -#define DLOG_POLICY(log_severity, log_source) \ - LOG_POLICY_##log_severity(PolicyLogger::LogHelper::LogType::kDLog, log_source) -#define VLOG_POLICY(log_verbosity, log_source) \ - PolicyLogger::LogHelper(PolicyLogger::LogHelper::LogType::kVLog, \ - PolicyLogger::Log::Severity::kVerbose, \ - log_verbosity, log_source, FROM_HERE) -#define DVLOG_POLICY(log_verbosity, log_source) \ - PolicyLogger::LogHelper(PolicyLogger::LogHelper::LogType::kDLog, \ - PolicyLogger::Log::Severity::kVerbose, \ - log_verbosity, log_source, FROM_HERE) -#define LOG_POLICY_INFO(log_type, log_source) \ - PolicyLogger::LogHelper(log_type, PolicyLogger::Log::Severity::kInfo, \ - PolicyLogger::LogHelper::kNoVerboseLog, log_source, \ - FROM_HERE) -#define LOG_POLICY_WARNING(log_type, log_source) \ - PolicyLogger::LogHelper(log_type, PolicyLogger::Log::Severity::kWarning, \ - PolicyLogger::LogHelper::kNoVerboseLog, log_source, \ - FROM_HERE) -#define LOG_POLICY_ERROR(log_type, log_source) \ - PolicyLogger::LogHelper(log_type, PolicyLogger::Log::Severity::kError, \ - PolicyLogger::LogHelper::kNoVerboseLog, log_source, \ - FROM_HERE) +#define LOG_POLICY(log_severity, log_source) \ + LOG_POLICY_##log_severity(::policy::PolicyLogger::LogHelper::LogType::kLog, \ + log_source) +#define DLOG_POLICY(log_severity, log_source) \ + LOG_POLICY_##log_severity(::policy::PolicyLogger::LogHelper::LogType::kDLog, \ + log_source) +#define VLOG_POLICY(log_verbosity, log_source) \ + ::policy::PolicyLogger::LogHelper( \ + ::policy::PolicyLogger::LogHelper::LogType::kVLog, \ + ::policy::PolicyLogger::Log::Severity::kVerbose, log_verbosity, \ + log_source, FROM_HERE) +#define DVLOG_POLICY(log_verbosity, log_source) \ + ::policy::PolicyLogger::LogHelper( \ + ::policy::PolicyLogger::LogHelper::LogType::kDLog, \ + ::policy::PolicyLogger::Log::Severity::kVerbose, log_verbosity, \ + log_source, FROM_HERE) +#define LOG_POLICY_INFO(log_type, log_source) \ + ::policy::PolicyLogger::LogHelper( \ + log_type, ::policy::PolicyLogger::Log::Severity::kInfo, \ + ::policy::PolicyLogger::LogHelper::kNoVerboseLog, log_source, FROM_HERE) +#define LOG_POLICY_WARNING(log_type, log_source) \ + ::policy::PolicyLogger::LogHelper( \ + log_type, ::policy::PolicyLogger::Log::Severity::kWarning, \ + ::policy::PolicyLogger::LogHelper::kNoVerboseLog, log_source, FROM_HERE) +#define LOG_POLICY_ERROR(log_type, log_source) \ + ::policy::PolicyLogger::LogHelper( \ + log_type, ::policy::PolicyLogger::Log::Severity::kError, \ + ::policy::PolicyLogger::LogHelper::kNoVerboseLog, log_source, FROM_HERE) #else #define LOG_POLICY(log_severity, log_source) LOG(log_severity) #define DLOG_POLICY(log_severity, log_source) DLOG(log_severity) @@ -54,11 +56,13 @@ #define DVLOG_POLICY(log_verbosity, log_source) DVLOG(log_verbosity) #endif // BUILDFLAG(IS_ANDROID) -#define POLICY_AUTH PolicyLogger::Log::Source::kAuthentication -#define POLICY_PROCESSING PolicyLogger::Log::Source::kPolicyProcessing -#define CBCM_ENROLLMENT PolicyLogger::Log::Source::kCBCMEnrollment -#define POLICY_FETCHING PolicyLogger::Log::Source::kPolicyFetching -#define PLATFORM_POLICY PolicyLogger::Log::Source::kPlatformPolicy +#define POLICY_AUTH ::policy::PolicyLogger::Log::Source::kAuthentication +#define POLICY_PROCESSING ::policy::PolicyLogger::Log::Source::kPolicyProcessing +#define CBCM_ENROLLMENT ::policy::PolicyLogger::Log::Source::kCBCMEnrollment +#define POLICY_FETCHING ::policy::PolicyLogger::Log::Source::kPolicyFetching +#define PLATFORM_POLICY ::policy::PolicyLogger::Log::Source::kPlatformPolicy + +namespace policy { // Collects logs to be displayed in chrome://policy-logs. class POLICY_EXPORT PolicyLogger {
diff --git a/components/policy/core/common/policy_proto_decoders.cc b/components/policy/core/common/policy_proto_decoders.cc index f61c40d..1894da63 100644 --- a/components/policy/core/common/policy_proto_decoders.cc +++ b/components/policy/core/common/policy_proto_decoders.cc
@@ -227,6 +227,8 @@ } } +// TODO(crbug/1187001): This function should accept base::Value::Dict for +// |json|. bool ParseComponentPolicy(base::Value json, PolicyScope scope, PolicySource source, @@ -237,9 +239,7 @@ // Each description is an object that contains the policy value under the // "Value" key. The optional "Level" key is either "Mandatory" (default) or // "Recommended". - for (auto it : json.GetDict()) { - const std::string& policy_name = it.first; - base::Value description = std::move(it.second); + for (auto [policy_name, description] : json.GetDict()) { if (!description.is_dict()) { *error = "The JSON blob dictionary value is not a dictionary."; return false;
diff --git a/components/policy/core/common/registry_dict.cc b/components/policy/core/common/registry_dict.cc index cc6afc8f..0bded97 100644 --- a/components/policy/core/common/registry_dict.cc +++ b/components/policy/core/common/registry_dict.cc
@@ -47,7 +47,7 @@ // Recurse for complex types. if (value.is_dict()) { base::Value result(base::Value::Type::DICT); - for (auto entry : value.DictItems()) { + for (auto entry : value.GetDict()) { absl::optional<base::Value> converted = ConvertRegistryValue(entry.second, schema.GetProperty(entry.first)); if (converted.has_value()) @@ -107,7 +107,7 @@ // (non-numerical keys are ignored). if (value.is_dict()) { base::Value result(base::Value::Type::LIST); - for (auto it : value.DictItems()) { + for (auto it : value.GetDict()) { if (!IsKeyNumerical(it.first)) continue; absl::optional<base::Value> converted =
diff --git a/components/policy/core/common/schema.cc b/components/policy/core/common/schema.cc index 84edf58..6d0ab2b 100644 --- a/components/policy/core/common/schema.cc +++ b/components/policy/core/common/schema.cc
@@ -294,9 +294,11 @@ kSchemaTypesToValueTypesEnd, nullptr); } -// Validate that |dict| only contains attributes that are allowed for the -// corresponding value of 'type'. Also ensure that all of those attributes are -// of the expected type. |options| can be used to ignore unknown attributes. +// Validate that |dict| only contains attributes that are allowed for +// the corresponding value of 'type'. Also ensure that all of those attributes +// are of the expected type. |options| can be used to ignore unknown attributes +// TODO(crbug/1187001): This function should accept base::Value::Dict for +// |dict|. bool ValidateAttributesAndTypes(const base::Value& dict, const std::string& type, int options, @@ -329,7 +331,7 @@ } base::Value::Type expected_type = base::Value::Type::NONE; - for (auto it : dict.DictItems()) { + for (auto it : dict.GetDict()) { if (MapSchemaKeyToValueType(it.first, begin, end, &expected_type)) { if (!CheckType(&it.second, expected_type)) { *error = base::StringPrintf("Invalid type for attribute '%s'", @@ -370,11 +372,14 @@ // Forward declaration (used in ValidateProperties). bool IsValidSchema(const base::Value& dict, int options, std::string* error); -// Validates that the values in the |properties| dict are valid schemas. +// Validates that the values in the |properties| dict are valid +// schemas. +// TODO(crbug/1187001): This function should accept base::Value::Dict for +// |properties|. bool ValidateProperties(const base::Value& properties, int options, std::string* error) { - for (auto dict_it : properties.DictItems()) { + for (auto dict_it : properties.GetDict()) { if (dict_it.second.type() != base::Value::Type::DICT) { *error = base::StringPrintf("Schema for property '%s' must be a dict.", dict_it.first.c_str()); @@ -913,6 +918,8 @@ return true; } +// TODO(crbug/1187001): This function should accept base::Value::Dict for +// |schema|. bool Schema::InternalStorage::ParseDictionary( const base::Value& schema, SchemaNode* schema_node, @@ -934,21 +941,21 @@ properties_nodes_[extra].begin = static_cast<int>(property_nodes_.size()); - const base::Value* properties = schema.FindDictKey(schema::kProperties); + const base::Value::Dict* properties = + schema.GetDict().FindDict(schema::kProperties); if (properties) { // This and below reserves nodes for all of the |properties|, and makes sure // they are contiguous. Recursive calls to Parse() will append after these // elements. - property_nodes_.resize(property_nodes_.size() + properties->DictSize()); + property_nodes_.resize(property_nodes_.size() + properties->size()); } properties_nodes_[extra].end = static_cast<int>(property_nodes_.size()); - const base::Value* pattern_properties = - schema.FindDictKey(schema::kPatternProperties); + const base::Value::Dict* pattern_properties = + schema.GetDict().FindDict(schema::kPatternProperties); if (pattern_properties) { - property_nodes_.resize(property_nodes_.size() + - pattern_properties->DictSize()); + property_nodes_.resize(property_nodes_.size() + pattern_properties->size()); } properties_nodes_[extra].pattern_end = @@ -958,7 +965,7 @@ int base_index = properties_nodes_[extra].begin; int index = base_index; - for (auto property : properties->DictItems()) { + for (auto property : *properties) { strings_.push_back(property.first); property_nodes_[index].key = strings_.back().c_str(); if (!Parse(property.second, &property_nodes_[index].schema, @@ -967,14 +974,14 @@ } ++index; } - CHECK_EQ(static_cast<int>(properties->DictSize()), index - base_index); + CHECK_EQ(static_cast<int>(properties->size()), index - base_index); } if (pattern_properties != nullptr) { int base_index = properties_nodes_[extra].end; int index = base_index; - for (auto pattern_property : pattern_properties->DictItems()) { + for (auto pattern_property : *pattern_properties) { re2::RE2* compiled_regex = CompileRegex(pattern_property.first); if (!compiled_regex->ok()) { *error = "/" + pattern_property.first + @@ -989,8 +996,7 @@ } ++index; } - CHECK_EQ(static_cast<int>(pattern_properties->DictSize()), - index - base_index); + CHECK_EQ(static_cast<int>(pattern_properties->size()), index - base_index); } properties_nodes_[extra].required_begin = required_properties_.size(); @@ -1263,7 +1269,7 @@ if (value.is_dict()) { base::flat_set<std::string> present_properties; - for (auto dict_item : value.DictItems()) { + for (auto dict_item : value.GetDict()) { SchemaList schema_list = GetMatchingProperties(dict_item.first); if (schema_list.empty()) { // Unknown property was detected. @@ -1361,7 +1367,7 @@ if (value->is_dict()) { base::flat_set<std::string> present_properties; std::vector<std::string> drop_list; // Contains the keys to drop. - for (auto dict_item : value->DictItems()) { + for (auto dict_item : value->GetDict()) { SchemaList schema_list = GetMatchingProperties(dict_item.first); if (schema_list.empty()) { // Unknown property was detected. @@ -1666,9 +1672,8 @@ return; if (value->is_dict()) { - for (auto dict_item : value->DictItems()) { - auto& sub_value = dict_item.second; - SchemaList schema_list = GetMatchingProperties(dict_item.first); + for (auto [key, sub_value] : value->GetDict()) { + SchemaList schema_list = GetMatchingProperties(key); for (const auto& schema_item : schema_list) schema_item.MaskSensitiveValuesRecursive(&sub_value); }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 2629c2d..e3b435a 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -1319,10 +1319,6 @@ <translation id="2223393221350938149">Ausführung von JavaScript JIT für keine Website zulassen</translation> <translation id="2223598546285729819">Standardeinstellung für Benachrichtigungen</translation> <translation id="222673035924187991">TLS Encrypted ClientHello aktivieren</translation> -<translation id="2231726854197443389">Mit dieser Richtlinie wird festgelegt, ob Nutzer den Nur-HTTPS-Modus in den Einstellungen aktivieren können. Über den Nur-HTTPS-Modus werden alle Aufrufe von Websites auf HTTPS umgestellt. - Wenn diese Einstellung nicht konfiguriert oder auf „Zugelassen“ festgelegt ist, dürfen Nutzer den Nur-HTTPS-Modus aktivieren. - Ist sie auf „Nicht zugelassen“ festgelegt, dürfen Nutzer den Nur-HTTPS-Modus nicht aktivieren. - Das Erzwingen des Nur-HTTPS-Modus wird momentan nicht unterstützt.</translation> <translation id="2231817271680715693">Browserverlauf bei erster Ausführung aus Standardbrowser importieren</translation> <translation id="2231962946025538735">Diese Richtlinie ist veraltet. Du kannst mit <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> die Verfügbarkeit des Flash-Plug-ins definieren und über <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> festlegen, ob der integrierte PDF-Viewer zum Öffnen von PDF-Dateien verwendet werden soll. @@ -7321,7 +7317,6 @@ <translation id="7962093600142350905">Mit dieser Richtlinie wird festgelegt, ob Nutzern im Dialogfeld mit der Druckvorschau verfügbare Privet-Drucker angezeigt werden. Wenn diese Richtlinie aktiviert ist, werden verfügbare Privet-Drucker angezeigt. Ist sie deaktiviert oder nicht konfiguriert, erscheinen Privet-Drucker nicht in der Druckvorschau, weil diese Druckmethode veraltet ist.</translation> -<translation id="7970844378072291834">Aktivieren des Nur-HTTPS-Modus erzwingen (noch keine Unterstützung)</translation> <translation id="7972642710812569707">Erzwingen, dass WebSQL im Zusammenhang mit Drittanbietern wieder aktiviert wird.</translation> <translation id="7973609468423251675">Diese Richtlinie ist veraltet und wird in Version 85 von <ph name="PRODUCT_OS_NAME" /> entfernt. Bitte verwende stattdessen die Richtlinie "<ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />".
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 756a5f16..55b3c55 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -744,6 +744,7 @@ Si la estableces, fallará la instalación de <ph name="PLUGIN_VM_NAME" /> cuando el espacio libre en disco disponible en el dispositivo sea inferior al espacio que requiere la política.</translation> <translation id="1686952487081322272">Inhabilitar Respuestas rápidas</translation> <translation id="1690383938831887552">No permitir que se carguen los intercambios HTTP firmados</translation> +<translation id="1692990221685273468">Determina si el verificador de certificados integrado aplicará de manera forzosa las restricciones codificadas en las anclas de confianza cargadas desde el almacén de confianza de la plataforma.</translation> <translation id="169467210981344373">Inhabilitar la caché de autenticación de HTTP con alcance global</translation> <translation id="1698810555265314018">Controla la resolución de las imágenes de impresión cuando <ph name="PRODUCT_NAME" /> imprime archivos PDF con rasterización. @@ -949,6 +950,15 @@ Si estableces la política como falsa o no la estableces, <ph name="PRODUCT_NAME" /> no realizará verificaciones de revocación en línea en <ph name="PRODUCT_NAME" /> 19 ni en versiones posteriores. Nota: Las verificaciones de <ph name="OCSP_CRL_LABEL" /> no proporcionan un beneficio de seguridad eficaz.</translation> +<translation id="1904685047904049720">Si habilitas esta política, las extensiones que no estén publicadas en Chrome Web +Store se inhabilitarán en <ph name="PRODUCT_NAME" />. +Esta política solo se aplica a las extensiones instaladas y actualizadas desde +Chrome Web Store. Se ignoran las extensiones que no están en la tienda, como las extensiones sin empaquetar instaladas +mediante el modo de desarrollador, y las extensiones instaladas mediante el interruptor de línea de comandos. También se ignoran las extensiones instaladas de manera automática que no se actualizan desde +Chrome Web Store y todas las extensiones fijadas a la versión. + +Si estableces la política como <ph name="ALLOW_UNPUBLISHED" /> (0) o no la estableces, se permitirán las extensiones que no estén publicadas en Chrome Web Store. +Si estableces la política como <ph name="DISABLE_UNPUBLISHED" /> (1), se inhabilitarán las extensiones que no estén publicadas en Chrome Web Store.</translation> <translation id="1905061765326052857">No permitir que los usuarios no afiliados usen las máquinas virtuales necesarias para admitir apps de Linux</translation> <translation id="1910704279188129272">Permite establecer restricciones de uso según la app. Se pueden aplicar restricciones de uso a las apps instaladas en <ph name="PRODUCT_OS_NAME" /> para un usuario determinado. @@ -1330,10 +1340,6 @@ <translation id="2223393221350938149">No permitir que cualquier sitio ejecute JavaScript con JIT</translation> <translation id="2223598546285729819">Configuración de notificación predeterminada</translation> <translation id="222673035924187991">Habilitar TLS Encrypted ClientHello</translation> -<translation id="2231726854197443389">Esta política controla si los usuarios pueden habilitar el modo solo HTTPS en la Configuración. El modo solo HTTPS actualiza todas las navegaciones a páginas HTTPS. - Si no estableces esta configuración o la habilitas, los usuarios podrán habilitar el modo solo HTTPS. - Si inhabilitas esta configuración, los usuarios no podrán habilitar el modo solo HTTPS. - Por el momento, no se permite habilitar el modo solo HTTPS de forma automática.</translation> <translation id="2231817271680715693">Importar historial de navegación del navegador predeterminado en la primera ejecución</translation> <translation id="2231962946025538735">Esta política dejó de estar disponible. Usa <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> para controlar la disponibilidad del complemento de Flash y <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> para controlar si debe usarse el visor de PDF integrado para abrir este tipo de archivos. @@ -4904,6 +4910,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">Habilitar los informes de estado del almacenamiento del dispositivo</translation> <translation id="5608114828230655271">Comportamiento predeterminado del dispositivo</translation> +<translation id="5611869109049836323">Aplicar de manera forzosa restricciones a las anclas de confianza que se agregaron de forma local</translation> <translation id="5614865701790130558">Registra eventos para las instalaciones de extensiones basadas en políticas</translation> <translation id="5618398258385745432">La configuración asociada se usó antes de implementar la reautenticación para ver contraseñas. A partir de ese momento, la configuración y, por lo tanto, esta política no tienen efecto en el comportamiento de Chrome. El comportamiento actual de Chrome es como si la política se hubiera establecido para no ver las contraseñas en texto claro en las páginas de configuración del administrador de contraseñas. Esto significa que la página de configuración contiene solo un marcador de posición y Chrome mostrará la contraseña después de que el usuario haga clic en "Mostrar" (e implemente la reautenticación, si corresponde). A continuación, se muestra la descripción original de la política. @@ -5757,6 +5764,7 @@ Si estableces la política, los usuarios no podrán cambiarla. Si no la estableces, los usuarios podrán ocultar o mostrar los accesos directos a aplicaciones desde el menú contextual de la barra de favoritos.</translation> <translation id="638003144128412430">Inhabilitar los informes de la zona horaria del dispositivo</translation> +<translation id="6382209369210116232">Inhabilitar las extensiones no publicadas</translation> <translation id="6382351416269252693">Establece una lista de patrones de URL de sitios donde se indiquen los que rechazarán automáticamente el permiso de fuentes locales. Esto limitará la capacidad de los sitios para ver la información sobre las fuentes locales.j Para obtener información detallada sobre los patrones de URL de sitios válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Se permite el uso de caracteres comodín (<ph name="WILDCARD_VALUE" />). Esta política solo establece coincidencias basadas en el origen; por lo tanto, se ignoran todas las rutas de acceso que se incluyan en el patrón de URL. @@ -6835,6 +6843,7 @@ <translation id="7323896582714668701">Parámetros de línea de comandos adicionales para <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">Impedir que Chrome bloquee la navegación a protocolos externos dentro del iframe de la zona de pruebas</translation> <translation id="7326394567531622570">Similar a Wipe (valor 2), pero intenta preservar los tokens de acceso para que el usuario no tenga que volver a acceder.</translation> +<translation id="7331387825106440104">No aplicar de manera forzosa restricciones a las anclas de confianza que se agregaron de forma local</translation> <translation id="7331962793961469250">Cuando la política se configura en Verdadero, las promociones de aplicaciones de Chrome Web Store no aparecen en la nueva pestaña. Cuando esta opción se configura en Falso o cuando no se configura, las promociones de aplicaciones de Chrome Web Store aparecen en la nueva pestaña.</translation> <translation id="7332963785317884918">Esta política cayó en desuso. <ph name="PRODUCT_OS_NAME" /> siempre utilizará la estrategia de limpieza "RemoveLRU". @@ -7472,7 +7481,6 @@ <translation id="7962093600142350905">Esta política controla si el usuario visualiza las impresoras Privet disponibles en el diálogo de la vista previa de impresión. Si habilitas esta política, se mostrarán las impresoras Privet disponibles. Si la inhabilitas o no la estableces, no se mostrarán impresoras Privet en la vista previa, ya que ese método de impresión está obsoleto.</translation> -<translation id="7970844378072291834">Habilitar el modo solo HTTPS de forma automática (aún no se admite)</translation> <translation id="7972642710812569707">Forzar que se vuelva a habilitar WebSQL en contextos de terceros</translation> <translation id="7973609468423251675">Ten en cuenta que esta política es obsoleta y se quitará en la versión 85 de <ph name="PRODUCT_OS_NAME" />. En su lugar, utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -8472,6 +8480,31 @@ <translation id="8854571659927427063">Si habilitas la política, se importarán los favoritos del navegador predeterminado anterior en la primera ejecución. Si la inhabilitas o no la estableces, no se importará ningún favorito en la primera ejecución. Los usuarios podrán activar un diálogo de importación; la casilla de verificación correspondiente a los favoritos estará marcada o desmarcada en función del valor de esta política.</translation> +<translation id="8854703425882848037">Los certificados X.509 pueden codificar restricciones, como restricciones de nombres, +en las extensiones del certificado. RFC 5280 especifica que la aplicación forzosa de tales +restricciones en los certificados de anclas de confianza es opcional. A partir de +la versión 112 de <ph name="PRODUCT_NAME" />, se aplicarán de manera forzosa estas restricciones +en los certificados cargados desde el almacén de certificados de la plataforma. + +Esta política existe como una inhabilitación temporal en caso de que una empresa encuentre +problemas con las restricciones codificadas en sus raíces privadas. En ese caso, esta +política se puede usar para inhabilitar de forma temporal la aplicación forzosa de las restricciones +y, a la vez, corregir los problemas de certificación. + +Si no estableces esta política o la habilitas, +<ph name="PRODUCT_NAME" /> aplicará de manera forzosa +las restricciones codificadas en las anclas de confianza cargadas desde el almacenamiento de confianza de la plataforma. + +Si la inhabilitas, +<ph name="PRODUCT_NAME" /> no aplicará de manera forzosa +las restricciones codificadas en las anclas de confianza cargadas desde el almacenamiento de confianza de la plataforma. + +Esta política no tiene efecto si +se inhabilita la política +<ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" />. + +Se planea quitar esta política en la +versión 115 de <ph name="PRODUCT_NAME" />.</translation> <translation id="8855929790177853633">Fuente de la imagen del protector de pantalla del usuario</translation> <translation id="8858642179038618439">Forzar el modo de seguridad de YouTube</translation> <translation id="8860342862142842017">Inhabilitar la aplicación del Certificado de transparencia para una lista de hash de subjectPublicKeyInfo</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 310b199..3a07b952 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -797,6 +797,7 @@ Si no se configura esta política, las funciones de brillo automático y los controles de pantalla del usuario no se ven afectados. Nota: Los valores que se asignen a esta política deben ser porcentajes de 0 a 100.</translation> +<translation id="1733092875104864334">No permitir que se recojan registros de texto WebRTC de los servicios de Google</translation> <translation id="1733768596873041559">Redirigir al proveedor de identidades SAML de forma predeterminada (se necesita la confirmación del usuario en versiones anteriores a <ph name="PRODUCT_NAME" /> 99)</translation> <translation id="1733939382419067578">Si se establece la política, podrás definir una lista de patrones de URL donde se especifique qué sitios pueden mostrar notificaciones. @@ -944,6 +945,11 @@ Si se le asigna el valor "False" o no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> no realizará comprobaciones de revocación online en <ph name="PRODUCT_NAME" /> 19 y versiones posteriores. Nota: Las comprobaciones de <ph name="OCSP_CRL_LABEL" /> no proporcionan una seguridad efectiva.</translation> +<translation id="1904685047904049720">Si se habilita esta política, las extensiones cuya publicación se haya anulado en Chrome Web Store se inhabilitarán en <ph name="PRODUCT_NAME" />. +Esta política solo se aplica a las extensiones que se instalan y actualizan desde Chrome Web Store. Se ignoran las extensiones no incluidas en la tienda, como las que se descomprimen en el modo Desarrollador o las que se instalan mediante el interruptor de la línea de comandos. También se ignoran las extensiones de instalación forzada que no se actualizan desde Chrome Web Store y todas las extensiones con una versión fija. + +Si se le asigna el valor <ph name="ALLOW_UNPUBLISHED" /> (0) a esta política o no se define, se permitirán las extensiones no publicadas en Chrome Web Store. +Si se le asigna el valor <ph name="DISABLE_UNPUBLISHED" /> (1) a esta política, se inhabilitarán las extensiones cuya publicación se haya anulado en Chrome Web Store.</translation> <translation id="1905061765326052857">No permitir que los usuarios no afiliados usen las máquinas virtuales necesarias para el funcionamiento de las aplicaciones de Linux</translation> <translation id="1910704279188129272">Permite especificar restricciones de uso por aplicación. Se pueden aplicar restricciones de uso a las aplicaciones instaladas en <ph name="PRODUCT_OS_NAME" /> para un usuario determinado. @@ -1326,10 +1332,6 @@ <translation id="2223393221350938149">No permitir que JavaScript use JIT en ningún sitio</translation> <translation id="2223598546285729819">Configuración de notificación predeterminada</translation> <translation id="222673035924187991">Habilitar Encrypted ClientHello de TLS</translation> -<translation id="2231726854197443389">Esta política controla si los usuarios pueden habilitar el modo solo‑HTTPS en Configuración. El modo solo‑HTTPS cambia todos los accesos a páginas al protocolo HTTPS. - Si esta política no se establece o se le asigna el valor allowed, los usuarios podrán habilitar el modo solo‑HTTPS. - Si se le asigna el valor disallowed, los usuarios no podrán habilitar el modo solo‑HTTPS. - Actualmente, no se puede habilitar por la fuerza el modo solo‑HTTPS.</translation> <translation id="2231817271680715693">Importar el historial de navegación desde el navegador predeterminado en la primera ejecución</translation> <translation id="2231962946025538735">Esta política está obsoleta. Utiliza <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> para controlar la disponibilidad del complemento Flash y <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> para controlar si el visor de PDF integrado se debe usar para abrir archivos PDF. @@ -1345,6 +1347,7 @@ Si esta política no se establece, cualquier complemento que coincida con los patrones de DisabledPlugins se bloqueará e inhabilitará, y el usuario no podrá habilitarlo.</translation> <translation id="2236488539271255289">No permitir que ningún sitio establezca datos locales</translation> +<translation id="2236593201136596376">Permitir que se recojan registros de texto WebRTC de los servicios de Google</translation> <translation id="2241498944622759244">Esta función nunca se llegó a lanzar. Por lo tanto, esta política no se utiliza. Si se le asigna el valor "True" o no se le asigna ninguno, <ph name="PRODUCT_NAME" /> sugerirá páginas que estén relacionadas con la página actual. Estas sugerencias se obtienen de forma remota de los servidores de Google. @@ -5710,6 +5713,7 @@ Si le asignas un valor a esta política, los usuarios no podrán cambiarlo. Si no se le asigna ninguno, los usuarios decidirán si se muestran o se ocultan los accesos directos a aplicaciones en el menú contextual de la barra de marcadores.</translation> <translation id="638003144128412430">Inhabilitar los informes sobre la zona horaria del dispositivo</translation> +<translation id="6382209369210116232">Inhabilitar extensiones no publicadas</translation> <translation id="6382351416269252693">Define una lista de patrones de URL de sitio donde se especifica qué sitios denegarán automáticamente el permiso de fuentes locales. Esto limitará la capacidad de los sitios para ver información sobre fuentes locales. Para obtener información detallada sobre los patrones de URL de sitios válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Los comodines (<ph name="WILDCARD_VALUE" />) están permitidos. Esta política solo detecta coincidencias basadas en el origen, así que se ignora cualquier ruta del patrón de URL. @@ -7411,7 +7415,6 @@ <translation id="7962093600142350905">Esta política controla si alguna de las impresoras disponibles en el protocolo Privet se muestran a los usuarios en el cuadro de diálogo de la vista previa de impresión. Si se habilita esta política, se mostrarán las impresoras disponibles en el protocolo Privet. Si se inhabilita esta política o no se le asigna ningún valor, las impresoras del protocolo Privet no se mostrarán en la vista previa de impresión, ya que este modo de impresión está obsoleto.</translation> -<translation id="7970844378072291834">Habilitar por la fuerza el modo solo‑HTTPS (aún no se puede)</translation> <translation id="7972642710812569707">Volver a habilitar de forma forzosa WebSQL en contextos de terceros.</translation> <translation id="7973609468423251675">Ten en cuenta que esta política está obsoleta y se eliminará de la versión 85 de <ph name="PRODUCT_OS_NAME" />. Utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> en su lugar. @@ -8085,6 +8088,7 @@ Si no se establece esta política para un sitio, se le aplicará la política de <ph name="DEFAULT_JAVA_SCRIPT_JIT_SETTING_POLICY_NAME" />, si se ha definido. Si no se ha definido esta política, se habilitará el uso de JavaScript con JIT en ese sitio.</translation> <translation id="8543108307976719751">Impedir conexiones de acceso remoto a este equipo</translation> +<translation id="8543639085146778837">Permitir que se recojan registros de texto WebRTC de los servicios de Google</translation> <translation id="8543975123557636331">Habilitar la salida de audio</translation> <translation id="8544375438507658205">Procesador de HTML predeterminado de <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8544465954173828789">Permite que los SMS del teléfono se sincronicen con Chromebook.</translation> @@ -8590,6 +8594,9 @@ El valor de esta política debe estar especificado en milisegundos. Los valores están fijados en un intervalo que comprendido entre 30 segundos y 24 horas.</translation> <translation id="9040042535845939426">Definir el estado de la pantalla de privacidad en la pantalla de inicio de sesión</translation> +<translation id="9046248916118130378">Si se habilita esta política, <ph name="PRODUCT_NAME" /> podrá recoger registros de texto WebRTC procedentes de servicios de Google como Google Meet y enviarlos a Google. Estos registros incluyen información de diagnóstico para solucionar problemas de depuración de videollamadas o audios en <ph name="PRODUCT_NAME" />, como los metadatos de texto que describen flujos de entrada y salida de WebRTC, entradas de registro específicas de WebRTC e información adicional del sistema. Estos registros no tienen contenido de audio ni de vídeo de la reunión. +Si se inhabilita esta política, no se subirán esos registros a Google. Los registros seguirán acumulándose de forma local en el dispositivo del usuario. +Si no se define esta política, <ph name="PRODUCT_NAME" /> recogerá y subirá estos registros de forma predeterminada.</translation> <translation id="9050853837490399534">Esta política determina si es necesario o no que el dispositivo se actualice a una versión Quick Fix. Si el valor de la política se establece en un token que se asocia a una versión Quick Fix, el dispositivo se actualizará a la versión Quick Fix correspondiente, a no ser que otra política bloquee la actualización.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index e9dbba0..c115fdb2 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1332,10 +1332,6 @@ <translation id="2223393221350938149">Interdire à tous les sites d'exécuter le JIT pour JavaScript</translation> <translation id="2223598546285729819">Paramètre de notification par défaut</translation> <translation id="222673035924187991">Activer TLS Encrypted ClientHello</translation> -<translation id="2231726854197443389">Cette règle détermine si les utilisateurs peuvent ou non activer le mode HTTPS uniquement dans les paramètres. Ce mode fait passer toutes les navigations en HTTPS. - Si ce paramètre n'est pas défini ou s'il est défini sur "Autorisé", les utilisateurs seront autorisés à activer le mode HTTPS uniquement. - Si ce paramètre est défini sur "Interdit", les utilisateurs ne seront pas autorisés à activer le mode HTTPS uniquement. - Le paramètre "Forcer l'activation du mode HTTPS uniquement" n'est pas encore pris en charge.</translation> <translation id="2231817271680715693">Importer l'historique de navigation du navigateur par défaut à la première exécution</translation> <translation id="2231962946025538735">Cette règle est obsolète. Veuillez utiliser la règle <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> pour contrôler la disponibilité du plug-in Flash et la règle <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> pour définir si la visionneuse de documents PDF intégrée doit être utilisée pour ouvrir les fichiers PDF. @@ -7357,7 +7353,6 @@ <translation id="7962093600142350905">Cette règle détermine si des imprimantes Privet disponibles s'affichent dans la boîte de dialogue d'aperçu avant impression à l'attention des utilisateurs. Si cette règle est activée, les imprimantes Privet disponibles s'affichent. Si vous désactivez cette règle ou ne la configurez pas, les imprimantes Privet ne s'affichent pas dans la boîte de dialogue d'aperçu avant impression, cette méthode d'impression étant obsolète.</translation> -<translation id="7970844378072291834">Forcer l'activation du mode HTTPS uniquement (pas encore pris en charge)</translation> <translation id="7972642710812569707">Forcer la réactivation de WebSQL dans des contextes tiers.</translation> <translation id="7973609468423251675">Cette règle étant obsolète, elle sera supprimée dans la version 85 de <ph name="PRODUCT_OS_NAME" />. (Veuillez utiliser la règle <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.)
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 1d54cb8..db3519c 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -743,6 +743,7 @@ Jika kebijakan ini disetel, penginstalan <ph name="PLUGIN_VM_NAME" /> akan gagal jika ruang disk kosong yang tersedia di perangkat kurang dari yang ditentukan oleh kebijakan.</translation> <translation id="1686952487081322272">Nonaktifkan Jawaban Instan</translation> <translation id="1690383938831887552">Cegah pemuatan Signed HTTP Exchange</translation> +<translation id="1692990221685273468">Menentukan apakah pemverifikasi sertifikat bawaan akan menerapkan batasan yang dienkode ke trust anchor yang dimuat dari penyimpanan trust platform.</translation> <translation id="169467210981344373">Nonaktifkan cache autentikasi HTTP yang tercakup secara global</translation> <translation id="1698810555265314018">Mengontrol resolusi gambar cetak saat <ph name="PRODUCT_NAME" /> mencetak PDF dengan rasterisasi. @@ -1341,10 +1342,6 @@ <translation id="2223393221350938149">Jangan izinkan situs apa pun menjalankan JIT JavaScript</translation> <translation id="2223598546285729819">Setelan pemberitahuan default</translation> <translation id="222673035924187991">Mengaktifkan Encrypted ClientHello TLS</translation> -<translation id="2231726854197443389">Kebijakan ini mengontrol apakah pengguna dapat mengaktifkan Mode Khusus HTTPS di Setelan. Mode Khusus HTTPS mengupgrade semua navigasi ke HTTPS. - Jika setelan ini tidak disetel atau disetel ke diizinkan, pengguna akan diizinkan mengaktifkan Mode Khusus HTTPS. - Jika setelan ini disetel ke tidak diizinkan, pengguna tidak akan diizinkan mengaktifkan Mode Khusus HTTPS. - Mengaktifkan paksa Mode Khusus HTTPS saat ini tidak didukung.</translation> <translation id="2231817271680715693">Impor histori browseran dari browser default saat pertama kali dijalankan</translation> <translation id="2231962946025538735">Kebijakan ini tidak digunakan lagi. Gunakan kebijakan <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> untuk mengontrol ketersediaan plugin Flash dan <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> untuk mengontrol apakah penampil PDF yang terintegrasi akan digunakan untuk membuka file PDF atau tidak. @@ -4925,6 +4922,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">Aktifkan pelaporan status penyimpanan perangkat</translation> <translation id="5608114828230655271">Perilaku default perangkat</translation> +<translation id="5611869109049836323">Terapkan batasan di trust anchor yang ditambahkan secara lokal</translation> <translation id="5614865701790130558">Membuat log peristiwa penginstalan ekstensi berdasarkan kebijakan</translation> <translation id="5618398258385745432">Setelan terkait digunakan sebelum autentikasi ulang saat melihat sandi diperkenalkan. Sejak saat itu, setelan dan kebijakan ini tidak berpengaruh pada perilaku Chrome. Perilaku Chrome saat ini sama seperti saat kebijakan ini ditetapkan untuk tidak menampilkan sandi dalam teks jelas di halaman setelan pengelola sandi. Artinya, halaman setelan hanya memuat placeholder, dan Chrome hanya akan menampilkan sandi setelah pengguna mengklik "Tampilkan" (dan mengautentikasi ulang, jika berlaku). Deskripsi asli untuk kebijakan ini tercantum di bawah. @@ -6860,6 +6858,7 @@ <translation id="7323896582714668701">Parameter baris perintah tambahan untuk <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">Cegah Chrome memblokir navigasi ke protokol eksternal di dalam iframe sandbox</translation> <translation id="7326394567531622570">Serupa dengan Wipe (nilai 2), namun mencoba untuk mempertahankan token login sehingga pengguna tidak perlu login lagi.</translation> +<translation id="7331387825106440104">Jangan terapkan batasan di trust anchor yang ditambahkan secara lokal</translation> <translation id="7331962793961469250">Bila disetel ke True, promosi untuk apl Chrome Webstore tidak akan muncul pada halaman tab baru. Menyetel opsi ini ke False atau membiarkannya tanpa disetel akan membuat promosi untuk apl Chrome Webstore muncul di halaman tab baru</translation> <translation id="7332963785317884918">Kebijakan ini tidak lagi digunakan. <ph name="PRODUCT_OS_NAME" /> akan selalu menggunakan strategi pembersihan 'RemoveLRU'. @@ -7497,7 +7496,6 @@ <translation id="7962093600142350905">Kebijakan ini mengontrol apakah printer privet yang tersedia akan ditampilkan kepada pengguna di dialog pratinjau cetak. Jika kebijakan ini disetel ke Aktif, printer privet yang tersedia akan ditampilkan. Jika kebijakan ini disetel ke Nonaktif atau tidak disetel, printer privet tidak akan muncul di pratinjau cetak, karena metode pencetakan ini sudah tidak digunakan lagi.</translation> -<translation id="7970844378072291834">Aktifkan paksa Mode Khusus HTTPS (belum didukung)</translation> <translation id="7972642710812569707">Paksa WebSQL di konteks pihak ketiga diaktifkan kembali.</translation> <translation id="7973609468423251675">Perhatikan bahwa kebijakan ini sudah tidak digunakan lagi dan akan dihapus di <ph name="PRODUCT_OS_NAME" /> versi 85. Sebagai gantinya, gunakan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -8475,6 +8473,32 @@ <translation id="8854571659927427063">Jika kebijakan disetel ke Aktif, bookmark akan diimpor dari browser default sebelumnya saat pertama kali dijalankan. Jika kebijakan disetel ke Nonaktif atau tidak disetel, tidak ada bookmark yang akan diimpor saat pertama kali dijalankan. Pengguna dapat memicu dialog impor dan kotak centang bookmark akan dicentang atau dihapus centangnya agar cocok dengan nilai kebijakan ini.</translation> +<translation id="8854703425882848037">Sertifikat X.509 dapat mengenkode batasan, seperti Batasan Nama, +di ekstensi dalam sertifikat. RFC 5280 menetapkan bahwa menerapkan +batasan tersebut pada sertifikat trust anchor bersifat opsional. Mulai +<ph name="PRODUCT_NAME" /> 112, batasan +dalam sertifikat tersebut yang dimuat dari penyimpanan sertifikat platform kini akan +diterapkan. + +Kebijakan ini dibuat sebagai penghentian sementara jika perusahaan mengalami +masalah dengan batasan yang dienkode di root pribadinya. Dalam hal ini, +kebijakan ini dapat digunakan untuk menonaktifkan sementara penerapan batasan +saat mengatasi masalah sertifikat. + +Jika kebijakan ini tidak disetel atau disetel ke aktif, +<ph name="PRODUCT_NAME" /> akan menerapkan +batasan yang dienkode ke trust anchor yang dimuat dari penyimpanan trust platform. + +Jika kebijakan ini disetel ke nonaktif, +<ph name="PRODUCT_NAME" /> tidak akan menerapkan +batasan yang dienkode ke trust anchor yang dimuat dari penyimpanan trust platform. + +Kebijakan ini tidak akan berpengaruh jika kebijakan +<ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> +dinonaktifkan. + +Kebijakan ini akan dihapus dari +<ph name="PRODUCT_NAME" /> versi 115.</translation> <translation id="8855929790177853633">Sumber gambar screensaver pengguna.</translation> <translation id="8858642179038618439">Memaksakan Mode Perlindungan YouTube</translation> <translation id="8860342862142842017">Nonaktifkan penerapan Transparansi Sertifikat untuk daftar hash subjectPublicKeyInfo</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index f6fe465..e8a06e9 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -942,6 +942,16 @@ Se il criterio è impostato su false o non viene configurato, <ph name="PRODUCT_NAME" /> non eseguirà i controlli delle revoche online in <ph name="PRODUCT_NAME" /> 19 e versioni successive. Nota: i controlli di <ph name="OCSP_CRL_LABEL" /> non forniscono vantaggi efficaci per la sicurezza.</translation> +<translation id="1904685047904049720">Se questo criterio viene attivato, le estensioni non pubblicate sul Chrome Web +Store verranno disattivate su <ph name="PRODUCT_NAME" />. +Questo criterio viene applicato solo alle estensioni installate e aggiornate dal +Chrome Web Store. Le estensioni esterne al negozio, come le estensioni non pacchettizzate +installate utilizzando la modalità sviluppatore e le estensioni installate tramite l'opzione della riga di comando, +vengono ignorate. Vengono ignorate anche le estensioni con installazione forzata che non si aggiornano dal +Chrome Web Store e tutte le estensioni con blocco della versione. + +Se il criterio viene impostato su <ph name="ALLOW_UNPUBLISHED" /> (0) o se non viene configurato, le estensioni non pubblicate sul Chrome Web Store sono consentite. +Se il criterio viene impostato su <ph name="DISABLE_UNPUBLISHED" /> (1), le estensioni non pubblicate sul Chrome Web Store vengono disattivate.</translation> <translation id="1905061765326052857">Non consentire agli utenti non affiliati di usare le macchine virtuali necessarie per supportare le app Linux</translation> <translation id="1910704279188129272">Consente di impostare limiti di utilizzo per app. I limiti di utilizzo possono essere applicati alle app installate su <ph name="PRODUCT_OS_NAME" /> per l'utente in questione. @@ -1321,10 +1331,6 @@ <translation id="2223393221350938149">Non consentire ad alcun sito di eseguire JIT di JavaScript</translation> <translation id="2223598546285729819">Impostazione di notifica predefinita</translation> <translation id="222673035924187991">Attiva TLS Encrypted ClientHello</translation> -<translation id="2231726854197443389">Questo criterio consente di stabilire se gli utenti possono attivare la Modalità solo HTTPS in Impostazioni. La Modalità solo HTTPS esegue l'upgrade di tutte le navigazioni alle estensioni HTTPS. - Se questa impostazione viene consentita o non viene configurata, gli utenti potranno attivare la Modalità solo HTTPS. - Se non viene consentita, gli utenti non potranno attivare la Modalità solo HTTPS. - Al momento l'opzione Forza l'attivazione della Modalità solo HTTPS non è supportata.</translation> <translation id="2231817271680715693">Importa cronologia di navigazione dal browser predefinito alla prima esecuzione</translation> <translation id="2231962946025538735">Questo criterio è stato ritirato. Usa il criterio <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> per controllare la disponibilità del plug-in Flash e il criterio <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> per scegliere se utilizzare il visualizzatore PDF integrato per aprire i file PDF. @@ -5674,6 +5680,7 @@ Se il criterio è configurato, gli utenti non possono apportare modifiche. Se non è configurato, gli utenti possono decidere se mostrare o nascondere la scorciatoia per le app dal menu contestuale della barra dei Preferiti.</translation> <translation id="638003144128412430">Disattiva i report sulle informazioni relative al fuso orario del dispositivo</translation> +<translation id="6382209369210116232">Disattiva le estensioni non pubblicate</translation> <translation id="6382351416269252693">Consente di impostare un elenco di pattern URL per i siti che specifica i siti a cui viene negata automaticamente l'autorizzazione per i caratteri locali. Ciò limiterà la capacità dei siti di vedere le informazioni sui caratteri locali. Per informazioni dettagliate sui pattern URL di siti validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. I caratteri jolly (<ph name="WILDCARD_VALUE" />) sono consentiti. Questo criterio ha corrispondenze basate soltanto sull'origine, pertanto qualsiasi percorso nel pattern URL viene ignorato. @@ -7352,7 +7359,6 @@ <translation id="7962093600142350905">Questo criterio controlla se vengono mostrate agli utenti eventuali stampanti Privet disponibili nella finestra di dialogo dell'anteprima di stampa. Se viene impostato su Attivato, le stampanti Privet disponibili vengono mostrate. Se viene impostato su Disattivato o se non viene configurato, le stampanti Privet non vengono mostrate nell'anteprima di stampa, poiché questo metodo di stampa è deprecato.</translation> -<translation id="7970844378072291834">Forza l'attivazione della Modalità solo HTTPS (opzione non ancora supportata)</translation> <translation id="7972642710812569707">Forza la riattivazione di WebSQL in contesti di terze parti.</translation> <translation id="7973609468423251675">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 218790b6..6abdbca 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1292,10 +1292,6 @@ <translation id="2223393221350938149">どのサイトにも JavaScript JIT の実行を許可しない</translation> <translation id="2223598546285729819">デフォルトの通知設定</translation> <translation id="222673035924187991">TLS 暗号化 ClientHello を有効にする</translation> -<translation id="2231726854197443389">このポリシーでは、ユーザーが [設定] で HTTPS 専用モードを有効にできるかどうかを管理します。HTTPS 専用モードでは、移動先がすべて HTTPS にアップグレードされます。 - 未設定のままにした場合や [allowed(許可する)] に設定した場合、ユーザーは HTTPS 専用モードを有効にできます。 - [disallowed(許可しない)] に設定した場合、ユーザーは HTTPS 専用モードを有効にできません。 - HTTPS 専用モードの強制的な有効化は、現在サポートされていません。</translation> <translation id="2231817271680715693">初回実行時にデフォルトのブラウザから閲覧履歴をインポートする</translation> <translation id="2231962946025538735">このポリシーはサポートを終了しました。Flash プラグインを使用できるかどうかを管理するには <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> を使用してください。また、PDF ファイルを開く際に組み込みの PDF ビューアを使用するかどうかを管理するには <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> を使用してください。 @@ -7068,7 +7064,6 @@ <translation id="7962093600142350905">このポリシーでは、印刷プレビュー ダイアログでユーザーに利用可能な任意の Privet プリンタを表示するかどうかを管理します。 このポリシーを有効に設定した場合、利用可能な Privet プリンタが表示されます。 このポリシーを無効に設定するか未設定のままにした場合、印刷プレビューに Privet プリンタは表示されません(この印刷方法はサポートが終了しています)。</translation> -<translation id="7970844378072291834">HTTPS 専用モードを強制的に有効化(まだサポートされていません)</translation> <translation id="7972642710812569707">サードパーティのコンテキストでの WebSQL を強制的に再び有効にする</translation> <translation id="7973609468423251675">このポリシーはサポートが終了しており、<ph name="PRODUCT_OS_NAME" /> バージョン 85 で削除されます。代わりに <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> を使用してください。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 05df30d..dbb484a 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -740,6 +740,7 @@ 정책을 설정하면 기기의 디스크 여유 공간이 정책에서 요구하는 수준보다 적을 경우 <ph name="PLUGIN_VM_NAME" /> 설치에 실패합니다.</translation> <translation id="1686952487081322272">빠른 답변 사용 안함</translation> <translation id="1690383938831887552">서명된 HTTP 교환(SXG) 로드 차단</translation> +<translation id="1692990221685273468">내장된 인증서 확인 기능이 플랫폼 신뢰 저장소에서 로드된 신뢰 앵커에 인코딩된 제약조건을 적용하게 할지 결정합니다.</translation> <translation id="169467210981344373">전역적으로 범위가 지정된 HTTP 인증 캐시 사용 중지</translation> <translation id="1698810555265314018"><ph name="PRODUCT_NAME" />에서 래스터화한 PDF를 인쇄할 때 인쇄 이미지 해상도를 관리합니다. @@ -1330,10 +1331,6 @@ <translation id="2223393221350938149">모든 사이트에서 자바스크립트 JIT를 실행하도록 허용 안함</translation> <translation id="2223598546285729819">기본 알림 설정</translation> <translation id="222673035924187991">TLS Encrypted ClientHello 사용</translation> -<translation id="2231726854197443389">이 정책은 사용자가 설정에서 HTTPS 전용 모드를 사용 설정할 수 있는지 결정합니다. HTTPS 전용 모드는 모든 탐색을 HTTPS로 업그레이드합니다. - 이 설정을 설정하지 않거나 허용됨으로 설정할 경우 사용자는 HTTPS 전용 모드를 사용 설정할 수 있습니다. - 이 설정을 허용되지 않음으로 설정할 경우 사용자는 HTTPS 전용 모드를 사용 설정할 수 없습니다. - HTTPS 전용 모드의 강제 사용 설정은 현재 지원되지 않습니다.</translation> <translation id="2231817271680715693">처음 실행 시 기본 브라우저에서 인터넷 사용기록 가져오기</translation> <translation id="2231962946025538735">지원 중단된 정책입니다. <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />을 사용하여 Flash 플러그인의 사용 가능 여부를 제어하고 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />를 사용하여 PDF 파일을 열 때 통합 PDF 뷰어를 사용할지 선택하세요. @@ -4867,6 +4864,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">기기 저장용량 상태 보고 사용 설정</translation> <translation id="5608114828230655271">기본 기기 동작</translation> +<translation id="5611869109049836323">로컬로 추가된 신뢰 앵커에 제약조건 적용</translation> <translation id="5614865701790130558">정책 기반 확장 프로그램 설치 이벤트 로그</translation> <translation id="5618398258385745432">비밀번호 조회를 위한 재인증 시작 전에 관련 설정을 사용했습니다. 그 이후에는 설정한 사항과 이 정책이 Chrome의 작동에 영향을 주지 않았습니다. 현재 Chrome은 비밀번호 관리자 설정 페이지에서 일반 텍스트로 비밀번호를 표시하는 것을 사용 중지하도록 정책을 설정했을 때와 동일하게 작동합니다. 따라서 설정 페이지에는 자리표시자만 포함되어 있으며, 사용자가 '표시'를 클릭하는 경우(해당하는 경우 다시 인증해야 함)에만 Chrome에서 비밀번호를 표시합니다. 정책의 원본 설명은 아래와 같습니다. @@ -6747,6 +6745,7 @@ <translation id="7323896582714668701"><ph name="PRODUCT_NAME" />의 추가 명령줄 매개변수</translation> <translation id="7325801934761922681">Chrome이 샌드박스 처리된 iframe 내부에서 외부 프로토콜로 이동을 차단하지 못하도록 방지</translation> <translation id="7326394567531622570">완전 삭제(값 2)와 유사하지만, 사용자가 다시 로그인할 필요가 없도록 로그인 토큰을 저장합니다.</translation> +<translation id="7331387825106440104">로컬로 추가된 신뢰 앵커에 제약조건 적용 안함</translation> <translation id="7331962793961469250">True로 설정하면 Chrome 웹 스토어의 앱 홍보가 새 탭 페이지에 표시되지 않습니다. 이 옵션을 False로 설정하거나 설정하지 않으면 Chrome 웹 스토어의 앱 홍보가 새 탭 페이지에 표시됩니다.</translation> @@ -7378,7 +7377,6 @@ <translation id="7962093600142350905">이 정책은 이용 가능한 Privet 프린터가 인쇄 미리보기 대화상자에서 사용자에게 표시될지를 제어합니다. 정책을 '사용'으로 설정하면 이용 가능한 Privet 프린터가 표시됩니다. 정책을 '사용 안함'으로 설정하거나 설정하지 않으면 Privet 인쇄 방식이 지원 중단되어 Privet 프린터가 인쇄 미리보기에 표시되지 않습니다.</translation> -<translation id="7970844378072291834">HTTPS 전용 모드 강제 사용 설정(아직 지원되지 않음)</translation> <translation id="7972642710812569707">타사 컨텍스트에서 WebSQL을 강제로 다시 사용 설정</translation> <translation id="7973609468423251675">이 정책은 지원이 중단되었으며 <ph name="PRODUCT_OS_NAME" /> 버전 85에서 삭제될 예정입니다. 대신 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> 정책을 사용하세요. @@ -8354,6 +8352,17 @@ <translation id="8854571659927427063">정책을 '사용'으로 설정하면 최초 실행 시 이전 기본 브라우저의 북마크를 가져옵니다. 정책을 '사용 안함'으로 설정하거나 설정하지 않으면 최초 실행 시 북마크를 가져오지 않습니다. 사용자는 가져오기 대화상자를 트리거할 수 있으며 '북마크' 체크박스가 이 정책의 값에 맞게 선택되거나 선택 해제됩니다.</translation> +<translation id="8854703425882848037">X.509 인증서는 인증서의 확장 프로그램에 이름 제약조건과 같은 제약조건을 인코딩할 수 있습니다. RFC 5280은 신뢰 앵커 인증서에 이러한 제약조건을 적용하는 것이 선택사항임을 명시합니다. 이제 <ph name="PRODUCT_NAME" /> 112부터 플랫폼 인증서 저장소에서 로드된 인증서에 이러한 제약조건이 적용됩니다. + +이 정책은 기업에서 비공개 루트에 인코딩된 제약조건 문제가 발생하는 경우 일시적인 선택 해제로 존재합니다. 이 경우 인증서 정책을 수정하는 동안 제약조건 시행을 일시적으로 중지하는 데 이 정책을 사용할 수 있습니다. + +이 정책을 설정하지 않거나 사용 설정하면 <ph name="PRODUCT_NAME" />은 플랫폼 신뢰 저장소에서 로드된 신뢰 앵커에 인코딩된 제약조건을 적용합니다. + +정책을 사용 중지하면 <ph name="PRODUCT_NAME" />은 플랫폼 신뢰 저장소에서 로드된 신뢰 앵커에 인코딩된 제약조건을 적용하지 않습니다. + +<ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> 정책이 사용 중지되어 있으면 이 정책은 아무런 영향을 미치지 않습니다. + +이 정책은 <ph name="PRODUCT_NAME" /> 버전 115부터 삭제될 예정입니다.</translation> <translation id="8855929790177853633">사용자 화면 보호기 이미지 소스입니다.</translation> <translation id="8858642179038618439">YouTube 안전 모드를 강제로 사용합니다.</translation> <translation id="8860342862142842017">subjectPublicKeyInfo 해시 목록에 인증서 투명성 시행 사용 중지</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 2ac64fc..e5d2664 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -741,6 +741,7 @@ Als dit beleid is ingesteld, mislukt de installatie van <ph name="PLUGIN_VM_NAME" /> als de beschikbare vrije opslagruimte op het apparaat minder is dan de waarde die wordt vereist door het beleid.</translation> <translation id="1686952487081322272">Snelle antwoorden uitzetten</translation> <translation id="1690383938831887552">Niet toestaan dat Signed HTTP Exchanges worden geladen</translation> +<translation id="1692990221685273468">Bepaalt of de ingebouwde certificaatverificatie beperkingen afdwingt die zijn gecodeerd in vertrouwensankers die worden geladen vanuit de vertrouwde opslag van het platform.</translation> <translation id="169467210981344373">HTTP-verificatiecache met wereldwijd bereik uitzetten</translation> <translation id="1698810555265314018">Dit beleid beheert de afbeeldingsresolutie voor afdrukken als <ph name="PRODUCT_NAME" /> gerasterde pdf's afdrukt. @@ -1329,10 +1330,6 @@ <translation id="2223393221350938149">Niet toestaan dat sites JavaScript JIT uitvoeren</translation> <translation id="2223598546285729819">Standaardinstelling voor meldingen</translation> <translation id="222673035924187991">ClientHallo met TLS-versleuteling aanzetten</translation> -<translation id="2231726854197443389">Met dit beleid wordt bepaald of gebruikers de modus 'Alleen HTTPS' kunnen aanzetten in de instellingen. Met de modus 'Alleen HTTPS' worden alle navigaties naar HTTPS geüpgraded. - Als deze instelling niet is ingesteld of is ingesteld op Toegestaan, kunnen gebruikers de modus 'Alleen HTTPS' aanzetten. - Als deze instelling is ingesteld op 'Niet toegestaan', kunnen gebruikers de modus 'Alleen HTTPS' niet aanzetten. - Het wordt momenteel niet ondersteund om de modus 'Alleen HTTPS' gedwongen aan te zetten.</translation> <translation id="2231817271680715693">Browsegeschiedenis importeren uit standaardbrowser bij eerste uitvoering</translation> <translation id="2231962946025538735">Dit beleid is beëindigd. Gebruik het beleid <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> om de beschikbaarheid van de Flash-plug-in te beheren en het beleid <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> om aan te geven of de geïntegreerde pdf-viewer moet worden gebruikt om pdf-bestanden te openen. @@ -4843,6 +4840,7 @@ <translation id="5601503069213153581">Pincode</translation> <translation id="5607021831414604820">Rapportage van opslagstatus van apparaat aanzetten</translation> <translation id="5608114828230655271">Standaard apparaatgedrag</translation> +<translation id="5611869109049836323">Beperkingen afdwingen in lokaal toegevoegde vertrouwensankers</translation> <translation id="5614865701790130558">Gebeurtenissen voor op beleid gebaseerde installaties van extensies registreren</translation> <translation id="5618398258385745432">De bijbehorende instelling werd gebruikt voordat hernieuwde verificatie voor de weergave van wachtwoorden is geïntroduceerd. Sindsdien hebben de instelling en dit beleid geen invloed gehad op het gedrag van Chrome. Het huidige gedrag van Chrome is nu hetzelfde alsof het beleid was ingesteld om wachtwoorden niet als leesbare tekst te tonen op de pagina met instellingen voor Wachtwoordmanager. Dat betekent dat de pagina met instellingen alleen een tijdelijke aanduiding bevat. Chrome laat het wachtwoord alleen zien als de gebruiker op Tonen klikt (en zo nodig de hernieuwde verificatie uitvoert). De oorspronkelijke beschrijving van het beleid volgt hieronder. @@ -6694,6 +6692,7 @@ <translation id="7323896582714668701">Extra opdrachtregelparameters voor <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">Voorkomen dat Chrome navigatie naar externe protocollen in iframes in sandboxes blokkeert</translation> <translation id="7326394567531622570">Vergelijkbaar met Wipe (waarde 2), maar probeert inlogtokens te behouden, zodat de gebruiker niet opnieuw hoeft in te loggen.</translation> +<translation id="7331387825106440104">Geen beperkingen afdwingen in lokaal toegevoegde vertrouwensankers</translation> <translation id="7331962793961469250">Wanneer dit is ingesteld op 'true', worden promoties voor apps van de Chrome Web Store niet weergegeven op de pagina 'Nieuw tabblad'. Als je deze optie instelt op 'false' of deze niet instelt, worden promoties voor apps van de Chrome Web Store wel op de pagina 'Nieuw tabblad' weergegeven.</translation> @@ -7320,7 +7319,6 @@ <translation id="7962093600142350905">Met dit beleid bepaal je of gebruikers beschikbare Privet-printers te zien krijgen in het dialoogvenster met afdrukvoorbeeld. Als je dit beleid aanzet, worden beschikbare Privet-printers getoond. Als je dit beleid niet toepast of niet instelt, worden Privet-printers niet getoond in het dialoogvenster met afdrukvoorbeeld, omdat deze afdrukmethode is verouderd.</translation> -<translation id="7970844378072291834">Modus 'Alleen HTTPS' gedwongen aanzetten (nog niet ondersteund)</translation> <translation id="7972642710812569707">Afdwingen dat WebSQL in contexten van derden opnieuw wordt aangezet.</translation> <translation id="7973609468423251675">Dit beleid is beëindigd en wordt verwijderd in <ph name="PRODUCT_OS_NAME" />-versie 85. Gebruik in plaats daarvan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -8287,6 +8285,17 @@ <translation id="8854571659927427063">Als je het beleid toepast, worden de bookmarks van de vorige standaardbrowser geïmporteerd bij de eerste uitvoering. Als je het beleid niet toepast of niet instelt, worden de bookmarks niet geïmporteerd bij de eerste uitvoering. Als gebruikers het dialoogvenster voor importeren openen, is het selectievakje voor bookmarks aan- of uitgevinkt in overeenstemming met de waarde van dit beleid.</translation> +<translation id="8854703425882848037">X.509-certificaten kunnen beperkingen, zoals naambeperkingen, coderen in extensies in het certificaat. RFC 5280 bepaalt dat het afdwingen van dergelijke beperkingen voor vertrouwensankercertificaten optioneel is. Vanaf <ph name="PRODUCT_NAME" /> 112 worden dergelijke beperkingen afgedwongen in certificaten die worden geladen vanuit de certificaatopslag van het platform. + +Dit beleid bestaat als tijdelijke afmelding voor als een bedrijf problemen ondervindt met de beperkingen die in hun eigen roots zijn gecodeerd. In dat geval kan dit beleid worden gebruikt om het afdwingen van de beperkingen tijdelijk uit te zetten en de certificaatproblemen te verhelpen. + +Als je dit beleid toepast of niet instelt, dwingt <ph name="PRODUCT_NAME" /> beperkingen af die zijn gecodeerd in vertrouwensankers die zijn geladen vanuit de vertrouwde opslag van het platform. + +Als je dit beleid niet toepast, dwingt <ph name="PRODUCT_NAME" /> geen beperkingen af die zijn gecodeerd in vertrouwensankers die zijn geladen vanuit de vertrouwde opslag van het platform. + +Dit beleid heeft geen effect als het beleid <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> niet wordt toegepast. + +Dit beleid wordt verwijderd in <ph name="PRODUCT_NAME" /> 115.</translation> <translation id="8855929790177853633">Bron van afbeeldingen voor screensaver.</translation> <translation id="8858642179038618439">Beperkte modus van YouTube afdwingen</translation> <translation id="8860342862142842017">Handhaving van Certificaattransparantie voor een lijst met subjectPublicKeyInfo-hashes</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index d3b4214..c81cbac 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -740,6 +740,7 @@ Se esta política for definida, haverá falha na instalação do <ph name="PLUGIN_VM_NAME" /> caso o espaço livre disponível em disco no dispositivo seja inferior ao exigido pela política.</translation> <translation id="1686952487081322272">Desativar as Respostas rápidas</translation> <translation id="1690383938831887552">Impedir o carregamento de Signed HTTP Exchanges</translation> +<translation id="1692990221685273468">Determina se o verificador integrado de certificados impõe restrições codificadas a âncoras de confiança carregadas pelo repositório de confiança da plataforma.</translation> <translation id="169467210981344373">Desativar cache de autenticação HTTP com escopo global</translation> <translation id="1698810555265314018">Controla a resolução da imagem quando o <ph name="PRODUCT_NAME" /> imprime PDFs com rasterização. @@ -1337,10 +1338,6 @@ <translation id="2223393221350938149">Não permitir que sites executem o JIT do JavaScript</translation> <translation id="2223598546285729819">Configuração padrão de notificações</translation> <translation id="222673035924187991">Ativar Encrypted ClientHello do TLS</translation> -<translation id="2231726854197443389">Esta política controla se os usuários podem ativar o HTTPS-Only Mode nas Configurações. O HTTPS-Only Mode faz upgrade de todas as navegações para HTTPS. - Se esta configuração for deixada sem definição ou for permitida, os usuários poderão ativar o HTTPS-Only Mode. - Se ela não for permitida, os usuários não poderão ativar o HTTPS-Only Mode. - A ativação automática do HTTPS-Only Mode não está disponível no momento.</translation> <translation id="2231817271680715693">Importar histórico de navegação do navegador padrão na primeira execução</translation> <translation id="2231962946025538735">O uso desta política foi suspenso. Use <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> para controlar a disponibilidade do plug-in Flash e <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> para controlar se o visualizador de PDF integrado será usado para abrir arquivos PDF. @@ -4912,6 +4909,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">Ativar relatórios de status do armazenamento do dispositivo</translation> <translation id="5608114828230655271">Comportamento padrão do dispositivo</translation> +<translation id="5611869109049836323">Aplicar restrições a âncoras de confiança adicionadas localmente</translation> <translation id="5614865701790130558">Registros de eventos para instalações de extensão com base em políticas</translation> <translation id="5618398258385745432">A configuração associada foi usada antes de a reautenticação na visualização de senhas ter sido introduzida. Desde então, a configuração e, consequentemente, esta política não têm efeito no comportamento do Chrome. O comportamento atual do Chrome agora é o mesmo que seria se a política tivesse sido definida para desativar a visualização de senhas em texto não criptografado na página de configurações do gerenciador de senhas. Isso quer dizer que a página de configurações contém apenas um marcador, e o Chrome só mostrará a senha depois que o usuário clicar em "Mostrar" (e reautenticar, se aplicável). A descrição original da política é a mostrada a seguir. @@ -6839,6 +6837,7 @@ <translation id="7323896582714668701">Parâmetros de linha de comando adicionais para o <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">Impedir que o Chrome bloqueie a navegação para protocolos externos no iframe dentro do sandbox</translation> <translation id="7326394567531622570">Semelhante a Wipe (valor 2), mas tenta preservar os tokens de login para que o usuário não precise fazer login novamente.</translation> +<translation id="7331387825106440104">Não aplicar restrições a âncoras de confiança adicionadas localmente</translation> <translation id="7331962793961469250">Quando definidas como "True", promoções para aplicativos na Chrome Web Store não serão exibidas na página nova guia. Definir esta opção como "False" ou deixá-la sem definição fará com que as promoções para aplicativos na Chrome Web Store sejam exibidas na página nova guia</translation> <translation id="7332963785317884918">Esta política está obsoleta. O <ph name="PRODUCT_OS_NAME" /> sempre usará a estratégia de limpeza "RemoveLRU". @@ -7475,7 +7474,6 @@ <translation id="7962093600142350905">Esta política controla se as impressoras com protocolo Privet disponíveis serão exibidas ao usuário na caixa de diálogo de visualização de impressão. Se a política for definida como "Ativada", as impressoras com protocolo Privet disponíveis serão exibidas. Se ela for definida como "Desativada" ou deixada sem definição, as impressoras com protocolo Privet não serão exibidas na visualização de impressão, já que esse método de impressão está suspenso.</translation> -<translation id="7970844378072291834">Forçar a ativação do HTTPS-Only Mode (indisponível no momento)</translation> <translation id="7972642710812569707">Forçar a reativação do WebSQL em contextos de terceiros.</translation> <translation id="7973609468423251675">Esta política está obsoleta e será removida na versão 85 do <ph name="PRODUCT_OS_NAME" />. Por isso, passe a usar <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -8455,6 +8453,32 @@ <translation id="8854571659927427063">Se a política for definida como ativada, os favoritos serão importados do navegador padrão anterior durante a primeira execução. Se a política for definida como desativada ou não for definida, nenhum favorito será importado durante a primeira execução. O usuário pode acionar uma caixa de diálogo de importação em que a caixa de seleção dos favoritos estará marcada ou desmarcada de acordo com o valor da política.</translation> +<translation id="8854703425882848037">Os certificados X.509 podem codificar restrições, como as de nome, +em extensões do certificado. A RFC 5280 especifica que a aplicação dessas +restrições a certificados de âncoras de confiança é opcional. Da versão 112 em diante +do <ph name="PRODUCT_NAME" />, essas restrições +em certificados carregados do repositório de certificados da plataforma passam a ser +aplicadas. + +Esta política existe como uma desativação temporária caso uma empresa encontre +problemas com as restrições codificadas nas raízes particulares. Nesse caso, esta +política pode ser usada para desativar temporariamente a aplicação das restrições +enquanto corrige os problemas de certificado. + +Quando esta política for deixada sem definição ou for ativada, +o <ph name="PRODUCT_NAME" /> vai aplicar +restrições codificadas a âncoras de confiança carregadas pelo repositório de confiança da plataforma. + +Quando ela for desativada, +o <ph name="PRODUCT_NAME" /> não aplicará +restrições codificadas a âncoras de confiança carregadas do repositório de confiança da plataforma. + +Esta política não tem efeito quando a +<ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> +está desativada. + +Esta política vai ser removida na +versão 115 do <ph name="PRODUCT_NAME" />.</translation> <translation id="8855929790177853633">Origem da imagem do protetor de tela do usuário.</translation> <translation id="8858642179038618439">Forçar modo de segurança do YouTube</translation> <translation id="8860342862142842017">Desativar a aplicação da Transparência dos certificados para uma lista de hashes subjectPublicKeyInfo</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 2db7ecb6..6dbc2cc 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -737,6 +737,7 @@ Если правило настроено, установка <ph name="PLUGIN_VM_NAME" /> будет выполнена, только если на устройстве больше свободного пространства, чем задано в правиле.</translation> <translation id="1686952487081322272">Отключить быстрые ответы</translation> <translation id="1690383938831887552">Запретить загрузку веб-контента, для показа которого используется Signed HTTP Exchange</translation> +<translation id="1692990221685273468">Определяет, будет ли встроенный инструмент для проверки сертификатов принудительно использовать ограничения, которые закодированы в якорях доверия, загруженных из доверенного хранилища платформы.</translation> <translation id="169467210981344373">Отключить глобальное применение кеша аутентификации HTTP</translation> <translation id="1698810555265314018">Определяет разрешение изображения при печати PDF в растровом формате в <ph name="PRODUCT_NAME" />. @@ -1330,10 +1331,6 @@ <translation id="2223393221350938149">Запретить использование JIT-компилятора JavaScript на всех сайтах</translation> <translation id="2223598546285729819">Настройка уведомлений по умолчанию</translation> <translation id="222673035924187991">Включение Encrypted ClientHello для TLS</translation> -<translation id="2231726854197443389">Это правило определяет, могут ли пользователи включить режим "Только HTTPS" в настройках. Если этот режим активирован, используется только протокол HTTPS. - Если этот параметр не настроен или для него установлено значение "Разрешено", пользователи смогут включить режим "Только HTTPS". - Если для этого параметра установлено значение "Запрещено", пользователи не смогут включить режим "Только HTTPS". - В настоящее время принудительное включение режима "Только HTTPS" не поддерживается.</translation> <translation id="2231817271680715693">Импорт истории просмотров из браузера, используемого по умолчанию, при первом запуске</translation> <translation id="2231962946025538735">Правило устарело. Используйте вместо него <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> для управления доступностью Flash-плагина и <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> для настройки встроенного средства просмотра PDF-файлов. @@ -4853,6 +4850,7 @@ <translation id="5601503069213153581">PIN-код</translation> <translation id="5607021831414604820">Включить отправку данных о статусе хранилища устройства</translation> <translation id="5608114828230655271">Настройка устройства по умолчанию</translation> +<translation id="5611869109049836323">Включить принудительное использование ограничений, закодированных в якорях доверия, которые добавлены локально</translation> <translation id="5614865701790130558">Ведение журнала событий, связанных с установкой расширений на основе правил</translation> <translation id="5618398258385745432">В Chrome была добавлена повторная аутентификация для доступа к паролям, и связанная настройка перестала действовать. Соответственно, это правило также больше не действует. Теперь Chrome работает так, как если бы правило запрещало просмотр паролей в незашифрованном виде в диспетчере. При этом пароль на странице настроек скрыт, но пользователь может нажать кнопку "Показать", ввести учетные данные аккаунта, если потребуется, и посмотреть пароль. Исходное описание правила приведено ниже. @@ -6734,6 +6732,7 @@ <translation id="7323896582714668701">Дополнительные параметры командной строки для <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">Запрещать Chrome блокировать переходы на внешние протоколы в изолированном окне iframe</translation> <translation id="7326394567531622570">Работает, как правило Wipe (значение 2), однако токены авторизации сохраняются, чтобы пользователю не приходилось снова входить в систему.</translation> +<translation id="7331387825106440104">Отключить принудительное использование ограничений, закодированных в якорях доверия, которые добавлены локально</translation> <translation id="7331962793961469250">Если установлено значение True, на новой вкладке не будет отображаться реклама приложений из Интернет-магазина Chrome. Если этот параметр не задан или выбрано значение False, реклама будет отображаться.</translation> <translation id="7332963785317884918">Это правило устарело. Очистка данных в <ph name="PRODUCT_OS_NAME" /> всегда будет проводиться по принципу RemoveLRU. @@ -7363,7 +7362,6 @@ <translation id="7962093600142350905">Это правило определяет, будут ли пользователи видеть в окне предварительного просмотра печати принтеры, использующие протокол Privet. Если оно включено, такие принтеры показываются в списке. Если правило отключено или не настроено, принтеры, использующие устаревший протокол Privet, не показываются в окне предварительного просмотра печати.</translation> -<translation id="7970844378072291834">Принудительное включение режима "Только HTTPS" (пока не поддерживается)</translation> <translation id="7972642710812569707">Принудительно включить WebSQL в стороннем контексте</translation> <translation id="7973609468423251675">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -8337,6 +8335,17 @@ <translation id="8854571659927427063">Если правило включено, при первом запуске будут импортированы закладки браузера, который ранее был основным. Если правило выключено или не настроено, закладки не импортируются при первом запуске. Когда пользователь откроет диалоговое окно импорта, флажок импорта закладок будет установлен или снят в соответствии с текущей настройкой правила.</translation> +<translation id="8854703425882848037">В дополнениях сертификата X.509 могут быть закодированы ограничения, например на имена. В стандарте RFC 5280 указано, что необязательно принудительно применять такие ограничения из сертификатов якорей доверия. Начиная с <ph name="PRODUCT_NAME" /> версии 112 такие ограничения в сертификатах, загруженных из хранилища платформы, будут использоваться принудительно. + +Это правило применяется как временное решение в случаях, когда компании испытывают проблемы с ограничениями, закодированными в корневых сертификатах. Его можно использовать, чтобы временно отключить принудительное применение ограничений, пока проблемы с сертификатами не будут устранены. + +Если правило включено или не настроено, <ph name="PRODUCT_NAME" /> будет принудительно использовать ограничения, которые закодированы в якорях доверия, загруженных из доверенного хранилища платформы. + +Если правило отключено, <ph name="PRODUCT_NAME" /> не будет принудительно использовать такие ограничения. + +Это правило не действует, если правило <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> отключено. + +Это правило будет удалено в <ph name="PRODUCT_NAME" /> версии 115.</translation> <translation id="8855929790177853633">Источник изображений для заставки на заблокированном экране</translation> <translation id="8858642179038618439">Позволяет принудительно включить безопасный режим на YouTube</translation> <translation id="8860342862142842017">Отключить проверку сертификатов для списка хешей subjectPublicKeyInfo</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index e739a5e..714b247d 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -739,6 +739,7 @@ หากตั้งค่านโยบายนี้ การติดตั้ง <ph name="PLUGIN_VM_NAME" /> จะไม่สำเร็จหากอุปกรณ์มีพื้นที่ว่างในดิสก์น้อยกว่าที่นโยบายกำหนดไว้</translation> <translation id="1686952487081322272">ปิดใช้คำตอบด่วน</translation> <translation id="1690383938831887552">ป้องกันไม่ให้โหลด Signed HTTP Exchange</translation> +<translation id="1692990221685273468">กําหนดว่าตัวตรวจสอบใบรับรองในตัวจะบังคับใช้ข้อจํากัดที่เข้ารหัสไว้ใน Trust Anchor ที่โหลดจากร้านค้าที่เชื่อถือได้ของแพลตฟอร์มหรือไม่</translation> <translation id="169467210981344373">ปิดใช้แคชการตรวจสอบสิทธิ์ HTTP ที่มีขอบเขตทั่วไป</translation> <translation id="1698810555265314018">ควบคุมความละเอียดของรูปภาพพิมพ์เมื่อ <ph name="PRODUCT_NAME" /> พิมพ์ PDF ที่มีการทำแรสเตอร์ @@ -1329,10 +1330,6 @@ <translation id="2223393221350938149">ไม่อนุญาตให้เว็บไซต์เรียกใช้ JIT ใน JavaScript</translation> <translation id="2223598546285729819">การตั้งค่าการแจ้งเตือนเริ่มต้น</translation> <translation id="222673035924187991">เปิดใช้ ClientHello ที่เข้ารหัสตาม TLS</translation> -<translation id="2231726854197443389">นโยบายนี้ควบคุมว่าผู้ใช้เปิดใช้โหมด "HTTPS เท่านั้น" ในการตั้งค่าได้หรือไม่ โหมด "HTTPS เท่านั้น" จะอัปเกรดการนำทางทั้งหมดให้เป็นแบบ HTTPS - หากไม่ได้ตั้งค่านี้หรือตั้งค่าเป็น "อนุญาต" ผู้ใช้จะได้รับอนุญาตให้เปิดใช้โหมด "HTTPS เท่านั้น" - หากตั้งค่านี้เป็น "ไม่อนุญาต" ผู้ใช้จะไม่ได้รับอนุญาตให้เปิดใช้โหมด "HTTPS เท่านั้น" - ปัจจุบันยังไม่รองรับการบังคับให้เปิดใช้โหมด "HTTPS เท่านั้น"</translation> <translation id="2231817271680715693">นำเข้าประวัติการเรียกดูจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation> <translation id="2231962946025538735">นโยบายนี้เลิกใช้งานแล้ว โปรดใช้ <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> เพื่อควบคุมความพร้อมใช้งานของปลั๊กอิน Flash และใช้ <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> เพื่อควบคุมว่าควรใช้โปรแกรมดู PDF ที่ผสานรวมในการเปิดไฟล์ PDF หรือไม่ @@ -4844,6 +4841,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">เปิดใช้การรายงานสถานะพื้นที่เก็บข้อมูลของอุปกรณ์</translation> <translation id="5608114828230655271">ลักษณะการทำงานเริ่มต้นของอุปกรณ์</translation> +<translation id="5611869109049836323">บังคับใช้ข้อจํากัดใน Trust Anchor ที่เพิ่มในเครื่อง</translation> <translation id="5614865701790130558">บันทึกเหตุการณ์ของการติดตั้งส่วนขยายตามนโยบาย</translation> <translation id="5618398258385745432">มีการใช้การตั้งค่าที่เชื่อมโยงกันก่อนการตรวจสอบสิทธิ์อีกครั้งเมื่อใช้การดูรหัสผ่าน ด้วยเหตุนี้ การตั้งค่าและนโยบายนี้จึงไม่มีผลต่อลักษณะการทำงานของ Chrome ซึ่งปัจจุบันมีลักษณะเหมือนกับว่ามีการตั้งค่านโยบายให้ปิดใช้การแสดงรหัสผ่านอย่างชัดเจนในหน้าการตั้งค่าตัวจัดการรหัสผ่าน หรือหมายความว่าหน้าการตั้งค่าจะมีเพียงตัวยึดตำแหน่ง และ Chrome จะแสดงรหัสผ่านต่อเมื่อผู้ใช้คลิก "แสดง" (และทำการตรวจสอบสิทธิ์อีกครั้ง หากจำเป็น) คำอธิบายเดิมของนโยบายนี้มีตามที่แสดงไว้ด้านล่าง @@ -6704,6 +6702,7 @@ <translation id="7323896582714668701">พารามิเตอร์บรรทัดคำสั่งเพิ่มเติมสำหรับ <ph name="PRODUCT_NAME" /></translation> <translation id="7325801934761922681">ป้องกันไม่ให้ Chrome บล็อกการเรียกออกไปยังโปรโตคอลนอก iframe ที่ทำแซนด์บ็อกซ์</translation> <translation id="7326394567531622570">เหมือนกับ Wipe (ค่า 2) แต่ให้ลองเก็บโทเค็นการลงชื่อเข้าใช้ไว้ เพื่อให้ผู้ใช้ไม่ต้องลงชื่อเข้าใช้อีกครั้ง</translation> +<translation id="7331387825106440104">ไม่บังคับใช้ข้อจำกัดใน Trust Anchor ที่เพิ่มในเครื่อง</translation> <translation id="7331962793961469250">เมื่อตั้งค่าเป็น "จริง" การส่งเสริมสำหรับแอปพลิเคชัน Chrome เว็บสโตร์จะไม่ปรากฏบนหน้าแท็บใหม่ การตั้งค่าตัวเลือกนี้เป็น "เท็จ" หรือการปล่อยไว้แบบไม่ได้ตั้งค่าจะทำให้การส่งเสริมสำหรับแอปพลิเคชัน Chrome เว็บสโตร์ปรากฏบนหน้าแท็บใหม่</translation> <translation id="7332963785317884918">นโยบายนี้ถูกกำหนดให้เลิกใช้แล้ว <ph name="PRODUCT_OS_NAME" /> จะใช้กลยุทธ์ในการล้างข้อมูลแบบ "RemoveLRU" เสมอ @@ -7327,7 +7326,6 @@ <translation id="7962093600142350905">นโยบายนี้ควบคุมว่าจะแสดงเครื่องพิมพ์ Privet ที่พร้อมใช้งานต่อผู้ใช้หรือไม่ในกล่องโต้ตอบการแสดงตัวอย่างการพิมพ์ การตั้งค่านโยบายนี้เป็น "เปิดใช้" จะแสดงเครื่องพิมพ์ Privet ที่พร้อมใช้งาน การตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้เครื่องพิมพ์ Privet ไม่ปรากฏในตัวอย่างก่อนพิมพ์ เนื่องจากเป็นวิธีการพิมพ์ที่เลิกใช้งานแล้ว</translation> -<translation id="7970844378072291834">บังคับให้เปิดใช้โหมด "HTTPS เท่านั้น" (ยังไม่รองรับ)</translation> <translation id="7972642710812569707">บังคับให้เปิดใช้ WebSQL ในบริบทของบุคคลที่สามอีกครั้ง</translation> <translation id="7973609468423251675">โปรดทราบว่าจะมีการเลิกใช้งานและนำนโยบายนี้ออกใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 85 โปรดใช้ <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> แทน @@ -8289,6 +8287,17 @@ <translation id="8854571659927427063">การตั้งค่านโยบายเป็น "เปิดใช้" จะนำเข้าบุ๊กมาร์กจากเบราว์เซอร์เริ่มต้นก่อนหน้าเมื่อเรียกใช้ครั้งแรก การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า หมายความว่าจะไม่มีการนำเข้าบุ๊กมาร์กเมื่อเรียกใช้ครั้งแรก ผู้ใช้จะทริกเกอร์กล่องโต้ตอบการนำเข้า และจะมีการเลือกหรือไม่ได้เลือกช่องทำเครื่องหมายบุ๊กมาร์กไว้ เพื่อให้ตรงกับค่าของนโยบายนี้</translation> +<translation id="8854703425882848037">ใบรับรอง X.509 อาจเข้ารหัสข้อจํากัด เช่น ข้อจํากัดชื่อ (Name Constraints) ในส่วนขยายในใบรับรอง RFC 5280 ระบุว่าการบังคับใช้ข้อจํากัดดังกล่าวกับใบรับรองของ Trust Anchor นั้นจะทำหรือไม่ทำก็ได้ ตั้งแต่ <ph name="PRODUCT_NAME" /> 112 เป็นต้นไป ระบบจะบังคับใช้ข้อจํากัดดังกล่าวในใบรับรองที่โหลดจากที่เก็บใบรับรองของแพลตฟอร์ม + +นโยบายนี้เป็นการเลือกไม่ใช้ชั่วคราวในกรณีที่องค์กรพบปัญหาเกี่ยวกับข้อจํากัดที่เข้ารหัสในรูทส่วนตัว ในกรณีดังกล่าว ระบบอาจใช้นโยบายนี้เพื่อปิดการบังคับใช้ข้อจํากัดไว้ชั่วคราวขณะกำลังแก้ไขปัญหาใบรับรอง + +เมื่อไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็นเปิดใช้ <ph name="PRODUCT_NAME" /> จะบังคับใช้ข้อจํากัดที่เข้ารหัสไว้ใน Trust Anchor ที่โหลดจากร้านค้าที่เชื่อถือได้ของแพลตฟอร์ม + +เมื่อตั้งค่านโยบายนี้เป็น "ปิดใช้" <ph name="PRODUCT_NAME" /> จะไม่บังคับใช้ข้อจํากัดที่เข้ารหัสไว้ใน Trust Anchor ที่โหลดจากร้านค้าที่เชื่อถือได้ของแพลตฟอร์ม + +นโยบายนี้จะไม่มีผลหากตั้งค่านโยบาย <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> เป็น "ปิดใช้" + +เรามีแผนจะนำนโยบายนี้ออกใน <ph name="PRODUCT_NAME" /> เวอร์ชัน 115</translation> <translation id="8855929790177853633">แหล่งที่มาของรูปภาพโปรแกรมรักษาหน้าจอของผู้ใช้</translation> <translation id="8858642179038618439">บังคับใช้โหมดปลอดภัยของ YouTube</translation> <translation id="8860342862142842017">ปิดการบังคับใช้ความโปร่งใสของใบรับรองสำหรับรายการแฮช subjectPublicKeyInfo</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 1999086..ebb3e63a 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -741,6 +741,7 @@ Politika ayarlanırsa cihazda yetersiz disk alanı olduğunda <ph name="PLUGIN_VM_NAME" /> yüklemesi başarısız olur.</translation> <translation id="1686952487081322272">Bil Bakalım'ı Devre Dışı Bırak</translation> <translation id="1690383938831887552">İmzalanmış HTTP Takaslarının yüklenmesini engelle</translation> +<translation id="1692990221685273468">Yerleşik sertifika doğrulayıcının, platform güven deposundan yüklenen güven bağlantıları için kodlanmış kısıtlamalar uygulayıp uygulamayacağını belirler.</translation> <translation id="169467210981344373">Genel kapsamlı HTTP kimlik doğrulama önbelleğini devre dışı bırak</translation> <translation id="1698810555265314018"><ph name="PRODUCT_NAME" />, pikselleştirme ile PDF yazdırdığında yazdırılan resmin çözünürlüğünü kontrol eder. @@ -1339,10 +1340,6 @@ <translation id="2223393221350938149">Hiçbir sitenin JavaScript JIT çalıştırmasına izin verme</translation> <translation id="2223598546285729819">Varsayılan bildirim ayarı</translation> <translation id="222673035924187991">TLS Encrypted ClientHello'yu etkinleştir</translation> -<translation id="2231726854197443389">Bu politika, kullanıcıların Yalnızca HTTPS Modunu Ayarlar'da etkinleştirip etkinleştiremeyeceğini kontrol eder. Yalnızca HTTPS Modu, tüm gezinmeleri HTTPS'ye yükseltir. - Bu ayar belirtilmezse veya izin verildi olarak seçilirse kullanıcılar Yalnızca HTTPS Modunu etkinleştirebilir. - Bu ayar izin verilmedi olarak seçilirse kullanıcılar Yalnızca HTTPS Modunu etkinleştiremez. - Yalnızca HTTPS Modunu etkinleştirmeye zorla seçeneği şu anda desteklenmiyor.</translation> <translation id="2231817271680715693">İlk çalıştırmada tarama geçmişini varsayılan tarayıcıdan içe aktar</translation> <translation id="2231962946025538735">Bu politika kullanımdan kaldırılmıştır. Lütfen Flash eklentisinin kullanılabilirliğini kontrol etmek için <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> politikasını, PDF dosyaları açılırken entegre PDF görüntüleyicisinin kullanılıp kullanılmayacağını kontrol etmek için de <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> politikasını kullanın. @@ -4890,6 +4887,7 @@ <translation id="5601503069213153581">PIN</translation> <translation id="5607021831414604820">Cihazın depolama alanı durumu raporlamasını etkinleştir</translation> <translation id="5608114828230655271">Varsayılan cihaz davranışı</translation> +<translation id="5611869109049836323">Yerel olarak eklenen güven bağlantılarında kısıtlamalar uygulama</translation> <translation id="5614865701790130558">Politika tabanlı eklenti yüklemeleriyle ilgili etkinlikleri günlüğe kaydetme</translation> <translation id="5618398258385745432">İlişkili ayar, şifrelerin görüntülenmesinde yeniden kimlik doğrulaması kullanılmaya başlamadan önce kullanılıyordu. O zamandan beri, bu ayarın ve dolayısıyla bu politikanın Chrome davranışı üzerinde herhangi bir etkisi olmadı. Şu anda Chrome'un geçerli davranışı, politikanın, şifre yöneticisi ayarları sayfasında şifreleri açık metin olarak göstermeyi devre dışı bırakacak şekilde ayarlanmasıyla aynıdır. Yani ayarlar sayfası, yalnızca bir yer tutucu içerir ve Chrome, yalnızca kullanıcının "Göster"i tıklamasıyla (ve uygulanıyorsa yeniden kimlik doğrulaması yapmasıyla) şifreyi gösterir. Politikanın asıl açıklaması aşağıda belirtilmiştir. @@ -6773,6 +6771,7 @@ <translation id="7323896582714668701"><ph name="PRODUCT_NAME" /> için ek komut satırı parametreleri</translation> <translation id="7325801934761922681">Chrome'un, korumalı alana alınmış iframe içerisindeki harici protokollerde gezinmeyi engellemesini önle</translation> <translation id="7326394567531622570">Wipe (2 değeri) seçeneğine benzer, ancak kullanıcının tekrar oturum açmak zorunda kalmaması için giriş jetonlarını saklar.</translation> +<translation id="7331387825106440104">Yerel olarak eklenen güven bağlantılarında kısıtlama uygulamayın</translation> <translation id="7331962793961469250">True değerine ayarlandığında, Chrome Web Mağazası uygulamalarına ilişkin tanıtımlar yeni sekme sayfasında görünmez. Bu seçeneğin False değerine ayarlanması veya ayarlanmadan bırakılması, Chrome Web Mağazası uygulamalarına ilişkin tanıtımların yeni sekme sayfasında görünmesine neden olur</translation> @@ -7405,7 +7404,6 @@ <translation id="7962093600142350905">Bu politika, kullanılabilir privet yazıcılarının yazdırma önizleme iletişim kutusunda kullanıcılara gösterilip gösterilmeyeceğini kontrol eder. Bu politika Etkin değerine ayarlanırsa kullanılabilir privet yazıcıları gösterilir. Bu politikanın Devre Dışı değerine ayarlanması ya da ayarlanmadan bırakılması, bu yazdırma yöntemi kullanımdan kaldırıldığı için privet yazıcılarının baskı önizlemede görünmemesine neden olur.</translation> -<translation id="7970844378072291834">Yalnızca HTTPS Modunu etkinleştirmeye zorla (şu anda desteklenmiyor)</translation> <translation id="7972642710812569707">Üçüncü taraf bağlamındaki WebSQL'yi yeniden etkinleştirilmeye zorla.</translation> <translation id="7973609468423251675">Bu politikanın artık kullanılmadığını ve <ph name="PRODUCT_OS_NAME" /> sürüm 85'te kaldırılacağını unutmayın. Lütfen bunun yerine <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> politikasını kullanın. @@ -8378,6 +8376,17 @@ <translation id="8854571659927427063">Politika Etkin değerine ayarlanırsa önceki varsayılan tarayıcıdan yer işaretleri ilk çalıştırmada içe aktarılır. Politika Devre dışı değerine ayarlanır veya ayarlanmadan bırakılırsa yer işaretleri ilk çalıştırmada içe aktarılmaz. Kullanıcılar içe aktarma iletişim kutusunu tetikleyebilir ve yer işaretleri onay kutusu, bu politikanın değerine uyacak şekilde işaretlenir veya işareti kaldırılır.</translation> +<translation id="8854703425882848037">X.509 sertifikaları, sertifikadaki uzantılara Ad Kısıtlamaları gibi kısıtlamalar kodlayabilir. RFC 5280, güven bağlantısı sertifikalarına bu tür kısıtlamaların uygulanmasının isteğe bağlı olduğunu belirtir. <ph name="PRODUCT_NAME" /> 112 sürümünden itibaren, platform sertifika deposundan yüklenen sertifikalardaki bu tür kısıtlamalar uygulanacaktır. + +Bu politika, özel köklerine kodlanan kısıtlamalarla karşılaşan kuruluşların geçici olarak kapsam dışında kalmayı seçmesine neden olur. Bu durumda, kısıtlamaların uygulanmasını geçici olarak devre dışı bırakıp sertifika sorunları düzeltmek için bu politika kullanılabilir. + +Bu politika ayarlanmadığında veya etkin değerine ayarlandığında <ph name="PRODUCT_NAME" />, platform güven deposundan yüklenen güven bağlantılarına kodlanmış kısıtlamalar uygular. + +Bu politika devre dışı değerine ayarlanırsa <ph name="PRODUCT_NAME" />, platform güven deposundan yüklenen güven bağlantılarına kodlanmış kısıtlamalar uygulamaz. + +<ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> politikası devre dışı bırakılırsa bu politikanın etkisi olmaz. + +<ph name="PRODUCT_NAME" /> sürüm 115'te bu politikanın kaldırılması planlanmaktadır.</translation> <translation id="8855929790177853633">Kullanıcı ekran koruyucusu resminin kaynağı.</translation> <translation id="8858642179038618439">YouTube Güvenlik Modunu zorla</translation> <translation id="8860342862142842017">subjectPublicKeyInfo karma listesi için Sertifika Şeffaflığı uygulamasını devre dışı bırak</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 16b3f9c4..593a695 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -945,6 +945,11 @@ Якщо для цього правила вибрано значення False або його не налаштовано, <ph name="PRODUCT_NAME" /> не здійснюватиме онлайн-перевірки анулювання сертифікатів у <ph name="PRODUCT_NAME" /> 19 і новіших версій. Примітка: перевірки <ph name="OCSP_CRL_LABEL" /> не забезпечують ефективне покращення безпеки.</translation> +<translation id="1904685047904049720">Якщо ввімкнути це правило, у <ph name="PRODUCT_NAME" /> буде вимкнено розширення, не опубліковані у Веб-магазині Chrome. +Це правило стосується лише встановлених розширень, які оновлюються з Веб-магазину Chrome. Інші розширення, як-от розпаковані розширення, установлені в режимі розробника, а також розширення, установлені за допомогою перемикача командного рядка, примусово встановлені розширення, які не оновлюються з Веб-магазину Chrome, і всі розширення для певної версії веб-переглядача, ігноруються. + +Якщо для цього правила вибрати значення <ph name="ALLOW_UNPUBLISHED" /> (0) або не налаштувати його, розширення, неопубліковані у Веб-магазині Chrome, буде дозволено. +Якщо для цього правила вибрати значення <ph name="DISABLE_UNPUBLISHED" /> (1), розширення, неопубліковані у Веб-магазині Chrome, буде вимкнено.</translation> <translation id="1905061765326052857">Заборонити неафілійованим користувачам використовувати віртуальні машини, потрібні для підтримки додатків Linux</translation> <translation id="1910704279188129272">Дозволяє встановити обмеження щодо використання окремо для кожного додатка. Обмеження щодо використання можна застосовувати до додатків, встановлених на <ph name="PRODUCT_OS_NAME" />, для певного користувача. @@ -1326,10 +1331,6 @@ <translation id="2223393221350938149">Заборонити всім сайтам запускати JIT-компілятор JavaScript</translation> <translation id="2223598546285729819">Налаштування сповіщень за умовчанням</translation> <translation id="222673035924187991">Увімкнути розширення Encrypted ClientHello для TLS</translation> -<translation id="2231726854197443389">Це правило дає змогу вибрати, чи можуть користувачі вмикати режим "Лише HTTPS" у налаштуваннях. У цьому режимі весь трафік переходить на HTTPS. - Якщо це правило не налаштувати або ввімкнути, користувачі зможуть вмикати режим "Лише HTTPS". - Якщо правило вимкнути, користувачі не зможуть цього робити. - Примусове ввімкнення режиму "Лише HTTPS" наразі не підтримується.</translation> <translation id="2231817271680715693">Імпорт історії веб-перегляду з веб-переглядача за умовчанням під час першого запуску</translation> <translation id="2231962946025538735">Це правило не підтримується. Натомість використовуйте правило <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />, щоб контролювати доступність плагіна Flash, і правило <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />, щоб указувати, чи файли PDF відкриватимуться за допомогою інтегрованого засобу перегляду PDF. @@ -5691,6 +5692,7 @@ Якщо це правило налаштовано, користувачі не зможуть змінювати його. Якщо його не налаштовано, користувачі вибирають, чи показувати ярлики додатків у контекстному меню панелі закладок.</translation> <translation id="638003144128412430">Вимкнути звітування щодо інформації про часовий пояс пристрою</translation> +<translation id="6382209369210116232">Вимкнути неопубліковані розширення</translation> <translation id="6382351416269252693">Дає змогу налаштовувати список шаблонів URL-адрес сайтів, що автоматично відхиляють дозвіл на використання локальних шрифтів. Такі сайти не отримають доступ до інформації про локальні шрифти. Докладніше про дійсні шаблони URL-адрес сайтів можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Дозволяються символи підстановки (<ph name="WILDCARD_VALUE" />). Це правило враховує тільки джерела, тому шляхи в шаблонах URL-адрес ігноруються. @@ -7371,7 +7373,6 @@ <translation id="7962093600142350905">Це правило дає змогу вибрати, чи показувати користувачам доступні принтери Privet у вікні попереднього перегляду друку. Якщо ввімкнути це правило, доступні принтери Privet показуватимуться. Якщо вимкнути або не налаштувати його, принтери Privet не показуватимуться в попередньому перегляді друку, оскільки цей спосіб друку більше не підтримується.</translation> -<translation id="7970844378072291834">Примусово ввімкнути режим "Лише HTTPS" (наразі не підтримується)</translation> <translation id="7972642710812569707">Примусово вмикати WebSQL у сторонніх ресурсах</translation> <translation id="7973609468423251675">Зауважте, що це правило більше не підтримується та буде вилучене в <ph name="PRODUCT_OS_NAME" /> версії 85. Натомість використовуйте правило <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 00abd3d..59db2ad 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1331,10 +1331,6 @@ <translation id="2223393221350938149">Không chấp nhận mọi trang web chạy JavaScript JIT</translation> <translation id="2223598546285729819">Cài đặt thông báo mặc định</translation> <translation id="222673035924187991">Bật ClientHello được mã hoá của TLS (Bảo mật tầng truyền tải)</translation> -<translation id="2231726854197443389">Chính sách này kiểm soát việc người dùng có thể bật chế độ Chỉ giao thức HTTPS trong phần Cài đặt hay không. Chế độ Chỉ giao thức HTTPS nâng mọi hình thức chuyển hướng lên giao thức HTTPS. - Nếu bạn cho phép hoặc không đặt chính sách này, thì người dùng sẽ được phép bật chế độ Chỉ giao thức HTTPS. - Nếu bạn không cho phép chính sách này, thì người dùng sẽ không được phép bật chế độ Chỉ giao thức HTTPS. - Hiện nay, chính sách buộc bật chế độ Chỉ HTTPS chưa được hỗ trợ.</translation> <translation id="2231817271680715693">Nhập lịch sử duyệt từ trình duyệt mặc định trong lần chạy đầu tiên</translation> <translation id="2231962946025538735">Chính sách này không còn dùng nữa. Vui lòng dùng <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> để kiểm soát tính sẵn có của trình bổ trợ Flash và <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> để kiểm soát xem có phải dùng trình xem PDF tích hợp để mở tệp PDF hay không. @@ -7385,7 +7381,6 @@ <translation id="7962093600142350905">Chính sách này kiểm soát việc người dùng có nhìn thấy các máy in privet có sẵn trong hộp thoại xem trước bản in hay không. Nếu bạn đặt chính sách này thành Bật, các máy in privet có sẵn sẽ hiển thị. Nếu bạn đặt chính sách này thành Tắt hoặc không đặt chính sách này, thì các máy in privet sẽ không hiển thị ở chế độ xem trước máy in vì phương thức in này đã ngừng hoạt động.</translation> -<translation id="7970844378072291834">Buộc bật chế độ Chỉ giao thức HTTPS (chưa được hỗ trợ)</translation> <translation id="7972642710812569707">Buộc bật lại WebSQL trong bối cảnh của bên thứ ba.</translation> <translation id="7973609468423251675">Lưu ý rằng chúng tôi không dùng chính sách này nữa và sẽ xóa khỏi <ph name="PRODUCT_OS_NAME" /> phiên bản 85. Thay vào đó, vui lòng sử dụng <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index f093596..32448dd 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -733,6 +733,7 @@ 如果您设置了此政策,当设备上的可用磁盘空间少于此政策规定的数值时,<ph name="PLUGIN_VM_NAME" /> 安装会失败。</translation> <translation id="1686952487081322272">停用快速解答功能</translation> <translation id="1690383938831887552">阻止加载通过 Signed HTTP Exchange (SXG) 提供的内容</translation> +<translation id="1692990221685273468">确定内置证书验证程序是否会强制执行从平台可信存储区加载的信任锚中经过编码的限制条件。</translation> <translation id="169467210981344373">停用全局范围的 HTTP 身份验证缓存</translation> <translation id="1698810555265314018">控制 <ph name="PRODUCT_NAME" /> 以光栅化模式打印 PDF 时的打印图片分辨率。 @@ -1320,10 +1321,6 @@ <translation id="2223393221350938149">不允许任何网站运行 JavaScript JIT</translation> <translation id="2223598546285729819">默认通知设置</translation> <translation id="222673035924187991">启用经过 TLS 加密的 ClientHello</translation> -<translation id="2231726854197443389">此政策用于控制用户能否在“设置”中启用纯 HTTPS 模式。纯 HTTPS 模式会将所有导航路径升级到 HTTPS。 - 如果此设置未配置或设为“允许”,用户将能启用纯 HTTPS 模式。 - 如果此设置设为“禁止”,用户将无法启用纯 HTTPS 模式。 - 尚不支持强制启用纯 HTTPS 模式。</translation> <translation id="2231817271680715693">首次运行时,从默认浏览器导入浏览记录</translation> <translation id="2231962946025538735">此政策已被弃用。请使用 <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> 控制 Flash 插件的可用性,并使用 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> 控制是否应使用集成式 PDF 查看器打开 PDF 文件。 @@ -4827,6 +4824,7 @@ <translation id="5601503069213153581">PIN 码</translation> <translation id="5607021831414604820">启用设备存储状态报告功能</translation> <translation id="5608114828230655271">默认设备行为</translation> +<translation id="5611869109049836323">在本地添加的信任锚中强制执行限制条件</translation> <translation id="5614865701790130558">记录基于政策的扩展程序安装事件</translation> <translation id="5618398258385745432">在我们推出“查看密码时需重新验证”这一规定之前,我们是使用相关的设置来控制用户能否查看密码。自这一规定推出后,相关设置以及此政策便不再对 Chrome 的行为有任何影响。Chrome 的当前行为等同于此政策设为在密码管理器设置页面中禁止以明文形式显示密码。这意味着,设置页面中包含的只是一个占位符,仅当用户点击“显示”(并进行重新验证,如果适用的话)后,Chrome 才会显示相应密码。此政策的原始描述如下所示: @@ -6683,6 +6681,7 @@ <translation id="7323896582714668701">适用于 <ph name="PRODUCT_NAME" />的其他命令行参数</translation> <translation id="7325801934761922681">不允许 Chrome 阻止导航到沙盒化 iframe 内的外部协议</translation> <translation id="7326394567531622570">与 Wipe(值 2)类似,但该选项会尝试保留登录令牌,以使用户无需再次登录。</translation> +<translation id="7331387825106440104">不在本地添加的信任锚中强制执行限制条件</translation> <translation id="7331962793961469250">设置为“True”时,新标签页中不会显示 Chrome 应用商店应用的推广内容。如果将此选项设置为“False”或不做任何设置,新标签页中就会显示 Chrome 应用商店应用的推广内容。</translation> <translation id="7332963785317884918">此政策已被弃用。<ph name="PRODUCT_OS_NAME" />将始终使用“RemoveLRU”清理策略。 @@ -7307,7 +7306,6 @@ <translation id="7962093600142350905">此政策用于控制是否在“打印预览”对话框中向用户显示任何可用的 Privet 打印机。 如果此政策已启用,系统将会显示可用的 Privet 打印机。 如果此政策已停用或未设置,系统将不会在“打印预览”对话框中显示 Privet 打印机,因为该打印方法已被弃用。</translation> -<translation id="7970844378072291834">强制启用纯 HTTPS 模式(尚不支持)</translation> <translation id="7972642710812569707">强制重新启用第三方情境下的 WebSQL。</translation> <translation id="7973609468423251675">请注意,此政策已被弃用,并将在 <ph name="PRODUCT_OS_NAME" />版本 85 中移除。请改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。 @@ -8265,6 +8263,17 @@ <translation id="8854571659927427063">如果此政策已启用,当首次运行浏览器时,系统将会从先前的默认浏览器导入书签。如果此政策已停用或未设置,当首次运行浏览器时,系统不会导入任何书签。 用户可以触发导入对话框,系统将会根据此政策的值选中或不选中“书签”复选框。</translation> +<translation id="8854703425882848037">X.509 证书可能会对证书扩展项中的限制条件(例如名称限制条件)进行编码。RFC 5280 规定,对信任锚证书强制执行此类限制条件是一项可选操作。从 <ph name="PRODUCT_NAME" /> 112 版开始,系统将对从平台证书存储区加载的证书强制执行此类限制条件。 + +此政策是一项临时的选择停用机制,当企业私有根证书中经过编码的限制条件出现问题时,可以使用此政策。在这种情况下,此政策可用于在更正证书问题期间暂时停止强制执行限制条件。 + +如果此政策未设置或已启用,<ph name="PRODUCT_NAME" /> 将会强制执行从平台可信存储区加载的信任锚中经过编码的限制条件。 + +如果此政策已停用,<ph name="PRODUCT_NAME" /> 将不会强制执行从平台可信存储区加载的信任锚中经过编码的限制条件。 + +如果 <ph name="CHROME_ROOT_STORE_ENABLED_POLICY_NAME" /> 政策已停用,此政策将不会产生任何影响。 + +按照我们的计划,此政策将会从 <ph name="PRODUCT_NAME" /> 115 版中移除。</translation> <translation id="8855929790177853633">用户屏保图片来源。</translation> <translation id="8858642179038618439">强制启用 YouTube 安全模式</translation> <translation id="8860342862142842017">对于指定的一系列 subjectPublicKeyInfo 哈希,不强制执行证书透明化要求</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index acf9595..21815754 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1317,10 +1317,6 @@ <translation id="2223393221350938149">禁止任何網站執行 JavaScript JIT</translation> <translation id="2223598546285729819">預設通知設定</translation> <translation id="222673035924187991">啟用經過 TLS 加密的 ClientHello</translation> -<translation id="2231726854197443389">這項政策可控管使用者是否能夠在設定中啟用僅限 HTTPS 模式。此模式會將所有瀏覽作業升級為採用 HTTPS。 - 如果將這項政策設為允許或不設定,使用者將可啟用僅限 HTTPS 模式。 - 如果將這項政策設為禁止,使用者則無法啟用僅限 HTTPS 模式。 - 請注意,系統目前不支援強制啟用僅限 HTTPS 模式。</translation> <translation id="2231817271680715693">第一次執行時從預設瀏覽器匯入瀏覽記錄</translation> <translation id="2231962946025538735">這項政策已淘汰,請使用 <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> 控管是否要提供 Flash 外掛程式,並使用 <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> 指定是否要使用整合式 PDF 檢視器開啟 PDF 檔案。 @@ -7246,7 +7242,6 @@ <translation id="7962093600142350905">這項政策可控管是否要在列印預覽對話方塊中向使用者顯示任何可用的 Privet 印表機。 如果將這項政策設為啟用,列印預覽就會顯示可用的 Privet 印表機。 如果將這項政策設為停用或不設定,列印預覽中則不會顯示 Privet 印表機,因為這種列印方式已經淘汰。</translation> -<translation id="7970844378072291834">強制啟用僅限 HTTPS 模式 (尚不支援)</translation> <translation id="7972642710812569707">強制將第三方內容中的 WebSQL 重新啟用。</translation> <translation id="7973609468423251675">請注意,這項政策已遭淘汰,並將在 <ph name="PRODUCT_OS_NAME" />第 85 版中移除。請改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。
diff --git a/components/power_bookmarks/common/power_overview.h b/components/power_bookmarks/common/power_overview.h index 8242226b..cbbe583 100644 --- a/components/power_bookmarks/common/power_overview.h +++ b/components/power_bookmarks/common/power_overview.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_POWER_BOOKMARKS_COMMON_POWER_OVERVIEW_H_ #define COMPONENTS_POWER_BOOKMARKS_COMMON_POWER_OVERVIEW_H_ +#include <cstddef> #include <memory> namespace power_bookmarks {
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index d7708a6..e82872c 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1974,6 +1974,7 @@ return true; } +#if BUILDFLAG(IS_CHROMEOS_ASH) void PrintRenderFrameHelper::OnPreviewDocumentCreated( int document_cookie, base::TimeTicks begin_time, @@ -1990,6 +1991,7 @@ ProcessPreviewDocument(begin_time, std::move(preview_document_region)); DidFinishPrinting(success ? OK : FAIL_PREVIEW); } +#endif bool PrintRenderFrameHelper::ProcessPreviewDocument( base::TimeTicks begin_time,
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index 58443f0..c7be37dc 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h
@@ -303,11 +303,13 @@ // Finalize the print ready preview document. bool FinalizePrintReadyDocument(); +#if BUILDFLAG(IS_CHROMEOS_ASH) // Called after a preview document has been created by a PrintRenderer. void OnPreviewDocumentCreated( int document_cookie, base::TimeTicks begin_time, base::ReadOnlySharedMemoryRegion preview_document_region); +#endif // Finish processing the preview document created by a PrintRenderer (record // the render time, update the PrintPreviewContext, and finalize the print
diff --git a/components/privacy_sandbox/privacy_sandbox_settings_impl.h b/components/privacy_sandbox/privacy_sandbox_settings_impl.h index 6384202..5a036f2 100644 --- a/components/privacy_sandbox/privacy_sandbox_settings_impl.h +++ b/components/privacy_sandbox/privacy_sandbox_settings_impl.h
@@ -97,12 +97,12 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class Status { - kAllowed, - kRestricted, - kIncognitoProfile, - kApisDisabled, - kSiteDataAccessBlocked, - kMismatchedConsent, + kAllowed = 0, + kRestricted = 1, + kIncognitoProfile = 2, + kApisDisabled = 3, + kSiteDataAccessBlocked = 4, + kMismatchedConsent = 5, kMaxValue = kMismatchedConsent, };
diff --git a/components/query_parser/snippet.h b/components/query_parser/snippet.h index a5670ed..1e8bf28 100644 --- a/components/query_parser/snippet.h +++ b/components/query_parser/snippet.h
@@ -11,9 +11,9 @@ #include <stddef.h> #include <string> +#include <utility> #include <vector> - namespace query_parser { class Snippet {
diff --git a/components/reading_list/features/reading_list_switches.cc b/components/reading_list/features/reading_list_switches.cc index 8d63f780..9f76d5e 100644 --- a/components/reading_list/features/reading_list_switches.cc +++ b/components/reading_list/features/reading_list_switches.cc
@@ -12,21 +12,6 @@ namespace reading_list { namespace switches { -// Allow users to save tabs for later. Enables a new button and menu for -// accessing tabs saved for later. -// android: https://crbug.com/1123087 -// desktop: https://crbug.com/1109316 -// ios: https://crbug.com/577659 -BASE_FEATURE(kReadLater, "ReadLater", base::FEATURE_ENABLED_BY_DEFAULT); - -bool IsReadingListEnabled() { -#if BUILDFLAG(IS_IOS) - return BUILDFLAG(ENABLE_READING_LIST); -#else - return base::FeatureList::IsEnabled(kReadLater); -#endif -} - BASE_FEATURE(kReadLaterBackendMigration, "ReadLaterBackendMigration", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/reading_list/features/reading_list_switches.h b/components/reading_list/features/reading_list_switches.h index 06bffdc..9a2f21e 100644 --- a/components/reading_list/features/reading_list_switches.h +++ b/components/reading_list/features/reading_list_switches.h
@@ -11,14 +11,6 @@ namespace reading_list { namespace switches { -// Feature flag used for enabling Read later on desktop and Android. -BASE_DECLARE_FEATURE(kReadLater); - -// Whether Reading List is enabled on this device. On iOS this is true if the -// buildflag for Reading List is enabled (no experiment). On Desktop it is also -// true if `kSidePanel` is enabled as it assumes a reading list. -bool IsReadingListEnabled(); - // Feature flag used for enabling the reading list backend migration. // When enabled, reading list data will also be stored in the Bookmarks backend. // This allows each platform to migrate their reading list front end to point at
diff --git a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc index 5737bc3..d78498d3 100644 --- a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc +++ b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
@@ -2274,6 +2274,7 @@ rule_value.Set("rule_name", rule.rule_name()); rule_value.Set("rule_id", rule.rule_id()); + rule_value.Set("url_category", rule.url_category()); triggered_rules.Append(std::move(rule_value)); } result_value.Set("triggered_rules", std::move(triggered_rules));
diff --git a/components/safe_browsing/content/common/proto/download_file_types.proto b/components/safe_browsing/content/common/proto/download_file_types.proto index 649e14b..176dffa 100644 --- a/components/safe_browsing/content/common/proto/download_file_types.proto +++ b/components/safe_browsing/content/common/proto/download_file_types.proto
@@ -11,7 +11,7 @@ // See //chrome/browser/resources/safe_browsing/README.md for guidelines // on how to set fields in this file. -// Next id: 5 +// Next id: 7 message DownloadFileType { optional string extension = 1; // required, except in default_file_type. optional int64 uma_value = 2; // required @@ -45,13 +45,17 @@ PLATFORM_TYPE_FUCHSIA = 6; } - // Next id: 5 + // Next id: 6 message PlatformSettings { optional PlatformType platform = 1 [default = PLATFORM_TYPE_ANY]; optional DangerLevel danger_level = 2; // required optional AutoOpenHint auto_open_hint = 3; // required optional uint64 max_file_size_to_analyze = 4 [default = 18446744073709551615]; // (2^64)-1] + + // `file_weight` determines how likely the given file type is to be included + // in a ping to Safe Browsing when downloading an archive. + optional int64 file_weight = 5; }; // Protos parsed by Chrome should have exactly one entry here.
diff --git a/components/safe_browsing/content/resources/download_file_types.asciipb b/components/safe_browsing/content/resources/download_file_types.asciipb index 5abb788..45c3586 100644 --- a/components/safe_browsing/content/resources/download_file_types.asciipb +++ b/components/safe_browsing/content/resources/download_file_types.asciipb
@@ -8,7 +8,7 @@ ## ## Top level settings ## -version_id: 58 +version_id: 59 sampled_ping_probability: 0.01 max_archived_binaries_to_report: 10 default_file_type { @@ -1012,6 +1012,7 @@ platform: PLATFORM_TYPE_WINDOWS danger_level: ALLOW_ON_USER_GESTURE auto_open_hint: DISALLOW_AUTO_OPEN + file_weight: 10 } } file_types { @@ -2238,6 +2239,7 @@ platform: PLATFORM_TYPE_WINDOWS danger_level: ALLOW_ON_USER_GESTURE auto_open_hint: DISALLOW_AUTO_OPEN + file_weight: 10 } } file_types {
diff --git a/components/safe_browsing/content/resources/download_file_types_experiment.asciipb b/components/safe_browsing/content/resources/download_file_types_experiment.asciipb index 8e67596..2e3d035 100644 --- a/components/safe_browsing/content/resources/download_file_types_experiment.asciipb +++ b/components/safe_browsing/content/resources/download_file_types_experiment.asciipb
@@ -12,7 +12,7 @@ ## version id is larger than the version id in download_file_types.asciipb. If ## there isn't an ongoing experiment, this version id is equal to the version id ## in download_file_types.asciipb. -version_id: 58 +version_id: 59 sampled_ping_probability: 0.01 max_archived_binaries_to_report: 10 default_file_type { @@ -1016,6 +1016,7 @@ platform: PLATFORM_TYPE_WINDOWS danger_level: ALLOW_ON_USER_GESTURE auto_open_hint: DISALLOW_AUTO_OPEN + file_weight: 10 } } file_types { @@ -2242,6 +2243,7 @@ platform: PLATFORM_TYPE_WINDOWS danger_level: ALLOW_ON_USER_GESTURE auto_open_hint: DISALLOW_AUTO_OPEN + file_weight: 10 } } file_types {
diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc index e7b9e21..b320f991 100644 --- a/components/search/ntp_features.cc +++ b/components/search/ntp_features.cc
@@ -233,6 +233,21 @@ "NtpHistoryClustersModule", base::FEATURE_DISABLED_BY_DEFAULT); +// Dummy feature to set kNtpHistoryClustersModuleBeginTimeDurationHoursParam. +BASE_FEATURE(kNtpHistoryClustersModuleBeginTimeDuration, + "NtpHistoryClustersModuleBeginTimeDuration", + base::FEATURE_DISABLED_BY_DEFAULT); + +// Dummy feature to set kNtpHistoryClustersModuleMinimumImagesRequiredParam. +BASE_FEATURE(kNtpHistoryClustersModuleMinimumImagesRequired, + "NtpHistoryClustersModuleMinimumImagesRequired", + base::FEATURE_DISABLED_BY_DEFAULT); + +// Dummy feature to set kNtpHistoryClustersModuleCategoriesParam. +BASE_FEATURE(kNtpHistoryClustersModuleCategories, + "NtpHistoryClustersModuleCategories", + base::FEATURE_DISABLED_BY_DEFAULT); + const base::FeatureParam<double> kNtpElementLuminosityChangeForLightBackgroundParam{ &kNtpComprehensiveTheming, @@ -287,6 +302,12 @@ "NtpRecipeTasksModuleCacheMaxAgeSParam"; const char kNtpRecipeTasksModuleExperimentGroupParam[] = "NtpRecipeTasksModuleExperimentGroupParam"; +const char kNtpHistoryClustersModuleBeginTimeDurationHoursParam[] = + "NtpHistoryClustersModuleBeginTimeDurationHoursParam"; +const char kNtpHistoryClustersModuleMinimumImagesRequiredParam[] = + "NtpHistoryClustersModuleMinimumImagesRequiredParam"; +const char kNtpHistoryClustersModuleCategoriesParam[] = + "NtpHistoryClustersModuleCategoriesParam"; base::TimeDelta GetModulesLoadTimeout() { std::string param_value = base::GetFieldTrialParamValueByFeature(
diff --git a/components/search/ntp_features.h b/components/search/ntp_features.h index 2f594bf..0885c565 100644 --- a/components/search/ntp_features.h +++ b/components/search/ntp_features.h
@@ -64,6 +64,9 @@ BASE_DECLARE_FEATURE(kNtpShortcuts); BASE_DECLARE_FEATURE(kNtpHandleMostVisitedNavigationExplicitly); BASE_DECLARE_FEATURE(kNtpHistoryClustersModule); +BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleBeginTimeDuration); +BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleMinimumImagesRequired); +BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleCategories); // Parameter for controlling the luminosity difference for NTP elements on light // backgrounds. @@ -132,6 +135,15 @@ // Parameter for communicating the experiment group of the recipe tasks module // experiment. extern const char kNtpRecipeTasksModuleExperimentGroupParam[]; +// Parameter for determining the maximum number of hours to look back to show a +// history cluster. +extern const char kNtpHistoryClustersModuleBeginTimeDurationHoursParam[]; +// Parameter for determining the minimum number of visits with an image that are +// required in order to show a history cluster. +extern const char kNtpHistoryClustersModuleMinimumImagesRequiredParam[]; +// Parameter for determining the categories a history cluster must fall into to +// be shown. +extern const char kNtpHistoryClustersModuleCategoriesParam[]; // Returns the timeout after which the load of a module should be aborted. base::TimeDelta GetModulesLoadTimeout();
diff --git a/components/security_interstitials/content/https_only_mode_blocking_page.cc b/components/security_interstitials/content/https_only_mode_blocking_page.cc index fbe347c..5bfb37c 100644 --- a/components/security_interstitials/content/https_only_mode_blocking_page.cc +++ b/components/security_interstitials/content/https_only_mode_blocking_page.cc
@@ -32,10 +32,12 @@ HttpsOnlyModeBlockingPage::HttpsOnlyModeBlockingPage( content::WebContents* web_contents, const GURL& request_url, - std::unique_ptr<SecurityInterstitialControllerClient> controller_client) + std::unique_ptr<SecurityInterstitialControllerClient> controller_client, + bool is_under_advanced_protection) : SecurityInterstitialPage(web_contents, request_url, - std::move(controller_client)) { + std::move(controller_client)), + is_under_advanced_protection_(is_under_advanced_protection) { controller()->metrics_helper()->RecordUserDecision(MetricsHelper::SHOW); controller()->metrics_helper()->RecordUserInteraction( MetricsHelper::TOTAL_VISITS); @@ -109,7 +111,8 @@ void HttpsOnlyModeBlockingPage::PopulateInterstitialStrings( base::Value::Dict& load_time_data) { PopulateHttpsOnlyModeStringsForSharedHTML(load_time_data); - PopulateHttpsOnlyModeStringsForBlockingPage(load_time_data, request_url()); + PopulateHttpsOnlyModeStringsForBlockingPage(load_time_data, request_url(), + is_under_advanced_protection_); } } // namespace security_interstitials
diff --git a/components/security_interstitials/content/https_only_mode_blocking_page.h b/components/security_interstitials/content/https_only_mode_blocking_page.h index 19e9bc5..364f9ab 100644 --- a/components/security_interstitials/content/https_only_mode_blocking_page.h +++ b/components/security_interstitials/content/https_only_mode_blocking_page.h
@@ -16,7 +16,8 @@ HttpsOnlyModeBlockingPage( content::WebContents* web_contents, const GURL& request_url, - std::unique_ptr<SecurityInterstitialControllerClient> controller_client); + std::unique_ptr<SecurityInterstitialControllerClient> controller_client, + bool is_under_advanced_protection); static const SecurityInterstitialPage::TypeID kTypeForTesting; ~HttpsOnlyModeBlockingPage() override; @@ -32,6 +33,9 @@ private: bool user_made_decision_ = false; + // True if the interstitial is shown because the user is under Advanced + // Protection which automatically enables HTTPS-First Mode. + bool is_under_advanced_protection_ = false; }; } // namespace security_interstitials
diff --git a/components/security_interstitials/core/https_only_mode_ui_util.cc b/components/security_interstitials/core/https_only_mode_ui_util.cc index 0317e77..2811ebe 100644 --- a/components/security_interstitials/core/https_only_mode_ui_util.cc +++ b/components/security_interstitials/core/https_only_mode_ui_util.cc
@@ -11,7 +11,8 @@ void PopulateHttpsOnlyModeStringsForBlockingPage( base::Value::Dict& load_time_data, - const GURL& url) { + const GURL& url, + bool is_under_advanced_protection) { load_time_data.Set("tabTitle", l10n_util::GetStringUTF16(IDS_HTTPS_ONLY_MODE_TITLE)); load_time_data.Set( @@ -22,7 +23,11 @@ url))); load_time_data.Set( "primaryParagraph", - l10n_util::GetStringUTF16(IDS_HTTPS_ONLY_MODE_PRIMARY_PARAGRAPH)); + is_under_advanced_protection + ? l10n_util::GetStringUTF16( + IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH) + : l10n_util::GetStringUTF16(IDS_HTTPS_ONLY_MODE_PRIMARY_PARAGRAPH)); + // TODO(crbug.com/1302509): Change this button to "Close" when we can't go // back: load_time_data.Set(
diff --git a/components/security_interstitials/core/https_only_mode_ui_util.h b/components/security_interstitials/core/https_only_mode_ui_util.h index c2294c7..6484080 100644 --- a/components/security_interstitials/core/https_only_mode_ui_util.h +++ b/components/security_interstitials/core/https_only_mode_ui_util.h
@@ -12,7 +12,8 @@ // Populates |load_time_data| for interstitial HTML. void PopulateHttpsOnlyModeStringsForBlockingPage( base::Value::Dict& load_time_data, - const GURL& url); + const GURL& url, + bool is_under_advanced_protection); // Values added to get shared interstitial HTML to play nice. void PopulateHttpsOnlyModeStringsForSharedHTML(
diff --git a/components/security_interstitials_strings.grdp b/components/security_interstitials_strings.grdp index 51efa0d2..6e65792 100644 --- a/components/security_interstitials_strings.grdp +++ b/components/security_interstitials_strings.grdp
@@ -104,13 +104,13 @@ The site ahead is blocked by your organization </message> <message name="IDS_ENTERPRISE_BLOCK_PRIMARY_PARAGRAPH" desc="Main paragraph of an error message. Context: the error page that's shown when the requested URL doesn't pass the filtering rules set by the admin."> - Your organization has blocked <ph name="BEGIN_BOLD"><strong></ph><ph name="DOMAIN">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> because it violates a policy. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> + Your organization has blocked <ph name="BEGIN_BOLD"><strong></ph><ph name="DOMAIN">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> because it violates a policy. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link" aria-label="$2"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> </message> <message name="IDS_ENTERPRISE_BLOCK_GO_BACK" desc="The text for the button that takes the user back to safety."> Go back </message> - <!-- Enterprise Warn interstitial --> + <!-- Enterprise Warn interstitial --> <message name="IDS_ENTERPRISE_WARN_TITLE" desc="Tab title. Context: the requested URL doesn't pass the filtering rules set by the admin."> Admin warning </message> @@ -118,7 +118,7 @@ The site ahead is flagged by your organization </message> <message name="IDS_ENTERPRISE_WARN_PRIMARY_PARAGRAPH" desc="Main paragraph of an error message. Context: the error page that's shown when the requested URL doesn't pass the filtering rules set by the admin."> - Your organization has identified <ph name="BEGIN_BOLD"><strong></ph><ph name="DOMAIN">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> as a site that might violate a policy. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> + Your organization has identified <ph name="BEGIN_BOLD"><strong></ph><ph name="DOMAIN">$1<ex>example.com</ex></ph><ph name="END_BOLD"></strong></ph> as a site that might violate a policy. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link" aria-label="$2"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> </message> <message name="IDS_ENTERPRISE_WARN_GO_BACK" desc="The text for the button that takes the user back to safety."> Go back @@ -126,6 +126,10 @@ <message name="IDS_ENTERPRISE_WARN_CONTINUE_TO_SITE" desc="The text for the button that bypasses the warning and continues to site."> Continue to site </message> + <message name="IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT" desc="Accessibility text for a 'Learn more' link that links to a help article about why the user was warned/blocked while trying to access a website that violated admin rules."> + Learn more about site restrictions in managed browsers + </message> + <!-- Clock errors --> <message name="IDS_CLOCK_ERROR_TITLE" desc="Tab title. Context: the browser can't load a page because the device's clock is wrong."> @@ -529,6 +533,9 @@ <message name="IDS_HTTPS_ONLY_MODE_PRIMARY_PARAGRAPH" desc="Main paragraph of the HTTPS-Only Mode warning. This warning is shown when the browser tries to upgrade a navigation to a site to HTTPS but the site does not support HTTPS."> You are seeing this warning because this site does not support HTTPS. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> </message> + <message name="IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH" desc="Main paragraph of the HTTPS-Only Mode warning. This warning is shown when the browser tries to upgrade a navigation to a site to HTTPS but the site does not support HTTPS. The user also has Advanced Protection enabled."> + You are seeing this warning because this site does not support HTTPS and you are under Google's Advanced Protection Program. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more<ph name="END_LEARN_MORE_LINK"></a></ph> + </message> <message name="IDS_HTTPS_ONLY_MODE_BACK_BUTTON" desc="Text for the button in the HTTPS-only mode warning that takes the user back to the previous page"> Go back </message>
diff --git a/components/security_interstitials_strings_grdp/IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT.png.sha1 b/components/security_interstitials_strings_grdp/IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT.png.sha1 new file mode 100644 index 0000000..411f1fe --- /dev/null +++ b/components/security_interstitials_strings_grdp/IDS_ENTERPRISE_INTERSTITIALS_LEARN_MORE_ACCCESSIBILITY_TEXT.png.sha1
@@ -0,0 +1 @@ +c79a70124d049659aa59f8da54606241c3492a33
diff --git a/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH.png.sha1 b/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH.png.sha1 new file mode 100644 index 0000000..906268ef --- /dev/null +++ b/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH.png.sha1
@@ -0,0 +1 @@ +723bb408bc833fd0e9b491ae5bef98c082627727 \ No newline at end of file
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter index d850a0c4..ab5d0a54 100644 --- a/components/segmentation_platform/components_unittests.filter +++ b/components/segmentation_platform/components_unittests.filter
@@ -15,6 +15,7 @@ FeatureAggregatorImplTest.* FeatureListQueryProcessorTest.* FeedUserModelTest.* +FieldTrialRecorderTest.* FrequentFeatureUserModelTest.* HistogramSignalHandlerTest.* HistoryDelegateImplTest.*
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn index 3ae453b..e0860c6a 100644 --- a/components/segmentation_platform/internal/BUILD.gn +++ b/components/segmentation_platform/internal/BUILD.gn
@@ -96,6 +96,8 @@ "metadata/metadata_utils.h", "metadata/metadata_writer.cc", "metadata/metadata_writer.h", + "metrics/field_trial_recorder.cc", + "metrics/field_trial_recorder.h", "platform_options.cc", "platform_options.h", "post_processor/post_processor.cc", @@ -258,6 +260,7 @@ "execution/processing/sql_feature_processor_unittest.cc", "execution/processing/sync_device_info_observer_unittest.cc", "metadata/metadata_utils_unittest.cc", + "metrics/field_trial_recorder_unittest.cc", "mock_ukm_data_manager.cc", "mock_ukm_data_manager.h", "post_processor/post_processor_unittest.cc",
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc index f030146..8a24541 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
@@ -388,7 +388,7 @@ {Segmentation_ModelExecution::kOptimizationTargetName, Segmentation_ModelExecution::kModelVersionName, Segmentation_ModelExecution::kInput0Name, - Segmentation_ModelExecution::kPredictionResultName, + Segmentation_ModelExecution::kPredictionResult1Name, Segmentation_ModelExecution::kSelectionResultName, Segmentation_ModelExecution::kOutputDelaySecName, Segmentation_ModelExecution::kActualResultName,
diff --git a/components/segmentation_platform/internal/database/segment_info_database.cc b/components/segmentation_platform/internal/database/segment_info_database.cc index dabfd0b58..67251be 100644 --- a/components/segmentation_platform/internal/database/segment_info_database.cc +++ b/components/segmentation_platform/internal/database/segment_info_database.cc
@@ -120,6 +120,11 @@ absl::optional<proto::SegmentInfo> segment_info, SuccessCallback callback) { cache_->UpdateSegmentInfo(segment_id, segment_info); + + // The cache has been updated now. We can notify the client synchronously. + std::move(callback).Run(/*success=*/true); + + // Now write to the database asyncrhonously. auto entries_to_save = std::make_unique< std::vector<std::pair<std::string, proto::SegmentInfo>>>(); auto keys_to_delete = std::make_unique<std::vector<std::string>>(); @@ -130,7 +135,7 @@ keys_to_delete->emplace_back(ToString(segment_id)); } database_->UpdateEntries(std::move(entries_to_save), - std::move(keys_to_delete), std::move(callback)); + std::move(keys_to_delete), base::DoNothing()); } void SegmentInfoDatabase::UpdateMultipleSegments( @@ -152,12 +157,16 @@ std::make_pair(ToString(segment_id), std::move(segment_info))); } + // The cache has been updated now. We can notify the client synchronously. + std::move(callback).Run(/*success=*/true); + + // Now write to the database asyncrhonously. for (auto& segment_id : segments_to_delete) { entries_to_delete->emplace_back(ToString(segment_id)); } database_->UpdateEntries(std::move(entries_to_save), - std::move(entries_to_delete), std::move(callback)); + std::move(entries_to_delete), base::DoNothing()); } void SegmentInfoDatabase::SaveSegmentResult( @@ -188,19 +197,48 @@ segment_info->clear_prediction_result(); } cache_->UpdateSegmentInfo(segment_info->segment_id(), segment_info); + + // The cache has been updated now. We can notify the client synchronously. + std::move(callback).Run(/*success=*/true); + + // Now write to the database asyncrhonously. auto entries_to_save = std::make_unique< std::vector<std::pair<std::string, proto::SegmentInfo>>>(); entries_to_save->emplace_back(std::make_pair( ToString(segment_info->segment_id()), std::move(segment_info.value()))); database_->UpdateEntries(std::move(entries_to_save), std::make_unique<std::vector<std::string>>(), - std::move(callback)); + base::DoNothing()); } void SegmentInfoDatabase::OnDatabaseInitialized( SuccessCallback callback, leveldb_proto::Enums::InitStatus status) { - std::move(callback).Run(status == leveldb_proto::Enums::InitStatus::kOK); + bool success = (status == leveldb_proto::Enums::InitStatus::kOK); + + if (!success) { + std::move(callback).Run(success); + return; + } + + // Initialize the cache by reading the database into the in-memory cache to be + // accessed hereafter. + database_->LoadEntries(base::BindOnce(&SegmentInfoDatabase::OnLoadAllEntries, + weak_ptr_factory_.GetWeakPtr(), + std::move(callback))); +} + +void SegmentInfoDatabase::OnLoadAllEntries( + SuccessCallback callback, + bool success, + std::unique_ptr<std::vector<proto::SegmentInfo>> all_infos) { + if (success) { + // Add all the entries to the cache on startup. + for (auto info : *all_infos.get()) { + cache_->UpdateSegmentInfo(info.segment_id(), info); + } + } + std::move(callback).Run(success); } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/segment_info_database.h b/components/segmentation_platform/internal/database/segment_info_database.h index 1052bbee..971c62f 100644 --- a/components/segmentation_platform/internal/database/segment_info_database.h +++ b/components/segmentation_platform/internal/database/segment_info_database.h
@@ -27,7 +27,9 @@ } // namespace proto // Represents a DB layer that stores model metadata and prediction results to -// the disk. +// the disk. At startup, all stored data is loaded into cache. Following +// interactions with this class will be directly from/to the cache. The disk +// will be updated asynchronously by this class. class SegmentInfoDatabase { public: using SuccessCallback = base::OnceCallback<void(bool)>; @@ -59,6 +61,8 @@ // Called to save or update metadata for a segment. The previous data is // overwritten. If |segment_info| is empty, the segment will be deleted. + // Updates are written to the cache and callback is returned to the client. + // The database will be updated asynchronously after. // TODO(shaktisahu): How does the client know if a segment is to be deleted? virtual void UpdateSegment(SegmentId segment_id, absl::optional<proto::SegmentInfo> segment_info, @@ -97,6 +101,11 @@ SuccessCallback callback, absl::optional<proto::SegmentInfo> segment_info); + void OnLoadAllEntries( + SuccessCallback callback, + bool success, + std::unique_ptr<std::vector<proto::SegmentInfo>> all_infos); + std::unique_ptr<SegmentInfoProtoDb> database_; std::unique_ptr<SegmentInfoCache> cache_;
diff --git a/components/segmentation_platform/internal/database/segment_info_database_unittest.cc b/components/segmentation_platform/internal/database/segment_info_database_unittest.cc index 5c6700b..995c0539 100644 --- a/components/segmentation_platform/internal/database/segment_info_database_unittest.cc +++ b/components/segmentation_platform/internal/database/segment_info_database_unittest.cc
@@ -286,6 +286,30 @@ VerifyResult(kSegmentId, absl::nullopt); } +TEST_P(SegmentInfoDatabaseTest, WriteResultWithCache) { + // Initialize DB with cache enabled and one entry. + db_entries_.insert( + std::make_pair(ToString(kSegmentId), CreateSegment(kSegmentId))); + VerifyDb({kSegmentId}); + SetUpDB(true); + + segment_db_->Initialize(base::DoNothing()); + db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); + EXPECT_EQ(segment_info_cache_->GetSegmentInfo(kSegmentId).first, + SegmentInfoCache::CachedItemState::kNotCached); + + // Verify that all DB entries are loaded into cache on initialization. + db_->LoadCallback(true); + EXPECT_EQ(segment_info_cache_->GetSegmentInfo(kSegmentId).first, + SegmentInfoCache::CachedItemState::kCachedAndFound); + + // Update results and verify that db is updated. + WriteResult(kSegmentId, 0.4f); + + // Verify that cache is updated. + VerifyResult(kSegmentId, 0.4f); +} + TEST_P(SegmentInfoDatabaseTest, WriteResultForTwoSegments) { // Initialize DB with two entries. db_entries_.insert(
diff --git a/components/segmentation_platform/internal/execution/model_executor_impl.cc b/components/segmentation_platform/internal/execution/model_executor_impl.cc index 8d78992..88e0d0b4 100644 --- a/components/segmentation_platform/internal/execution/model_executor_impl.cc +++ b/components/segmentation_platform/internal/execution/model_executor_impl.cc
@@ -204,7 +204,7 @@ SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult( state->segment_info.segment_id(), state->segment_info.model_version(), state->input_tensor, - result.value().at(0)); + result.value()); } } ModelProvider::Request input_tensor = state->input_tensor;
diff --git a/components/segmentation_platform/internal/metrics/field_trial_recorder.cc b/components/segmentation_platform/internal/metrics/field_trial_recorder.cc new file mode 100644 index 0000000..d1f1acc --- /dev/null +++ b/components/segmentation_platform/internal/metrics/field_trial_recorder.cc
@@ -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. + +#include "components/segmentation_platform/internal/metrics/field_trial_recorder.h" + +#include "components/segmentation_platform/internal/metadata/metadata_utils.h" +#include "components/segmentation_platform/public/config.h" +#include "components/segmentation_platform/public/field_trial_register.h" + +namespace segmentation_platform { + +FieldTrialRecorder::FieldTrialRecorder(FieldTrialRegister* field_trial_register) + : field_trial_register_(field_trial_register) {} + +FieldTrialRecorder::~FieldTrialRecorder() = default; + +void FieldTrialRecorder::RecordFieldTrialAtStartup( + const std::vector<std::unique_ptr<Config>>& configs, + CachedResultProvider* cached_result_provider) { + for (const auto& config : configs) { + if (config->on_demand_execution || + !metadata_utils::HasMigratedToMultiOutput(config.get())) { + continue; + } + + const std::string& trial_name = config->GetSegmentationFilterName(); + ClassificationResult cached_results = + cached_result_provider->GetCachedResultForClient( + config->segmentation_key); + const std::string& group_name = cached_results.ordered_labels.size() > 0 + ? cached_results.ordered_labels[0] + : "Unselected"; + field_trial_register_->RegisterFieldTrial(trial_name, group_name); + } +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/metrics/field_trial_recorder.h b/components/segmentation_platform/internal/metrics/field_trial_recorder.h new file mode 100644 index 0000000..1f032376 --- /dev/null +++ b/components/segmentation_platform/internal/metrics/field_trial_recorder.h
@@ -0,0 +1,47 @@ +// 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_SEGMENTATION_PLATFORM_INTERNAL_METRICS_FIELD_TRIAL_RECORDER_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_METRICS_FIELD_TRIAL_RECORDER_H_ + +#include "base/memory/raw_ptr.h" +#include "components/segmentation_platform/internal/selection/cached_result_provider.h" +#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" + +namespace segmentation_platform { + +struct Config; +class FieldTrialRegister; + +// Records field trials for every client. +class FieldTrialRecorder { + public: + explicit FieldTrialRecorder(FieldTrialRegister* field_trial_register); + ~FieldTrialRecorder(); + + FieldTrialRecorder(const FieldTrialRecorder&) = delete; + FieldTrialRecorder& operator=(const FieldTrialRecorder&) = delete; + + // Records field trial for all client based on their `OutputConfig`. It gets + // the result from last session for the client using `CachedResultProvider`. + // Based on these results, record the field trial. Currently it supports field + // trial recording the top most output label for the following. + // 1. BinnedClassifier + // 2. BinaryClassifier + // 3. MultiClassClassifier with `top_k_outputs` as 1. (We only record top + // label as the field trial sice we possibly can't create all permutations of + // all the labels.) + void RecordFieldTrialAtStartup( + const std::vector<std::unique_ptr<Config>>& configs, + CachedResultProvider* cached_result_provider); + + private: + const raw_ptr<FieldTrialRegister> field_trial_register_; + + base::WeakPtrFactory<FieldTrialRecorder> weak_ptr_factory_{this}; +}; + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_METRICS_FIELD_TRIAL_RECORDER_H_
diff --git a/components/segmentation_platform/internal/metrics/field_trial_recorder_unittest.cc b/components/segmentation_platform/internal/metrics/field_trial_recorder_unittest.cc new file mode 100644 index 0000000..9db3b95a --- /dev/null +++ b/components/segmentation_platform/internal/metrics/field_trial_recorder_unittest.cc
@@ -0,0 +1,124 @@ +// 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/segmentation_platform/internal/metrics/field_trial_recorder.h" + +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/segmentation_platform/internal/constants.h" +#include "components/segmentation_platform/internal/metadata/metadata_utils.h" +#include "components/segmentation_platform/internal/metadata/metadata_writer.h" +#include "components/segmentation_platform/internal/selection/cached_result_provider.h" +#include "components/segmentation_platform/internal/selection/client_result_prefs.h" +#include "components/segmentation_platform/public/config.h" +#include "components/segmentation_platform/public/field_trial_register.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { + +namespace { + +using ::testing::NiceMock; + +// Labels for BinnedClassifier. +const char kLowUsed[] = "Low"; +const char kMediumUsed[] = "Medium"; +const char kHighUsed[] = "High"; +const char kUnderflowLabel[] = "Underflow"; + +const char kClientKey[] = "test_key"; + +std::unique_ptr<Config> CreateTestConfig() { + auto config = std::make_unique<Config>(); + config->segmentation_key = kClientKey; + config->segmentation_uma_name = "test_key"; + config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER); + return config; +} + +proto::ClientResult CreateClientResult(proto::PredictionResult pred_result) { + proto::ClientResult client_result; + client_result.mutable_client_result()->CopyFrom(pred_result); + client_result.set_timestamp_us( + base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds()); + return client_result; +} + +proto::OutputConfig GetTestOutputConfigForBinnedClassifier() { + proto::SegmentationModelMetadata model_metadata; + MetadataWriter writer(&model_metadata); + writer.AddOutputConfigForBinnedClassifier( + /*bins=*/{{0.2, kLowUsed}, {0.3, kMediumUsed}, {0.5, kHighUsed}}, + kUnderflowLabel); + return model_metadata.output_config(); +} + +class MockFieldTrialRegister : public FieldTrialRegister { + public: + MOCK_METHOD2(RegisterFieldTrial, + void(base::StringPiece trial_name, + base::StringPiece group_name)); + + MOCK_METHOD3(RegisterSubsegmentFieldTrialIfNeeded, + void(base::StringPiece trial_name, + proto::SegmentId segment_id, + int subsegment_rank)); +}; +} // namespace + +class FieldTrialRecorderTest : public testing::Test { + public: + FieldTrialRecorderTest() = default; + ~FieldTrialRecorderTest() override = default; + + void SetUp() override { + result_prefs_ = std::make_unique<ClientResultPrefs>(&pref_service_); + pref_service_.registry()->RegisterStringPref(kSegmentationClientResultPrefs, + std::string()); + + field_trial_recorder_ = + std::make_unique<FieldTrialRecorder>(&field_trial_register_); + configs_.push_back(CreateTestConfig()); + } + + protected: + NiceMock<MockFieldTrialRegister> field_trial_register_; + TestingPrefServiceSimple pref_service_; + std::unique_ptr<ClientResultPrefs> result_prefs_; + std::unique_ptr<FieldTrialRecorder> field_trial_recorder_; + std::unique_ptr<CachedResultProvider> cached_result_provider_; + std::vector<std::unique_ptr<Config>> configs_; +}; + +TEST_F(FieldTrialRecorderTest, RecordUnselectedFieldTrial) { + cached_result_provider_ = std::make_unique<CachedResultProvider>( + std::move(result_prefs_), configs_); + + EXPECT_CALL(field_trial_register_, + RegisterFieldTrial(base::StringPiece("Segmentation_test_key"), + base::StringPiece("Unselected"))); + + field_trial_recorder_->RecordFieldTrialAtStartup( + configs_, cached_result_provider_.get()); +} + +TEST_F(FieldTrialRecorderTest, RecordFieldTrial) { + result_prefs_->SaveClientResultToPrefs( + kClientKey, + CreateClientResult(metadata_utils::CreatePredictionResult( + /*model_scores=*/{0.8}, GetTestOutputConfigForBinnedClassifier(), + /*timestamp=*/base::Time::Now()))); + cached_result_provider_ = std::make_unique<CachedResultProvider>( + std::move(result_prefs_), configs_); + + EXPECT_CALL(field_trial_register_, + RegisterFieldTrial(base::StringPiece("Segmentation_test_key"), + base::StringPiece("High"))); + + field_trial_recorder_->RecordFieldTrialAtStartup( + configs_, cached_result_provider_.get()); +} + +} // namespace segmentation_platform \ No newline at end of file
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc index f20e0f7e..5ae918d 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -56,6 +56,8 @@ configs_(std::move(init_params->configs)), all_segment_ids_(GetAllSegmentIdsFromConfigs(configs_)), field_trial_register_(std::move(init_params->field_trial_register)), + field_trial_recorder_( + std::make_unique<FieldTrialRecorder>(field_trial_register_.get())), profile_prefs_(init_params->profile_prefs.get()), creation_time_(clock_->Now()) { base::UmaHistogramMediumTimes( @@ -86,8 +88,6 @@ &SegmentationPlatformServiceImpl::OnModelRefreshNeeded, weak_ptr_factory_.GetWeakPtr())); - // TODO(ritikagup@): Move code for recording FieldTrialRegister into separate - // class when adding support for recording multi class output fields. cached_result_provider_ = std::make_unique<CachedResultProvider>( init_params->profile_prefs, configs_); @@ -95,6 +95,9 @@ std::make_unique<ClientResultPrefs>(init_params->profile_prefs), init_params->clock); + field_trial_recorder_->RecordFieldTrialAtStartup( + configs_, cached_result_provider_.get()); + request_dispatcher_ = std::make_unique<RequestDispatcher>( configs_, cached_result_provider_.get());
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.h b/components/segmentation_platform/internal/segmentation_platform_service_impl.h index 84ee1b4..74776df0 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.h +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.h
@@ -15,6 +15,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "components/segmentation_platform/internal/database/storage_service.h" +#include "components/segmentation_platform/internal/metrics/field_trial_recorder.h" #include "components/segmentation_platform/internal/platform_options.h" #include "components/segmentation_platform/internal/scheduler/execution_service.h" #include "components/segmentation_platform/internal/selection/cached_result_provider.h" @@ -178,6 +179,9 @@ // Writes to result cache. std::unique_ptr<CachedResultWriter> cached_result_writer_; + // Records field trials for all configs. + std::unique_ptr<FieldTrialRecorder> field_trial_recorder_; + // For routing requests to the right handler. std::unique_ptr<RequestDispatcher> request_dispatcher_;
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.cc b/components/segmentation_platform/internal/segmentation_ukm_helper.cc index 5421e73..b731ab8 100644 --- a/components/segmentation_platform/internal/segmentation_ukm_helper.cc +++ b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
@@ -21,6 +21,7 @@ #define CALL_MEMBER_FN(obj, func) ((obj).*(func)) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x)[0]) +using segmentation_platform::SegmentationUkmHelper; using segmentation_platform::proto::SegmentId; using ukm::builders::Segmentation_ModelExecution; @@ -80,6 +81,18 @@ &Segmentation_ModelExecution::SetInput48, &Segmentation_ModelExecution::SetInput49}; +const UkmMemberFn kSegmentationUkmPredictionResultMethods[] = { + &Segmentation_ModelExecution::SetPredictionResult1, + &Segmentation_ModelExecution::SetPredictionResult2, + &Segmentation_ModelExecution::SetPredictionResult3, + &Segmentation_ModelExecution::SetPredictionResult4, + &Segmentation_ModelExecution::SetPredictionResult5, + &Segmentation_ModelExecution::SetPredictionResult6, + &Segmentation_ModelExecution::SetPredictionResult7, + &Segmentation_ModelExecution::SetPredictionResult8, + &Segmentation_ModelExecution::SetPredictionResult9, + &Segmentation_ModelExecution::SetPredictionResult10}; + const UkmMemberFn kSegmentationUkmOutputMethods[] = { &Segmentation_ModelExecution::SetActualResult, &Segmentation_ModelExecution::SetActualResult2, @@ -87,9 +100,19 @@ &Segmentation_ModelExecution::SetActualResult4, &Segmentation_ModelExecution::SetActualResult5, &Segmentation_ModelExecution::SetActualResult6}; - } // namespace +// Helper method to add model prediction results to UKM log. +void AddPredictionResultToUkmModelExecution( + ukm::builders::Segmentation_ModelExecution* model_execution, + const std::vector<float>& results) { + CHECK_LE(results.size(), ARRAY_SIZE(kSegmentationUkmPredictionResultMethods)); + for (size_t i = 0; i < results.size(); ++i) { + CALL_MEMBER_FN(*model_execution, kSegmentationUkmPredictionResultMethods[i]) + (SegmentationUkmHelper::FloatToInt64(results[i])); + } +} + namespace segmentation_platform { SegmentationUkmHelper::SegmentationUkmHelper() { @@ -126,7 +149,7 @@ SegmentId segment_id, int64_t model_version, const ModelProvider::Request& input_tensor, - float result) { + const std::vector<float>& results) { ukm::SourceId source_id = ukm::NoURLSourceId(); ukm::builders::Segmentation_ModelExecution execution_result(source_id); @@ -136,9 +159,8 @@ return ukm::kInvalidSourceId; } - // TODO(xingliu): Also record continuous outputs for model execution. - execution_result.SetPredictionResult(FloatToInt64(result)) - .Record(ukm::UkmRecorder::Get()); + AddPredictionResultToUkmModelExecution(&execution_result, results); + execution_result.Record(ukm::UkmRecorder::Get()); return source_id; } @@ -162,9 +184,9 @@ } if (prediction_result.has_value() && prediction_result->result_size() > 0) { - // TODO(ritikagup): Add support for uploading multiple outputs. - execution_result.SetPredictionResult( - FloatToInt64(prediction_result->result()[0])); + std::vector<float> results(prediction_result->result().begin(), + prediction_result->result().end()); + AddPredictionResultToUkmModelExecution(&execution_result, results); } if (selected_segment.has_value()) { execution_result.SetSelectionResult(selected_segment->segment_id);
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.h b/components/segmentation_platform/internal/segmentation_ukm_helper.h index 01ef64ae2..53c986ec 100644 --- a/components/segmentation_platform/internal/segmentation_ukm_helper.h +++ b/components/segmentation_platform/internal/segmentation_ukm_helper.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_SEGMENTATION_UKM_HELPER_H_ #define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_SEGMENTATION_UKM_HELPER_H_ +#include <vector> + #include "base/containers/flat_set.h" #include "base/no_destructor.h" #include "base/time/time.h" @@ -40,7 +42,7 @@ SegmentId segment_id, int64_t model_version, const ModelProvider::Request& input_tensor, - float result); + const std::vector<float>& results); // Record segmentation model training data as UKM message. // `input_tensors` contains the values for training inputs.
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc b/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc index f3a09545..2745d100 100644 --- a/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc +++ b/components/segmentation_platform/internal/segmentation_ukm_helper_unittest.cc
@@ -48,6 +48,7 @@ absl::optional<proto::PredictionResult> GetPredictionResult() { proto::PredictionResult result; result.add_result(0.5); + result.add_result(0.4); return result; } @@ -109,7 +110,8 @@ // Allow results for OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB to be recorded. ModelProvider::Request input_tensors = {0.1, 0.7, 0.8, 0.5}; SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult( - proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, input_tensors, 0.6); + proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, input_tensors, + {0.6, 0.3}); ExpectUkmMetrics(Segmentation_ModelExecution::kEntryName, {Segmentation_ModelExecution::kOptimizationTargetName, Segmentation_ModelExecution::kModelVersionName, @@ -117,7 +119,8 @@ Segmentation_ModelExecution::kInput1Name, Segmentation_ModelExecution::kInput2Name, Segmentation_ModelExecution::kInput3Name, - Segmentation_ModelExecution::kPredictionResultName}, + Segmentation_ModelExecution::kPredictionResult1Name, + Segmentation_ModelExecution::kPredictionResult2Name}, { proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, @@ -126,6 +129,7 @@ SegmentationUkmHelper::FloatToInt64(0.8), SegmentationUkmHelper::FloatToInt64(0.5), SegmentationUkmHelper::FloatToInt64(0.6), + SegmentationUkmHelper::FloatToInt64(0.3), }); } @@ -147,7 +151,8 @@ Segmentation_ModelExecution::kInput0Name, Segmentation_ModelExecution::kActualResult3Name, Segmentation_ModelExecution::kActualResult4Name, - Segmentation_ModelExecution::kPredictionResultName, + Segmentation_ModelExecution::kPredictionResult1Name, + Segmentation_ModelExecution::kPredictionResult2Name, Segmentation_ModelExecution::kSelectionResultName, Segmentation_ModelExecution::kOutputDelaySecName}, { @@ -157,6 +162,7 @@ SegmentationUkmHelper::FloatToInt64(1.0), SegmentationUkmHelper::FloatToInt64(0.0), SegmentationUkmHelper::FloatToInt64(0.5), + SegmentationUkmHelper::FloatToInt64(0.4), proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 10, }); @@ -224,7 +230,7 @@ ukm::SourceId source_id = SegmentationUkmHelper::GetInstance()->RecordModelExecutionResult( proto::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 101, input_tensors, - 0.6); + {0.6}); ASSERT_EQ(source_id, ukm::kInvalidSourceId); tester.ExpectTotalCount(histogram_name, 1); ASSERT_EQ(tester.GetTotalSum(histogram_name), 100);
diff --git a/components/services/app_service/public/cpp/app_update.cc b/components/services/app_service/public/cpp/app_update.cc index 12a393d9..fccb44ff 100644 --- a/components/services/app_service/public/cpp/app_update.cc +++ b/components/services/app_service/public/cpp/app_update.cc
@@ -5,6 +5,7 @@ #include "components/services/app_service/public/cpp/app_update.h" #include "base/logging.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/time/time.h" #include "components/services/app_service/public/cpp/icon_types.h" @@ -28,6 +29,10 @@ return apps::RunOnOsLogin(login_data.login_mode, login_data.is_managed); } +std::string FormatBytes(absl::optional<uint64_t> bytes) { + return bytes.has_value() ? base::NumberToString(bytes.value()) : "null"; +} + } // namespace namespace apps { @@ -493,8 +498,8 @@ << EnumToString(app.RunOnOsLogin().value().login_mode) << std::endl; } - out << "App Size: " << app.AppSizeInBytes().value_or(-1) << std::endl; - out << "Data Size: " << app.DataSizeInBytes().value_or(-1) << std::endl; + out << "App Size: " << FormatBytes(app.AppSizeInBytes()) << std::endl; + out << "Data Size: " << FormatBytes(app.DataSizeInBytes()) << std::endl; return out; }
diff --git a/components/services/storage/indexed_db/locks/partitioned_lock_manager.cc b/components/services/storage/indexed_db/locks/partitioned_lock_manager.cc index d2229531..1bed89d 100644 --- a/components/services/storage/indexed_db/locks/partitioned_lock_manager.cc +++ b/components/services/storage/indexed_db/locks/partitioned_lock_manager.cc
@@ -29,10 +29,12 @@ PartitionedLockManager::LockRequest::LockRequest( LockType type, base::WeakPtr<PartitionedLockHolder> locks_holder, - base::OnceClosure acquired_callback) + base::OnceClosure acquired_callback, + const base::Location& location) : requested_type(type), locks_holder(std::move(locks_holder)), - acquired_callback(std::move(acquired_callback)) {} + acquired_callback(std::move(acquired_callback)), + location(location) {} PartitionedLockManager::LockRequest::LockRequest(LockRequest&&) noexcept = default; PartitionedLockManager::LockRequest::~LockRequest() = default; @@ -69,7 +71,8 @@ base::flat_set<PartitionedLockRequest> lock_requests, base::WeakPtr<PartitionedLockHolder> locks_holder, LocksAcquiredCallback callback, - AcquireOptions acquire_options) { + AcquireOptions acquire_options, + const base::Location& location) { if (!locks_holder) { std::move(callback).Run(); return; @@ -96,15 +99,17 @@ // All locks have been acquired. if (!holder || callback.IsCancelled() || callback.is_null()) return; - if (run_synchronously->data) + if (run_synchronously->data) { std::move(callback).Run(); - else + } else { runner->PostTask(FROM_HERE, std::move(callback)); + } }, task_runner_, run_callback_synchonously, locks_holder, std::move(callback))); for (PartitionedLockRequest& request : lock_requests) { - AcquireLock(std::move(request), locks_holder, all_locks_acquired_barrier); + AcquireLock(std::move(request), locks_holder, all_locks_acquired_barrier, + location); } // If the barrier wasn't run yet, then it will be run asynchronously. run_callback_synchonously->data = false; @@ -117,6 +122,24 @@ : TestLockResult::kLocked; } +std::vector<base::Location> +PartitionedLockManager::GetHeldAndQueuedLockLocations( + const base::flat_set<PartitionedLockRequest>& requests) const { + std::vector<base::Location> result; + for (const auto& request : requests) { + auto lock_it = locks_.find(request.lock_id); + if (lock_it == locks_.end()) { + continue; + } + result.insert(result.end(), lock_it->second.request_locations.begin(), + lock_it->second.request_locations.end()); + for (const LockRequest& queued_request : lock_it->second.queue) { + result.push_back(queued_request.location); + } + } + return result; +} + std::vector<PartitionedLockId> PartitionedLockManager::GetUnacquirableLocks( std::vector<PartitionedLockRequest>& lock_requests) { std::vector<PartitionedLockId> lock_ids; @@ -144,7 +167,8 @@ void PartitionedLockManager::AcquireLock( PartitionedLockRequest request, base::WeakPtr<PartitionedLockHolder> locks_holder, - base::OnceClosure acquired_callback) { + base::OnceClosure acquired_callback, + const base::Location& location) { DCHECK(locks_holder); auto it = locks_.find(request.lock_id); @@ -160,8 +184,10 @@ if (lock.CanBeAcquired(request.type)) { ++lock.acquired_count; lock.lock_mode = request.type; - auto released_callback = base::BindOnce( - &PartitionedLockManager::LockReleased, weak_factory_.GetWeakPtr()); + lock.request_locations.insert(location); + auto released_callback = + base::BindOnce(&PartitionedLockManager::LockReleased, + weak_factory_.GetWeakPtr(), location); locks_holder->locks.emplace_back(std::move(request.lock_id), std::move(released_callback)); std::move(acquired_callback).Run(); @@ -170,11 +196,12 @@ // grant the given callback the lock when it is acquired in the future in // the |LockReleased| method. lock.queue.emplace_back(request.type, std::move(locks_holder), - std::move(acquired_callback)); + std::move(acquired_callback), location); } } -void PartitionedLockManager::LockReleased(PartitionedLockId lock_id) { +void PartitionedLockManager::LockReleased(base::Location request_location, + PartitionedLockId lock_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto it = locks_.find(lock_id); DCHECK(it != locks_.end()); @@ -182,6 +209,7 @@ DCHECK_GT(lock.acquired_count, 0); --(lock.acquired_count); + lock.request_locations.erase(request_location); if (lock.acquired_count == 0) { // Either the lock isn't acquired yet or more shared locks can be granted. while (!lock.queue.empty() && @@ -200,8 +228,10 @@ ++lock.acquired_count; lock.lock_mode = requester.requested_type; - auto released_callback = base::BindOnce( - &PartitionedLockManager::LockReleased, weak_factory_.GetWeakPtr()); + lock.request_locations.insert(requester.location); + auto released_callback = + base::BindOnce(&PartitionedLockManager::LockReleased, + weak_factory_.GetWeakPtr(), requester.location); // Grant the lock. requester.locks_holder->locks.emplace_back(lock_id, std::move(released_callback));
diff --git a/components/services/storage/indexed_db/locks/partitioned_lock_manager.h b/components/services/storage/indexed_db/locks/partitioned_lock_manager.h index 5b233da..63821ee 100644 --- a/components/services/storage/indexed_db/locks/partitioned_lock_manager.h +++ b/components/services/storage/indexed_db/locks/partitioned_lock_manager.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_SERVICES_STORAGE_INDEXED_DB_LOCKS_PARTITIONED_LOCK_MANAGER_H_ #define COMPONENTS_SERVICES_STORAGE_INDEXED_DB_LOCKS_PARTITIONED_LOCK_MANAGER_H_ +#include <deque> #include <iosfwd> #include <list> #include <memory> @@ -15,7 +16,8 @@ #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/functional/callback.h" -#include "base/memory/ref_counted.h" +#include "base/location.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" @@ -91,12 +93,18 @@ void AcquireLocks(base::flat_set<PartitionedLockRequest> lock_requests, base::WeakPtr<PartitionedLockHolder> locks_holder, LocksAcquiredCallback callback, - AcquireOptions acquire_options = AcquireOptions()); + AcquireOptions acquire_options = AcquireOptions(), + const base::Location& location = FROM_HERE); enum class TestLockResult { kLocked, kFree }; // Tests to see if the given lock request can be acquired. TestLockResult TestLock(PartitionedLockRequest lock_requests); + // Gets the request location of all locks currently held and queued for the + // given requests. + std::vector<base::Location> GetHeldAndQueuedLockLocations( + const base::flat_set<PartitionedLockRequest>& requests) const; + // Filter out the list of `PartitionedLockId`s that cannot be acquired given // the list of `PartitionedLockRequest`. // See `Lock::CanBeAcquired()`. @@ -118,12 +126,14 @@ LockRequest(LockRequest&&) noexcept; LockRequest(LockType type, base::WeakPtr<PartitionedLockHolder> locks_holder, - base::OnceClosure callback); + base::OnceClosure callback, + const base::Location& location); ~LockRequest(); LockType requested_type = LockType::kShared; base::WeakPtr<PartitionedLockHolder> locks_holder; base::OnceClosure acquired_callback; + base::Location location; }; // Represents a lock, which has a lock_id. To support shared access, there can @@ -144,15 +154,17 @@ } int acquired_count = 0; + base::flat_set<base::Location> request_locations; LockType lock_mode = LockType::kShared; std::list<LockRequest> queue; }; void AcquireLock(PartitionedLockRequest request, base::WeakPtr<PartitionedLockHolder> locks_holder, - base::OnceClosure acquired_callback); + base::OnceClosure acquired_callback, + const base::Location& location); - void LockReleased(PartitionedLockId lock_id); + void LockReleased(base::Location request_location, PartitionedLockId lock_id); SEQUENCE_CHECKER(sequence_checker_);
diff --git a/components/services/storage/indexed_db/locks/partitioned_lock_manager_unittest.cc b/components/services/storage/indexed_db/locks/partitioned_lock_manager_unittest.cc index 4b1ce4b..995d0c66 100644 --- a/components/services/storage/indexed_db/locks/partitioned_lock_manager_unittest.cc +++ b/components/services/storage/indexed_db/locks/partitioned_lock_manager_unittest.cc
@@ -4,16 +4,17 @@ #include "components/services/storage/indexed_db/locks/partitioned_lock_manager.h" -#include "base/barrier_closure.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" +#include "base/location.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/task/sequenced_task_runner.h" -#include "base/test/bind.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "components/services/storage/indexed_db/locks/partitioned_lock.h" #include "components/services/storage/indexed_db/locks/partitioned_lock_id.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -351,5 +352,49 @@ } } +TEST_F(PartitionedLockManagerTest, Locations) { + PartitionedLockManager lock_manager; + + base::Location location1 = FROM_HERE; + base::Location location2 = FROM_HERE; + base::Location location3 = FROM_HERE; + + EXPECT_EQ(0ll, lock_manager.LocksHeldForTesting()); + EXPECT_EQ(0ll, lock_manager.RequestsWaitingForTesting()); + + PartitionedLockId lock_id = {0, "foo"}; + + PartitionedLockHolder holder1; + PartitionedLockHolder holder2; + { + base::test::TestFuture<void> lock_acquired; + lock_manager.AcquireLocks( + {{lock_id, PartitionedLockManager::LockType::kShared}}, + holder1.AsWeakPtr(), lock_acquired.GetCallback(), + PartitionedLockManager::AcquireOptions(), location1); + ASSERT_TRUE(lock_acquired.Wait()); + } + { + base::test::TestFuture<void> lock_acquired; + lock_manager.AcquireLocks( + {{lock_id, PartitionedLockManager::LockType::kShared}}, + holder2.AsWeakPtr(), lock_acquired.GetCallback(), + PartitionedLockManager::AcquireOptions(), location2); + ASSERT_TRUE(lock_acquired.Wait()); + } + { + lock_manager.AcquireLocks( + {{lock_id, PartitionedLockManager::LockType::kExclusive}}, + holder2.AsWeakPtr(), base::DoNothing(), + PartitionedLockManager::AcquireOptions(), location3); + } + std::vector<base::Location> held_locations = + lock_manager.GetHeldAndQueuedLockLocations( + {{lock_id, PartitionedLockManager::LockType::kShared}}); + ASSERT_EQ(held_locations.size(), 3ul); + EXPECT_THAT(held_locations, + testing::UnorderedElementsAre(location1, location2, location3)); +} + } // namespace } // namespace content
diff --git a/components/soda/constants.h b/components/soda/constants.h index fa10186..367a8c8 100644 --- a/components/soda/constants.h +++ b/components/soda/constants.h
@@ -55,6 +55,8 @@ const uint8_t public_key_sha[32] = {}; }; +// TODO(crbug.com/1161569): Replace the display name mapping with +// GetDisplayNameForLocale. constexpr SodaLanguagePackComponentConfig kLanguageComponentConfigs[] = { {LanguageCode::kEnUs, "en-US",
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 8508d56a..45f982a 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 цаляў</translation> <translation id="1181037720776840403">Выдаліць</translation> <translation id="1186201132766001848">Праверыць паролі</translation> +<translation id="1195073053842921378">Гэты адрас будзе выдалены з прылады</translation> <translation id="1195558154361252544">Апавяшчэнні аўтаматычна блакіруюцца для ўсіх сайтаў, акрамя тых, якім вы далі дазвол іх паказваць</translation> <translation id="1197088940767939838">Аранжавы</translation> <translation id="1201402288615127009">Далей</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 6fe9327..b44d05cc7 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Nastavi</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Meni s dugmadima za promjenu veličine</translation> +<translation id="2365355378251437925">Unesite <ph name="FIELD" /></translation> <translation id="2367567093518048410">Nivo</translation> <translation id="2380886658946992094">Pravo</translation> <translation id="2383455408879745299">Prilagodite alate za pristupačnost u postavkama Chromea</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 09467c7..efc15b9e 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 polzades</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1186201132766001848">Comprova les contrasenyes</translation> +<translation id="1195073053842921378">L'adreça se suprimirà d'aquest dispositiu</translation> <translation id="1195558154361252544">Les notificacions de tots els llocs web estan bloquejades automàticament excepte les que permetis</translation> <translation id="1197088940767939838">Taronja</translation> <translation id="1201402288615127009">Següent</translation> @@ -1327,7 +1328,7 @@ <translation id="4261046003697461417">No es poden fer anotacions en documents protegits</translation> <translation id="4265872034478892965">Permès per l'administrador</translation> <translation id="4270541775497538019">Apiladora 6</translation> -<translation id="4274173425554582601">Ordinadors i electrònica</translation> +<translation id="4274173425554582601">Informàtica i electrònica</translation> <translation id="4275830172053184480">Reinici del dispositiu</translation> <translation id="4277028893293644418">Restableix la contrasenya</translation> <translation id="4278390842282768270">Permès</translation> @@ -1819,7 +1820,7 @@ <translation id="5481076368049295676">Aquest contingut pot provar d'instal·lar programari maliciós al teu dispositiu per suprimir-ne informació o robar-te'n. <ph name="BEGIN_LINK" />Mostra igualment<ph name="END_LINK" />.</translation> <translation id="54817484435770891">Afegeix una adreça vàlida</translation> <translation id="5485973315555778056">Màquina al núvol</translation> -<translation id="5487426985799386720">Menjar i begudes</translation> +<translation id="5487426985799386720">Menjar i beguda</translation> <translation id="5490432419156082418">Adreces i més</translation> <translation id="5492298309214877701">Aquest lloc de la intranet de l'empresa, l'organització o el centre educatiu té el mateix URL que un lloc web extern. <ph name="LINE_BREAK" /> @@ -1991,7 +1992,7 @@ <translation id="5922853866070715753">Ja queda poc</translation> <translation id="5923492272538889093">Vols utilitzar el desbloqueig del dispositiu en lloc del CVC?</translation> <translation id="5924782825030413055">Font de la darrera actualització del consentiment:</translation> -<translation id="5928444777041341328">Llar i jardí</translation> +<translation id="5928444777041341328">Casa i jardí</translation> <translation id="5932224571077948991">El lloc web mostra anuncis intrusius o enganyosos</translation> <translation id="5937560539988385583">S'ha traduït la pàgina</translation> <translation id="5938153366081463283">Afegeix una targeta virtual</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index c9bf652c..ce0e5c3 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -3334,6 +3334,7 @@ <translation id="950736567201356821">Triple punch top</translation> <translation id="961663415146723894">Bind bottom</translation> <translation id="962484866189421427">This content might try to install deceptive apps that pretend to be something else or collect data that may be used to track you. <ph name="BEGIN_LINK" />Show anyway<ph name="END_LINK" /></translation> +<translation id="963837307749850257">All users</translation> <translation id="964050462028070434">Manage passwords and passkeys…</translation> <translation id="96680173638229310">Autos and vehicles</translation> <translation id="969892804517981540">Official Build</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 72a37d4..bce0048 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">30,48 × 40,64 cm (12 × 16 in)</translation> <translation id="1181037720776840403">Kendu</translation> <translation id="1186201132766001848">Egiaztatu pasahitzak</translation> +<translation id="1195073053842921378">Helbidea gailutik ezabatuko da</translation> <translation id="1195558154361252544">Webgune guztien jakinarazpenak automatikoki blokeatzen dira, zuk baimentzen dituzunenak izan ezik</translation> <translation id="1197088940767939838">Laranja</translation> <translation id="1201402288615127009">Hurrengoa</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 7a37623..4001448 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 tuumaa</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1186201132766001848">Tarkista salasanat</translation> +<translation id="1195073053842921378">Osoite poistetaan tältä laitteelta</translation> <translation id="1195558154361252544">Ilmoitukset estetään automaattisesti kaikilla muilla paitsi sallituilla sivustoilla</translation> <translation id="1197088940767939838">Oranssi</translation> <translation id="1201402288615127009">Seuraava</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 5b3ef07..a81f02d 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 pouces</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1186201132766001848">Vérifier les mots de passe</translation> +<translation id="1195073053842921378">Cette adresse sera supprimée de cet appareil</translation> <translation id="1195558154361252544">Les notifications sont bloquées automatiquement pour tous les sites, sauf ceux que vous autorisez</translation> <translation id="1197088940767939838">Orange</translation> <translation id="1201402288615127009">Suivant</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 980f632..314b4aa 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 polgadas</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1186201132766001848">Comprobar contrasinais</translation> +<translation id="1195073053842921378">Este enderezo eliminarase do dispositivo</translation> <translation id="1195558154361252544">Bloquéanse automaticamente as notificacións para todos os sitios, excepto para os que permitas</translation> <translation id="1197088940767939838">Laranxa</translation> <translation id="1201402288615127009">Seguinte</translation> @@ -2815,7 +2816,7 @@ <translation id="7952804540472583406"><ph name="BEGIN_LINK" />Inicia sesión<ph name="END_LINK" /> na rede.</translation> <translation id="7953569069500808819">Grampa no bordo superior</translation> <translation id="7955105108888461311">Preguntar en persoa</translation> -<translation id="7956713633345437162">Marcadores para móbiles</translation> +<translation id="7956713633345437162">Marcadores do móbil</translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7962467575542381659">Máquina da plataforma</translation> <translation id="7966803981046576691">Tipo de conta para o traballo</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index d4e7561..02bc96ed 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 ઇંચ</translation> <translation id="1181037720776840403">કાઢી નાખો</translation> <translation id="1186201132766001848">પાસવર્ડ ચેક કરો</translation> +<translation id="1195073053842921378">આ ડિવાઇસમાંથી આ સરનામું ડિલીટ કરવામાં આવશે</translation> <translation id="1195558154361252544">તમે જેના માટે મંજૂરી આપી હોય તે સિવાયની બધી સાઇટ માટે નોટિફિકેશનને ઑટોમૅટિક રીતે બ્લૉક કરવામાં આવે છે</translation> <translation id="1197088940767939838">નારંગી</translation> <translation id="1201402288615127009">આગલું</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index de3ac51..9bd0884b 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Nastavi</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Izbornik prekidača za promjenu veličine</translation> +<translation id="2365355378251437925">Unesite <ph name="FIELD" /></translation> <translation id="2367567093518048410">Razina</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">U postavkama Chromea prilagodite svoje alate za pristupačnost</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index cdd76597..a99eb08 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 inci (30 x 40 cm)</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1186201132766001848">Periksa Sandi</translation> +<translation id="1195073053842921378">Alamat ini akan dihapus dari perangkat ini</translation> <translation id="1195558154361252544">Notifikasi otomatis diblokir untuk semua situs kecuali situs yang Anda izinkan</translation> <translation id="1197088940767939838">Oranye</translation> <translation id="1201402288615127009">Berikutnya</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index a0dc31607..6249df4 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 to.</translation> <translation id="1181037720776840403">Fjarlægja</translation> <translation id="1186201132766001848">Yfirfara aðgangsorð</translation> +<translation id="1195073053842921378">Heimilisfanginu verður eytt úr tækinu</translation> <translation id="1195558154361252544">Sjálfkrafa er lokað á tilkynningar fyrir öll vefsvæði nema þau sem þú hefur gefið leyfi</translation> <translation id="1197088940767939838">Appelsínugulur</translation> <translation id="1201402288615127009">Áfram</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 49b29b8..8b2462c6 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 in</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1186201132766001848">Controlla password</translation> +<translation id="1195073053842921378">Questo indirizzo verrà eliminato da questo dispositivo</translation> <translation id="1195558154361252544">Le notifiche vengono bloccate automaticamente per tutti i siti, tranne per quelli che consenti tu</translation> <translation id="1197088940767939838">Arancione</translation> <translation id="1201402288615127009">Avanti</translation> @@ -588,6 +589,7 @@ <translation id="2359808026110333948">Continua</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Menu di attivazione/disattivazione ridimensionamento</translation> +<translation id="2365355378251437925">Inserisci un valore <ph name="FIELD" /></translation> <translation id="2367567093518048410">Livello</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Personalizza i tuoi strumenti di accessibilità nelle impostazioni di Chrome</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index d6bd811b..8777691d 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12x16 אינץ'</translation> <translation id="1181037720776840403">הסרה</translation> <translation id="1186201132766001848">בדיקת הסיסמאות</translation> +<translation id="1195073053842921378">הכתובת הזו תימחק מהמכשיר</translation> <translation id="1195558154361252544">הצגת ההודעות חסומה באופן אוטומטי בכל האתרים, מלבד האתרים שבהם היא אושרה</translation> <translation id="1197088940767939838">כתום</translation> <translation id="1201402288615127009">הבא</translation> @@ -588,6 +589,7 @@ <translation id="2359808026110333948">המשך</translation> <translation id="2361263712565360498">275x395 מ"מ</translation> <translation id="236340516568226369">תפריט מתגים לשינוי גודל</translation> +<translation id="2365355378251437925">יש להזין <ph name="FIELD" /></translation> <translation id="2367567093518048410">רמה</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">התאמה אישית של כלי הנגישות בהגדרות Chrome</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 574e3a9..c29f856 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">გაგრძელება</translation> <translation id="2361263712565360498">275 x 395 მმ</translation> <translation id="236340516568226369">ზომის შეცვლის გადართვის მენიუ</translation> +<translation id="2365355378251437925">შეიყვანეთ <ph name="FIELD" /></translation> <translation id="2367567093518048410">დონე</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">მარტივი წვდომის ხელსაწყოების პერსონალიზირება Chrome პარამეტრებიდან</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 7b652cb..d90261d 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 дюйм</translation> <translation id="1181037720776840403">Өшіру</translation> <translation id="1186201132766001848">Құпия сөздерді тексеру</translation> +<translation id="1195073053842921378">Бұл мекенжай осы құрылғыдан жойылады</translation> <translation id="1195558154361252544">Сіз рұқсат еткеннен басқа сайттар үшін хабарландырулар автоматты түрде бөгелді.</translation> <translation id="1197088940767939838">Қызғылт сары</translation> <translation id="1201402288615127009">Келесі</translation> @@ -588,6 +589,7 @@ <translation id="2359808026110333948">Жалғастыру</translation> <translation id="2361263712565360498">275 x 395 мм</translation> <translation id="236340516568226369">Өлшем өзгерту мәзірі</translation> +<translation id="2365355378251437925"><ph name="FIELD" /> бөліміне кіріңіз</translation> <translation id="2367567093518048410">Деңгей</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Chrome параметрлерінен арнайы мүмкіндіктер құралдарын жекелендіру</translation> @@ -3331,6 +3333,7 @@ <translation id="950736567201356821">Жоғарғы жағын үш рет тесу</translation> <translation id="961663415146723894">Төменгі жағын байлау</translation> <translation id="962484866189421427">Бұл контент жалған қолданбалар орнатуы мүмкін, олар басқа біреудің атын жамылуы немесе сізді бақылау үшін пайдаланылатын деректерді жинауы мүмкін. <ph name="BEGIN_LINK" />Бәрібір көрсету<ph name="END_LINK" /></translation> +<translation id="963837307749850257">Барлық пайдаланушы</translation> <translation id="964050462028070434">Құпия сөздер мен кіру кілттерін басқару…</translation> <translation id="96680173638229310">Автомобильдер мен көлік құралдары</translation> <translation id="969892804517981540">Ресми жинақ</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index a4bbe7e..6e6854c 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -85,6 +85,7 @@ <translation id="1178821169867863726">12 x 16 in</translation> <translation id="1181037720776840403">ដកចេញ</translation> <translation id="1186201132766001848">ពិនិត្យពាក្យសម្ងាត់</translation> +<translation id="1195073053842921378">អាសយដ្ឋាននេះនឹងត្រូវបានលុបពីឧបករណ៍នេះ</translation> <translation id="1195558154361252544">ការជូនដំណឹងត្រូវបានទប់ស្កាត់ដោយស្វ័យប្រវត្តិសម្រាប់គេហទំព័រទាំងអស់ លើកលែងតែគេហទំព័រដែលអ្នកអនុញ្ញាតប៉ុណ្ណោះ</translation> <translation id="1197088940767939838">ទឹកក្រូច</translation> <translation id="1201402288615127009">បន្ទាប់</translation> @@ -3338,6 +3339,7 @@ <translation id="950736567201356821">ចោះបីរន្ធខាងលើ</translation> <translation id="961663415146723894">ភ្ជាប់ខាងក្រោម</translation> <translation id="962484866189421427">ខ្លឹមសារនេះអាចព្យាយាមដំឡើងកម្មវិធីបោកប្រាស់ ដែលក្លែងធ្វើជាអ្វីម្យ៉ាង ឬប្រមូលទិន្នន័យដែលអាចប្រើដើម្បីតាមដានអ្នក។ <ph name="BEGIN_LINK" />បង្ហាញចុះមិនអីទេ<ph name="END_LINK" /></translation> +<translation id="963837307749850257">អ្នកប្រើប្រាស់ទាំងអស់</translation> <translation id="964050462028070434">គ្រប់គ្រងពាក្យសម្ងាត់ និងកូដសម្ងាត់…</translation> <translation id="96680173638229310">យានយន្ត និងយានជំនិះ</translation> <translation id="969892804517981540">លេខកំណែផ្លូវការ</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 94ad79f..d97e80a0 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -588,6 +588,7 @@ <translation id="2359808026110333948">ಮುಂದುವರೆಸಿ</translation> <translation id="2361263712565360498">275 x 395 ಮಿಮೀ</translation> <translation id="236340516568226369">ಟಾಗಲ್ ಮೆನುವನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಿ</translation> +<translation id="2365355378251437925"><ph name="FIELD" /> ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="2367567093518048410">ಹಂತ</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಪ್ರವೇಶಿಸುವಿಕೆ ಪರಿಕರಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಿ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index a0060bb..b5faf85 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 col.</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1186201132766001848">Patikrinti slaptažodžius</translation> +<translation id="1195073053842921378">Šis adresas bus ištrintas iš šio įrenginio</translation> <translation id="1195558154361252544">Pranešimai automatiškai blokuojami visose svetainėse, išskyrus svetaines, kuriose leidote rodyti</translation> <translation id="1197088940767939838">Oranžinė</translation> <translation id="1201402288615127009">Kitas</translation> @@ -3334,6 +3335,7 @@ <translation id="950736567201356821">Trys skylės viršuje</translation> <translation id="961663415146723894">Įrišimas apačioje</translation> <translation id="962484866189421427">Šis turinys gali bandyti įdiegti klaidinančių programų, kurios apsimeta kitomis programomis, arba rinkti duomenis, naudojamus jums stebėti. <ph name="BEGIN_LINK" />Rodyti vis tiek<ph name="END_LINK" /></translation> +<translation id="963837307749850257">Visi vartotojai</translation> <translation id="964050462028070434">Tvarkyti slaptažodžius ir „passkey“…</translation> <translation id="96680173638229310">Automobiliai ir transporto priemonės</translation> <translation id="969892804517981540">Oficialiai pagaminta</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 2f24f191..96382df9 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 collas</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1186201132766001848">Pārbaudīt paroles</translation> +<translation id="1195073053842921378">Šī adrese tiks dzēsta no šīs ierīces.</translation> <translation id="1195558154361252544">Paziņojumi tiek automātiski bloķēti visās vietnēs, izņemot tās, kurās atļāvāt to rādīšanu.</translation> <translation id="1197088940767939838">Oranža</translation> <translation id="1201402288615127009">Tālāk</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 96c03f1..527658f 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 ഇഞ്ച്</translation> <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation> <translation id="1186201132766001848">പാസ്വേഡ് പരിശോധിക്കൂ</translation> +<translation id="1195073053842921378">ഈ വിലാസം ഈ ഉപകരണത്തിൽ നിന്ന് ഇല്ലാതാക്കും</translation> <translation id="1195558154361252544">നിങ്ങൾ അനുവദിക്കുന്ന സൈറ്റുകൾക്ക് ഒഴികെ മറ്റ് എല്ലാ സൈറ്റുകൾക്കും അറിയിപ്പുകൾ സ്വയമേവ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation> <translation id="1197088940767939838">ഓറഞ്ച്</translation> <translation id="1201402288615127009">അടുത്തത്</translation> @@ -588,6 +589,7 @@ <translation id="2359808026110333948">തുടരുക</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">വലുപ്പം മാറ്റുക ടോഗിൾ മെനു</translation> +<translation id="2365355378251437925"><ph name="FIELD" /> നൽകുക</translation> <translation id="2367567093518048410">നില</translation> <translation id="2380886658946992094">നിയമപരം</translation> <translation id="2383455408879745299">Chrome ക്രമീകരണത്തിൽ നിങ്ങളുടെ ഉപയോഗസഹായി ടൂളുകൾ വ്യക്തിപരമാക്കുക</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 669294a..a019baf 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 ଇଞ୍ଚ</translation> <translation id="1181037720776840403">କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="1186201132766001848">ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ</translation> +<translation id="1195073053842921378">ଏହି ଡିଭାଇସରୁ ଏହି ଠିକଣାଟି ଡିଲିଟ ହୋଇଯିବ</translation> <translation id="1195558154361252544">ଆପଣ ଅନୁମତି ଦେଇଥିବା ସାଇଟ୍ଗୁଡ଼ିକ ବ୍ୟତୀତ ସମସ୍ତ ସାଇଟ୍ରେ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରାଯାଇଛି</translation> <translation id="1197088940767939838">କମଳା</translation> <translation id="1201402288615127009">ପରବର୍ତ୍ତୀ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index f45a946d..40b865f 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Dalej</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Menu przełączania rozmiaru</translation> +<translation id="2365355378251437925">Wpisz <ph name="FIELD" /></translation> <translation id="2367567093518048410">Poziom</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Spersonalizuj narzędzia ułatwień dostępu w ustawieniach Chrome</translation> @@ -3333,6 +3334,7 @@ <translation id="950736567201356821">Trzy otwory u góry</translation> <translation id="961663415146723894">Wiązanie na dole</translation> <translation id="962484866189421427">Te treści mogą próbować zainstalować wprowadzające w błąd aplikacje, które udają, że są przeznaczone do czegoś innego niż w rzeczywistości, lub zbierają dane, na podstawie których można Cię śledzić. <ph name="BEGIN_LINK" />Pokaż mimo to<ph name="END_LINK" /></translation> +<translation id="963837307749850257">Wszyscy użytkownicy</translation> <translation id="964050462028070434">Zarządzaj hasłami i kluczami…</translation> <translation id="96680173638229310">Samochody i pojazdy</translation> <translation id="969892804517981540">Oficjalna wersja</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 515a29d5..4a706aa6 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Continuar</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Menu de interruptores de redimensionamento</translation> +<translation id="2365355378251437925">Introduza o(a) <ph name="FIELD" /></translation> <translation id="2367567093518048410">Nível</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Personalize as ferramentas de acessibilidade nas definições do Chrome</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index a1223e4..3c84f9af 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Continuă</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Meniu cu comutatoare de redimensionare</translation> +<translation id="2365355378251437925">Intră în <ph name="FIELD" /></translation> <translation id="2367567093518048410">Nivel</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Personalizează instrumentele de accesibilitate în setările Chrome</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index b408e8f6..213a79dc 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Продолжить</translation> <translation id="2361263712565360498">275 x 395 мм</translation> <translation id="236340516568226369">Меню изменения размера</translation> +<translation id="2365355378251437925">Заполните поле "<ph name="FIELD" />".</translation> <translation id="2367567093518048410">Уровень</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Персонализировать инструменты специальных возможностей в настройках Chrome</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index cde0e92..6ef8186 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">අඟ 12 x 16</translation> <translation id="1181037720776840403">ඉවත් කරන්න</translation> <translation id="1186201132766001848">මුරපද පරීක්ෂා කරන්න</translation> +<translation id="1195073053842921378">මෙම ලිපිනය මෙම උපාංගයෙන් මකනු ඇත</translation> <translation id="1195558154361252544">ඔබ අවසර දෙන ඒවා හැර සියලුම වෙබ් අඩවි සඳහා දැනුම්දීම් ස්වයංක්රීයව අවහිර කෙරෙති</translation> <translation id="1197088940767939838">තැඹිලි</translation> <translation id="1201402288615127009">ඊළඟ</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 0a241ca..8386c6f 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">Naprej</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Povečanje velikosti menija za preklop</translation> +<translation id="2365355378251437925">Izpolnite polje <ph name="FIELD" /></translation> <translation id="2367567093518048410">Raven</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Osebno prilagajanje orodij za ljudi s posebnimi potrebami v Chromovih nastavitvah</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index f3048010..5469463 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -3333,6 +3333,7 @@ <translation id="950736567201356821">Trostruko bušenje na vrhu</translation> <translation id="961663415146723894">Povez na dnu</translation> <translation id="962484866189421427">Ovaj sadržaj možda pokušava da instalira obmanjujuće aplikacije koje se pretvaraju da su nešto drugo ili da prikupljaju podatke koji mogu da se koriste za praćenje. <ph name="BEGIN_LINK" />Prikaži<ph name="END_LINK" /></translation> +<translation id="963837307749850257">Svi korisnici</translation> <translation id="964050462028070434">Upravljajte lozinkama i pristupnim kodovima…</translation> <translation id="96680173638229310">Automobili i vozila</translation> <translation id="969892804517981540">Zvanična verzija</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 2abe907..edf0bb1 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -3333,6 +3333,7 @@ <translation id="950736567201356821">Троструко бушење на врху</translation> <translation id="961663415146723894">Повез на дну</translation> <translation id="962484866189421427">Овај садржај можда покушава да инсталира обмањујуће апликације које се претварају да су нешто друго или да прикупљају податке који могу да се користе за праћење. <ph name="BEGIN_LINK" />Прикажи<ph name="END_LINK" /></translation> +<translation id="963837307749850257">Сви корисници</translation> <translation id="964050462028070434">Управљајте лозинкама и приступним кодовима…</translation> <translation id="96680173638229310">Аутомобили и возила</translation> <translation id="969892804517981540">Званична верзија</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index cbbf48f..33d3870 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">Inchi 12 x 16</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="1186201132766001848">Kagua Manenosiri</translation> +<translation id="1195073053842921378">Anwani hii itafutwa kwenye kifaa hiki</translation> <translation id="1195558154361252544">Arifa zinazuiwa kiotomatiki kwenye tovuti zote isipokuwa zile unazoruhusu</translation> <translation id="1197088940767939838">Rangi ya machungwa</translation> <translation id="1201402288615127009">Endelea</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 4e5686d..c32fd45e 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -84,6 +84,7 @@ <translation id="1178821169867863726">12 x 16 இன்ச்</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1186201132766001848">கடவுச்சொற்களைச் சோதித்துப் பார்க்கவும்</translation> +<translation id="1195073053842921378">இந்தச் சாதனத்தில் இருந்து இந்த முகவரி நீக்கப்படும்</translation> <translation id="1195558154361252544">நீங்கள் அனுமதிக்கும் தளங்களைத் தவிர பிற அனைத்துத் தளங்களுக்கும் அறிவிப்புகள் தானாகவே முடக்கப்படும்</translation> <translation id="1197088940767939838">ஆரஞ்சு</translation> <translation id="1201402288615127009">அடுத்து</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 7c8e0eb..bacf404 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -85,6 +85,7 @@ <translation id="1178821169867863726">12 x 16 انچ</translation> <translation id="1181037720776840403">ہٹائیں</translation> <translation id="1186201132766001848">پاس ورڈز چیک کریں</translation> +<translation id="1195073053842921378">یہ پتہ اس آلے سے حذف ہو جائے گا</translation> <translation id="1195558154361252544">تمام سائٹس کے لیے اطلاعات کو خودکار طور پر مسدود کر دیا گیا ہے سوائے ان کے جن کی آپ نے اجازت دی ہے</translation> <translation id="1197088940767939838">نارنجی</translation> <translation id="1201402288615127009">اگلا</translation> @@ -589,6 +590,7 @@ <translation id="2359808026110333948">جاری رکھیں</translation> <translation id="2361263712565360498">275 x 395 مل لیٹر</translation> <translation id="236340516568226369">ٹوگل مینو کا سائز تبدیل کریں</translation> +<translation id="2365355378251437925"><ph name="FIELD" /> درج کریں</translation> <translation id="2367567093518048410">سطح</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Chrome کی ترتیبات میں اپنی ایکسیسبیلٹی کے ٹولز کو ذاتی نوعیت کا بنائیں</translation> @@ -3336,6 +3338,7 @@ <translation id="950736567201356821">اوپر تین بار سوراخ</translation> <translation id="961663415146723894">نیچے باندھیں</translation> <translation id="962484866189421427">ہو سکتا ہے کہ یہ مواد ایسی پُر فریب ایپس انسٹال کرنے کی کوشش کرے جو کچھ اور ہونے کا دکھاوا کریں یا آپ کی براؤزنگ سرگرمیوں پر نظر رکھنے کیلئے استعمال کیا جانے والا ڈیٹا جمع کریں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> +<translation id="963837307749850257">تمام صارفین</translation> <translation id="964050462028070434">پاس ورڈز اور پاس کیز کا نظم کریں…</translation> <translation id="96680173638229310">آٹوز اور گاڑیاں</translation> <translation id="969892804517981540">آفیشل بلڈ</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 144a35a..a942627 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -588,6 +588,7 @@ <translation id="2359808026110333948">Davom etish</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">Hajmni oʻzgartirish tugmasi menyusi</translation> +<translation id="2365355378251437925"><ph name="FIELD" /> axborotini kiriting</translation> <translation id="2367567093518048410">Daraja</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Chrome sozlamalari orqali qulayolik vositalarini moslashtirish</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 29f2cbb..f9bb0c4 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">继续</translation> <translation id="2361263712565360498">275 x 395 mm</translation> <translation id="236340516568226369">“调整大小”切换菜单</translation> +<translation id="2365355378251437925">请输入<ph name="FIELD" /></translation> <translation id="2367567093518048410">级别</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">在 Chrome 设置中定制您的个性化无障碍工具</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 4b688c41..0067412 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">繼續</translation> <translation id="2361263712565360498">275 x 395 毫米</translation> <translation id="236340516568226369">調整切換選單大小</translation> +<translation id="2365355378251437925">請輸入「<ph name="FIELD" />」</translation> <translation id="2367567093518048410">級別</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">在 Chrome 設定中個人化您的無障礙工具</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 971c482..547744b 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -589,6 +589,7 @@ <translation id="2359808026110333948">繼續</translation> <translation id="2361263712565360498">275 x 395 公釐</translation> <translation id="236340516568226369">畫面大小切換選單</translation> +<translation id="2365355378251437925">請輸入「<ph name="FIELD" />」</translation> <translation id="2367567093518048410">等級</translation> <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">在 Chrome 設定中依個人需求調整無障礙工具</translation>
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallback.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallback.java index c239bf86..b80b98a0 100644 --- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallback.java +++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallback.java
@@ -17,20 +17,16 @@ import android.view.inputmethod.InputMethodManager; import androidx.annotation.BinderThread; -import androidx.annotation.IntDef; import org.chromium.base.Log; import org.chromium.base.MathUtils; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.blink.mojom.StylusWritingGestureAction; import org.chromium.blink.mojom.StylusWritingGestureData; import org.chromium.blink.mojom.StylusWritingGestureGranularity; +import org.chromium.content.browser.input.StylusGestureHandler; import org.chromium.content_public.browser.StylusWritingImeCallback; import org.chromium.mojo_base.mojom.String16; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - /** * This class implements the Direct Writing service callback interface that gets registered to the * service, which would be called on the {@link BinderThread}. It also caches information about @@ -63,27 +59,6 @@ static final String GESTURE_TYPE_ARCH_TYPE_REMOVE_SPACE = "arch_type_remove_space"; static final String GESTURE_I_TYPE_FUNCTIONAL = "i_type_functional"; - // This should be kept in sync with the definition |StylusHandwritingGesture| - // in tools/metrics/histograms/enums.xml. - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - @IntDef({StylusHandwritingGesture.DELETE_TEXT, StylusHandwritingGesture.ADD_SPACE_OR_TEXT, - StylusHandwritingGesture.REMOVE_SPACES, StylusHandwritingGesture.SPLIT_OR_MERGE, - StylusHandwritingGesture.COUNT}) - @Retention(RetentionPolicy.SOURCE) - public @interface StylusHandwritingGesture { - int DELETE_TEXT = 0; - int ADD_SPACE_OR_TEXT = 1; - int REMOVE_SPACES = 2; - int SPLIT_OR_MERGE = 3; - int COUNT = 4; - } - - private static void recordGesture(@StylusHandwritingGesture int gesture) { - RecordHistogram.recordEnumeratedHistogram( - "InputMethod.StylusHandwriting.Gesture", gesture, StylusHandwritingGesture.COUNT); - } - private EditorInfo mEditorInfo; private int mLastSelectionStart; private int mLastSelectionEnd; @@ -178,16 +153,20 @@ switch (gestureData.action) { case StylusWritingGestureAction.DELETE_TEXT: - recordGesture(StylusHandwritingGesture.DELETE_TEXT); + StylusGestureHandler.logGestureType( + StylusGestureHandler.UmaGestureType.DW_DELETE_TEXT); break; case StylusWritingGestureAction.ADD_SPACE_OR_TEXT: - recordGesture(StylusHandwritingGesture.ADD_SPACE_OR_TEXT); + StylusGestureHandler.logGestureType( + StylusGestureHandler.UmaGestureType.DW_ADD_SPACE_OR_TEXT); break; case StylusWritingGestureAction.REMOVE_SPACES: - recordGesture(StylusHandwritingGesture.REMOVE_SPACES); + StylusGestureHandler.logGestureType( + StylusGestureHandler.UmaGestureType.DW_REMOVE_SPACES); break; case StylusWritingGestureAction.SPLIT_OR_MERGE: - recordGesture(StylusHandwritingGesture.SPLIT_OR_MERGE); + StylusGestureHandler.logGestureType( + StylusGestureHandler.UmaGestureType.DW_SPLIT_OR_MERGE); break; default: assert false : "Gesture type unset";
diff --git a/components/sync_device_info/device_info_sync_bridge_unittest.cc b/components/sync_device_info/device_info_sync_bridge_unittest.cc index e6d8804..e3807e07 100644 --- a/components/sync_device_info/device_info_sync_bridge_unittest.cc +++ b/components/sync_device_info/device_info_sync_bridge_unittest.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "components/sync_device_info/device_info_sync_bridge.h" -#include "build/build_config.h" #include <algorithm> #include <map> @@ -21,6 +20,7 @@ #include "base/test/simple_test_clock.h" #include "base/test/task_environment.h" #include "base/time/time.h" +#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/prefs/testing_pref_service.h" #include "components/sync/base/model_type.h"
diff --git a/components/translate/content/common/translate.mojom b/components/translate/content/common/translate.mojom index e58264a..33cb44a 100644 --- a/components/translate/content/common/translate.mojom +++ b/components/translate/content/common/translate.mojom
@@ -48,7 +48,8 @@ // e.g., translate-internals. // // Whether language detection has been run on the page. Under - // kRetryLanguageDetection, this is only done if page content was captured. + // kSkipLanguageDetectionOnEmptyContent, this is only done if page content was + // captured. bool has_run_lang_detection; // The time at which language the language detection was performed. Used only // for debugging.
diff --git a/components/translate/content/renderer/translate_agent.cc b/components/translate/content/renderer/translate_agent.cc index 09f78ea..4ac3e40 100644 --- a/components/translate/content/renderer/translate_agent.cc +++ b/components/translate/content/renderer/translate_agent.cc
@@ -228,10 +228,11 @@ LanguageDetectionDetails details; std::string language; - if (base::FeatureList::IsEnabled(translate::kRetryLanguageDetection) && + // Under kSkipLanguageDetectionOnEmptyContent, if captured content is empty, + // default to using "und" instead of attempting language detection. + if (base::FeatureList::IsEnabled( + translate::kSkipLanguageDetectionOnEmptyContent) && page_contents_length_ == 0) { - // Under kRetryLanguageDetection, if captured content is empty, - // default to using "und" instead of attempting language detection. language = translate::kUnknownLanguageCode; } else if (translate::IsTFLiteLanguageDetectionEnabled()) { translate::LanguageDetectionModel& language_detection_model =
diff --git a/components/translate/core/common/translate_util.cc b/components/translate/core/common/translate_util.cc index 748ca90..957d02b 100644 --- a/components/translate/core/common/translate_util.cc +++ b/components/translate/core/common/translate_util.cc
@@ -61,6 +61,9 @@ BASE_FEATURE(kRetryLanguageDetection, "RetryLanguageDetection", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSkipLanguageDetectionOnEmptyContent, + "SkipLanguageDetectionOnEmptyContent", + base::FEATURE_DISABLED_BY_DEFAULT); #if !BUILDFLAG(IS_WIN) BASE_FEATURE(kMmapLanguageDetectionModel,
diff --git a/components/translate/core/common/translate_util.h b/components/translate/core/common/translate_util.h index 7b6528b..ca9dd07 100644 --- a/components/translate/core/common/translate_util.h +++ b/components/translate/core/common/translate_util.h
@@ -37,8 +37,12 @@ // is shown. extern const base::FeatureParam<int> kDesktopPartialTranslateBubbleShowDelayMs; -// Controls whether language detection improvements are in effect +// When enabled, language detection is attempted when the page finishes loading +// if no page content is captured when parsing completes. BASE_DECLARE_FEATURE(kRetryLanguageDetection); +// When enabled, language detection is skipped if no page content was captured +// and chrome://translate-internals logs are updated to reflect this. +BASE_DECLARE_FEATURE(kSkipLanguageDetectionOnEmptyContent); #if !BUILDFLAG(IS_WIN) // Controls whether mmap is used to load the language detection model.
diff --git a/components/translate/core/language_detection/ngram_hash_ops_utils.h b/components/translate/core/language_detection/ngram_hash_ops_utils.h index c6b896e..01d8e1db 100644 --- a/components/translate/core/language_detection/ngram_hash_ops_utils.h +++ b/components/translate/core/language_detection/ngram_hash_ops_utils.h
@@ -6,6 +6,7 @@ #define COMPONENTS_TRANSLATE_CORE_LANGUAGE_DETECTION_NGRAM_HASH_OPS_UTILS_H_ #include <string> +#include <utility> #include <vector> namespace translate {
diff --git a/components/user_education/views/help_bubble_view.cc b/components/user_education/views/help_bubble_view.cc index 7ac97886..fe8d766b 100644 --- a/components/user_education/views/help_bubble_view.cc +++ b/components/user_education/views/help_bubble_view.cc
@@ -288,6 +288,8 @@ DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(HelpBubbleView, kFirstNonDefaultButtonIdForTesting); +DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(HelpBubbleView, kBodyTextIdForTesting); + // Explicitly don't use the default DIALOG_SHADOW as it will show a black // outline in dark mode on Mac. Use our own shadow instead. The shadow type is // the same for all other platforms. @@ -381,14 +383,18 @@ labels_.push_back( top_text_container->AddChildView(std::make_unique<views::Label>( params.title_text, delegate->GetTitleTextContext()))); - labels_.push_back( + views::Label* label = AddChildViewAt(std::make_unique<views::Label>( params.body_text, delegate->GetBodyTextContext()), - GetIndexOf(button_container).value())); + GetIndexOf(button_container).value()); + labels_.push_back(label); + label->SetProperty(views::kElementIdentifierKey, kBodyTextIdForTesting); } else { - labels_.push_back( + views::Label* label = top_text_container->AddChildView(std::make_unique<views::Label>( - params.body_text, delegate->GetBodyTextContext()))); + params.body_text, delegate->GetBodyTextContext())); + labels_.push_back(label); + label->SetProperty(views::kElementIdentifierKey, kBodyTextIdForTesting); } // Set common label properties.
diff --git a/components/user_education/views/help_bubble_view.h b/components/user_education/views/help_bubble_view.h index 0c5166f..5b6be2b 100644 --- a/components/user_education/views/help_bubble_view.h +++ b/components/user_education/views/help_bubble_view.h
@@ -63,6 +63,7 @@ DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kHelpBubbleElementIdForTesting); DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kDefaultButtonIdForTesting); DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kFirstNonDefaultButtonIdForTesting); + DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kBodyTextIdForTesting); HelpBubbleView(const HelpBubbleDelegate* delegate, const internal::HelpBubbleAnchorParams& anchor,
diff --git a/components/user_education/views/new_badge_label.h b/components/user_education/views/new_badge_label.h index 47cd220..f55803f 100644 --- a/components/user_education/views/new_badge_label.h +++ b/components/user_education/views/new_badge_label.h
@@ -8,6 +8,7 @@ #include <memory> #include "ui/base/l10n/l10n_util.h" +#include "ui/base/ui_base_features.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/badge_painter.h" #include "ui/views/controls/label.h" @@ -100,8 +101,9 @@ // kInternalPaddingKey will be set so that layouts know this space is empty. bool pad_after_new_badge_ = true; - const std::u16string new_badge_text_ = - l10n_util::GetStringUTF16(IDS_NEW_BADGE); + const std::u16string new_badge_text_ = l10n_util::GetStringUTF16( + features::IsChromeRefresh2023() ? IDS_NEW_BADGE_UPPERCASE + : IDS_NEW_BADGE); }; } // namespace user_education
diff --git a/components/viz/service/display/ca_layer_overlay.cc b/components/viz/service/display/ca_layer_overlay.cc index 2bfe498..5880dd8 100644 --- a/components/viz/service/display/ca_layer_overlay.cc +++ b/components/viz/service/display/ca_layer_overlay.cc
@@ -388,7 +388,7 @@ #if BUILDFLAG(IS_MAC) overlays_allowed_(ui::RemoteLayerAPISupported()), #else - overlays_allowed_(true), + overlays_allowed_(false), #endif enable_ca_renderer_(base::FeatureList::IsEnabled(kCARenderer)), enable_hdr_underlays_(base::FeatureList::IsEnabled(kHDRUnderlays)) {
diff --git a/components/viz/service/display/dc_layer_overlay.cc b/components/viz/service/display/dc_layer_overlay.cc index 35de646..b40df79 100644 --- a/components/viz/service/display/dc_layer_overlay.cc +++ b/components/viz/service/display/dc_layer_overlay.cc
@@ -11,10 +11,8 @@ #include "base/metrics/histogram_macros.h" #include "build/build_config.h" #include "cc/base/math_util.h" -#include "components/viz/common/display/renderer_settings.h" #include "components/viz/common/overlay_state/win/overlay_state_service.h" #include "components/viz/common/quads/aggregated_render_pass_draw_quad.h" -#include "components/viz/common/quads/debug_border_draw_quad.h" #include "components/viz/common/quads/solid_color_draw_quad.h" #include "components/viz/common/quads/texture_draw_quad.h" #include "components/viz/common/quads/yuv_video_draw_quad.h" @@ -34,8 +32,6 @@ namespace { -constexpr int kDCLayerDebugBorderWidth = 4; -constexpr gfx::Insets kDCLayerDebugBorderInsets = gfx::Insets(-2); // This is the number of frames we should wait before actual overlay promotion // under multi-video cases. constexpr int kDCLayerFramesDelayedBeforeOverlay = 5; @@ -472,12 +468,10 @@ } // namespace DCLayerOverlayProcessor::DCLayerOverlayProcessor( - const DebugRendererSettings* debug_settings, int allowed_yuv_overlay_count, bool skip_initialization_for_testing) : has_overlay_support_(skip_initialization_for_testing), allowed_yuv_overlay_count_(allowed_yuv_overlay_count), - debug_settings_(debug_settings), no_undamaged_overlay_promotion_(base::FeatureList::IsEnabled( features::kNoUndamagedOverlayPromotion)) { if (!skip_initialization_for_testing) { @@ -603,55 +597,6 @@ damages_to_be_removed_.clear(); } -void DCLayerOverlayProcessor::InsertDebugBorderDrawQuad( - const OverlayCandidateList* dc_layer_overlays, - AggregatedRenderPass* render_pass, - const gfx::RectF& display_rect, - gfx::Rect* damage_rect) { - auto* shared_quad_state = render_pass->CreateAndAppendSharedQuadState(); - auto& quad_list = render_pass->quad_list; - - // Add debug borders for the root damage rect after overlay promotion. - { - SkColor4f border_color = SkColors::kGreen; - auto it = - quad_list.InsertBeforeAndInvalidateAllPointers<DebugBorderDrawQuad>( - quad_list.begin(), 1u); - auto* debug_quad = static_cast<DebugBorderDrawQuad*>(*it); - - gfx::Rect rect = *damage_rect; - rect.Inset(kDCLayerDebugBorderInsets); - debug_quad->SetNew(shared_quad_state, rect, rect, border_color, - kDCLayerDebugBorderWidth); - } - - // Add debug borders for overlays/underlays - for (const auto& dc_layer : *dc_layer_overlays) { - gfx::Rect overlay_rect = gfx::ToEnclosingRect( - OverlayCandidate::DisplayRectInTargetSpace(dc_layer)); - if (dc_layer.clip_rect) - overlay_rect.Intersect(*dc_layer.clip_rect); - - // Overlay:red, Underlay:blue. - SkColor4f border_color = - dc_layer.plane_z_order > 0 ? SkColors::kRed : SkColors::kBlue; - auto it = - quad_list.InsertBeforeAndInvalidateAllPointers<DebugBorderDrawQuad>( - quad_list.begin(), 1u); - auto* debug_quad = static_cast<DebugBorderDrawQuad*>(*it); - - overlay_rect.Inset(kDCLayerDebugBorderInsets); - debug_quad->SetNew(shared_quad_state, overlay_rect, overlay_rect, - border_color, kDCLayerDebugBorderWidth); - } - - // Mark the entire output as damaged because the border quads might not be - // inside the current damage rect. It's far simpler to mark the entire output - // as damaged instead of accounting for individual border quads which can - // change positions across frames. - damage_rect->Union(gfx::ToEnclosingRect(display_rect)); -} - bool DCLayerOverlayProcessor::IsPreviousFrameUnderlayRect( const gfx::Rect& quad_rectangle, size_t index) { @@ -977,11 +922,6 @@ RecordOverlayHistograms(dc_layer_overlays, this_frame_has_occluding_damage_rect, damage_rect); } - - if (debug_settings_->show_dc_layer_debug_borders) { - InsertDebugBorderDrawQuad(dc_layer_overlays, render_pass, display_rect, - damage_rect); - } } bool DCLayerOverlayProcessor::ShouldSkipOverlay(
diff --git a/components/viz/service/display/dc_layer_overlay.h b/components/viz/service/display/dc_layer_overlay.h index 5e74d7f..12fbcb4 100644 --- a/components/viz/service/display/dc_layer_overlay.h +++ b/components/viz/service/display/dc_layer_overlay.h
@@ -22,7 +22,6 @@ #include "ui/gl/direct_composition_support.h" namespace viz { -struct DebugRendererSettings; class DisplayResourceProvider; class VIZ_SERVICE_EXPORT DCLayerOverlayProcessor final @@ -33,7 +32,6 @@ // When |skip_initialization_for_testing| is true, object will be isolated // for unit tests. explicit DCLayerOverlayProcessor( - const DebugRendererSettings* debug_settings, int allowed_yuv_overlay_count, bool skip_initialization_for_testing = false); @@ -102,10 +100,6 @@ void RemoveOverlayDamageRect(const QuadList::Iterator& it); - void InsertDebugBorderDrawQuad(const OverlayCandidateList* dc_layer_overlays, - AggregatedRenderPass* render_pass, - const gfx::RectF& display_rect, - gfx::Rect* damage_rect); bool IsPreviousFrameUnderlayRect(const gfx::Rect& quad_rectangle, size_t index); @@ -139,9 +133,6 @@ int processed_yuv_overlay_count_ = 0; uint64_t frames_since_last_qualified_multi_overlays_ = 0; - // Reference to the global viz singleton. - const raw_ptr<const DebugRendererSettings> debug_settings_; - bool previous_frame_underlay_is_opaque_ = true; bool allow_promotion_hinting_ = false; gfx::RectF previous_display_rect_;
diff --git a/components/viz/service/display/overlay_dc_unittest.cc b/components/viz/service/display/overlay_dc_unittest.cc index 994a3a8..fdd13b25 100644 --- a/components/viz/service/display/overlay_dc_unittest.cc +++ b/components/viz/service/display/overlay_dc_unittest.cc
@@ -72,8 +72,8 @@ public: explicit DCTestOverlayProcessor(OutputSurface* output_surface) : OverlayProcessorWin(output_surface, + &debug_settings_, std::make_unique<DCLayerOverlayProcessor>( - &debug_settings_, /*allowed_yuv_overlay_count=*/1, true)) {} DebugRendererSettings debug_settings_;
diff --git a/components/viz/service/display/overlay_processor_interface.cc b/components/viz/service/display/overlay_processor_interface.cc index b123940..fea01b3 100644 --- a/components/viz/service/display/overlay_processor_interface.cc +++ b/components/viz/service/display/overlay_processor_interface.cc
@@ -110,12 +110,12 @@ return std::make_unique<OverlayProcessorStub>(); return std::make_unique<OverlayProcessorWin>( - output_surface, + output_surface, debug_settings, std::make_unique<DCLayerOverlayProcessor>( - debug_settings, /*allowed_yuv_overlay_count=*/capabilities - .supports_two_yuv_hardware_overlays - ? 2 - : 1)); + /*allowed_yuv_overlay_count=*/capabilities + .supports_two_yuv_hardware_overlays + ? 2 + : 1)); #elif BUILDFLAG(IS_OZONE) #if !BUILDFLAG(IS_CASTOS) // In tests and Ozone/X11, we do not expect surfaceless surface support.
diff --git a/components/viz/service/display/overlay_processor_win.cc b/components/viz/service/display/overlay_processor_win.cc index 06e3f4be..22393798 100644 --- a/components/viz/service/display/overlay_processor_win.cc +++ b/components/viz/service/display/overlay_processor_win.cc
@@ -9,6 +9,8 @@ #include "base/trace_event/trace_event.h" #include "build/build_config.h" +#include "components/viz/common/display/renderer_settings.h" +#include "components/viz/common/quads/debug_border_draw_quad.h" #include "components/viz/common/quads/solid_color_draw_quad.h" #include "components/viz/service/display/display_resource_provider.h" #include "components/viz/service/display/output_surface.h" @@ -17,6 +19,10 @@ namespace viz { namespace { + +constexpr int kDCLayerDebugBorderWidth = 4; +constexpr gfx::Insets kDCLayerDebugBorderInsets = gfx::Insets(-2); + // Switching between enabling DC layers and not is expensive, so only // switch away after a large number of frames not needing DC layers have // been produced. @@ -26,8 +32,10 @@ OverlayProcessorWin::OverlayProcessorWin( OutputSurface* output_surface, + const DebugRendererSettings* debug_settings, std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor) : output_surface_(output_surface), + debug_settings_(debug_settings), dc_layer_overlay_processor_(std::move(dc_layer_overlay_processor)) { DCHECK(output_surface_->capabilities().supports_dc_layers); } @@ -90,6 +98,60 @@ // contents would otherwise be undefined. *damage_rect = root_render_pass->output_rect; } + + if (debug_settings_->show_dc_layer_debug_borders) { + InsertDebugBorderDrawQuadsForOverlayCandidates( + *candidates, root_render_pass, *damage_rect); + + // Mark the entire output as damaged because the border quads might not be + // inside the current damage rect. It's far simpler to mark the entire + // output as damaged instead of accounting for individual border quads which + // can change positions across frames. + *damage_rect = root_render_pass->output_rect; + } +} + +void OverlayProcessorWin::InsertDebugBorderDrawQuadsForOverlayCandidates( + const OverlayCandidateList& dc_layer_overlays, + AggregatedRenderPass* root_render_pass, + const gfx::Rect& damage_rect) { + auto* shared_quad_state = root_render_pass->CreateAndAppendSharedQuadState(); + auto& quad_list = root_render_pass->quad_list; + + // Add debug borders for the root damage rect after overlay promotion. + { + SkColor4f border_color = SkColors::kGreen; + auto it = + quad_list.InsertBeforeAndInvalidateAllPointers<DebugBorderDrawQuad>( + quad_list.begin(), 1u); + auto* debug_quad = static_cast<DebugBorderDrawQuad*>(*it); + + gfx::Rect rect = damage_rect; + rect.Inset(kDCLayerDebugBorderInsets); + debug_quad->SetNew(shared_quad_state, rect, rect, border_color, + kDCLayerDebugBorderWidth); + } + + // Add debug borders for overlays/underlays + for (const auto& dc_layer : dc_layer_overlays) { + gfx::Rect overlay_rect = gfx::ToEnclosingRect( + OverlayCandidate::DisplayRectInTargetSpace(dc_layer)); + if (dc_layer.clip_rect) { + overlay_rect.Intersect(*dc_layer.clip_rect); + } + + // Overlay:red, Underlay:blue. + SkColor4f border_color = + dc_layer.plane_z_order > 0 ? SkColors::kRed : SkColors::kBlue; + auto it = + quad_list.InsertBeforeAndInvalidateAllPointers<DebugBorderDrawQuad>( + quad_list.begin(), 1u); + auto* debug_quad = static_cast<DebugBorderDrawQuad*>(*it); + + overlay_rect.Inset(kDCLayerDebugBorderInsets); + debug_quad->SetNew(shared_quad_state, overlay_rect, overlay_rect, + border_color, kDCLayerDebugBorderWidth); + } } bool OverlayProcessorWin::NeedsSurfaceDamageRectList() const {
diff --git a/components/viz/service/display/overlay_processor_win.h b/components/viz/service/display/overlay_processor_win.h index 65f4fd2..662088b 100644 --- a/components/viz/service/display/overlay_processor_win.h +++ b/components/viz/service/display/overlay_processor_win.h
@@ -18,16 +18,16 @@ #include "components/viz/service/viz_service_export.h" #include "gpu/ipc/common/surface_handle.h" -namespace cc { -class DisplayResourceProvider; -} - namespace viz { +class DisplayResourceProvider; +struct DebugRendererSettings; + class VIZ_SERVICE_EXPORT OverlayProcessorWin : public OverlayProcessorInterface { public: OverlayProcessorWin( OutputSurface* output_surface, + const DebugRendererSettings* debug_settings, std::unique_ptr<DCLayerOverlayProcessor> dc_layer_overlay_processor); OverlayProcessorWin(const OverlayProcessorWin&) = delete; @@ -80,7 +80,16 @@ } private: + void InsertDebugBorderDrawQuadsForOverlayCandidates( + const OverlayCandidateList& dc_layer_overlays, + AggregatedRenderPass* root_render_pass, + const gfx::Rect& damage_rect); + const raw_ptr<OutputSurface> output_surface_; + + // Reference to the global viz singleton. + const raw_ptr<const DebugRendererSettings> debug_settings_; + // Whether direct composition layers are being used with SetEnableDCLayers(). bool using_dc_layers_ = false; // Number of frames since the last time direct composition layers were used.
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index 875f183..93a2823 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -3101,7 +3101,10 @@ DrawDelegatedInkTrail(); current_canvas_ = nullptr; - EndPaint(/*failed=*/false); + // Non-root render passes that are scheduled as overlays will be painted in + // PrepareRenderPassOverlay(). + bool is_overlay = buffer_queue_ && is_root_render_pass; + EndPaint(/*failed=*/false, is_overlay); // Defer flushing drawing task for root render pass, to avoid extra // MakeCurrent() call. It is expensive on GL. @@ -3530,7 +3533,7 @@ if (!content_image) { DLOG(ERROR) << "MakePromiseSkImageFromRenderPass() in " "PrepareRenderPassOverlay() failed."; - EndPaint(/*failed=*/true); + EndPaint(/*failed=*/true, /*is_overlay=*/true); return; } @@ -3552,7 +3555,7 @@ } current_canvas_ = nullptr; - EndPaint(/*failed=*/false); + EndPaint(/*failed=*/false, /*is_overlay=*/true); } #if BUILDFLAG(IS_APPLE) @@ -3589,7 +3592,7 @@ } #endif // BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_OZONE) -void SkiaRenderer::EndPaint(bool failed) { +void SkiaRenderer::EndPaint(bool failed, bool is_overlay) { base::OnceClosure on_finished_callback; base::OnceCallback<void(gfx::GpuFenceHandle)> on_return_release_fence_cb; // If SkiaRenderer has not failed, prepare callbacks and pass them to @@ -3621,8 +3624,6 @@ resource_provider()->SetReleaseFence(current_release_fence_.get()); } } - bool is_overlay = buffer_queue_ && current_frame()->current_render_pass == - current_frame()->root_render_pass; skia_output_surface_->EndPaint(std::move(on_finished_callback), std::move(on_return_release_fence_cb), is_overlay);
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h index 2684d77f..b3f49ab 100644 --- a/components/viz/service/display/skia_renderer.h +++ b/components/viz/service/display/skia_renderer.h
@@ -303,7 +303,9 @@ // Sets up callbacks for frame resource fences and passes them to // SkiaOutputSurface by calling EndPaint on that. If |failed|, // SkiaOutputSurface::EndPaint will be called with null callbacks. - void EndPaint(bool failed); + // |is_overlay| should be true for render passes that are scheduled as + // overlays. + void EndPaint(bool failed, bool is_overlay); DisplayResourceProviderSkia* resource_provider() { return static_cast<DisplayResourceProviderSkia*>(resource_provider_);
diff --git a/components/webapps/browser/android/BUILD.gn b/components/webapps/browser/android/BUILD.gn index 6a4b7189..88833f6 100644 --- a/components/webapps/browser/android/BUILD.gn +++ b/components/webapps/browser/android/BUILD.gn
@@ -69,6 +69,7 @@ java_cpp_enum("webapps_java_enums_srcjar") { sources = [ + "//components/webapps/browser/android/app_banner_manager_android.h", "//components/webapps/browser/banners/app_banner_manager.h", "//components/webapps/browser/banners/app_banner_settings_helper.h", "//components/webapps/browser/installable/installable_metrics.h",
diff --git a/components/webapps/browser/android/app_banner_manager_android.cc b/components/webapps/browser/android/app_banner_manager_android.cc index 9753798..52aa8db 100644 --- a/components/webapps/browser/android/app_banner_manager_android.cc +++ b/components/webapps/browser/android/app_banner_manager_android.cc
@@ -20,6 +20,7 @@ #include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_delegate.h" #include "components/messages/android/messages_feature.h" +#include "components/site_engagement/content/site_engagement_service.h" #include "components/version_info/android/channel_getter.h" #include "components/version_info/channel.h" #include "components/version_info/version_info.h" @@ -90,6 +91,10 @@ return (int)state(); } +int AppBannerManagerAndroid::GetBadgeStatusForTesting(JNIEnv* env) { + return (int)badge_state_; +} + bool AppBannerManagerAndroid::OnAppDetailsRetrieved( JNIEnv* env, const JavaParamRef<jobject>& obj, @@ -135,8 +140,16 @@ ResetBindings(); } +bool AppBannerManagerAndroid::HasSufficientEngagementForAmbientBadge() { + double score = GetSiteEngagementService()->GetScore(validated_url_); + int min_engagement = + features::kAmbientBadgeSiteEngagement_MinEngagement.Get(); + return score >= min_engagement; +} + void AppBannerManagerAndroid::BadgeDismissed() { TrackDismissEvent(DISMISS_EVENT_AMBIENT_INFOBAR_DISMISSED); + badge_state_ = AmbientBadgeState::DISMISSED; AppBannerSettingsHelper::RecordBannerEvent( web_contents(), validated_url_, GetAppIdentifier(), @@ -182,6 +195,7 @@ } void AppBannerManagerAndroid::PerformWorkerCheckForAmbientBadge() { + badge_state_ = AmbientBadgeState::PENDING_WORKER; manager()->GetData( ParamsToPerformWorkerCheck(), base::BindOnce( @@ -206,6 +220,7 @@ AppBannerManager::ResetCurrentPageData(); native_app_data_.Reset(); native_app_package_ = ""; + badge_state_ = AmbientBadgeState::INACTIVE; } std::unique_ptr<AddToHomescreenParams> @@ -546,10 +561,32 @@ return; } + badge_state_ = AmbientBadgeState::ACTIVE; + // Do not show the ambient badge if it was recently dismissed. if (AppBannerSettingsHelper::WasBannerRecentlyBlocked( web_contents(), validated_url_, GetAppIdentifier(), GetCurrentTime())) { + badge_state_ = AmbientBadgeState::BLOCKED; + return; + } + + // if it's showing for web app (not native app), only show if the worker check + // already passed. + if (!native_app_data_ && features::SkipServiceWorkerForInstallPromotion() && + !passed_worker_check_) { + badge_state_ = AmbientBadgeState::PENDING_WORKER; + return; + } + + if (ShouldSuppressAmbientBadge()) { + badge_state_ = AmbientBadgeState::PENDING_ENGAGEMENT; + return; + } + + if (base::FeatureList::IsEnabled(features::kAmbientBadgeSiteEngagement) && + !HasSufficientEngagementForAmbientBadge()) { + badge_state_ = AmbientBadgeState::PENDING_ENGAGEMENT; return; } @@ -564,11 +601,7 @@ if (infobar_visible || message_controller_.IsMessageEnqueued()) return; - // Only show if it's native app, or the worker check already passed. - if (!features::SkipServiceWorkerForInstallPromotion() || - passed_worker_check_ || native_app_data_) { - ShowAmbientBadge(); - } + ShowAmbientBadge(); } void AppBannerManagerAndroid::HideAmbientBadge() { @@ -614,7 +647,35 @@ web_contents(), manifest_url_, manifest_id_); } +bool AppBannerManagerAndroid::ShouldSuppressAmbientBadge() { + if (!base::FeatureList::IsEnabled( + features::kAmbientBadgeSuppressFirstVisit)) { + return false; + } + + content::WebContents* contents = web_contents(); + absl::optional<base::Time> last_could_show_time = + AppBannerSettingsHelper::GetSingleBannerEvent( + contents, validated_url_, GetAppIdentifier(), + AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW_AMBIENT_BADGE); + + AppBannerSettingsHelper::RecordBannerEvent( + contents, validated_url_, GetAppIdentifier(), + AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW_AMBIENT_BADGE, + GetCurrentTime()); + + if (!last_could_show_time || last_could_show_time->is_null()) { + return true; + } + + base::TimeDelta period = + features::kAmbientBadgeSuppressFirstVisit_Period.Get(); + return GetCurrentTime() - *last_could_show_time > period; +} + void AppBannerManagerAndroid::ShowAmbientBadge() { + badge_state_ = AmbientBadgeState::SHOWING; + if (base::FeatureList::IsEnabled(features::kInstallableAmbientBadgeMessage) && base::FeatureList::IsEnabled( messages::kMessagesForAndroidInfrastructure)) {
diff --git a/components/webapps/browser/android/app_banner_manager_android.h b/components/webapps/browser/android/app_banner_manager_android.h index bed95cce..6390c26c 100644 --- a/components/webapps/browser/android/app_banner_manager_android.h +++ b/components/webapps/browser/android/app_banner_manager_android.h
@@ -54,6 +54,31 @@ AppBannerManagerAndroid& operator=(const AppBannerManagerAndroid&) = delete; ~AppBannerManagerAndroid() override; + // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.banners + // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AmbientBadgeState + enum class AmbientBadgeState { + // The ambient badge pipeline has not yet been triggered for this page load. + INACTIVE = 0, + + // The ambient badge pipeline is running. + ACTIVE = 1, + + // Ambient badge blocked because of recently dismissed + BLOCKED = 2, + + // Waiting for service worker install to trigger the banner. + PENDING_WORKER = 3, + + // Waiting for sufficient engagement to trigger the ambient badge. + PENDING_ENGAGEMENT = 4, + + // Showing Ambient Badge. + SHOWING = 5, + + // Ambient badge dismissed. + DISMISSED = 6, + }; + // Returns a reference to the Java-side AppBannerManager owned by this object. const base::android::ScopedJavaLocalRef<jobject> GetJavaBannerManager() const; @@ -73,6 +98,8 @@ // Returns the state of the processing pipeline for testing purposes. int GetPipelineStatusForTesting(JNIEnv* env); + int GetBadgeStatusForTesting(JNIEnv* env); + // Called when the Java-side has retrieved information for the app. // Returns |false| if an icon fetch couldn't be kicked off. bool OnAppDetailsRetrieved( @@ -178,6 +205,12 @@ // manifest. void OnNativeAppIconFetched(const SkBitmap& bitmap); + // Checks whether the web page has sufficient engagement for showing the + // ambient badge. + bool HasSufficientEngagementForAmbientBadge(); + + bool ShouldSuppressAmbientBadge(); + // Shows the in-product help if possible and returns true when a request to // show it was made, but false if conditions (e.g. engagement score) for // showing where not deemed adequate. @@ -198,6 +231,9 @@ // Title to display in the banner for native app. std::u16string native_app_title_; + // The current ambient badge status. + AmbientBadgeState badge_state_ = AmbientBadgeState::INACTIVE; + base::WeakPtrFactory<AppBannerManagerAndroid> weak_factory_{this}; };
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java index 99fb0ce..ad68e04 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java
@@ -187,6 +187,12 @@ return AppBannerManagerJni.get().getPipelineStatusForTesting(mNativePointer); } + /** Returns the state of the ambient badge. */ + @VisibleForTesting + public int getBadgeStatusForTesting() { + return AppBannerManagerJni.get().getBadgeStatusForTesting(mNativePointer); + } + /** Sets constants (in days) the banner should be blocked for after dismissing and ignoring. */ @VisibleForTesting public static void setDaysAfterDismissAndIgnoreForTesting(int dismissDays, int ignoreDays) { @@ -235,6 +241,7 @@ void ignoreChromeChannelForTesting(); boolean isRunningForTesting(long nativeAppBannerManagerAndroid, AppBannerManager caller); int getPipelineStatusForTesting(long nativeAppBannerManagerAndroid); + int getBadgeStatusForTesting(long nativeAppBannerManagerAndroid); void setDaysAfterDismissAndIgnoreToTrigger(int dismissDays, int ignoreDays); void setTimeDeltaForTesting(int days); void setTotalEngagementToTrigger(double engagement);
diff --git a/components/webapps/browser/banners/app_banner_settings_helper.cc b/components/webapps/browser/banners/app_banner_settings_helper.cc index ad8da42..f71cdf9a 100644 --- a/components/webapps/browser/banners/app_banner_settings_helper.cc +++ b/components/webapps/browser/banners/app_banner_settings_helper.cc
@@ -53,10 +53,13 @@ // Dictionary keys to use for the events. Must be kept in sync with // AppBannerEvent. constexpr const char* kBannerEventKeys[] = { + // clang-format off "couldShowBannerEvents", "didShowBannerEvent", "didBlockBannerEvent", "didAddToHomescreenEvent", + "couldShowAmbientBadgeEvent", + // clang-format on }; // Keys to use when querying the variations params.
diff --git a/components/webapps/browser/banners/app_banner_settings_helper.h b/components/webapps/browser/banners/app_banner_settings_helper.h index 5691b39..d41b437 100644 --- a/components/webapps/browser/banners/app_banner_settings_helper.h +++ b/components/webapps/browser/banners/app_banner_settings_helper.h
@@ -70,6 +70,10 @@ // not shown for sites which were added, and to determine if sites were // launched recently. APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, + // Records when a site met the conditions to show an ambient badge. + // Used to suppress the ambient badge from being shown too often. + APP_BANNER_EVENT_COULD_SHOW_AMBIENT_BADGE, + APP_BANNER_EVENT_NUM_EVENTS, };
diff --git a/components/webapps/browser/features.cc b/components/webapps/browser/features.cc index 9b3ed1b8..475ca86f 100644 --- a/components/webapps/browser/features.cc +++ b/components/webapps/browser/features.cc
@@ -14,6 +14,21 @@ "AddToHomescreenMessaging", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAmbientBadgeSiteEngagement, + "AmbientBadgeSiteEngagement", + base::FEATURE_DISABLED_BY_DEFAULT); + +extern const base::FeatureParam<int> kAmbientBadgeSiteEngagement_MinEngagement{ + &kAmbientBadgeSiteEngagement, "minimal_engagement", 0}; + +BASE_FEATURE(kAmbientBadgeSuppressFirstVisit, + "AmbientBadgeSuppressFirstVisit", + base::FEATURE_DISABLED_BY_DEFAULT); + +extern const base::FeatureParam<base::TimeDelta> + kAmbientBadgeSuppressFirstVisit_Period{&kAmbientBadgeSuppressFirstVisit, + "period", base::Days(30)}; + // Enables or disables the installable ambient badge infobar. BASE_FEATURE(kInstallableAmbientBadgeInfoBar, "InstallableAmbientBadgeInfoBar", @@ -57,10 +72,7 @@ // only the "installable" status but not "promotable". BASE_FEATURE(kSkipServiceWorkerCheckInstallOnly, "SkipServiceWorkerCheckInstallOnly", - - base::FEATURE_ENABLED_BY_DEFAULT - -); + base::FEATURE_ENABLED_BY_DEFAULT); // Enables showing a detailed install dialog for user installs. BASE_FEATURE(kDesktopPWAsDetailedInstallDialog, @@ -70,7 +82,12 @@ // Enables sending the beforeinstallprompt without a service worker check. BASE_FEATURE(kSkipServiceWorkerForInstallPrompt, "SkipServiceWorkerForInstallPromot", - base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(IS_ANDROID) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); bool SkipInstallServiceWorkerCheck() { return base::FeatureList::IsEnabled(kSkipServiceWorkerCheckInstallOnly);
diff --git a/components/webapps/browser/features.h b/components/webapps/browser/features.h index cd045aa6..e6c951d2 100644 --- a/components/webapps/browser/features.h +++ b/components/webapps/browser/features.h
@@ -7,6 +7,7 @@ #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" +#include "base/time/time.h" #include "build/build_config.h" namespace webapps { @@ -14,6 +15,11 @@ #if BUILDFLAG(IS_ANDROID) BASE_DECLARE_FEATURE(kAddToHomescreenMessaging); +BASE_DECLARE_FEATURE(kAmbientBadgeSiteEngagement); +extern const base::FeatureParam<int> kAmbientBadgeSiteEngagement_MinEngagement; +BASE_DECLARE_FEATURE(kAmbientBadgeSuppressFirstVisit); +extern const base::FeatureParam<base::TimeDelta> + kAmbientBadgeSuppressFirstVisit_Period; BASE_DECLARE_FEATURE(kInstallableAmbientBadgeInfoBar); BASE_DECLARE_FEATURE(kInstallableAmbientBadgeMessage); extern const base::FeatureParam<int>
diff --git a/content/app/content_main.cc b/content/app/content_main.cc index a3cc7fab..a0d32d8 100644 --- a/content/app/content_main.cc +++ b/content/app/content_main.cc
@@ -327,7 +327,7 @@ autorelease_pool.reset(); #endif -#if !BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) content_main_runner->Shutdown(); #endif
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index 8bfbf0e7..b8f988a 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -838,7 +838,7 @@ // On Android, AtExitManager is set up when library is loaded. // A consequence of this is that you can't use the ctor/dtor-based // TRACE_EVENT methods on Linux or iOS builds till after we set this up. -#if !BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) if (!content_main_params_->ui_task) { // When running browser tests, don't create a second AtExitManager as that // interfers with shutdown when objects created before ContentMain is @@ -1113,9 +1113,6 @@ main_params.sandbox_info = content_main_params_->sandbox_info; #elif BUILDFLAG(IS_MAC) main_params.autorelease_pool = content_main_params_->autorelease_pool; -#elif BUILDFLAG(IS_IOS) - main_params.argc = content_main_params_->argc; - main_params.argv = content_main_params_->argv; #endif const bool start_minimal_browser = content_main_params_->minimal_browser_mode;
diff --git a/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm b/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm index 54039565..cd879ade 100644 --- a/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm +++ b/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm
@@ -272,6 +272,10 @@ - (void)draggingSession:(NSDraggingSession*)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation { + if (!_host) { + return; + } + // Reconstruct the screen point by removing the offset. It seems like the // underlying drag machinery is measuring from the corner of the dragged // image.
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 326cb4df..86adcc50 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -44,7 +44,6 @@ ":for_content_tests", # See top of //content/BUILD.gn for why. "//content/app:*", "//content/public/browser:browser_sources", - "//content/test/fuzzer:attribution_source_fuzzer", "//content/test/fuzzer:browser_accessibility_fuzzer", "//content/test/fuzzer:clipboard_host_mojolpm_fuzzer", "//content/test/fuzzer:first_party_set_parser_fuzzer_support", @@ -448,13 +447,11 @@ "attribution_reporting/attribution_observer.h", "attribution_reporting/attribution_observer_types.cc", "attribution_reporting/attribution_observer_types.h", - "attribution_reporting/attribution_os_level_manager.h", "attribution_reporting/attribution_report.cc", "attribution_reporting/attribution_report.h", "attribution_reporting/attribution_report_network_sender.cc", "attribution_reporting/attribution_report_network_sender.h", "attribution_reporting/attribution_report_sender.h", - "attribution_reporting/attribution_source_type.h", "attribution_reporting/attribution_storage.cc", "attribution_reporting/attribution_storage.h", "attribution_reporting/attribution_storage_delegate.cc", @@ -2417,6 +2414,7 @@ "//ui/base/ime/ash", "//ui/chromeos/styles:cros_styles_views", ] + public_deps += [ "//ash/webui/common/resources:resources" ] } if (is_castos) { @@ -2996,6 +2994,7 @@ "android/web_contents_observer_proxy.h", "attribution_reporting/attribution_input_event_tracker_android.cc", "attribution_reporting/attribution_input_event_tracker_android.h", + "attribution_reporting/attribution_os_level_manager.h", "attribution_reporting/attribution_os_level_manager_android.cc", "attribution_reporting/attribution_os_level_manager_android.h", "child_process_launcher_helper_android.cc",
diff --git a/content/browser/attribution_reporting/aggregatable_attribution_utils.cc b/content/browser/attribution_reporting/aggregatable_attribution_utils.cc index 96e3da5..66137e4 100644 --- a/content/browser/attribution_reporting/aggregatable_attribution_utils.cc +++ b/content/browser/attribution_reporting/aggregatable_attribution_utils.cc
@@ -20,11 +20,11 @@ #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/constants.h" #include "components/attribution_reporting/filters.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/browser/aggregation_service/aggregatable_report.h" #include "content/browser/attribution_reporting/aggregatable_histogram_contribution.h" #include "content/browser/attribution_reporting/attribution_info.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/common/aggregatable_report.mojom.h" #include "net/base/schemeful_site.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -50,7 +50,7 @@ std::vector<AggregatableHistogramContribution> CreateAggregatableHistogram( const attribution_reporting::FilterData& source_filter_data, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType source_type, const attribution_reporting::AggregationKeys& keys, const attribution_reporting::AggregatableTriggerDataList& aggregatable_trigger_data,
diff --git a/content/browser/attribution_reporting/aggregatable_attribution_utils.h b/content/browser/attribution_reporting/aggregatable_attribution_utils.h index b8312aaa..1ed50d2 100644 --- a/content/browser/attribution_reporting/aggregatable_attribution_utils.h +++ b/content/browser/attribution_reporting/aggregatable_attribution_utils.h
@@ -8,7 +8,7 @@ #include <vector> #include "components/attribution_reporting/aggregatable_trigger_data.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/common/content_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -28,7 +28,7 @@ CONTENT_EXPORT std::vector<AggregatableHistogramContribution> CreateAggregatableHistogram( const attribution_reporting::FilterData& source_filter_data, - AttributionSourceType, + attribution_reporting::mojom::SourceType, const attribution_reporting::AggregationKeys& keys, const attribution_reporting::AggregatableTriggerDataList&, const attribution_reporting::AggregatableValues&);
diff --git a/content/browser/attribution_reporting/aggregatable_attribution_utils_unittest.cc b/content/browser/attribution_reporting/aggregatable_attribution_utils_unittest.cc index adb46ca..8f79d7b9 100644 --- a/content/browser/attribution_reporting/aggregatable_attribution_utils_unittest.cc +++ b/content/browser/attribution_reporting/aggregatable_attribution_utils_unittest.cc
@@ -18,9 +18,9 @@ #include "components/attribution_reporting/aggregatable_values.h" #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/filters.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "content/browser/attribution_reporting/aggregatable_histogram_contribution.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" @@ -31,6 +31,7 @@ namespace { using ::attribution_reporting::FilterPair; +using ::attribution_reporting::mojom::SourceType; using ::testing::ElementsAre; using AttributionFilters = ::attribution_reporting::Filters; @@ -83,7 +84,7 @@ std::vector<AggregatableHistogramContribution> contributions = CreateAggregatableHistogram( - *source_filter_data, AttributionSourceType::kEvent, *source, + *source_filter_data, SourceType::kEvent, *source, *attribution_reporting::AggregatableTriggerDataList::Create( std::move(aggregatable_trigger_data)), aggregatable_values); @@ -113,8 +114,7 @@ std::vector<AggregatableHistogramContribution> contributions = CreateAggregatableHistogram( - attribution_reporting::FilterData(), - AttributionSourceType::kNavigation, *source, + attribution_reporting::FilterData(), SourceType::kNavigation, *source, /*aggregatable_trigger_data=*/{}, /*aggregatable_values=*/ *attribution_reporting::AggregatableValues::Create(
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc index 177adec..b5e21c5 100644 --- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -20,13 +20,13 @@ #include "components/attribution_reporting/registration_type.mojom.h" #include "components/attribution_reporting/source_registration.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/attribution_beacon_id.h" #include "content/browser/attribution_reporting/attribution_constants.h" #include "content/browser/attribution_reporting/attribution_input_event.h" #include "content/browser/attribution_reporting/attribution_manager.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/storable_source.h" #include "content/public/browser/global_routing_id.h" @@ -46,6 +46,7 @@ using ::attribution_reporting::SuitableOrigin; using ::attribution_reporting::mojom::RegistrationType; using ::attribution_reporting::mojom::SourceRegistrationError; +using ::attribution_reporting::mojom::SourceType; using ::blink::mojom::AttributionNavigationType; // These values are persisted to logs. Entries should not be renumbered and @@ -339,8 +340,7 @@ // invalid. if (header_value.empty()) { attribution_manager_->NotifyFailedSourceRegistration( - header_value, source_origin, reporting_origin, - AttributionSourceType::kNavigation, + header_value, source_origin, reporting_origin, SourceType::kNavigation, SourceRegistrationError::kInvalidJson); return; } @@ -493,9 +493,9 @@ context.IncrementNumDataRegistered(); - auto source_type = AttributionSourceType::kEvent; + auto source_type = SourceType::kEvent; if (auto nav_type = context.nav_type()) { - source_type = AttributionSourceType::kNavigation; + source_type = SourceType::kNavigation; base::UmaHistogramEnumeration( "Conversions.SourceRegistration.NavigationType.Background", *nav_type); @@ -688,10 +688,10 @@ NavigationRedirectSourceRegistrations& registrations = it->second; registrations.pending_source_data--; - absl::optional<StorableSource> source = ParseStorableSource( - std::move(result), header_value, reporting_origin, - registrations.source_origin, AttributionSourceType::kNavigation, - registrations.is_within_fenced_frame); + absl::optional<StorableSource> source = + ParseStorableSource(std::move(result), header_value, reporting_origin, + registrations.source_origin, SourceType::kNavigation, + registrations.is_within_fenced_frame); if (source.has_value()) { base::UmaHistogramEnumeration( @@ -817,8 +817,8 @@ ParseStorableSource(std::move(result), header_value, reporting_origin, registrations.source_origin, absl::holds_alternative<NavigationBeaconId>(beacon_id) - ? AttributionSourceType::kNavigation - : AttributionSourceType::kEvent, + ? SourceType::kNavigation + : SourceType::kEvent, registrations.is_within_fenced_frame); if (source.has_value()) { @@ -839,7 +839,7 @@ const std::string& header_value, const attribution_reporting::SuitableOrigin& reporting_origin, const attribution_reporting::SuitableOrigin& source_origin, - AttributionSourceType source_type, + SourceType source_type, bool is_within_fenced_frame) { base::expected<StorableSource, SourceRegistrationError> source = base::unexpected(SourceRegistrationError::kInvalidJson);
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h index 6e1b7ce3..9beeeae 100644 --- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h +++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
@@ -15,9 +15,9 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/browser/attribution_reporting/attribution_beacon_id.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/common/content_export.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "services/data_decoder/public/cpp/data_decoder.h" @@ -148,7 +148,7 @@ const std::string& header_value, const attribution_reporting::SuitableOrigin& reporting_origin, const attribution_reporting::SuitableOrigin& source_origin, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType, bool is_within_fenced_frame); void MaybeOnBeaconRegistrationsFinished(BeaconId beacon_id);
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 82ce4e9..fcddb6a 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
@@ -30,10 +30,10 @@ #include "components/attribution_reporting/registration_type.mojom.h" #include "components/attribution_reporting/source_registration.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "content/browser/attribution_reporting/attribution_beacon_id.h" #include "content/browser/attribution_reporting/attribution_constants.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/public/browser/global_routing_id.h" @@ -62,6 +62,7 @@ using ::attribution_reporting::TriggerRegistration; using ::attribution_reporting::mojom::RegistrationType; using ::attribution_reporting::mojom::SourceRegistrationError; +using ::attribution_reporting::mojom::SourceType; using ::blink::mojom::AttributionNavigationType; @@ -165,8 +166,8 @@ EXPECT_CALL( mock_manager_, HandleSource( - AllOf(SourceTypeIs(AttributionSourceType::kEvent), - SourceEventIdIs(10), DestinationSiteIs(destination_site), + AllOf(SourceTypeIs(SourceType::kEvent), SourceEventIdIs(10), + DestinationSiteIs(destination_site), ImpressionOriginIs(page_origin), ReportingOriginIs(reporting_origin), SourcePriorityIs(20), SourceDebugKeyIs(789), AggregationKeysAre(aggregation_keys), @@ -507,8 +508,8 @@ EXPECT_CALL( mock_manager_, HandleSource( - AllOf(SourceTypeIs(AttributionSourceType::kNavigation), - SourceEventIdIs(10), DestinationSiteIs(destination_site), + AllOf(SourceTypeIs(SourceType::kNavigation), SourceEventIdIs(10), + DestinationSiteIs(destination_site), ImpressionOriginIs(page_origin), ReportingOriginIs(reporting_origin), SourcePriorityIs(20), SourceDebugKeyIs(789), AggregationKeysAre(aggregation_keys), @@ -820,7 +821,7 @@ EXPECT_CALL(mock_manager_, NotifyFailedSourceRegistration( "!!!invalid json", source_site, reporter, - AttributionSourceType::kNavigation, + SourceType::kNavigation, SourceRegistrationError::kInvalidJson)); const blink::AttributionSrcToken attribution_src_token; @@ -1445,14 +1446,14 @@ auto reporting_origin = *SuitableOrigin::Deserialize("https://reporter.example"); - EXPECT_CALL(mock_manager_, - HandleSource(AllOf(SourceTypeIs(AttributionSourceType::kEvent), - SourceEventIdIs(10), - DestinationSiteIs(destination_site), - ImpressionOriginIs(page_origin), - ReportingOriginIs(reporting_origin), - SourceIsWithinFencedFrameIs(true)), - kFrameId)); + EXPECT_CALL( + mock_manager_, + HandleSource(AllOf(SourceTypeIs(SourceType::kEvent), SourceEventIdIs(10), + DestinationSiteIs(destination_site), + ImpressionOriginIs(page_origin), + ReportingOriginIs(reporting_origin), + SourceIsWithinFencedFrameIs(true)), + kFrameId)); mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote; data_host_manager_.RegisterDataHost( @@ -1607,11 +1608,10 @@ TEST_F(AttributionDataHostManagerImplTest, NavigationBeaconSource_ParsingFinishesBeforeAndAfterNav) { - EXPECT_CALL( - mock_manager_, - HandleSource(AllOf(SourceTypeIs(AttributionSourceType::kNavigation), - SourceIsWithinFencedFrameIs(false)), - kFrameId)) + EXPECT_CALL(mock_manager_, + HandleSource(AllOf(SourceTypeIs(SourceType::kNavigation), + SourceIsWithinFencedFrameIs(false)), + kFrameId)) .Times(2); auto reporting_origin = url::Origin::Create(GURL("https://report.test")); @@ -1654,7 +1654,7 @@ EXPECT_CALL(mock_manager_, NotifyFailedSourceRegistration( "!!!invalid json", source_origin, *SuitableOrigin::Create(reporting_origin), - AttributionSourceType::kNavigation, + SourceType::kNavigation, SourceRegistrationError::kInvalidJson)) .Times(2); @@ -1687,9 +1687,8 @@ TEST_F(AttributionDataHostManagerImplTest, NavigationBeaconSource_DataReceivedBeforeAndAfterNav) { - EXPECT_CALL( - mock_manager_, - HandleSource(SourceTypeIs(AttributionSourceType::kNavigation), kFrameId)) + EXPECT_CALL(mock_manager_, + HandleSource(SourceTypeIs(SourceType::kNavigation), kFrameId)) .Times(2); auto reporting_origin = url::Origin::Create(GURL("https://report.test")); @@ -1855,7 +1854,7 @@ TEST_F(AttributionDataHostManagerImplTest, EventBeaconSource_DataReceived) { EXPECT_CALL(mock_manager_, - HandleSource(AllOf(SourceTypeIs(AttributionSourceType::kEvent), + HandleSource(AllOf(SourceTypeIs(SourceType::kEvent), SourceIsWithinFencedFrameIs(true)), kFrameId));
diff --git a/content/browser/attribution_reporting/attribution_host_unittest.cc b/content/browser/attribution_reporting/attribution_host_unittest.cc index 97fea5e..bbfd9b9 100644 --- a/content/browser/attribution_reporting/attribution_host_unittest.cc +++ b/content/browser/attribution_reporting/attribution_host_unittest.cc
@@ -15,7 +15,6 @@ #include "content/browser/attribution_reporting/attribution_beacon_id.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" #include "content/browser/attribution_reporting/attribution_manager.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/storage_partition_impl.h" #include "content/browser/web_contents/web_contents_impl.h"
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc index aad2b63a..99c975e 100644 --- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -23,13 +23,13 @@ #include "components/attribution_reporting/event_trigger_data.h" #include "components/attribution_reporting/filters.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/attribution_debug_report.h" #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/send_result.h" @@ -60,6 +60,7 @@ using ::attribution_reporting::FilterPair; using ::attribution_reporting::SuitableOrigin; using ::attribution_reporting::mojom::SourceRegistrationError; +using ::attribution_reporting::mojom::SourceType; using AttributionFilters = ::attribution_reporting::Filters; @@ -279,7 +280,7 @@ }) .BuildStored(), SourceBuilder(now + base::Hours(1)) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .SetPriority(std::numeric_limits<int64_t>::max()) .SetDedupKeys({13, 17}) .SetAggregatableBudgetConsumed(1300) @@ -314,7 +315,7 @@ manager()->NotifySourceHandled( SourceBuilder(now + base::Hours(7)) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build(), StorableSource::Result::kExcessiveReportingOrigins); @@ -404,8 +405,8 @@ manager()->NotifySourceRegistrationFailure( "!", *SuitableOrigin::Deserialize("https://b.test"), - *SuitableOrigin::Deserialize("https://a.test"), - AttributionSourceType::kEvent, SourceRegistrationError::kInvalidJson); + *SuitableOrigin::Deserialize("https://a.test"), SourceType::kEvent, + SourceRegistrationError::kInvalidJson); EXPECT_EQ(kCompleteTitle, title_watcher.WaitAndGetTitle()); } @@ -512,7 +513,7 @@ .WillByDefault(RunOnceCallback<2>(std::vector<AttributionReport>{ ReportBuilder(AttributionInfoBuilder( SourceBuilder(now) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .SetAttributionLogic( StoredSource::AttributionLogic::kFalsely) .BuildStored()) @@ -954,11 +955,11 @@ net::ERR_INTERNET_DISCONNECTED)); ON_CALL(*manager(), GetPendingReportsForInternalUse) .WillByDefault(RunOnceCallback<2>(std::vector<AttributionReport>{ - ReportBuilder(AttributionInfoBuilder( - SourceBuilder(now) - .SetSourceType(AttributionSourceType::kEvent) - .BuildStored()) - .Build()) + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now) + .SetSourceType(SourceType::kEvent) + .BuildStored()) + .Build()) .SetReportTime(now) .SetAggregatableHistogramContributions(contributions) .BuildAggregatableAttribution()}));
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc index d890124c..16b788c3 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -27,6 +27,7 @@ #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/parsing_utils.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/attribution_debug_report.h" @@ -34,7 +35,6 @@ #include "content/browser/attribution_reporting/attribution_internals.mojom.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/attribution_utils.h" #include "content/browser/attribution_reporting/common_source_info.h" @@ -392,7 +392,7 @@ base::Time source_time, const attribution_reporting::SuitableOrigin& source_origin, const attribution_reporting::SuitableOrigin& reporting_origin, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType source_type, attribution_reporting::mojom::SourceRegistrationError error) { auto web_ui_source = WebUISourceRegistration::New(); web_ui_source->registration = GetRegistration(
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.h b/content/browser/attribution_reporting/attribution_internals_handler_impl.h index 8b88fd1..f645cc72 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.h +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.h
@@ -91,7 +91,7 @@ base::Time source_time, const attribution_reporting::SuitableOrigin& source_origin, const attribution_reporting::SuitableOrigin& reporting_origin, - AttributionSourceType, + attribution_reporting::mojom::SourceType, attribution_reporting::mojom::SourceRegistrationError) override; void OnObserverDisconnected();
diff --git a/content/browser/attribution_reporting/attribution_interop_parser.cc b/content/browser/attribution_reporting/attribution_interop_parser.cc index 16dd2999..1236a92 100644 --- a/content/browser/attribution_reporting/attribution_interop_parser.cc +++ b/content/browser/attribution_reporting/attribution_interop_parser.cc
@@ -24,12 +24,12 @@ #include "base/values.h" #include "components/attribution_reporting/source_registration.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/test_utils.h" #include "components/attribution_reporting/trigger_registration.h" #include "components/attribution_reporting/trigger_registration_error.mojom.h" #include "content/browser/attribution_reporting/attribution_config.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/storable_source.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -40,6 +40,7 @@ namespace { using ::attribution_reporting::SuitableOrigin; +using ::attribution_reporting::mojom::SourceType; constexpr char kAttributionSrcUrlKey[] = "attribution_src_url"; constexpr char kRegistrationRequestKey[] = "registration_request"; @@ -291,7 +292,7 @@ absl::optional<SuitableOrigin> source_origin; absl::optional<SuitableOrigin> reporting_origin; - absl::optional<AttributionSourceType> source_type; + absl::optional<SourceType> source_type; ParseDict(source_dict, kRegistrationRequestKey, [&](base::Value::Dict dict) { @@ -456,21 +457,20 @@ return ParseBool(dict, "debug_permission").value_or(false); } - absl::optional<AttributionSourceType> ParseSourceType( - const base::Value::Dict& dict) { + absl::optional<SourceType> ParseSourceType(const base::Value::Dict& dict) { static constexpr char kKey[] = "source_type"; static constexpr char kNavigation[] = "navigation"; static constexpr char kEvent[] = "event"; auto context = PushContext(kKey); - absl::optional<AttributionSourceType> source_type; + absl::optional<SourceType> source_type; if (const std::string* v = dict.FindString(kKey)) { if (*v == kNavigation) { - source_type = AttributionSourceType::kNavigation; + source_type = SourceType::kNavigation; } else if (*v == kEvent) { - source_type = AttributionSourceType::kEvent; + source_type = SourceType::kEvent; } }
diff --git a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc index 095c232..9c25274 100644 --- a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc +++ b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc
@@ -16,10 +16,10 @@ #include "base/time/time_override.h" #include "base/types/expected.h" #include "base/values.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/attribution_config.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/common_source_info.h" #include "content/browser/attribution_reporting/storable_source.h" @@ -174,7 +174,7 @@ EXPECT_EQ(source1->common_info().source_time(), kOffsetTime + base::Milliseconds(1643235573123)); EXPECT_EQ(source1->common_info().source_type(), - AttributionSourceType::kNavigation); + attribution_reporting::mojom::SourceType::kNavigation); EXPECT_EQ(source1->common_info().reporting_origin(), *SuitableOrigin::Deserialize("https://a.r.test")); EXPECT_EQ(source1->common_info().source_origin(), @@ -187,7 +187,7 @@ EXPECT_EQ(source2->common_info().source_time(), kOffsetTime + base::Milliseconds(1643235574123)); EXPECT_EQ(source2->common_info().source_type(), - AttributionSourceType::kEvent); + attribution_reporting::mojom::SourceType::kEvent); EXPECT_EQ(source2->common_info().reporting_origin(), *SuitableOrigin::Deserialize("https://b.r.test")); EXPECT_EQ(source2->common_info().source_origin(),
diff --git a/content/browser/attribution_reporting/attribution_interop_runner.cc b/content/browser/attribution_reporting/attribution_interop_runner.cc index c1c3b0f..51992e71 100644 --- a/content/browser/attribution_reporting/attribution_interop_runner.cc +++ b/content/browser/attribution_reporting/attribution_interop_runner.cc
@@ -41,7 +41,6 @@ #include "content/browser/attribution_reporting/attribution_manager_impl.h" #include "content/browser/attribution_reporting/attribution_observer.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" -#include "content/browser/attribution_reporting/attribution_os_level_manager.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_report_sender.h" #include "content/browser/attribution_reporting/attribution_storage_delegate_impl.h" @@ -403,8 +402,7 @@ base::ThreadPool::CreateUpdateableSequencedTaskRunner( {base::TaskPriority::BEST_EFFORT, base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN, - base::ThreadPolicy::MUST_USE_FOREGROUND}), - /*os_level_manager=*/nullptr); + base::ThreadPolicy::MUST_USE_FOREGROUND})); AttributionEventHandler handler(std::move(manager), raw_fake_cookie_checker, AttributionReportJsonConverter(time_origin));
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc index a73684f9..e41c03b 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -49,7 +49,6 @@ #include "content/browser/attribution_reporting/attribution_metrics.h" #include "content/browser/attribution_reporting/attribution_observer.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" -#include "content/browser/attribution_reporting/attribution_os_level_manager.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_report_network_sender.h" #include "content/browser/attribution_reporting/attribution_report_sender.h" @@ -80,6 +79,7 @@ #include "url/gurl.h" #if BUILDFLAG(IS_ANDROID) +#include "content/browser/attribution_reporting/attribution_os_level_manager.h" #include "content/browser/attribution_reporting/attribution_os_level_manager_android.h" #endif @@ -439,14 +439,12 @@ std::unique_ptr<AttributionCookieChecker> cookie_checker, std::unique_ptr<AttributionReportSender> report_sender, StoragePartitionImpl* storage_partition, - scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner, - std::unique_ptr<AttributionOsLevelManager> os_level_manager) { + scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner) { return base::WrapUnique(new AttributionManagerImpl( storage_partition, user_data_directory, max_pending_events, std::move(special_storage_policy), std::move(storage_delegate), std::move(cookie_checker), std::move(report_sender), - /*data_host_manager=*/nullptr, std::move(storage_task_runner), - std::move(os_level_manager))); + /*data_host_manager=*/nullptr, std::move(storage_task_runner))); } AttributionManagerImpl::AttributionManagerImpl( @@ -472,16 +470,7 @@ base::TaskTraits(base::TaskPriority::BEST_EFFORT, base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN, - base::ThreadPolicy::MUST_USE_FOREGROUND)), -#if BUILDFLAG(IS_ANDROID) - base::FeatureList::IsEnabled( - blink::features::kAttributionReportingCrossAppWeb) - ? std::make_unique<AttributionOsLevelManagerAndroid>() - : nullptr -#else - /*os_level_manager=*/nullptr -#endif - ) { + base::ThreadPolicy::MUST_USE_FOREGROUND))) { } // namespace content AttributionManagerImpl::AttributionManagerImpl( @@ -493,8 +482,7 @@ std::unique_ptr<AttributionCookieChecker> cookie_checker, std::unique_ptr<AttributionReportSender> report_sender, std::unique_ptr<AttributionDataHostManager> data_host_manager, - scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner, - std::unique_ptr<AttributionOsLevelManager> os_level_manager) + scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner) : storage_partition_(storage_partition), max_pending_events_(max_pending_events), storage_task_runner_(std::move(storage_task_runner)), @@ -509,20 +497,24 @@ data_host_manager_(std::move(data_host_manager)), special_storage_policy_(std::move(special_storage_policy)), cookie_checker_(std::move(cookie_checker)), - report_sender_(std::move(report_sender)), - attribution_os_level_manager_(std::move(os_level_manager)) { + report_sender_(std::move(report_sender)) { DCHECK(storage_partition_); DCHECK_GT(max_pending_events_, 0u); DCHECK(storage_task_runner_); DCHECK(cookie_checker_); DCHECK(report_sender_); - if (attribution_os_level_manager_) { +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled( + blink::features::kAttributionReportingCrossAppWeb)) { + attribution_os_level_manager_ = + std::make_unique<AttributionOsLevelManagerAndroid>(); // The measurement API status can only change when user changes the setting // on the device, therefore it's fine to update the global variable to keep // track of the latest setting. SetOsSupport(attribution_os_level_manager_->GetOsSupport()); } +#endif } AttributionManagerImpl::~AttributionManagerImpl() { @@ -836,10 +828,30 @@ BrowsingDataFilterBuilder* filter_builder, bool delete_rate_limit_data, base::OnceClosure done) { - const bool should_clear_from_os = attribution_os_level_manager_ != nullptr; +#if BUILDFLAG(IS_ANDROID) + if (attribution_os_level_manager_) { + auto barrier = base::BarrierClosure(2, std::move(done)); + done = barrier; - auto on_done = - base::BarrierClosure(should_clear_from_os ? 2 : 1, std::move(done)); + if (filter_builder) { + auto* filter_builder_impl = + static_cast<BrowsingDataFilterBuilderImpl*>(filter_builder); + attribution_os_level_manager_->ClearData( + delete_begin, delete_end, filter_builder_impl->GetOrigins(), + filter_builder_impl->GetRegisterableDomains(), + filter_builder->GetMode(), delete_rate_limit_data, + std::move(barrier)); + } else { + // When there is not filter_builder, we clear all the data. + attribution_os_level_manager_->ClearData( + delete_begin, delete_end, /*origins=*/{}, /*domains=*/{}, + // By preserving data only from an empty list, we are effectively + // clearing all the data. + BrowsingDataFilterBuilder::Mode::kPreserve, delete_rate_limit_data, + std::move(barrier)); + } + } +#endif // When a clear data task is queued or running, we use a higher priority. ++num_pending_clear_data_tasks_; @@ -848,30 +860,9 @@ attribution_storage_.AsyncCall(&AttributionStorage::ClearData) .WithArgs(delete_begin, delete_end, std::move(filter), delete_rate_limit_data) - .Then(base::OnceClosure(on_done).Then( + .Then(std::move(done).Then( base::BindOnce(&AttributionManagerImpl::OnClearDataComplete, weak_factory_.GetWeakPtr()))); - - if (!should_clear_from_os) { - return; - } - - if (filter_builder) { - auto* filter_builder_impl = - static_cast<BrowsingDataFilterBuilderImpl*>(filter_builder); - attribution_os_level_manager_->ClearData( - delete_begin, delete_end, filter_builder_impl->GetOrigins(), - filter_builder_impl->GetRegisterableDomains(), - filter_builder->GetMode(), delete_rate_limit_data, std::move(on_done)); - } else { - // When there is not filter_builder, we clear all the data. - attribution_os_level_manager_->ClearData( - delete_begin, delete_end, /*origins=*/{}, /*domains=*/{}, - // By preserving data only from an empty list, we are effectively - // clearing all the data. - BrowsingDataFilterBuilder::Mode::kPreserve, delete_rate_limit_data, - std::move(on_done)); - } } void AttributionManagerImpl::OnClearDataComplete() { @@ -1216,4 +1207,11 @@ } } +#if BUILDFLAG(IS_ANDROID) +void AttributionManagerImpl::OverrideOsLevelManagerForTesting( + std::unique_ptr<AttributionOsLevelManager> os_level_manager) { + attribution_os_level_manager_ = std::move(os_level_manager); +} +#endif + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h index 3db5b61..a739c366 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.h +++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -18,6 +18,8 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/threading/sequence_bound.h" +#include "build/build_config.h" +#include "build/buildflag.h" #include "components/attribution_reporting/os_support.mojom-forward.h" #include "components/attribution_reporting/source_registration_error.mojom-forward.h" #include "content/browser/aggregation_service/aggregation_service.h" @@ -52,7 +54,6 @@ class AttributionCookieChecker; class AttributionDataHostManager; class AttributionDebugReport; -class AttributionOsLevelManager; class AttributionStorage; class AttributionStorageDelegate; class CreateReportResult; @@ -62,6 +63,10 @@ struct GlobalRenderFrameHostId; struct SendResult; +#if BUILDFLAG(IS_ANDROID) +class AttributionOsLevelManager; +#endif + CONTENT_EXPORT BASE_DECLARE_FEATURE(kAttributionVerboseDebugReporting); // UI thread class that manages the lifetime of the underlying attribution @@ -115,8 +120,7 @@ std::unique_ptr<AttributionCookieChecker> cookie_checker, std::unique_ptr<AttributionReportSender> report_sender, StoragePartitionImpl* storage_partition, - scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner, - std::unique_ptr<AttributionOsLevelManager> os_level_manager); + scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner); static std::unique_ptr<AttributionManagerImpl> CreateWithNewDbForTesting( StoragePartitionImpl* storage_partition, @@ -190,8 +194,7 @@ std::unique_ptr<AttributionCookieChecker> cookie_checker, std::unique_ptr<AttributionReportSender> report_sender, std::unique_ptr<AttributionDataHostManager> data_host_manager, - scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner, - std::unique_ptr<AttributionOsLevelManager> os_level_manager); + scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner); void MaybeEnqueueEvent(SourceOrTriggerRFH event); void ProcessEvents(); @@ -259,6 +262,11 @@ void OnClearDataComplete(); +#if BUILDFLAG(IS_ANDROID) + void OverrideOsLevelManagerForTesting( + std::unique_ptr<AttributionOsLevelManager>); +#endif + // Never null. const raw_ptr<StoragePartitionImpl> storage_partition_; @@ -305,7 +313,9 @@ base::ObserverList<AttributionObserver> observers_; +#if BUILDFLAG(IS_ANDROID) std::unique_ptr<AttributionOsLevelManager> attribution_os_level_manager_; +#endif base::WeakPtrFactory<AttributionManagerImpl> weak_factory_{this}; };
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index 2f0ed70a..cc8a518 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -31,6 +31,7 @@ #include "base/time/time.h" #include "base/values.h" #include "build/build_config.h" +#include "build/buildflag.h" #include "components/attribution_reporting/suitable_origin.h" #include "content/browser/aggregation_service/aggregatable_report.h" #include "content/browser/aggregation_service/aggregation_service.h" @@ -41,7 +42,6 @@ #include "content/browser/attribution_reporting/attribution_debug_report.h" #include "content/browser/attribution_reporting/attribution_observer.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" -#include "content/browser/attribution_reporting/attribution_os_level_manager.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_report_sender.h" #include "content/browser/attribution_reporting/attribution_storage.h" @@ -70,6 +70,10 @@ #include "url/gurl.h" #include "url/origin.h" +#if BUILDFLAG(IS_ANDROID) +#include "content/browser/attribution_reporting/attribution_os_level_manager.h" +#endif + namespace content { namespace { @@ -199,6 +203,7 @@ base::circular_deque<base::OnceCallback<void(bool)>> callbacks_; }; +#if BUILDFLAG(IS_ANDROID) class MockAttributionOsLevelManager : public AttributionOsLevelManager { public: ~MockAttributionOsLevelManager() override = default; @@ -207,6 +212,14 @@ RegisterAttributionSource, (const GURL& registration_url, const url::Origin& top_level_origin, + bool is_debug_key_allowed, + const AttributionInputEvent&), + (override)); + + MOCK_METHOD(void, + RegisterAttributionTrigger, + (const GURL& registration_url, + const url::Origin& top_level_origin, bool is_debug_key_allowed), (override)); @@ -226,6 +239,7 @@ (), (override)); }; +#endif } // namespace @@ -260,7 +274,7 @@ CreateAggregationService(); } - void CreateManager(bool create_os_level_manager = false) { + void CreateManager() { CHECK(!attribution_manager_); auto storage_delegate = std::make_unique<ConfigurableStorageDelegate>(); @@ -281,25 +295,18 @@ auto report_sender = std::make_unique<MockReportSender>(); report_sender_ = report_sender.get(); - auto os_level_manager = - create_os_level_manager - ? std::make_unique<MockAttributionOsLevelManager>() - : nullptr; - os_level_manager_ = os_level_manager.get(); - attribution_manager_ = AttributionManagerImpl::CreateForTesting( dir_.GetPath(), kMaxPendingEvents, mock_storage_policy_, std::move(storage_delegate), std::move(cookie_checker), std::move(report_sender), static_cast<StoragePartitionImpl*>( browser_context_->GetDefaultStoragePartition()), - storage_task_runner_, std::move(os_level_manager)); + storage_task_runner_); } void ShutdownManager() { cookie_checker_ = nullptr; report_sender_ = nullptr; - os_level_manager_ = nullptr; attribution_manager_.reset(); } @@ -319,6 +326,14 @@ partition->OverrideAggregationServiceForTesting(nullptr); } +#if BUILDFLAG(IS_ANDROID) + void OverrideOsLevelManager( + std::unique_ptr<AttributionOsLevelManager> os_level_manager) { + attribution_manager_->OverrideOsLevelManagerForTesting( + std::move(os_level_manager)); + } +#endif + std::vector<StoredSource> StoredSources() { std::vector<StoredSource> result; base::RunLoop loop; @@ -360,7 +375,6 @@ raw_ptr<MockCookieChecker> cookie_checker_; raw_ptr<MockReportSender> report_sender_; raw_ptr<MockAggregationService> aggregation_service_; - raw_ptr<MockAttributionOsLevelManager> os_level_manager_; scoped_refptr<base::UpdateableSequencedTaskRunner> storage_task_runner_; }; @@ -1014,9 +1028,11 @@ } } +#if BUILDFLAG(IS_ANDROID) TEST_F(AttributionManagerImplTest, ClearDataFromBrowserAndOs) { - ShutdownManager(); - CreateManager(/*create_os_level_manager=*/true); + auto os_level_manager = std::make_unique<MockAttributionOsLevelManager>(); + auto* os_level_manager_ptr = os_level_manager.get(); + OverrideOsLevelManager(std::move(os_level_manager)); base::Time start = base::Time::Now(); base::Time end = start + base::Minutes(1); @@ -1028,7 +1044,7 @@ filter_builder.AddOrigin(origin); filter_builder.AddRegisterableDomain(domain); - EXPECT_CALL(*os_level_manager_, + EXPECT_CALL(*os_level_manager_ptr, ClearData(start, end, std::set<url::Origin>({origin}), std::set<std::string>({domain}), mode, /*delete_rate_limit_data=*/true, _)) @@ -1049,13 +1065,14 @@ } TEST_F(AttributionManagerImplTest, ClearAllDataFromBrowserAndOs) { - ShutdownManager(); - CreateManager(/*create_os_level_manager=*/true); + auto os_level_manager = std::make_unique<MockAttributionOsLevelManager>(); + auto* os_level_manager_ptr = os_level_manager.get(); + OverrideOsLevelManager(std::move(os_level_manager)); base::Time start = base::Time::Now(); base::Time end = start + base::Minutes(1); - EXPECT_CALL(*os_level_manager_, + EXPECT_CALL(*os_level_manager_ptr, ClearData(start, end, std::set<url::Origin>({}), std::set<std::string>({}), BrowsingDataFilterBuilder::Mode::kPreserve, @@ -1076,6 +1093,7 @@ EXPECT_THAT(StoredReports(), IsEmpty()); } +#endif TEST_F(AttributionManagerImplTest, ConversionsSentFromUI_ReportedImmediately) { Checkpoint checkpoint;
diff --git a/content/browser/attribution_reporting/attribution_observer.h b/content/browser/attribution_reporting/attribution_observer.h index a1617ca..9c0a542c2 100644 --- a/content/browser/attribution_reporting/attribution_observer.h +++ b/content/browser/attribution_reporting/attribution_observer.h
@@ -10,8 +10,8 @@ #include "base/observer_list_types.h" #include "base/time/time.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/store_source_result.mojom-forward.h" namespace attribution_reporting { @@ -69,7 +69,7 @@ base::Time source_time, const attribution_reporting::SuitableOrigin& source_origin, const attribution_reporting::SuitableOrigin& reporting_origin, - AttributionSourceType, + attribution_reporting::mojom::SourceType, attribution_reporting::mojom::SourceRegistrationError) {} };
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager.h b/content/browser/attribution_reporting/attribution_os_level_manager.h index b8c47047..97b118d 100644 --- a/content/browser/attribution_reporting/attribution_os_level_manager.h +++ b/content/browser/attribution_reporting/attribution_os_level_manager.h
@@ -24,6 +24,8 @@ namespace content { +struct AttributionInputEvent; + // Interface between the browser's Attribution Reporting implementation and the // operating system's. class AttributionOsLevelManager { @@ -32,7 +34,12 @@ virtual void RegisterAttributionSource(const GURL& registration_url, const url::Origin& top_level_origin, - bool is_debug_key_allowed) = 0; + bool is_debug_key_allowed, + const AttributionInputEvent&) = 0; + + virtual void RegisterAttributionTrigger(const GURL& registration_url, + const url::Origin& top_level_origin, + bool is_debug_key_allowed) = 0; // Clears storage data with the OS. // Note that `done` is not run if `AttributionOsLevelManager` is destroyed
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc index 10ea79ff..3d6b8c48 100644 --- a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc +++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
@@ -18,6 +18,7 @@ #include "base/sequence_checker.h" #include "base/time/time.h" #include "components/attribution_reporting/os_support.mojom-shared.h" +#include "content/browser/attribution_reporting/attribution_input_event.h" #include "content/public/android/content_jni_headers/AttributionOsLevelManager_jni.h" #include "content/public/browser/browsing_data_filter_builder.h" #include "url/android/gurl_android.h" @@ -87,13 +88,27 @@ void AttributionOsLevelManagerAndroid::RegisterAttributionSource( const GURL& registration_url, const url::Origin& top_level_origin, - bool is_debug_key_allowed) { + bool is_debug_key_allowed, + const AttributionInputEvent& input_event) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); JNIEnv* env = base::android::AttachCurrentThread(); Java_AttributionOsLevelManager_registerAttributionSource( env, jobj_, url::GURLAndroid::FromNativeGURL(env, registration_url), url::GURLAndroid::FromNativeGURL(env, top_level_origin.GetURL()), + is_debug_key_allowed, input_event.input_event); +} + +void AttributionOsLevelManagerAndroid::RegisterAttributionTrigger( + const GURL& registration_url, + const url::Origin& top_level_origin, + bool is_debug_key_allowed) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + JNIEnv* env = base::android::AttachCurrentThread(); + Java_AttributionOsLevelManager_registerAttributionTrigger( + env, jobj_, url::GURLAndroid::FromNativeGURL(env, registration_url), + url::GURLAndroid::FromNativeGURL(env, top_level_origin.GetURL()), is_debug_key_allowed); }
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.h b/content/browser/attribution_reporting/attribution_os_level_manager_android.h index ef230ada..43b67d9 100644 --- a/content/browser/attribution_reporting/attribution_os_level_manager_android.h +++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.h
@@ -34,7 +34,12 @@ void RegisterAttributionSource(const GURL& registration_url, const url::Origin& top_level_origin, - bool is_debug_key_allowed) override; + bool is_debug_key_allowed, + const AttributionInputEvent&) override; + + void RegisterAttributionTrigger(const GURL& registration_url, + const url::Origin& top_level_origin, + bool is_debug_key_allowed) override; void ClearData(base::Time delete_begin, base::Time delete_end,
diff --git a/content/browser/attribution_reporting/attribution_report_unittest.cc b/content/browser/attribution_reporting/attribution_report_unittest.cc index ce7f045a..a6da225 100644 --- a/content/browser/attribution_reporting/attribution_report_unittest.cc +++ b/content/browser/attribution_reporting/attribution_report_unittest.cc
@@ -12,9 +12,9 @@ #include "base/test/values_test_util.h" #include "base/time/time.h" #include "base/values.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "content/browser/attribution_reporting/attribution_info.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/stored_source.h" #include "net/base/schemeful_site.h" @@ -28,6 +28,7 @@ namespace content { namespace { +using ::attribution_reporting::mojom::SourceType; using ::base::test::IsJson; TEST(AttributionReportTest, ReportURL) { @@ -57,10 +58,10 @@ TEST(AttributionReportTest, ReportBody) { const struct { - AttributionSourceType source_type; + SourceType source_type; base::Value::Dict expected; } kTestCases[] = { - {AttributionSourceType::kNavigation, base::test::ParseJsonDict(R"json({ + {SourceType::kNavigation, base::test::ParseJsonDict(R"json({ "attribution_destination":"https://conversion.test", "randomized_trigger_rate":0.2, "report_id":"21abd97f-73e8-4b88-9389-a9fee6abda5e", @@ -69,7 +70,7 @@ "source_type":"navigation", "trigger_data":"5" })json")}, - {AttributionSourceType::kEvent, base::test::ParseJsonDict(R"json({ + {SourceType::kEvent, base::test::ParseJsonDict(R"json({ "attribution_destination":"https://conversion.test", "randomized_trigger_rate":0.2, "report_id":"21abd97f-73e8-4b88-9389-a9fee6abda5e",
diff --git a/content/browser/attribution_reporting/attribution_source_type.h b/content/browser/attribution_reporting/attribution_source_type.h deleted file mode 100644 index 8290a65..0000000 --- a/content/browser/attribution_reporting/attribution_source_type.h +++ /dev/null
@@ -1,16 +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 CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_SOURCE_TYPE_H_ -#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_SOURCE_TYPE_H_ - -#include "components/attribution_reporting/source_type.mojom.h" - -namespace content { - -using AttributionSourceType = ::attribution_reporting::mojom::SourceType; - -} // namespace content - -#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_SOURCE_TYPE_H_
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.cc b/content/browser/attribution_reporting/attribution_storage_delegate.cc index fc98a7fb..126531a 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate.cc
@@ -5,9 +5,14 @@ #include "content/browser/attribution_reporting/attribution_storage_delegate.h" #include "base/check.h" +#include "components/attribution_reporting/source_type.mojom.h" namespace content { +namespace { +using ::attribution_reporting::mojom::SourceType; +} // namespace + AttributionStorageDelegate::AttributionStorageDelegate( const AttributionConfig& config) : config_(config) { @@ -15,12 +20,12 @@ } int AttributionStorageDelegate::GetMaxAttributionsPerSource( - AttributionSourceType source_type) const { + SourceType source_type) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (source_type) { - case AttributionSourceType::kNavigation: + case SourceType::kNavigation: return config_.event_level_limit.max_attributions_per_navigation_source; - case AttributionSourceType::kEvent: + case SourceType::kEvent: return config_.event_level_limit.max_attributions_per_event_source; } } @@ -54,14 +59,14 @@ } double AttributionStorageDelegate::GetRandomizedResponseRate( - AttributionSourceType source_type) const { + SourceType source_type) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (source_type) { - case AttributionSourceType::kNavigation: + case SourceType::kNavigation: return config_.event_level_limit .navigation_source_randomized_response_rate; - case AttributionSourceType::kEvent: + case SourceType::kEvent: return config_.event_level_limit.event_source_randomized_response_rate; } } @@ -73,7 +78,7 @@ uint64_t AttributionStorageDelegate::SanitizeTriggerData( uint64_t trigger_data, - AttributionSourceType source_type) const { + SourceType source_type) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const uint64_t cardinality = TriggerDataCardinality(source_type); @@ -92,13 +97,13 @@ } uint64_t AttributionStorageDelegate::TriggerDataCardinality( - AttributionSourceType source_type) const { + SourceType source_type) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (source_type) { - case AttributionSourceType::kNavigation: + case SourceType::kNavigation: return config_.event_level_limit .navigation_source_trigger_data_cardinality; - case AttributionSourceType::kEvent: + case SourceType::kEvent: return config_.event_level_limit.event_source_trigger_data_cardinality; } }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.h b/content/browser/attribution_reporting/attribution_storage_delegate.h index 6700bab9..ca6d64bd8 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate.h +++ b/content/browser/attribution_reporting/attribution_storage_delegate.h
@@ -11,9 +11,9 @@ #include "base/sequence_checker.h" #include "base/thread_annotations.h" #include "base/time/time.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/browser/attribution_reporting/attribution_config.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/common/content_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -67,7 +67,8 @@ // marked inactive and no new reports will be created for it. // Sources will be checked against this limit after they schedule a new // report. - int GetMaxAttributionsPerSource(AttributionSourceType source_type) const; + int GetMaxAttributionsPerSource( + attribution_reporting::mojom::SourceType) const; // These limits are designed solely to avoid excessive disk / memory usage. // In particular, they do not correspond with any privacy parameters. @@ -120,7 +121,8 @@ // source with the given source type, as implemented by // `GetRandomizedResponse()`. Must be in the range [0, 1] and remain constant // for the lifetime of the delegate. - double GetRandomizedResponseRate(AttributionSourceType) const; + double GetRandomizedResponseRate( + attribution_reporting::mojom::SourceType) const; // Returns a randomized response for the given source, consisting of zero or // more fake reports. Returns `absl::nullopt` to indicate that the response @@ -134,13 +136,14 @@ // Sanitizes `trigger_data` according to the data limits for `source_type`. uint64_t SanitizeTriggerData(uint64_t trigger_data, - AttributionSourceType source_type) const; + attribution_reporting::mojom::SourceType) const; // Sanitizes `source_event_id` according to the data limit. uint64_t SanitizeSourceEventId(uint64_t source_event_id) const; protected: - uint64_t TriggerDataCardinality(AttributionSourceType source_type) const; + uint64_t TriggerDataCardinality( + attribution_reporting::mojom::SourceType) const; AttributionConfig config_ GUARDED_BY_CONTEXT(sequence_checker_);
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 8de6a4d..ea3126b9 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -12,8 +12,8 @@ #include "base/containers/flat_map.h" #include "base/guid.h" #include "base/time/time.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/combinatorics.h" #include "content/browser/attribution_reporting/common_source_info.h" @@ -24,6 +24,7 @@ namespace { +using ::attribution_reporting::mojom::SourceType; using ::testing::AllOf; using ::testing::Ge; using ::testing::Lt; @@ -32,12 +33,11 @@ constexpr base::TimeDelta kDefaultExpiry = base::Days(30); -AttributionReport GetReport( - base::Time source_time, - base::Time trigger_time, - base::TimeDelta expiry = kDefaultExpiry, - base::TimeDelta report_window = kDefaultExpiry, - AttributionSourceType source_type = AttributionSourceType::kNavigation) { +AttributionReport GetReport(base::Time source_time, + base::Time trigger_time, + base::TimeDelta expiry = kDefaultExpiry, + base::TimeDelta report_window = kDefaultExpiry, + SourceType source_type = SourceType::kNavigation) { return ReportBuilder( AttributionInfoBuilder(SourceBuilder(source_time) .SetExpiry(expiry) @@ -49,7 +49,7 @@ .Build(); } -void RunRandomFakeReportsTest(const AttributionSourceType source_type, +void RunRandomFakeReportsTest(const SourceType source_type, const int num_stars, const int num_bars, const int num_samples, @@ -196,7 +196,7 @@ const AttributionReport report = GetReport(source_time, trigger_time, /*expiry=*/base::Days(1), - /*report_window=*/base::Days(1), AttributionSourceType::kEvent); + /*report_window=*/base::Days(1), SourceType::kEvent); EXPECT_EQ(source_time + base::Days(1) + base::Hours(1), AttributionStorageDelegateImpl().GetEventLevelReportTime( report.attribution_info().source.common_info(), @@ -210,7 +210,7 @@ const AttributionReport report = GetReport(source_time, trigger_time, /*expiry=*/base::Days(4), - /*report_window=*/base::Days(4), AttributionSourceType::kEvent); + /*report_window=*/base::Days(4), SourceType::kEvent); EXPECT_EQ(source_time + base::Days(4) + base::Hours(1), AttributionStorageDelegateImpl().GetEventLevelReportTime( report.attribution_info().source.common_info(), @@ -267,18 +267,18 @@ kImpressionTime + kExpiry + base::Hours(1); const struct { - AttributionSourceType source_type; + SourceType source_type; int sequence_index; std::vector<FakeReport> expected; } kTestCases[] = { // Event sources only have 3 output states, so we can enumerate them: { - .source_type = AttributionSourceType::kEvent, + .source_type = SourceType::kEvent, .sequence_index = 0, .expected = {}, }, { - .source_type = AttributionSourceType::kEvent, + .source_type = SourceType::kEvent, .sequence_index = 1, .expected = {{ .trigger_data = 0, @@ -287,7 +287,7 @@ }}, }, { - .source_type = AttributionSourceType::kEvent, + .source_type = SourceType::kEvent, .sequence_index = 2, .expected = {{ .trigger_data = 1, @@ -297,12 +297,12 @@ }, // Navigation sources have 2925 output states, so pick interesting ones: { - .source_type = AttributionSourceType::kNavigation, + .source_type = SourceType::kNavigation, .sequence_index = 0, .expected = {}, }, { - .source_type = AttributionSourceType::kNavigation, + .source_type = SourceType::kNavigation, .sequence_index = 20, .expected = {{ .trigger_data = 3, @@ -311,7 +311,7 @@ }}, }, { - .source_type = AttributionSourceType::kNavigation, + .source_type = SourceType::kNavigation, .sequence_index = 41, .expected = { @@ -328,7 +328,7 @@ }, }, { - .source_type = AttributionSourceType::kNavigation, + .source_type = SourceType::kNavigation, .sequence_index = 50, .expected = { @@ -345,7 +345,7 @@ }, }, { - .source_type = AttributionSourceType::kNavigation, + .source_type = SourceType::kNavigation, .sequence_index = 1268, .expected = { @@ -388,7 +388,7 @@ // // For the distribution check, the probability of failure with `tolerance` is // at most 1e-9. - RunRandomFakeReportsTest(AttributionSourceType::kEvent, + RunRandomFakeReportsTest(SourceType::kEvent, /*num_stars=*/1, /*num_bars=*/2, /*num_samples=*/100'000, @@ -403,7 +403,7 @@ // // For the distribution check, the probability of failure with `tolerance` is // at most .0002. - RunRandomFakeReportsTest(AttributionSourceType::kNavigation, + RunRandomFakeReportsTest(SourceType::kNavigation, /*num_stars=*/3, /*num_bars=*/24, /*num_samples=*/150'000, @@ -412,16 +412,16 @@ TEST(AttributionStorageDelegateImplTest, SanitizeTriggerData) { const struct { - AttributionSourceType source_type; + SourceType source_type; uint64_t trigger_data; uint64_t expected; } kTestCases[] = { - {AttributionSourceType::kNavigation, 7, 7}, - {AttributionSourceType::kNavigation, 8, 0}, - {AttributionSourceType::kNavigation, 9, 1}, - {AttributionSourceType::kEvent, 1, 1}, - {AttributionSourceType::kEvent, 2, 0}, - {AttributionSourceType::kEvent, 3, 1}, + {SourceType::kNavigation, 7, 7}, // + {SourceType::kNavigation, 8, 0}, // + {SourceType::kNavigation, 9, 1}, // + {SourceType::kEvent, 1, 1}, // + {SourceType::kEvent, 2, 0}, // + {SourceType::kEvent, 3, 1}, // }; for (const auto& test_case : kTestCases) {
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index d5426455..d1e3450 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -33,6 +33,7 @@ #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/event_trigger_data.h" #include "components/attribution_reporting/filters.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/aggregatable_attribution_utils.h" @@ -41,7 +42,6 @@ #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_reporting.pb.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_storage_delegate.h" #include "content/browser/attribution_reporting/attribution_storage_sql_migrations.h" #include "content/browser/attribution_reporting/attribution_trigger.h" @@ -74,6 +74,7 @@ using EventLevelResult = ::content::AttributionTrigger::EventLevelResult; using ::attribution_reporting::SuitableOrigin; +using ::attribution_reporting::mojom::SourceType; const base::FilePath::CharType kDatabasePath[] = FILE_PATH_LITERAL("Conversions"); @@ -136,16 +137,16 @@ } } -int SerializeSourceType(AttributionSourceType val) { +int SerializeSourceType(SourceType val) { return static_cast<int>(val); } -absl::optional<AttributionSourceType> DeserializeSourceType(int val) { +absl::optional<SourceType> DeserializeSourceType(int val) { switch (val) { - case static_cast<int>(AttributionSourceType::kNavigation): - return AttributionSourceType::kNavigation; - case static_cast<int>(AttributionSourceType::kEvent): - return AttributionSourceType::kEvent; + case static_cast<int>(SourceType::kNavigation): + return SourceType::kNavigation; + case static_cast<int>(SourceType::kEvent): + return SourceType::kEvent; default: return absl::nullopt; } @@ -347,7 +348,7 @@ base::Time expiry_time = statement.ColumnTime(col++); base::Time event_report_window_time = statement.ColumnTime(col++); base::Time aggregatable_report_window_time = statement.ColumnTime(col++); - absl::optional<AttributionSourceType> source_type = + absl::optional<SourceType> source_type = DeserializeSourceType(statement.ColumnInt(col++)); absl::optional<StoredSource::AttributionLogic> attribution_logic = DeserializeAttributionLogic(statement.ColumnInt(col++)); @@ -1081,7 +1082,7 @@ return EventLevelResult::kReportWindowPassed; } - const AttributionSourceType source_type = common_info.source_type(); + const SourceType source_type = common_info.source_type(); auto event_trigger = base::ranges::find_if( trigger.registration().event_triggers.vec(), @@ -2684,7 +2685,7 @@ return AggregatableResult::kReportWindowPassed; } - const AttributionSourceType source_type = common_info.source_type(); + const SourceType source_type = common_info.source_type(); auto matched_dedup_key = base::ranges::find_if( trigger.registration().aggregatable_dedup_keys.vec(),
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc index 0b93ea1..a31a5b5 100644 --- a/content/browser/attribution_reporting/attribution_storage_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -31,12 +31,12 @@ #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/event_trigger_data.h" #include "components/attribution_reporting/filters.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/aggregatable_histogram_contribution.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_storage_sql.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/attribution_trigger.h" @@ -73,6 +73,7 @@ using ::attribution_reporting::FilterPair; using ::attribution_reporting::SuitableOrigin; +using ::attribution_reporting::mojom::SourceType; // Default max number of conversions for a single impression for testing. const int kMaxConversions = 3; @@ -296,7 +297,7 @@ TEST_F(AttributionStorageTest, EventSourceImpressionsForConversion_Converts) { storage()->StoreSource( - SourceBuilder().SetSourceType(AttributionSourceType::kEvent).Build()); + SourceBuilder().SetSourceType(SourceType::kEvent).Build()); EXPECT_EQ(AttributionTrigger::EventLevelResult::kSuccess, MaybeCreateAndStoreEventLevelReport( TriggerBuilder().SetEventSourceTriggerData(456).Build())); @@ -1041,14 +1042,13 @@ .max_attributions = 1, }); - storage()->StoreSource(SourceBuilder() - .SetSourceType(AttributionSourceType::kNavigation) - .Build()); + storage()->StoreSource( + SourceBuilder().SetSourceType(SourceType::kNavigation).Build()); EXPECT_EQ(AttributionTrigger::EventLevelResult::kSuccess, MaybeCreateAndStoreEventLevelReport(DefaultTrigger())); storage()->StoreSource( - SourceBuilder().SetSourceType(AttributionSourceType::kEvent).Build()); + SourceBuilder().SetSourceType(SourceType::kEvent).Build()); // This would fail if the source types had separate limits. EXPECT_EQ(AttributionTrigger::EventLevelResult::kExcessiveAttributions, MaybeCreateAndStoreEventLevelReport(DefaultTrigger())); @@ -1306,13 +1306,13 @@ storage()->StoreSource(SourceBuilder() .SetDestinationOrigin(*SuitableOrigin::Deserialize( "https://a.example/")) - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .Build()); AttributionStorage::StoreSourceResult result = storage()->StoreSource( SourceBuilder() .SetDestinationOrigin( *SuitableOrigin::Deserialize("https://b.example")) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); EXPECT_EQ(result.status, StorableSource::Result::kInsufficientUniqueDestinationCapacity); @@ -1331,13 +1331,13 @@ storage()->StoreSource(SourceBuilder() .SetDestinationOrigin(*SuitableOrigin::Deserialize( "https://a.example/")) - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .SetExpiry(expiry) .Build()); storage()->StoreSource(SourceBuilder() .SetDestinationOrigin(*SuitableOrigin::Deserialize( "https://b.example")) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1)); @@ -1348,7 +1348,7 @@ storage()->StoreSource(SourceBuilder() .SetDestinationOrigin(*SuitableOrigin::Deserialize( "https://b.example")) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1)); @@ -1428,7 +1428,7 @@ SourceBuilder builder = TestAggregatableSourceProvider().GetBuilder(); builder.SetSourceEventId(4) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .SetPriority(100); delegate()->set_randomized_response( std::vector<AttributionStorageDelegate::FakeReport>{ @@ -2088,7 +2088,7 @@ FilterPair{ .negative = attribution_reporting::Filters::ForSourceTypeForTesting( - AttributionSourceType::kNavigation)}), + SourceType::kNavigation)}), false, }, { @@ -2098,7 +2098,7 @@ FilterPair{ .negative = attribution_reporting::Filters::ForSourceTypeForTesting( - AttributionSourceType::kEvent)}), + SourceType::kEvent)}), true, }, { @@ -2732,26 +2732,24 @@ storage()->StoreSource(SourceBuilder() .SetReportingOrigin(origin1) - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .Build()); MaybeCreateAndStoreEventLevelReport( TriggerBuilder().SetReportingOrigin(origin1).Build()); storage()->StoreSource(SourceBuilder() .SetReportingOrigin(origin2) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); MaybeCreateAndStoreEventLevelReport( TriggerBuilder().SetReportingOrigin(origin2).Build()); - EXPECT_THAT( - storage()->GetAttributionReports(base::Time::Max()), - UnorderedElementsAre( - AllOf( - ReportSourceIs(SourceTypeIs(AttributionSourceType::kNavigation)), - EventLevelDataIs(RandomizedTriggerRateIs(.2))), - AllOf(ReportSourceIs(SourceTypeIs(AttributionSourceType::kEvent)), - EventLevelDataIs(RandomizedTriggerRateIs(.4))))); + EXPECT_THAT(storage()->GetAttributionReports(base::Time::Max()), + UnorderedElementsAre( + AllOf(ReportSourceIs(SourceTypeIs(SourceType::kNavigation)), + EventLevelDataIs(RandomizedTriggerRateIs(.2))), + AllOf(ReportSourceIs(SourceTypeIs(SourceType::kEvent)), + EventLevelDataIs(RandomizedTriggerRateIs(.4))))); } // Will return minimum of next event-level report and next aggregatable report @@ -2813,34 +2811,32 @@ storage()->StoreSource(SourceBuilder() .SetReportingOrigin(origin1) - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .Build()); MaybeCreateAndStoreEventLevelReport( TriggerBuilder().SetReportingOrigin(origin1).SetTriggerData(6).Build()); storage()->StoreSource(SourceBuilder() .SetReportingOrigin(origin2) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); MaybeCreateAndStoreEventLevelReport(TriggerBuilder() .SetReportingOrigin(origin2) .SetEventSourceTriggerData(4) .Build()); - EXPECT_THAT( - storage()->GetAttributionReports(base::Time::Max()), - UnorderedElementsAre( - AllOf( - ReportSourceIs(SourceTypeIs(AttributionSourceType::kNavigation)), - EventLevelDataIs(TriggerDataIs(2))), - AllOf(ReportSourceIs(SourceTypeIs(AttributionSourceType::kEvent)), - EventLevelDataIs(TriggerDataIs(1))))); + EXPECT_THAT(storage()->GetAttributionReports(base::Time::Max()), + UnorderedElementsAre( + AllOf(ReportSourceIs(SourceTypeIs(SourceType::kNavigation)), + EventLevelDataIs(TriggerDataIs(2))), + AllOf(ReportSourceIs(SourceTypeIs(SourceType::kEvent)), + EventLevelDataIs(TriggerDataIs(1))))); } TEST_F(AttributionStorageTest, SourceFilterData_RoundTrips) { storage()->StoreSource(SourceBuilder() .SetFilterData(AttributionFilterData()) - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .Build()); const auto filter_data = AttributionFilterData::Create({{"abc", {"x", "y"}}}); @@ -2848,7 +2844,7 @@ storage()->StoreSource(SourceBuilder() .SetFilterData(*filter_data) - .SetSourceType(AttributionSourceType::kEvent) + .SetSourceType(SourceType::kEvent) .Build()); EXPECT_THAT(storage()->GetActiveSources(), @@ -2860,7 +2856,7 @@ const auto origin = *SuitableOrigin::Deserialize("https://r.test"); storage()->StoreSource(SourceBuilder() - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .SetDestinationOrigin(origin) .SetReportingOrigin(origin) .Build()); @@ -2878,9 +2874,9 @@ /*data=*/11, /*priority=*/12, /*dedup_key=*/13, - FilterPair{.positive = attribution_reporting::Filters:: - ForSourceTypeForTesting( - AttributionSourceType::kEvent)})}), + FilterPair{ + .positive = attribution_reporting::Filters:: + ForSourceTypeForTesting(SourceType::kEvent)})}), /*aggregatable_trigger_data=*/ attribution_reporting::AggregatableTriggerDataList(), /*aggregatable_values=*/ @@ -2902,7 +2898,7 @@ storage()->StoreSource( SourceBuilder() - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType(SourceType::kNavigation) .SetDestinationOrigin(origin) .SetReportingOrigin(origin) .SetFilterData(*AttributionFilterData::Create({{"abc", {"123"}}})) @@ -3049,7 +3045,7 @@ FilterPair{ .negative = attribution_reporting::Filters::ForSourceTypeForTesting( - AttributionSourceType::kNavigation)}, + SourceType::kNavigation)}, /*debug_key=*/absl::nullopt, attribution_reporting::AggregatableDedupKeyList(), event_triggers, *attribution_reporting::AggregatableTriggerDataList::Create(
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index 2e90ac73..b2cbdd5 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -28,12 +28,12 @@ #include "components/attribution_reporting/filters.h" #include "components/attribution_reporting/source_registration.h" #include "components/attribution_reporting/source_registration_error.mojom.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/attribution_config.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" #include "content/browser/attribution_reporting/attribution_observer.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/rate_limit_result.h" #include "content/public/browser/attribution_data_model.h" @@ -56,6 +56,7 @@ using ::attribution_reporting::FilterPair; using ::attribution_reporting::SuitableOrigin; +using ::attribution_reporting::mojom::SourceType; using ::testing::AllOf; using ::testing::Field; @@ -397,7 +398,7 @@ const std::string& header_value, const SuitableOrigin& source_origin, const SuitableOrigin& reporting_origin, - AttributionSourceType source_type, + SourceType source_type, attribution_reporting::mojom::SourceRegistrationError error) { base::Time source_time = base::Time::Now(); for (auto& observer : observers_) { @@ -533,7 +534,7 @@ return *this; } -SourceBuilder& SourceBuilder::SetSourceType(AttributionSourceType source_type) { +SourceBuilder& SourceBuilder::SetSourceType(SourceType source_type) { source_type_ = source_type; return *this; } @@ -743,13 +744,13 @@ trigger_data_, priority_, dedup_key_, FilterPair{.positive = attribution_reporting::Filters::ForSourceTypeForTesting( - AttributionSourceType::kNavigation)}); + SourceType::kNavigation)}); event_triggers.emplace_back( event_source_trigger_data_, priority_, dedup_key_, attribution_reporting::FilterPair{ .positive = attribution_reporting::Filters::ForSourceTypeForTesting( - AttributionSourceType::kEvent)}); + SourceType::kEvent)}); } return AttributionTrigger(
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index 78091f85..1864138 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -12,6 +12,7 @@ #include <string> #include <vector> +#include "base/containers/enum_set.h" #include "base/containers/flat_set.h" #include "base/guid.h" #include "base/observer_list.h" @@ -30,6 +31,7 @@ #include "components/attribution_reporting/registration_type.mojom-forward.h" #include "components/attribution_reporting/source_registration.h" #include "components/attribution_reporting/source_registration_error.mojom-forward.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "components/attribution_reporting/test_utils.h" #include "components/attribution_reporting/trigger_registration.h" @@ -42,7 +44,6 @@ #include "content/browser/attribution_reporting/attribution_observer.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_storage.h" #include "content/browser/attribution_reporting/attribution_storage_delegate.h" #include "content/browser/attribution_reporting/attribution_trigger.h" @@ -86,10 +87,10 @@ enum class RateLimitResult : int; -const AttributionSourceType kSourceTypes[] = { - AttributionSourceType::kNavigation, - AttributionSourceType::kEvent, -}; +constexpr auto kSourceTypes = + base::EnumSet<attribution_reporting::mojom::SourceType, + attribution_reporting::mojom::SourceType::kMinValue, + attribution_reporting::mojom::SourceType::kMaxValue>::All(); template <class SuperClass> class MockAttributionReportingContentBrowserClientBase : public SuperClass { @@ -305,7 +306,7 @@ (const std::string& header_value, const attribution_reporting::SuitableOrigin& source_origin, const attribution_reporting::SuitableOrigin& reporting_origin, - AttributionSourceType, + attribution_reporting::mojom::SourceType, attribution_reporting::mojom::SourceRegistrationError), (override)); @@ -342,7 +343,7 @@ const std::string& header_value, const attribution_reporting::SuitableOrigin& source_origin, const attribution_reporting::SuitableOrigin& reporting_origin, - AttributionSourceType, + attribution_reporting::mojom::SourceType, attribution_reporting::mojom::SourceRegistrationError); void NotifyDebugReportSent(const AttributionDebugReport&, int status, @@ -458,7 +459,7 @@ SourceBuilder& SetReportingOrigin(attribution_reporting::SuitableOrigin); - SourceBuilder& SetSourceType(AttributionSourceType source_type); + SourceBuilder& SetSourceType(attribution_reporting::mojom::SourceType); SourceBuilder& SetPriority(int64_t priority); @@ -503,7 +504,8 @@ attribution_reporting::SuitableOrigin source_origin_; base::flat_set<net::SchemefulSite> destination_sites_; attribution_reporting::SuitableOrigin reporting_origin_; - AttributionSourceType source_type_ = AttributionSourceType::kNavigation; + attribution_reporting::mojom::SourceType source_type_ = + attribution_reporting::mojom::SourceType::kNavigation; int64_t priority_ = 0; StoredSource::AttributionLogic attribution_logic_ = StoredSource::AttributionLogic::kTruthfully;
diff --git a/content/browser/attribution_reporting/attribution_utils.cc b/content/browser/attribution_reporting/attribution_utils.cc index da426ee2..cfe9e94 100644 --- a/content/browser/attribution_reporting/attribution_utils.cc +++ b/content/browser/attribution_reporting/attribution_utils.cc
@@ -10,26 +10,27 @@ #include "base/json/json_writer.h" #include "base/time/time.h" #include "base/values.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "content/browser/attribution_reporting/common_source_info.h" namespace content { namespace { +using ::attribution_reporting::mojom::SourceType; + constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1); -base::span<const base::TimeDelta> EarlyDeadlines( - AttributionSourceType source_type) { +base::span<const base::TimeDelta> EarlyDeadlines(SourceType source_type) { static constexpr base::TimeDelta kEarlyDeadlinesNavigation[] = { base::Days(2), base::Days(7), }; switch (source_type) { - case AttributionSourceType::kNavigation: + case SourceType::kNavigation: return kEarlyDeadlinesNavigation; - case AttributionSourceType::kEvent: + case SourceType::kEvent: return base::span<const base::TimeDelta>(); } } @@ -85,7 +86,7 @@ return ReportTimeFromDeadline(source.source_time(), deadline_to_use); } -int NumReportWindows(AttributionSourceType source_type) { +int NumReportWindows(SourceType source_type) { // Add 1 for the expiry deadline. return 1 + EarlyDeadlines(source_type).size(); }
diff --git a/content/browser/attribution_reporting/attribution_utils.h b/content/browser/attribution_reporting/attribution_utils.h index 0bfebda..769535b 100644 --- a/content/browser/attribution_reporting/attribution_utils.h +++ b/content/browser/attribution_reporting/attribution_utils.h
@@ -7,7 +7,7 @@ #include <string> -#include "content/browser/attribution_reporting/attribution_source_type.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/common/content_export.h" namespace base { @@ -25,7 +25,7 @@ base::Time trigger_time); // Returns the number of report windows for the given source type. -int NumReportWindows(AttributionSourceType source_type); +int NumReportWindows(attribution_reporting::mojom::SourceType); // Calculates the report time for a given source and window index. base::Time ReportTimeAtWindow(const CommonSourceInfo& source, int window_index);
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index a4bc25b..99995732 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -30,6 +30,7 @@ #include "content/browser/attribution_reporting/storable_source.h" #include "content/browser/fenced_frame/fenced_frame_reporter.h" #include "content/browser/fenced_frame/fenced_frame_url_mapping.h" +#include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/page_impl.h" #include "content/browser/renderer_host/render_frame_host_impl.h" @@ -74,6 +75,7 @@ #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom.h" #include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -1718,7 +1720,12 @@ ->GetURLLoaderFactoryForBrowserProcess(), AttributionDataHostManager::FromBrowserContext( web_contents()->GetBrowserContext()), - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, + PrivateAggregationManager::GetManager( + *web_contents()->GetBrowserContext()), + /*main_frame_origin=*/ + web_contents()->GetPrimaryMainFrame()->GetLastCommittedOrigin(), + /*winner_origin=*/url::Origin::Create(GURL("https://a.test"))); } private:
diff --git a/content/browser/attribution_reporting/common_source_info.cc b/content/browser/attribution_reporting/common_source_info.cc index cd4ef9b..00fd2cc4 100644 --- a/content/browser/attribution_reporting/common_source_info.cc +++ b/content/browser/attribution_reporting/common_source_info.cc
@@ -12,6 +12,7 @@ #include "base/cxx17_backports.h" #include "base/ranges/algorithm.h" #include "base/values.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "net/base/schemeful_site.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -21,6 +22,7 @@ namespace { using ::attribution_reporting::SuitableOrigin; +using ::attribution_reporting::mojom::SourceType; base::flat_set<net::SchemefulSite> DestinationSet( net::SchemefulSite destination) { @@ -51,13 +53,13 @@ base::Time CommonSourceInfo::GetExpiryTime( absl::optional<base::TimeDelta> declared_expiry, base::Time source_time, - AttributionSourceType source_type) { + SourceType source_type) { // Default to the maximum expiry time. base::TimeDelta expiry = declared_expiry.value_or(kDefaultAttributionSourceExpiry); // Expiry time for event sources must be a whole number of days. - if (source_type == AttributionSourceType::kEvent) { + if (source_type == SourceType::kEvent) { expiry = expiry.RoundToMultiple(base::Days(1)); } @@ -87,7 +89,7 @@ base::Time expiry_time, absl::optional<base::Time> event_report_window_time, absl::optional<base::Time> aggregatable_report_window_time, - AttributionSourceType source_type, + SourceType source_type, int64_t priority, attribution_reporting::FilterData filter_data, absl::optional<uint64_t> debug_key, @@ -115,7 +117,7 @@ base::Time expiry_time, absl::optional<base::Time> event_report_window_time, absl::optional<base::Time> aggregatable_report_window_time, - AttributionSourceType source_type, + SourceType source_type, int64_t priority, attribution_reporting::FilterData filter_data, absl::optional<uint64_t> debug_key,
diff --git a/content/browser/attribution_reporting/common_source_info.h b/content/browser/attribution_reporting/common_source_info.h index 6caeaf4..611bedf 100644 --- a/content/browser/attribution_reporting/common_source_info.h +++ b/content/browser/attribution_reporting/common_source_info.h
@@ -12,8 +12,8 @@ #include "base/time/time.h" #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/filters.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "components/attribution_reporting/suitable_origin.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/common/content_export.h" #include "net/base/schemeful_site.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -32,7 +32,7 @@ static base::Time GetExpiryTime( absl::optional<base::TimeDelta> declared_expiry, base::Time source_time, - AttributionSourceType source_type); + attribution_reporting::mojom::SourceType); static absl::optional<base::Time> GetReportWindowTime( absl::optional<base::TimeDelta> declared_window, @@ -48,7 +48,7 @@ base::Time expiry_time, absl::optional<base::Time> event_report_window_time, absl::optional<base::Time> aggregatable_report_window_time, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType, int64_t priority, attribution_reporting::FilterData filter_data, absl::optional<uint64_t> debug_key, @@ -62,7 +62,7 @@ base::Time expiry_time, absl::optional<base::Time> event_report_window_time, absl::optional<base::Time> aggregatable_report_window_time, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType, int64_t priority, attribution_reporting::FilterData filter_data, absl::optional<uint64_t> debug_key, @@ -107,7 +107,9 @@ return aggregatable_report_window_time_; } - AttributionSourceType source_type() const { return source_type_; } + attribution_reporting::mojom::SourceType source_type() const { + return source_type_; + } int64_t priority() const { return priority_; } @@ -143,7 +145,7 @@ base::Time expiry_time_; base::Time event_report_window_time_; base::Time aggregatable_report_window_time_; - AttributionSourceType source_type_; + attribution_reporting::mojom::SourceType source_type_; int64_t priority_; attribution_reporting::FilterData filter_data_; absl::optional<uint64_t> debug_key_;
diff --git a/content/browser/attribution_reporting/common_source_info_unittest.cc b/content/browser/attribution_reporting/common_source_info_unittest.cc index 030454ee..6bbe3956 100644 --- a/content/browser/attribution_reporting/common_source_info_unittest.cc +++ b/content/browser/attribution_reporting/common_source_info_unittest.cc
@@ -5,12 +5,15 @@ #include "content/browser/attribution_reporting/common_source_info.h" #include "base/time/time.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace content { +namespace { + +using ::attribution_reporting::mojom::SourceType; TEST(CommonSourceInfoTest, NoExpiryForImpression_DefaultUsed) { const base::Time source_time = base::Time::Now(); @@ -90,17 +93,16 @@ TEST(CommonSourceInfoTest, NonWholeDayImpressionExpirySpecified_Rounded) { const struct { - AttributionSourceType source_type; + SourceType source_type; base::TimeDelta declared_expiry; base::TimeDelta want_expiry; } kTestCases[] = { - {AttributionSourceType::kNavigation, base::Hours(36), base::Hours(36)}, - {AttributionSourceType::kEvent, base::Hours(36), base::Days(2)}, + {SourceType::kNavigation, base::Hours(36), base::Hours(36)}, + {SourceType::kEvent, base::Hours(36), base::Days(2)}, - {AttributionSourceType::kNavigation, - base::Days(1) + base::Milliseconds(1), + {SourceType::kNavigation, base::Days(1) + base::Milliseconds(1), base::Days(1) + base::Milliseconds(1)}, - {AttributionSourceType::kEvent, base::Days(1) + base::Milliseconds(1), + {SourceType::kEvent, base::Days(1) + base::Milliseconds(1), base::Days(1)}, }; @@ -136,4 +138,5 @@ CommonSourceInfo::GetReportWindowTime(declared_expiry, source_time)); } +} // namespace } // namespace content
diff --git a/content/browser/attribution_reporting/rate_limit_table_unittest.cc b/content/browser/attribution_reporting/rate_limit_table_unittest.cc index 75ac9e7..12167fd 100644 --- a/content/browser/attribution_reporting/rate_limit_table_unittest.cc +++ b/content/browser/attribution_reporting/rate_limit_table_unittest.cc
@@ -19,9 +19,9 @@ #include "base/functional/callback_helpers.h" #include "base/test/task_environment.h" #include "base/time/time.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" #include "content/browser/attribution_reporting/attribution_info.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/rate_limit_result.h" #include "content/browser/attribution_reporting/stored_source.h" @@ -350,14 +350,16 @@ const auto navigation_attribution = AttributionInfoBuilder( SourceBuilder() - .SetSourceType(AttributionSourceType::kNavigation) + .SetSourceType( + attribution_reporting::mojom::SourceType::kNavigation) .BuildStored()) .Build(); const auto event_attribution = - AttributionInfoBuilder(SourceBuilder() - .SetSourceType(AttributionSourceType::kEvent) - .BuildStored()) + AttributionInfoBuilder( + SourceBuilder() + .SetSourceType(attribution_reporting::mojom::SourceType::kEvent) + .BuildStored()) .Build(); ASSERT_EQ(RateLimitResult::kAllowed,
diff --git a/content/browser/attribution_reporting/storable_source.cc b/content/browser/attribution_reporting/storable_source.cc index aab93e7..4f9e5f1 100644 --- a/content/browser/attribution_reporting/storable_source.cc +++ b/content/browser/attribution_reporting/storable_source.cc
@@ -14,8 +14,8 @@ #include "components/attribution_reporting/aggregation_keys.h" #include "components/attribution_reporting/filters.h" #include "components/attribution_reporting/source_registration.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "components/attribution_reporting/suitable_origin.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "content/browser/attribution_reporting/attribution_utils.h" #include "content/browser/attribution_reporting/common_source_info.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -34,7 +34,7 @@ attribution_reporting::SourceRegistration reg, base::Time source_time, attribution_reporting::SuitableOrigin source_origin, - AttributionSourceType source_type, + attribution_reporting::mojom::SourceType source_type, bool is_within_fenced_frame) : registration_json_( SerializeAttributionJson(reg.ToJson(), /*pretty_print=*/true)),
diff --git a/content/browser/attribution_reporting/storable_source.h b/content/browser/attribution_reporting/storable_source.h index a464e9d..32e1a46 100644 --- a/content/browser/attribution_reporting/storable_source.h +++ b/content/browser/attribution_reporting/storable_source.h
@@ -7,7 +7,7 @@ #include <string> -#include "content/browser/attribution_reporting/attribution_source_type.h" +#include "components/attribution_reporting/source_type.mojom-forward.h" #include "content/browser/attribution_reporting/common_source_info.h" #include "content/browser/attribution_reporting/store_source_result.mojom.h" #include "content/common/content_export.h" @@ -38,7 +38,7 @@ attribution_reporting::SourceRegistration, base::Time source_time, attribution_reporting::SuitableOrigin source_origin, - AttributionSourceType, + attribution_reporting::mojom::SourceType, bool is_within_fenced_frame); ~StorableSource();
diff --git a/content/browser/attribution_reporting/storable_source_unittest.cc b/content/browser/attribution_reporting/storable_source_unittest.cc index 20333b7..073d535e 100644 --- a/content/browser/attribution_reporting/storable_source_unittest.cc +++ b/content/browser/attribution_reporting/storable_source_unittest.cc
@@ -8,8 +8,8 @@ #include "base/time/time.h" #include "components/attribution_reporting/source_registration.h" +#include "components/attribution_reporting/source_type.mojom.h" #include "components/attribution_reporting/suitable_origin.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" #include "net/base/schemeful_site.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -105,7 +105,7 @@ StorableSource actual(reporting_origin, std::move(reg), kSourceTime, *SuitableOrigin::Deserialize("https://source.test"), - AttributionSourceType::kNavigation, + attribution_reporting::mojom::SourceType::kNavigation, /*is_within_fenced_frame=*/false); EXPECT_EQ(actual.common_info().expiry_time(),
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index b6c922a..ac926583 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -20,6 +20,7 @@ #include "content/browser/back_forward_cache_browsertest.h" #include "content/browser/fenced_frame/fenced_frame.h" #include "content/browser/fenced_frame/fenced_frame_reporter.h" +#include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/navigation_entry_restore_context_impl.h" #include "content/browser/renderer_host/navigation_request.h" @@ -62,6 +63,7 @@ #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom.h" #include "third_party/blink/public/mojom/frame/frame.mojom-test-utils.h" #include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -4645,7 +4647,12 @@ ->GetURLLoaderFactoryForBrowserProcess(), AttributionDataHostManager::FromBrowserContext( web_contents()->GetBrowserContext()), - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, + PrivateAggregationManager::GetManager( + *web_contents()->GetBrowserContext()), + /*main_frame_origin=*/ + web_contents()->GetPrimaryMainFrame()->GetLastCommittedOrigin(), + /*winner_origin=*/url::Origin::Create(GURL("https://a.test"))); } // A helper function for specifying reportEvent tests. Each step consists of a @@ -6072,7 +6079,13 @@ ->GetURLLoaderFactoryForBrowserProcess(), AttributionDataHostManager::FromBrowserContext( web_contents()->GetBrowserContext()), - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, + static_cast<StoragePartitionImpl*>( + web_contents()->GetPrimaryMainFrame()->GetStoragePartition()) + ->GetPrivateAggregationManager(), + /*main_frame_origin=*/ + web_contents()->GetPrimaryMainFrame()->GetLastCommittedOrigin(), + /*winner_origin=*/url::Origin::Create(GURL("https://a.test"))); } void SendBasicRequest(GURL url) {
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc index 2cc8229..c3094d8 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter.cc +++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -4,12 +4,17 @@ #include "content/browser/fenced_frame/fenced_frame_reporter.h" +#include <iterator> +#include <map> #include <memory> +#include <set> #include <string> +#include <utility> #include <vector> #include "base/atomic_sequence_num.h" #include "base/check.h" +#include "base/check_op.h" #include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/memory/ref_counted.h" @@ -23,8 +28,12 @@ #include "content/browser/attribution_reporting/attribution_data_host_manager.h" #include "content/browser/attribution_reporting/attribution_host.h" #include "content/browser/attribution_reporting/attribution_manager.h" +#include "content/browser/private_aggregation/private_aggregation_budget_key.h" +#include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/public/browser/web_contents.h" +#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/http/http_response_headers.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/redirect_info.h" @@ -159,21 +168,12 @@ FencedFrameReporter::ReportingDestinationInfo::operator=( ReportingDestinationInfo&&) = default; -FencedFrameReporter::FencedFrameReporter( - base::PassKey<FencedFrameReporter> pass_key, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - AttributionDataHostManager* attribution_data_host_manager) - : url_loader_factory_(std::move(url_loader_factory)), - attribution_data_host_manager_(attribution_data_host_manager) { - DCHECK(url_loader_factory_); -} - -FencedFrameReporter::~FencedFrameReporter() = default; - scoped_refptr<FencedFrameReporter> FencedFrameReporter::CreateForSharedStorage( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, AttributionDataHostManager* attribution_data_host_manager, ReportingUrlMap reporting_url_map) { + // `private_aggregation_manager_`, `main_frame_origin_`, and `winner_origin_` + // are only needed by FLEDGE. scoped_refptr<FencedFrameReporter> reporter = base::MakeRefCounted<FencedFrameReporter>( base::PassKey<FencedFrameReporter>(), std::move(url_loader_factory), @@ -187,11 +187,15 @@ scoped_refptr<FencedFrameReporter> FencedFrameReporter::CreateForFledge( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, AttributionDataHostManager* attribution_data_host_manager, - bool direct_seller_is_seller) { + bool direct_seller_is_seller, + PrivateAggregationManager* private_aggregation_manager, + const url::Origin& main_frame_origin, + const url::Origin& winner_origin) { scoped_refptr<FencedFrameReporter> reporter = base::MakeRefCounted<FencedFrameReporter>( base::PassKey<FencedFrameReporter>(), std::move(url_loader_factory), - attribution_data_host_manager); + attribution_data_host_manager, private_aggregation_manager, + main_frame_origin, winner_origin); reporter->direct_seller_is_seller_ = direct_seller_is_seller; reporter->reporting_metadata_.emplace( blink::FencedFrame::ReportingDestination::kBuyer, @@ -205,6 +209,26 @@ return reporter; } +FencedFrameReporter::FencedFrameReporter( + base::PassKey<FencedFrameReporter> pass_key, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + AttributionDataHostManager* attribution_data_host_manager, + PrivateAggregationManager* private_aggregation_manager, + const absl::optional<url::Origin>& main_frame_origin, + const absl::optional<url::Origin>& winner_origin) + : url_loader_factory_(std::move(url_loader_factory)), + attribution_data_host_manager_(attribution_data_host_manager), + private_aggregation_manager_(private_aggregation_manager), + main_frame_origin_(main_frame_origin), + winner_origin_(winner_origin) { + DCHECK(url_loader_factory_); + // These should both be nullopt for non-FLEDGE fenced frames, and populated + // for FLEDGE fenced frames. + DCHECK_EQ(main_frame_origin_.has_value(), winner_origin_.has_value()); +} + +FencedFrameReporter::~FencedFrameReporter() = default; + void FencedFrameReporter::OnUrlMappingReady( blink::FencedFrame::ReportingDestination reporting_destination, ReportingUrlMap reporting_url_map) { @@ -407,6 +431,92 @@ return true; } +void FencedFrameReporter::OnForEventPrivateAggregationRequestsReceived( + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map) { + MaybeBindPrivateAggregationHost(); + + for (auto& [event_type, requests] : private_aggregation_event_map) { + PrivateAggregationRequests& destination_vector = + private_aggregation_event_map_[event_type]; + destination_vector.insert(destination_vector.end(), + std::move_iterator(requests.begin()), + std::move_iterator(requests.end())); + } + + for (const std::string& pa_event_type : received_pa_events_) { + SendPrivateAggregationRequestsForEventInternal(pa_event_type); + } +} + +void FencedFrameReporter::SendPrivateAggregationRequestsForEvent( + const std::string& pa_event_type) { + if (!private_aggregation_manager_) { + // `private_aggregation_manager_` is nullptr when private aggregation + // feature flag is disabled, but a compromised renderer might still send + // events when it should not be able to. Simply ignores the events. + return; + } + MaybeBindPrivateAggregationHost(); + + // Always insert `pa_event_type` to `received_pa_events_`, since + // `private_aggregation_event_map_` might grow with more entries when + // reportWin() completes. + received_pa_events_.emplace(pa_event_type); + + SendPrivateAggregationRequestsForEventInternal(pa_event_type); +} + +void FencedFrameReporter::SendPrivateAggregationRequestsForEventInternal( + const std::string& pa_event_type) { + DCHECK(private_aggregation_host_.is_bound()); + + auto it = private_aggregation_event_map_.find(pa_event_type); + if (it == private_aggregation_event_map_.end()) { + return; + } + + // Send PA requests of `pa_event_type`. + for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : + it->second) { + DCHECK(request); + // All for-event contributions have already been converted to histogram + // contributions by filling in post auction signals before reaching here. + DCHECK(request->contribution->is_histogram_contribution()); + std::vector<mojom::AggregatableReportHistogramContributionPtr> + contributions; + contributions.push_back( + std::move(request->contribution->get_histogram_contribution())); + private_aggregation_host_->SendHistogramReport( + std::move(contributions), request->aggregation_mode, + std::move(request->debug_mode_details)); + } + + // Remove the entry of key `pa_event_type` from + // `private_aggregation_event_map_` to avoid possibly sending the same + // requests more than once. As a result, receiving the same event type + // multiple times only triggers sending the event's requests once. + private_aggregation_event_map_.erase(it); +} + +void FencedFrameReporter::MaybeBindPrivateAggregationHost() { + if (private_aggregation_host_.is_bound()) { + return; + } + DCHECK(private_aggregation_manager_); + DCHECK(winner_origin_.has_value() && + winner_origin_.value().scheme() == url::kHttpsScheme); + DCHECK(main_frame_origin_.has_value() && + main_frame_origin_.value().scheme() == url::kHttpsScheme); + bool bound = private_aggregation_manager_->BindNewReceiver( + winner_origin_.value(), main_frame_origin_.value(), + PrivateAggregationBudgetKey::Api::kFledge, + private_aggregation_host_.BindNewPipeAndPassReceiver()); + // FLEDGE's worklets should all be trustworthy, including `winner_origin_`, so + // the receiver `private_aggregation_host_` should be accepted. + DCHECK(bound); +} + void FencedFrameReporter::UpdateAutomaticBeaconData( const std::string& event_data, const std::vector<blink::FencedFrame::ReportingDestination>& destination) { @@ -426,4 +536,20 @@ return out; } +std::set<std::string> FencedFrameReporter::GetReceivedPaEventsForTesting() { + return received_pa_events_; +} + +std::map<std::string, FencedFrameReporter::PrivateAggregationRequests> +FencedFrameReporter::GetPrivateAggregationEventMapForTesting() { + std::map<std::string, FencedFrameReporter::PrivateAggregationRequests> out; + for (auto& [event_type, requests] : private_aggregation_event_map_) { + for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : + requests) { + out[event_type].emplace_back(request.Clone()); + } + } + return out; +} + } // namespace content
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.h b/content/browser/fenced_frame/fenced_frame_reporter.h index ef214c3..4e09cf7 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter.h +++ b/content/browser/fenced_frame/fenced_frame_reporter.h
@@ -5,14 +5,21 @@ #ifndef CONTENT_BROWSER_FENCED_FRAME_FENCED_FRAME_REPORTER_H_ #define CONTENT_BROWSER_FENCED_FRAME_FENCED_FRAME_REPORTER_H_ +#include <map> +#include <set> #include <string> +#include <vector> #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/types/pass_key.h" #include "content/browser/attribution_reporting/attribution_beacon_id.h" #include "content/common/content_export.h" +#include "content/common/private_aggregation_host.mojom.h" +#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" @@ -22,6 +29,7 @@ namespace content { class AttributionDataHostManager; +class PrivateAggregationManager; class RenderFrameHostImpl; struct CONTENT_EXPORT AutomaticBeaconInfo { @@ -50,10 +58,8 @@ public: using ReportingUrlMap = base::flat_map<std::string, GURL>; - FencedFrameReporter( - base::PassKey<FencedFrameReporter> pass_key, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - AttributionDataHostManager* attribution_data_host_manager); + using PrivateAggregationRequests = + std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr>; // Creates a FencedFrameReporter that only maps kSharedStorageSelectUrl // destinations, using the passed in map. @@ -72,12 +78,37 @@ // the corresponding mappings are passed in via OnUrlMappingReady(). // // `url_loader_factory` is used to send all reports, and must not be null. + // // `attribution_data_host_manager` is used to notify Attribution Reporting API // for the beacons. + // + // `private_aggregation_manager` is used to send private aggregation requests + // for fenced frame events. See comment above declaration of + // `private_aggregation_manager_` for more details. + // + // `main_frame_origin` is the main frame of the page where the auction is + // running. Can be an opaque origin in test iff the test does not have for + // event private aggregation requests. + // + // `winner_origin` is the winning buyer's origin. Can be an opaque origin in + // test iff the test does not have for event private aggregation requests. static scoped_refptr<FencedFrameReporter> CreateForFledge( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, AttributionDataHostManager* attribution_data_host_manager, - bool direct_seller_is_seller); + bool direct_seller_is_seller, + PrivateAggregationManager* private_aggregation_manager, + const url::Origin& main_frame_origin, + const url::Origin& winner_origin); + + // Don't use this constructor directly, but use factory methods instead. + // See factory methods for details. + FencedFrameReporter( + base::PassKey<FencedFrameReporter> pass_key, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + AttributionDataHostManager* attribution_data_host_manager, + PrivateAggregationManager* private_aggregation_manager = nullptr, + const absl::optional<url::Origin>& main_frame_origin = absl::nullopt, + const absl::optional<url::Origin>& winner_origin = absl::nullopt); // Called when a mapping for reports of type `reporting_destination` is ready. // The reporter must currently be considering maps of type @@ -134,6 +165,28 @@ std::string& error_message, absl::optional<int64_t> navigation_id = absl::nullopt); + // Called when a mapping for private aggregation requests of non-reserved + // event types is received. Currently it is only called inside + // `InterestGroupAuctionReporter::SendPendingReportsIfNavigated()`, which is + // called after any of the following: + // * the winning ad has been navigated to. + // * reportWin() completes. + // * reportResult() completes. + // The first two cases can have non-empty `private_aggregation_event_map`. + // When invoked, any pending non-reserved event type will trigger sending + // corresponding private aggregation request in + // `private_aggregation_event_map` if it has a matching key. Any future + // reports of that type will be immediately sent using the provided map. + void OnForEventPrivateAggregationRequestsReceived( + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map); + + // Uses `pa_event_type` to send a private aggregation request. The + // non-reserved PA event type is added to `received_pa_events_` because more + // private aggregation requests associated with this event may be received and + // need to be sent after this is called. + void SendPrivateAggregationRequestsForEvent(const std::string& pa_event_type); + // Stores the payload that will be sent as part of the // `reserved.top_navigation` automatic beacon. void UpdateAutomaticBeaconData( @@ -147,6 +200,15 @@ base::flat_map<blink::FencedFrame::ReportingDestination, ReportingUrlMap> GetAdBeaconMapForTesting(); + // Returns `received_pa_events_`, so that it can be validated in tests. Should + // only be called from tests. + std::set<std::string> GetReceivedPaEventsForTesting(); + + // Returns a copy of `private_aggregation_event_map_`, so that it can be + // validated in tests. Should only be called from tests. + std::map<std::string, PrivateAggregationRequests> + GetPrivateAggregationEventMapForTesting(); + const absl::optional<AutomaticBeaconInfo>& automatic_beacon_info() { return automatic_beacon_info_; } @@ -207,6 +269,16 @@ BeaconId beacon_id, std::string& error_message); + // Helper to send private aggregation requests in + // `private_aggregation_event_map_` with key `pa_event_type`. + void SendPrivateAggregationRequestsForEventInternal( + const std::string& pa_event_type); + + // Binds a receiver to `private_aggregation_manager_`. Binds Remote + // `private_aggregation_host_` and connects it to the receiver, if it has not + // been bound. + void MaybeBindPrivateAggregationHost(); + // Used by FencedFrameURLMappingTestPeer. const base::flat_map<blink::FencedFrame::ReportingDestination, ReportingDestinationInfo>& @@ -218,7 +290,7 @@ // Bound to the lifetime of the browser context. Could be null in Incognito // mode or in test. - raw_ptr<AttributionDataHostManager> attribution_data_host_manager_; + const raw_ptr<AttributionDataHostManager> attribution_data_host_manager_; base::flat_map<blink::FencedFrame::ReportingDestination, ReportingDestinationInfo> @@ -228,6 +300,33 @@ // it maps to the "ComponentSeller" destination. bool direct_seller_is_seller_ = false; + // Bound to the lifetime of the browser context. Can be nullptr if: + // * It's for non-FLEDGE reporter. + // * In tests that does not trigger private aggregation reports. + // * When feature `kPrivateAggregationApi` is not enabled. + const raw_ptr<PrivateAggregationManager> private_aggregation_manager_; + + // The main frame of the page where the auction is running. Set to + // absl::nullopt for non-FLEDGE reporter. + const absl::optional<url::Origin> main_frame_origin_; + + // The winning buyer's origin. Set to absl::nullopt for non-FLEDGE reporter. + const absl::optional<url::Origin> winner_origin_; + + // Private aggregation requests for non-reserved event types registered in + // bidder worklets, keyed by event type. + // OnForEventPrivateAggregationRequestsReceived() builds this map up. + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map_; + + // Fenced frame events for private aggregation API. An event is not removed + // from the set even after corresponding non-reserved private aggregation + // requests are sent, because more requests associated with this event might + // be received and need to be sent later. + std::set<std::string> received_pa_events_; + + mojo::Remote<mojom::PrivateAggregationHost> private_aggregation_host_; + // Stores data registered by one of the documents in a FencedFrame using // the `Fence.setReportEventDataForAutomaticBeacons` API. //
diff --git a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc index 73d76a9..18f2298c 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc
@@ -4,16 +4,23 @@ #include "content/browser/fenced_frame/fenced_frame_reporter.h" +#include <functional> +#include <map> #include <string> +#include <type_traits> +#include <utility> #include "base/memory/scoped_refptr.h" #include "base/strings/string_piece.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" #include "content/browser/attribution_reporting/attribution_manager.h" +#include "content/browser/interest_group/test_interest_group_private_aggregation_manager.h" #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/browser/storage_partition_impl.h" +#include "content/common/aggregatable_report.mojom.h" #include "content/public/browser/browser_context.h" #include "content/public/test/test_renderer_host.h" +#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" #include "net/base/isolation_info.h" #include "net/base/network_isolation_key.h" #include "net/http/http_request_headers.h" @@ -22,12 +29,52 @@ #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_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/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" #include "url/gurl.h" #include "url/origin.h" namespace content { +namespace { + +using PrivateAggregationRequests = + FencedFrameReporter::PrivateAggregationRequests; + +const auction_worklet::mojom::PrivateAggregationRequestPtr + kPrivateAggregationRequest = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewHistogramContribution( + content::mojom::AggregatableReportHistogramContribution:: + New( + /*bucket=*/1, + /*value=*/2)), + content::mojom::AggregationServiceMode::kDefault, + content::mojom::DebugModeDetails::New()); + +const auction_worklet::mojom::PrivateAggregationRequestPtr + kPrivateAggregationRequest2 = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewHistogramContribution( + content::mojom::AggregatableReportHistogramContribution:: + New( + /*bucket=*/3, + /*value=*/4)), + content::mojom::AggregationServiceMode::kDefault, + content::mojom::DebugModeDetails::New()); + +// Helper to avoid excess boilerplate. +template <typename... Ts> +auto ElementsAreRequests(Ts&... requests) { + static_assert( + std::conjunction<std::is_same< + std::remove_const_t<Ts>, + auction_worklet::mojom::PrivateAggregationRequestPtr>...>::value); + // Need to use `std::ref` as `mojo::StructPtr`s are move-only. + return testing::UnorderedElementsAre(testing::Eq(std::ref(requests))...); +} class FencedFrameReporterTest : public RenderViewHostTestHarness { public: @@ -84,10 +131,18 @@ } network::TestURLLoaderFactory test_url_loader_factory_; + const GURL request_initiator_{"https://initiator.test/"}; const GURL report_destination_{"https://report_destination.test"}; const GURL report_destination2_{"https://report_destination2.test"}; const GURL report_destination3_{"https://report_destination3.test"}; + const url::Origin main_frame_origin_ = + url::Origin::Create(request_initiator_); + const url::Origin report_destination_origin_ = + url::Origin::Create(report_destination_); + + TestInterestGroupPrivateAggregationManager private_aggregation_manager_{ + main_frame_origin_}; }; // ReportingDestination has no map. @@ -130,7 +185,9 @@ // A FLEDGE FencedFrameReporter has no map for Shared Storage. reporter = FencedFrameReporter::CreateForFledge( shared_url_loader_factory(), attribution_data_host_manager(), - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); EXPECT_FALSE(reporter->SendReport( "event_type", "event_data", blink::FencedFrame::ReportingDestination::kSharedStorageSelectUrl, @@ -253,9 +310,11 @@ // SendReport() calls. TEST_F(FencedFrameReporterTest, SendFledgeReportsAfterMapsReceived) { scoped_refptr<FencedFrameReporter> reporter = - FencedFrameReporter::CreateForFledge(shared_url_loader_factory(), - attribution_data_host_manager(), - /*direct_seller_is_seller=*/false); + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/false, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); // Receive all mappings. reporter->OnUrlMappingReady( @@ -309,9 +368,11 @@ // SendReport() calls. TEST_F(FencedFrameReporterTest, SendReportsFledgeBeforeMapsReceived) { scoped_refptr<FencedFrameReporter> reporter = - FencedFrameReporter::CreateForFledge(shared_url_loader_factory(), - attribution_data_host_manager(), - /*direct_seller_is_seller=*/true); + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/true, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); // Make reports. They should be queued, since mappings haven't been received // yet. @@ -369,9 +430,11 @@ // because there's nowhere to pass them TEST_F(FencedFrameReporterTest, SendFledgeReportsBeforeMapsReceivedWithErrors) { scoped_refptr<FencedFrameReporter> reporter = - FencedFrameReporter::CreateForFledge(shared_url_loader_factory(), - attribution_data_host_manager(), - /*direct_seller_is_seller=*/false); + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/false, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); // SendReport() is called, and then a mapping is received that doesn't have // the report's event type. No request should be made. @@ -408,6 +471,199 @@ EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); } +// Test sending non-reserved private aggregation requests, when events from +// fenced frame is received after FLEDGE non-reserved PA requests are ready. +TEST_F(FencedFrameReporterTest, FledgeEventsReceivedAfterRequestsReady) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + scoped_refptr<FencedFrameReporter> reporter = + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/false, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); + + // Receive all non-reserved private aggregation requests. + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map; + private_aggregation_event_map["event_type"].push_back( + kPrivateAggregationRequest.Clone()); + private_aggregation_event_map["event_type2"].push_back( + kPrivateAggregationRequest2.Clone()); + + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map2; + private_aggregation_event_map2["event_type"].push_back( + kPrivateAggregationRequest2.Clone()); + private_aggregation_event_map2["event_type3"].push_back( + kPrivateAggregationRequest2.Clone()); + + reporter->OnForEventPrivateAggregationRequestsReceived( + std::move(private_aggregation_event_map)); + reporter->OnForEventPrivateAggregationRequestsReceived( + std::move(private_aggregation_event_map2)); + // Reporter received private_aggregation_event_map. + EXPECT_THAT( + reporter->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre( + testing::Pair("event_type", + ElementsAreRequests(kPrivateAggregationRequest, + kPrivateAggregationRequest2)), + testing::Pair("event_type2", + ElementsAreRequests(kPrivateAggregationRequest2)), + testing::Pair("event_type3", + ElementsAreRequests(kPrivateAggregationRequest2)))); + // No event received from fenced frame yet, so no PA request gets sent. + EXPECT_TRUE( + private_aggregation_manager_.TakePrivateAggregationRequests().empty()); + + // Each call to SendPrivateAggregationRequestsForEvent() should send + // corresponding PA requests immediately, and the entry for the event type + // should be removed from reporter's private_aggregation_event_map. + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + report_destination_origin_, + ElementsAreRequests(kPrivateAggregationRequest, + kPrivateAggregationRequest2)))); + EXPECT_THAT( + reporter->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre( + testing::Pair("event_type2", + ElementsAreRequests(kPrivateAggregationRequest2)), + testing::Pair("event_type3", + ElementsAreRequests(kPrivateAggregationRequest2)))); + + reporter->SendPrivateAggregationRequestsForEvent("event_type2"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + report_destination_origin_, + ElementsAreRequests(kPrivateAggregationRequest2)))); + EXPECT_THAT( + reporter->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre(testing::Pair( + "event_type3", ElementsAreRequests(kPrivateAggregationRequest2)))); + + // Private aggregation requests for "event_type" has already been sent and + // cleared, so no more such requests for the type to send when receiving it + // again. + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre()); + + // No private aggregation requests for "event_type4", so there's no effect + // when "event_type4" is received. + reporter->SendPrivateAggregationRequestsForEvent("event_type4"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre()); +} + +// Test sending non-reserved private aggregation requests, when events from +// fenced frame is received before FLEDGE non-reserved PA requests are ready. +TEST_F(FencedFrameReporterTest, FledgeEventsReceivedBeforeRequestsReady) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + scoped_refptr<FencedFrameReporter> reporter = + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/false, &private_aggregation_manager_, + main_frame_origin_, + /*winner_origin=*/report_destination_origin_); + + // Calls SendPrivateAggregationRequestsForEvent() with event types. The event + // types should be queued, since non-reserved private aggregation requests + // haven't been received yet. + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + reporter->SendPrivateAggregationRequestsForEvent("event_type3"); + // ReceivedPaEvents is a std::set, so duplicate event types are only stored + // once. + EXPECT_THAT(reporter->GetReceivedPaEventsForTesting(), + testing::UnorderedElementsAre("event_type", "event_type3")); + EXPECT_TRUE( + private_aggregation_manager_.TakePrivateAggregationRequests().empty()); + + // Receive all non-reserved private aggregation requests. + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map; + private_aggregation_event_map["event_type"].push_back( + kPrivateAggregationRequest.Clone()); + private_aggregation_event_map["event_type2"].push_back( + kPrivateAggregationRequest2.Clone()); + + reporter->OnForEventPrivateAggregationRequestsReceived( + std::move(private_aggregation_event_map)); + + // `received_pa_events_` is kept, in case needed for new private aggregation + // requests from reportWin(). + EXPECT_THAT(reporter->GetReceivedPaEventsForTesting(), + testing::UnorderedElementsAre("event_type", "event_type3")); + // All pending pa events' PA requests in private_aggregation_event_map should + // be sent after private_aggregation_event_map is ready. + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + report_destination_origin_, + ElementsAreRequests(kPrivateAggregationRequest)))); + + // Calling SendPrivateAggregationRequestsForEvent() should send + // corresponding PA requests immediately. + reporter->SendPrivateAggregationRequestsForEvent("event_type2"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + report_destination_origin_, + ElementsAreRequests(kPrivateAggregationRequest2)))); + // Although requests for "event_type2" are sent immediately, still store + // "event_type2" in reporter's `received_pa_events_`, so that further + // received PA requests of the type can still be triggered. + EXPECT_THAT(reporter->GetReceivedPaEventsForTesting(), + testing::UnorderedElementsAre("event_type", "event_type3", + "event_type2")); + + // Private aggregation requests for "event_type" has already been sent and + // cleared, so no more such requests for the type to sends. + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre()); + + // Receive more non-reserved private aggregation requests. It happens when + // reportWin() completes and then + // OnForEventPrivateAggregationRequestsReceived() is called. + std::map<std::string, PrivateAggregationRequests> + private_aggregation_event_map2; + private_aggregation_event_map2["event_type"].push_back( + kPrivateAggregationRequest2.Clone()); + private_aggregation_event_map2["event_type2"].push_back( + kPrivateAggregationRequest.Clone()); + + reporter->OnForEventPrivateAggregationRequestsReceived( + std::move(private_aggregation_event_map2)); + + // Requests for both event types are sent immediately since there were such + // pending PA events. + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + report_destination_origin_, + ElementsAreRequests(kPrivateAggregationRequest, + kPrivateAggregationRequest2)))); +} + +// FencedFrameReporter's `private_aggregation_manager` is nullptr but fenced +// frame sends events unexpectedly. This could happen if the renderer is +// compromised. Should just ignore the events. +TEST_F(FencedFrameReporterTest, FledgeEventsReceivedUnexpectedly) { + scoped_refptr<FencedFrameReporter> reporter = + FencedFrameReporter::CreateForFledge( + shared_url_loader_factory(), attribution_data_host_manager(), + /*direct_seller_is_seller=*/false, + /*private_aggregation_manager=*/nullptr, main_frame_origin_, + /*winner_origin=*/report_destination_origin_); + + // Calls SendPrivateAggregationRequestsForEvent() with "event_type". + // "event_type" should be ignored and not be queued. + reporter->SendPrivateAggregationRequestsForEvent("event_type"); + EXPECT_TRUE(reporter->GetReceivedPaEventsForTesting().empty()); + EXPECT_TRUE( + private_aggregation_manager_.TakePrivateAggregationRequests().empty()); +} + TEST_F(FencedFrameReporterTest, AttributionManagerShutDown_NoCrash) { EXPECT_TRUE(attribution_data_host_manager()); @@ -435,4 +691,5 @@ report_destination_.spec(), "")); } +} // namespace } // namespace content
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 f2ab774..22112da 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
@@ -18,6 +18,7 @@ #include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h" #include "third_party/blink/public/common/interest_group/ad_auction_constants.h" #include "url/gurl.h" +#include "url/origin.h" #include "url/url_constants.h" namespace content { @@ -128,7 +129,10 @@ return FencedFrameReporter::CreateForFledge( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(nullptr), /*attribution_data_host_manager=*/nullptr, - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, + /*private_aggregation_manager=*/nullptr, + /*main_frame_origin=*/url::Origin(), + /*winner_origin=*/url::Origin()); } } // namespace
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 bf5ae26d..bab080f 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 "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" #include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom.h" +#include "url/origin.h" namespace content { @@ -513,7 +514,10 @@ properties.fenced_frame_reporter_ = FencedFrameReporter::CreateForFledge( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(nullptr), /*attribution_data_host_manager=*/nullptr, - /*direct_seller_is_seller=*/false); + /*direct_seller_is_seller=*/false, + /*private_aggregation_manager=*/nullptr, + /*main_frame_origin=*/url::Origin(), + /*winner_origin=*/url::Origin()); input_properties = properties.RedactFor(FencedFrameEntity::kEmbedder); EXPECT_TRUE(input_properties.has_fenced_frame_reporting()); mojo::test::SerializeAndDeserialize<blink::mojom::FencedFrameProperties>(
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 2513d9d2..7ce4efe 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -241,6 +241,12 @@ gpu_info.machine_model_name)); basic_info.Append(display::BuildGpuInfoEntry("Machine model version", gpu_info.machine_model_version)); + basic_info.Append(display::BuildGpuInfoEntry("GL implementation", + gpu_info.gl_implementation)); + basic_info.Append(display::BuildGpuInfoEntry("ANGLE implementation", + gpu_info.angle_implementation)); + basic_info.Append( + display::BuildGpuInfoEntry("Display type", gpu_info.display_type)); basic_info.Append( display::BuildGpuInfoEntry("GL_VENDOR", gpu_info.gl_vendor)); basic_info.Append(
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc index 4bd98af..540d5123 100644 --- a/content/browser/interest_group/auction_runner.cc +++ b/content/browser/interest_group/auction_runner.cc
@@ -341,7 +341,7 @@ DCHECK(callback_); blink::InterestGroupSet interest_groups_that_bid; - auction_.GetInterestGroupsThatBid(interest_groups_that_bid); + auction_.GetInterestGroupsThatBidAndReportBidCounts(interest_groups_that_bid); if (!success) { FailAuction(/*manually_aborted=*/false, std::move(interest_groups_that_bid));
diff --git a/content/browser/interest_group/auction_runner.h b/content/browser/interest_group/auction_runner.h index 399875b..3ba417d14 100644 --- a/content/browser/interest_group/auction_runner.h +++ b/content/browser/interest_group/auction_runner.h
@@ -105,10 +105,9 @@ // Incognito mode or in test. // // `log_private_aggregation_requests_callback` will be invoked with private - // aggregation - // requests before they're uploaded, allowing them to be logged. It may be - // invoked multiple times. It may be invoked ether directly by AuctionRunner - // (when an auction has no winner) or by the returned + // aggregation requests before they're uploaded, allowing them to be logged. + // It may be invoked multiple times. It may be invoked ether directly by + // AuctionRunner (when an auction has no winner) or by the returned // InterestGroupAuctionReporter (when an auction has a winner). It will never // be passed an empty set of pending reports. // @@ -116,8 +115,7 @@ // the renderer in order to initiate the auction. // // `main_frame_origin` is the origin of the main frame where the auction is - // running. Used for - // issuing reports. + // running. Used for issuing reports. // // `frame_origin` is the origin of the frame running the auction. Used for // issuing reports.
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 08bf78c..544c219 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -1137,7 +1137,7 @@ FencedFrameReporter::ReportingUrlMap> ad_beacon_map; std::map<std::string, PrivateAggregationRequests> - private_aggregation_requests_non_reserved; + private_aggregation_event_map; std::vector<blink::InterestGroupKey> interest_groups_that_bid; std::vector<std::string> errors; @@ -1532,8 +1532,9 @@ result_.debug_win_report_urls = interest_group_manager_->TakeReportUrlsOfType( InterestGroupManagerImpl::ReportType::kDebugWin); - result_.private_aggregation_requests_non_reserved = - reporter_->TakeNonReservedPrivateAggregationRequests(); + result_.private_aggregation_event_map = + reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting(); result_.interest_groups_that_bid = interest_group_manager_->TakeInterestGroupsThatBid(); const auto& report_errors = reporter_->errors(); @@ -1677,12 +1678,22 @@ // // `bidders` All interest groups that will bid in the auction. // - // `trusted_fetch_durations` For each interest group, the trusted fetch + // `trusted_fetch_latency` For each interest group, the trusted fetch // duration that should be returned from the mock worklet. + // + // `bidding_latency` For each interest group, the bidding duration that + // should be returned from the mock worklet. + // + // `should_bid` For each worklet, true indicates that a bid should be + // generated, and false indicates that a null bid should be returned. void RunExtendedPABuyersAuction( const std::vector<StorageInterestGroup>& bidders, - const std::vector<base::TimeDelta> trusted_fetch_durations) { - ASSERT_EQ(bidders.size(), trusted_fetch_durations.size()); + const std::vector<base::TimeDelta> trusted_fetch_latency, + const std::vector<base::TimeDelta> bidding_latency = {base::TimeDelta()}, + const std::vector<bool> should_bid = {true}) { + ASSERT_EQ(bidders.size(), trusted_fetch_latency.size()); + ASSERT_EQ(bidders.size(), bidding_latency.size()); + ASSERT_EQ(bidders.size(), should_bid.size()); UseMockWorkletService(); StartAuction(kSellerUrl, bidders); mock_auction_process_manager_->WaitForWorklets( @@ -1695,23 +1706,31 @@ *bidders[i].interest_group.bidding_url); ASSERT_TRUE(bidder_worklet); - bidder_worklet->SetBidderTrustedSignalsFetchDuration( - trusted_fetch_durations[i]); - bidder_worklet->InvokeGenerateBidCallback(/*bid=*/1, - GURL("https://ad1.com/")); - auto score_ad_params = seller_worklet->WaitForScoreAd(); - mojo::Remote<auction_worklet::mojom::ScoreAdClient>( - std::move(score_ad_params.score_ad_client)) - ->OnScoreAdComplete( - /*score=*/1, - /*reject_reason=*/ - auction_worklet::mojom::RejectReason::kNotAvailable, - auction_worklet::mojom::ComponentAuctionModifiedBidParamsPtr(), - /*scoring_signals_data_version=*/0, - /*has_scoring_signals_data_version=*/false, - /*debug_loss_report_url=*/absl::nullopt, - /*debug_win_report_url=*/absl::nullopt, /*pa_requests=*/{}, - /*errors=*/{}); + if (!trusted_fetch_latency[i].is_zero()) { + bidder_worklet->SetBidderTrustedSignalsFetchLatency( + trusted_fetch_latency[i]); + } + if (!bidding_latency[i].is_zero()) { + bidder_worklet->SetBiddingLatency(bidding_latency[i]); + } + bidder_worklet->InvokeGenerateBidCallback( + /*bid=*/should_bid[i] ? absl::make_optional(1) : absl::nullopt, + GURL("https://ad1.com/")); + if (should_bid[i]) { + auto score_ad_params = seller_worklet->WaitForScoreAd(); + mojo::Remote<auction_worklet::mojom::ScoreAdClient>( + std::move(score_ad_params.score_ad_client)) + ->OnScoreAdComplete( + /*score=*/1, + /*reject_reason=*/ + auction_worklet::mojom::RejectReason::kNotAvailable, + auction_worklet::mojom::ComponentAuctionModifiedBidParamsPtr(), + /*scoring_signals_data_version=*/0, + /*has_scoring_signals_data_version=*/false, + /*debug_loss_report_url=*/absl::nullopt, + /*debug_win_report_url=*/absl::nullopt, /*pa_requests=*/{}, + /*errors=*/{}); + } } // Need to flush the service pipe to make sure the AuctionRunner has @@ -2482,7 +2501,7 @@ kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - res.private_aggregation_requests_non_reserved, + res.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -2678,9 +2697,8 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); - EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -2768,7 +2786,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -2851,7 +2869,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -2916,7 +2934,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3096,7 +3114,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3231,7 +3249,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3583,7 +3601,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3614,7 +3632,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kNoInterestGroups, @@ -3681,7 +3699,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3722,7 +3740,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kNoInterestGroups, @@ -3786,7 +3804,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3898,7 +3916,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -3981,7 +3999,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4057,7 +4075,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4101,7 +4119,7 @@ EXPECT_TRUE(res.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(res.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(res.private_aggregation_event_map.empty()); EXPECT_THAT(res.interest_groups_that_bid, testing::UnorderedElementsAre()); EXPECT_THAT(res.errors, testing::UnorderedElementsAre( @@ -4142,7 +4160,7 @@ EXPECT_TRUE(res.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(res.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(res.private_aggregation_event_map.empty()); EXPECT_THAT(res.interest_groups_that_bid, testing::UnorderedElementsAre()); EXPECT_THAT( res.errors, @@ -4198,7 +4216,7 @@ testing::Pair(kBidder2, ElementsAreRequests( kExpectedGenerateBidPrivateAggregationRequest)))); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key, kBidder2Key)); EXPECT_THAT(res.errors, testing::UnorderedElementsAre( @@ -4275,7 +4293,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4303,7 +4321,7 @@ EXPECT_TRUE(res.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(res.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(res.private_aggregation_event_map.empty()); EXPECT_EQ(0, url_loader_factory_.NumPending()); EXPECT_THAT(res.interest_groups_that_bid, testing::UnorderedElementsAre()); @@ -4376,7 +4394,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4453,7 +4471,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4540,7 +4558,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4617,7 +4635,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); - EXPECT_THAT(result_.private_aggregation_requests_non_reserved, + EXPECT_THAT(result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests(BuildPrivateAggregationRequest( /*bucket=*/10, /*value=*/22))))); @@ -4684,10 +4702,11 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); - EXPECT_THAT(result_.private_aggregation_requests_non_reserved, + EXPECT_THAT(result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests(BuildPrivateAggregationRequest( /*bucket=*/10, /*value=*/22))))); + EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key, kBidder2Key)); EXPECT_EQ(R"({"render_url":"https://ad2.com/"})", @@ -4754,7 +4773,7 @@ // ReportWin script override doesn't send a report. kExpectedGenerateBidPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -4903,12 +4922,13 @@ ElementsAreRequests( kExpectedGenerateBidPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( BuildPrivateAggregationRequest(/*bucket=*/10, /*value=*/21), BuildPrivateAggregationRequest(/*bucket=*/30, /*value=*/41))))); + EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key, kBidder2Key)); EXPECT_EQ(R"({"render_url":"https://ad1.com/","metadata":{"ads": true}})", @@ -6358,7 +6378,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests(BuildPrivateAggregationRequest( /*bucket=*/10, /*value=*/22), @@ -6563,7 +6583,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests(BuildPrivateAggregationRequest( /*bucket=*/10, /*value=*/22), @@ -6737,7 +6757,7 @@ kExpectedScoreAdPrivateAggregationRequest, kExpectedReportResultPrivateAggregationRequest)))); EXPECT_THAT( - result_.private_aggregation_requests_non_reserved, + result_.private_aggregation_event_map, testing::UnorderedElementsAre(testing::Pair( "click", ElementsAreRequests( @@ -6936,7 +6956,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); } TEST_F(AuctionRunnerTest, AllBiddersCrashBeforeBidding) { @@ -6994,7 +7014,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); @@ -7101,7 +7121,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder2Key)); EXPECT_EQ(R"({"render_url":"https://ad2.com/"})", @@ -7197,7 +7217,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kSellerWorkletCrashed, @@ -7623,7 +7643,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE(private_aggregation_manager_.TakePrivateAggregationRequests() .empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key)); EXPECT_EQ(R"({"render_url":"https://ad1.com/","metadata":{"ads": true}})", @@ -7645,7 +7665,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE(private_aggregation_manager_.TakePrivateAggregationRequests() .empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kNoBids, @@ -7725,7 +7745,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE(private_aggregation_manager_.TakePrivateAggregationRequests() .empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key)); EXPECT_EQ(R"({"render_url":"https://ad1.com/","metadata":{"ads": true}})", @@ -7747,7 +7767,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE(private_aggregation_manager_.TakePrivateAggregationRequests() .empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kNoBids, @@ -7899,7 +7919,7 @@ EXPECT_TRUE(result_.ad_component_urls.empty()); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre()); CheckHistograms(InterestGroupAuction::AuctionResult::kNoBids, @@ -7967,7 +7987,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder2Key)); EXPECT_EQ(R"({"render_url":"https://ad2.com/"})", @@ -8082,7 +8102,7 @@ testing::UnorderedElementsAreArray(kEmptyAdBeaconMap)); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(result_.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(result_.private_aggregation_event_map.empty()); EXPECT_THAT(result_.interest_groups_that_bid, testing::UnorderedElementsAre(kBidder1Key, kBidder2Key)); CheckHistograms(InterestGroupAuction::AuctionResult::kSuccess, @@ -9445,9 +9465,8 @@ // reportResult() "reserved.win". BuildPrivateAggregationRequest(/*bucket=*/71, /*value=*/81))))); - EXPECT_THAT( - res.private_aggregation_requests_non_reserved, + res.private_aggregation_event_map, testing::UnorderedElementsAre( testing::Pair("arbitrary", ElementsAreRequests( BuildPrivateAggregationRequest( @@ -9590,7 +9609,7 @@ BuildPrivateAggregationRequest(/*bucket=*/1, /*value=*/131), BuildPrivateAggregationRequest(/*bucket=*/0, /*value=*/132))))); - EXPECT_TRUE(res.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(res.private_aggregation_event_map.empty()); } // Similar to `PrivateAggregationRequestForEventContributionBucketBaseValue()` @@ -10105,6 +10124,43 @@ kScale))))); } +TEST_F(AuctionRunnerTest, PrivateAggregationBuyersReportBiddingDuration) { + constexpr base::TimeDelta kBiddingDuration = base::Milliseconds(2); + constexpr absl::uint128 kBaseBucket = 100l; + constexpr absl::uint128 kOffset = 0l; + constexpr double kScale = 1.0; + + auction_report_buyer_keys_ = {{kBaseBucket}}; + auction_report_buyers_ = {{{blink::AuctionConfig::NonSharedParams:: + BuyerReportType::kTotalGenerateBidLatency, + {/*bucket=*/kOffset, + /*scale=*/kScale}}}}; + + std::vector<StorageInterestGroup> bidders; + bidders.emplace_back(MakeInterestGroup( + blink::TestInterestGroupBuilder(kBidder1, kBidder1Name) + .SetBiddingUrl(kBidder1Url) + .SetTrustedBiddingSignalsUrl(kBidder1TrustedSignalsUrl) + .SetTrustedBiddingSignalsKeys({{"k1", "k2"}}) + .SetAds({{blink::InterestGroup::Ad(GURL("https://ad1.com"), + absl::nullopt)}}) + .SetSellerCapabilities( + {{{url::Origin::Create(kSellerUrl), + blink::InterestGroup::SellerCapabilities::kLatencyStats}}}) + .Build())); + + RunExtendedPABuyersAuction(bidders, + /*trusted_fetch_latency=*/{base::TimeDelta()}, + /*bidding_latency=*/{kBiddingDuration}); + + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + url::Origin::Create(kSellerUrl), + ElementsAreRequests(BuildPrivateAggregationRequest( + /*bucket=*/kBaseBucket + kOffset, + /*value=*/kBiddingDuration.InMilliseconds() * kScale))))); +} + TEST_F(AuctionRunnerTest, PrivateAggregationBuyersReportAllSellersCapabilities) { constexpr base::TimeDelta kTrustedSignalsFetchDuration = @@ -10485,7 +10541,10 @@ .Build())); RunExtendedPABuyersAuction( - bidders, {kTrustedSignalsFetchDuration1, kTrustedSignalsFetchDuration2}); + bidders, /*trusted_fetch_latency=*/ + {kTrustedSignalsFetchDuration1, kTrustedSignalsFetchDuration2}, + /*bidding_latency=*/{base::TimeDelta(), base::TimeDelta()}, + /*should_bid=*/{true, true}); EXPECT_THAT( private_aggregation_manager_.TakePrivateAggregationRequests(), @@ -10543,7 +10602,10 @@ .Build())); RunExtendedPABuyersAuction( - bidders, {kTrustedSignalsFetchDuration1, kTrustedSignalsFetchDuration2}); + bidders, /*trusted_fetch_latency=*/ + {kTrustedSignalsFetchDuration1, kTrustedSignalsFetchDuration2}, + /*bidding_latency=*/{base::TimeDelta(), base::TimeDelta()}, + /*should_bid=*/{true, true}); EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), testing::UnorderedElementsAre(testing::Pair( @@ -10554,6 +10616,115 @@ kScale))))); } +TEST_F(AuctionRunnerTest, PrivateAggregationBuyersReportBidCount) { + constexpr absl::uint128 kBaseBucket1 = 100l; + constexpr absl::uint128 kBaseBucket2 = 105l; + constexpr absl::uint128 kOffset = 0l; + constexpr double kScale = 1.0; + + auction_report_buyer_keys_ = {{kBaseBucket1, kBaseBucket2}}; + auction_report_buyers_ = { + {{blink::AuctionConfig::NonSharedParams::BuyerReportType::kBidCount, + {/*bucket=*/kOffset, + /*scale=*/kScale}}}}; + + std::vector<StorageInterestGroup> bidders; + bidders.emplace_back(MakeInterestGroup( + blink::TestInterestGroupBuilder(kBidder1, kBidder1Name) + .SetBiddingUrl(kBidder1Url) + .SetTrustedBiddingSignalsUrl(kBidder1TrustedSignalsUrl) + .SetTrustedBiddingSignalsKeys({{"k1", "k2"}}) + .SetAds({{blink::InterestGroup::Ad(GURL("https://ad1.com"), + absl::nullopt)}}) + .SetSellerCapabilities({{{url::Origin::Create(kSellerUrl), + blink::InterestGroup::SellerCapabilities:: + kInterestGroupCounts}}}) + .Build())); + bidders.emplace_back(MakeInterestGroup( + blink::TestInterestGroupBuilder(kBidder2, kBidder2Name) + .SetBiddingUrl(kBidder2Url) + .SetTrustedBiddingSignalsUrl(kBidder2TrustedSignalsUrl) + .SetTrustedBiddingSignalsKeys({{"k1", "k2"}}) + .SetAds({{blink::InterestGroup::Ad(GURL("https://ad1.com"), + absl::nullopt)}}) + .SetSellerCapabilities({{{url::Origin::Create(kSellerUrl), + blink::InterestGroup::SellerCapabilities:: + kInterestGroupCounts}}}) + .Build())); + + RunExtendedPABuyersAuction( + bidders, /*trusted_fetch_latency=*/ + {base::TimeDelta(), base::TimeDelta()}, + /*bidding_latency=*/{base::TimeDelta(), base::TimeDelta()}, + /*should_bid=*/{true, false}); + + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + url::Origin::Create(kSellerUrl), + ElementsAreRequests(BuildPrivateAggregationRequest( + /*bucket=*/kBaseBucket1 + kOffset, + /*value=*/1 * kScale), + BuildPrivateAggregationRequest( + /*bucket=*/kBaseBucket2 + kOffset, + /*value=*/0 * kScale))))); +} + +// TODO(caraitto): Add a test where InterestGroupCount is greater than +// perBuyerGroupLimits of the buyer. + +TEST_F(AuctionRunnerTest, PrivateAggregationBuyersReportInterestGroupCount) { + constexpr absl::uint128 kBaseBucket1 = 100l; + constexpr absl::uint128 kBaseBucket2 = 105l; + constexpr absl::uint128 kOffset = 0l; + constexpr double kScale = 1.0; + + auction_report_buyer_keys_ = {{kBaseBucket1, kBaseBucket2}}; + auction_report_buyers_ = {{{blink::AuctionConfig::NonSharedParams:: + BuyerReportType::kInterestGroupCount, + {/*bucket=*/kOffset, + /*scale=*/kScale}}}}; + + std::vector<StorageInterestGroup> bidders; + bidders.emplace_back(MakeInterestGroup( + blink::TestInterestGroupBuilder(kBidder1, kBidder1Name) + .SetBiddingUrl(kBidder1Url) + .SetTrustedBiddingSignalsUrl(kBidder1TrustedSignalsUrl) + .SetTrustedBiddingSignalsKeys({{"k1", "k2"}}) + .SetAds({{blink::InterestGroup::Ad(GURL("https://ad1.com"), + absl::nullopt)}}) + .SetSellerCapabilities({{{url::Origin::Create(kSellerUrl), + blink::InterestGroup::SellerCapabilities:: + kInterestGroupCounts}}}) + .Build())); + bidders.emplace_back(MakeInterestGroup( + blink::TestInterestGroupBuilder(kBidder2, kBidder2Name) + .SetBiddingUrl(kBidder2Url) + .SetTrustedBiddingSignalsUrl(kBidder2TrustedSignalsUrl) + .SetTrustedBiddingSignalsKeys({{"k1", "k2"}}) + .SetAds({{blink::InterestGroup::Ad(GURL("https://ad1.com"), + absl::nullopt)}}) + .SetSellerCapabilities({{{url::Origin::Create(kSellerUrl), + blink::InterestGroup::SellerCapabilities:: + kInterestGroupCounts}}}) + .Build())); + + RunExtendedPABuyersAuction( + bidders, /*trusted_fetch_latency=*/ + {base::TimeDelta(), base::TimeDelta()}, + /*bidding_latency=*/{base::TimeDelta(), base::TimeDelta()}, + /*should_bid=*/{true, false}); + + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + url::Origin::Create(kSellerUrl), + ElementsAreRequests(BuildPrivateAggregationRequest( + /*bucket=*/kBaseBucket1 + kOffset, + /*value=*/1 * kScale), + BuildPrivateAggregationRequest( + /*bucket=*/kBaseBucket2 + kOffset, + /*value=*/1 * kScale))))); +} + // Enable and test forDebuggingOnly.reportAdAuctionLoss() and // forDebuggingOnly.reportAdAuctionWin() APIs. class AuctionRunnerBiddingAndScoringDebugReportingAPIEnabledTest @@ -12303,7 +12474,7 @@ const Result& res = RunStandardAuction(); EXPECT_TRUE( private_aggregation_manager_.TakePrivateAggregationRequests().empty()); - EXPECT_TRUE(res.private_aggregation_requests_non_reserved.empty()); + EXPECT_TRUE(res.private_aggregation_event_map.empty()); } class AuctionRunnerKAnonTest : public AuctionRunnerTest,
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc index f2d24e9..8bbf396 100644 --- a/content/browser/interest_group/interest_group_auction.cc +++ b/content/browser/interest_group/interest_group_auction.cc
@@ -455,12 +455,12 @@ void OnBiddingSignalsReceived( const base::flat_map<std::string, double>& priority_vector, - base::TimeDelta trusted_signals_fetch_duration, + base::TimeDelta trusted_signals_fetch_latency, base::OnceClosure resume_generate_bid_callback) override { BidState* state = generate_bid_client_receiver_set_.current_context(); const blink::InterestGroup& interest_group = state->bidder->interest_group; auction_->ReportTrustedSignalsFetchLatency(interest_group, - trusted_signals_fetch_duration); + trusted_signals_fetch_latency); absl::optional<double> new_priority; if (!priority_vector.empty()) { new_priority = CalculateInterestGroupPriority( @@ -488,11 +488,13 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, - base::TimeDelta bidding_duration, + base::TimeDelta bidding_latency, const std::vector<std::string>& errors) override { + BidState* state = generate_bid_client_receiver_set_.current_context(); + const blink::InterestGroup& interest_group = state->bidder->interest_group; + auction_->ReportBiddingLatency(interest_group, bidding_latency); OnGenerateBidCompleteInternal( - generate_bid_client_receiver_set_.current_context(), - std::move(mojo_bid), std::move(mojo_kanon_bid), + state, std::move(mojo_bid), std::move(mojo_kanon_bid), bidding_signals_data_version, has_bidding_signals_data_version, debug_loss_report_url, debug_win_report_url, set_priority, has_set_priority, std::move(update_priority_signals_overrides), @@ -522,12 +524,20 @@ const url::Origin& owner() const { return owner_; } - void GetInterestGroupsThatBid( + void GetInterestGroupsThatBidAndReportBidCounts( blink::InterestGroupSet& interest_groups) const { + size_t bid_count = 0; for (const auto& bid_state : bid_states_) { if (bid_state->made_bid) { interest_groups.emplace(bid_state->bidder->interest_group.owner, bid_state->bidder->interest_group.name); + bid_count++; + } + } + for (const auto& bid_state : bid_states_) { + if (auction_->ReportBidCount(bid_state->bidder->interest_group, + bid_count)) { + break; } } } @@ -1639,18 +1649,19 @@ return num_interest_groups; } -void InterestGroupAuction::GetInterestGroupsThatBid( +void InterestGroupAuction::GetInterestGroupsThatBidAndReportBidCounts( blink::InterestGroupSet& interest_groups) const { if (!all_bids_scored_) return; for (auto& buyer_helper : buyer_helpers_) { - buyer_helper->GetInterestGroupsThatBid(interest_groups); + buyer_helper->GetInterestGroupsThatBidAndReportBidCounts(interest_groups); } // Retrieve data from component auctions as well. for (const auto& component_auction_info : component_auctions_) { - component_auction_info.second->GetInterestGroupsThatBid(interest_groups); + component_auction_info.second->GetInterestGroupsThatBidAndReportBidCounts( + interest_groups); } } @@ -1735,19 +1746,19 @@ return url.ReplaceComponents(replacements); } -void InterestGroupAuction::ReportPaBuyersValueIfAllowed( +bool InterestGroupAuction::ReportPaBuyersValueIfAllowed( const blink::InterestGroup& interest_group, blink::InterestGroup::SellerCapabilities capability, blink::AuctionConfig::NonSharedParams::BuyerReportType buyer_report_type, int value) { if (!CanReportPaBuyersValue(interest_group, capability, config_->seller)) { - return; + return false; } absl::optional<absl::uint128> bucket_base = BucketBaseForReportPaBuyers(*config_, interest_group.owner); if (!bucket_base) { - return; + return false; } absl::optional< @@ -1755,7 +1766,7 @@ report_buyers_config = ReportBuyersConfigForPaBuyers(buyer_report_type, *config_); if (!report_buyers_config) { - return; + return false; } // TODO(caraitto): Consider adding renderer and Mojo validation to ensure that @@ -1774,6 +1785,7 @@ // TODO(caraitto): Consider allowing these to be set. content::mojom::AggregationServiceMode::kDefault, content::mojom::DebugModeDetails::New())); + return true; } bool InterestGroupAuction::HasNonKAnonWinner() const { @@ -1974,14 +1986,44 @@ } } +bool InterestGroupAuction::ReportInterestGroupCount( + const blink::InterestGroup& interest_group, + size_t count) { + return ReportPaBuyersValueIfAllowed( + interest_group, + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts, + blink::AuctionConfig::NonSharedParams::BuyerReportType:: + kInterestGroupCount, + count); +} + +bool InterestGroupAuction::ReportBidCount( + const blink::InterestGroup& interest_group, + size_t count) { + return ReportPaBuyersValueIfAllowed( + interest_group, + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts, + blink::AuctionConfig::NonSharedParams::BuyerReportType::kBidCount, count); +} + void InterestGroupAuction::ReportTrustedSignalsFetchLatency( const blink::InterestGroup& interest_group, - base::TimeDelta trusted_signals_fetch_duration) { + base::TimeDelta trusted_signals_fetch_latency) { ReportPaBuyersValueIfAllowed( interest_group, blink::InterestGroup::SellerCapabilities::kLatencyStats, blink::AuctionConfig::NonSharedParams::BuyerReportType:: kTotalSignalsFetchLatency, - trusted_signals_fetch_duration.InMilliseconds()); + trusted_signals_fetch_latency.InMilliseconds()); +} + +void InterestGroupAuction::ReportBiddingLatency( + const blink::InterestGroup& interest_group, + base::TimeDelta bidding_latency) { + ReportPaBuyersValueIfAllowed( + interest_group, blink::InterestGroup::SellerCapabilities::kLatencyStats, + blink::AuctionConfig::NonSharedParams::BuyerReportType:: + kTotalGenerateBidLatency, + bidding_latency.InMilliseconds()); } base::flat_set<std::string> InterestGroupAuction::GetKAnonKeysToJoin() const { @@ -2110,6 +2152,12 @@ OnOneLoadCompleted(); return; } + for (const StorageInterestGroup& group : interest_groups) { + if (ReportInterestGroupCount(group.interest_group, + interest_groups.size())) { + break; + } + } post_auction_update_owners_.push_back( interest_groups[0].interest_group.owner); for (const auto& bidder : interest_groups) {
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h index e041568..dae0a22f 100644 --- a/content/browser/interest_group/interest_group_auction.h +++ b/content/browser/interest_group/interest_group_auction.h
@@ -476,7 +476,8 @@ // Returns all interest groups that bid in an auction. Expected to be called // after the bidding and scoring phase completes. Returns an empty set if the // auction failed for any reason other than the seller rejecting all bids. - void GetInterestGroupsThatBid(blink::InterestGroupSet& interest_groups) const; + void GetInterestGroupsThatBidAndReportBidCounts( + blink::InterestGroupSet& interest_groups) const; // Retrieves any debug reporting URLs. May only be called once, since it takes // ownership of stored reporting URLs. This is called internally by @@ -525,12 +526,37 @@ // only be called once, since it moves the stored origins. void TakePostAuctionUpdateOwners(std::vector<url::Origin>& owners); + // Reports (via extended private aggregation) the number of interest groups + // loaded for the owner of `interest_group` iff `interest_group` has + // authorized this auction's seller to receive such information. + // + // The reported value isn't limited by the auction config's + // perBuyerGroupLimits. + // + // Returns true iff a report was issued. + bool ReportInterestGroupCount(const blink::InterestGroup& interest_group, + size_t count); + + // Reports (via extended private aggregation) the number of interest groups + // that bid for the owner of `interest_group` iff `interest_group` has + // authorized this auction's seller to receive such information. + // + // Returns true iff a report was issued. + bool ReportBidCount(const blink::InterestGroup& interest_group, size_t count); + // Reports (via extended private aggregation) the time taken to fetch trusted // signals iff `interest_group` has authorized this auction's seller to // receive such information. void ReportTrustedSignalsFetchLatency( const blink::InterestGroup& interest_group, - base::TimeDelta trusted_signals_fetch_duration); + base::TimeDelta trusted_signals_fetch_latency); + + // Reports (via extended private aggregation) the time taken to perform + // bidding (including the pre-kanonymous bid, and failed bids) iff + // `interest_group` has authorized this auction's seller to receive such + // information. + void ReportBiddingLatency(const blink::InterestGroup& interest_group, + base::TimeDelta bidding_latency); // Retrieves the keys that need to be joined as a result of the auction. A // failed auction may result in keys that still need to be joined, for @@ -824,7 +850,12 @@ // `config_`'s `auction_report_buyer_keys` and `auction_report_buyers`, and // value equals to `value` times the `scalar` from `config_`'s // `auction_report_buyers`. - void ReportPaBuyersValueIfAllowed( + // + // Returns true iff a report was issued. + // + // TODO(crbug.com/1416621): Consider pre-aggregating metrics before sending to + // the server. + bool ReportPaBuyersValueIfAllowed( const blink::InterestGroup& interest_group, blink::InterestGroup::SellerCapabilities capability, blink::AuctionConfig::NonSharedParams::BuyerReportType buyer_report_type,
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index f88e77c..0dfa3972 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -13,6 +13,7 @@ #include <vector> #include "base/containers/flat_map.h" +#include "base/feature_list.h" #include "base/functional/callback.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" @@ -33,6 +34,7 @@ #include "content/browser/interest_group/interest_group_storage.h" #include "content/browser/private_aggregation/private_aggregation_budget_key.h" #include "content/browser/private_aggregation/private_aggregation_manager.h" +#include "content/common/private_aggregation_features.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom-forward.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" @@ -126,7 +128,10 @@ url_loader_factory_, attribution_data_host_manager, /*direct_seller_is_seller=*/ - !component_seller_winning_bid_info.has_value())) { + !component_seller_winning_bid_info.has_value(), + private_aggregation_manager_, + main_frame_origin_, + winning_bid_info_.storage_interest_group->interest_group.owner)) { DCHECK(interest_group_manager_); DCHECK(auction_worklet_manager_); DCHECK(url_loader_factory_); @@ -693,6 +698,18 @@ private_aggregation_manager_, log_private_aggregation_requests_callback_, main_frame_origin_, std::move(private_aggregation_requests_reserved_)); private_aggregation_requests_reserved_.clear(); + + if (base::FeatureList::IsEnabled(content::kPrivateAggregationApi) && + content::kPrivateAggregationApiEnabledInFledge.Get() && + content::kPrivateAggregationApiFledgeExtensionsEnabled.Get()) { + fenced_frame_reporter_->OnForEventPrivateAggregationRequestsReceived( + std::move(private_aggregation_requests_non_reserved_)); + } + // TODO(qingxinwu): Check the feature flags when collecting PA requests in + // browser process, and report a bad message if PA requests are received when + // the feature flags are disabled. Then CHECK that + // `private_aggregation_requests_non_reserved_` is empty here. + private_aggregation_requests_non_reserved_.clear(); } } // namespace content
diff --git a/content/browser/interest_group/interest_group_auction_reporter.h b/content/browser/interest_group/interest_group_auction_reporter.h index a3c0381..fdea50d 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.h +++ b/content/browser/interest_group/interest_group_auction_reporter.h
@@ -22,6 +22,7 @@ #include "content/browser/interest_group/auction_worklet_manager.h" #include "content/browser/interest_group/interest_group_storage.h" #include "content/browser/interest_group/subresource_url_authorizations.h" +#include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/common/content_export.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" @@ -231,12 +232,6 @@ const std::vector<std::string>& errors() const { return errors_; } - // TODO(mmenke): Remove this method, and report these directly. - std::map<std::string, PrivateAggregationRequests> - TakeNonReservedPrivateAggregationRequests() { - return std::move(private_aggregation_requests_non_reserved_); - } - // The FencedFrameReporter that `this` will pass event-level ad beacon // information received from reporting worklets to, as they're received. // Created by `this`. The consumer is responsible for wiring this up to a
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc index bee5189..5b205d1d 100644 --- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc +++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -7,17 +7,21 @@ #include <map> #include <memory> #include <string> +#include <utility> #include <vector> #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" +#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/notreached.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "content/browser/fenced_frame/fenced_frame_reporter.h" #include "content/browser/interest_group/auction_worklet_manager.h" #include "content/browser/interest_group/interest_group_k_anonymity_manager.h" @@ -28,6 +32,7 @@ #include "content/browser/interest_group/test_interest_group_private_aggregation_manager.h" #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/common/aggregatable_report.mojom.h" +#include "content/common/private_aggregation_features.h" #include "content/common/private_aggregation_host.mojom.h" #include "content/public/test/test_renderer_host.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" @@ -88,6 +93,10 @@ public AuctionWorkletManager::Delegate { public: InterestGroupAuctionReporterTest() { + feature_list_.InitAndEnableFeatureWithParameters( + content::kPrivateAggregationApi, + {{"fledge_extensions_enabled", "true"}}); + mojo::SetDefaultProcessErrorHandler( base::BindRepeating(&InterestGroupAuctionReporterTest::OnBadMessage, base::Unretained(this))); @@ -198,24 +207,25 @@ } void SetUpReporterAndStart() { - interest_group_auction_reporter_ = std::make_unique< - InterestGroupAuctionReporter>( - interest_group_manager_impl_.get(), &auction_worklet_manager_, - /*attribution_data_host_manager=*/nullptr, - &private_aggregation_manager_, - private_aggregation_manager_.GetLogPrivateAggregationRequestsCallback(), - std::move(auction_config_), kTopFrameOrigin, kFrameOrigin, - frame_client_security_state_.Clone(), - dummy_report_shared_url_loader_factory_, std::move(winning_bid_info_), - std::move(seller_winning_bid_info_), - std::move(component_seller_winning_bid_info_), - /*interest_groups_that_bid=*/ - blink::InterestGroupSet{{kWinningBidderOrigin, kWinningBidderName}, - {kLosingBidderOrigin, kLosingBidderName}}, - std::move(debug_win_report_urls_), std::move(debug_loss_report_urls_), - k_anon_keys_to_join_, std::move(private_aggregation_requests_reserved_), - std::map<std::string, - InterestGroupAuctionReporter::PrivateAggregationRequests>()); + interest_group_auction_reporter_ = + std::make_unique<InterestGroupAuctionReporter>( + interest_group_manager_impl_.get(), &auction_worklet_manager_, + /*attribution_data_host_manager=*/nullptr, + &private_aggregation_manager_, + private_aggregation_manager_ + .GetLogPrivateAggregationRequestsCallback(), + std::move(auction_config_), kTopFrameOrigin, kFrameOrigin, + frame_client_security_state_.Clone(), + dummy_report_shared_url_loader_factory_, + std::move(winning_bid_info_), std::move(seller_winning_bid_info_), + std::move(component_seller_winning_bid_info_), + /*interest_groups_that_bid=*/ + blink::InterestGroupSet{{kWinningBidderOrigin, kWinningBidderName}, + {kLosingBidderOrigin, kLosingBidderName}}, + std::move(debug_win_report_urls_), + std::move(debug_loss_report_urls_), k_anon_keys_to_join_, + std::move(private_aggregation_requests_reserved_), + std::move(private_aggregation_event_map_)); interest_group_auction_reporter_->Start( base::BindOnce(&InterestGroupAuctionReporterTest::OnCompleteCallback, base::Unretained(this))); @@ -371,6 +381,8 @@ errors_ = interest_group_auction_reporter_->errors(); } + base::test::ScopedFeatureList feature_list_; + const url::Origin kTopFrameOrigin = url::Origin::Create(GURL("https://top_frame_origin.test/")); const url::Origin kFrameOrigin = @@ -456,6 +468,48 @@ New(/*bucket=*/42, /*value=*/24)), content::mojom::AggregationServiceMode::kDefault, content::mojom::DebugModeDetails::New()); + const auction_worklet::mojom::PrivateAggregationRequestPtr + kWinningBidderGenerateBidNonReservedPrivateAggregationRequest = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewForEventContribution( + auction_worklet::mojom:: + AggregatableReportForEventContribution::New( + auction_worklet::mojom::ForEventSignalBucket:: + NewIdBucket(1), + auction_worklet::mojom::ForEventSignalValue:: + NewIntValue(2), + "event_type")), + content::mojom::AggregationServiceMode::kDefault, + content::mojom::DebugModeDetails::New()); + const auction_worklet::mojom::PrivateAggregationRequestPtr + kBonusNonReservedPrivateAggregationRequest = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewForEventContribution( + auction_worklet::mojom:: + AggregatableReportForEventContribution::New( + auction_worklet::mojom::ForEventSignalBucket:: + NewIdBucket(42), + auction_worklet::mojom::ForEventSignalValue:: + NewIntValue(24), + "event_type2")), + content::mojom::AggregationServiceMode::kDefault, + content::mojom::DebugModeDetails::New()); + const auction_worklet::mojom::PrivateAggregationRequestPtr + kReportWinNonReservedPrivateAggregationRequest = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewForEventContribution( + auction_worklet::mojom:: + AggregatableReportForEventContribution::New( + auction_worklet::mojom::ForEventSignalBucket:: + NewIdBucket(3), + auction_worklet::mojom::ForEventSignalValue:: + NewIntValue(4), + "event_type")), + content::mojom::AggregationServiceMode::kDefault, + content::mojom::DebugModeDetails::New()); std::vector<GURL> debug_win_report_urls_; std::vector<GURL> debug_loss_report_urls_; @@ -518,6 +572,11 @@ InterestGroupAuctionReporter::PrivateAggregationRequests> private_aggregation_requests_reserved_; + // The non-reserved private aggregation requests passed in to the constructor. + std::map<std::string, + InterestGroupAuctionReporter::PrivateAggregationRequests> + private_aggregation_event_map_; + std::unique_ptr<TestInterestGroupManagerImpl> interest_group_manager_impl_ = std::make_unique<TestInterestGroupManagerImpl>( kFrameOrigin, @@ -1289,8 +1348,8 @@ ElementsAreRequests( kLosingBidderGenerateBidPrivateAggregationRequest)))); - // The aggregation request from the seller's reportResult() method should be - // immediately passed along. + // The reserved aggregation requests from the seller's reportResult() method + // should be immediately passed along. WaitForReportResultAndRunCallback( kSellerScriptUrl, /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, MakeRequestPtrVector(kReportResultPrivateAggregationRequest.Clone(), @@ -1301,8 +1360,8 @@ ElementsAreRequests(kReportResultPrivateAggregationRequest, kBonusPrivateAggregationRequest)))); - // The aggregation request from the bidder's reportWin() method should be - // immediately passed along. + // The reserved aggregation requests from the bidder's reportWin() method + // should be immediately passed along. WaitForReportWinAndRunCallback( /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, MakeRequestPtrVector(kReportWinPrivateAggregationRequest.Clone(), @@ -1372,6 +1431,110 @@ WaitForCompletion(); } +// Check that private aggregation requests of non-reserved event types are +// passed along as expected. This creates an auction which is both passed +// aggregation reports from the bidding and scoring phase of the auction, and +// receives more from each reporting worklet that's invoked. This covers the +// case where a navigation occurs before the seller's reporting script +// completes. +TEST_F(InterestGroupAuctionReporterTest, + PrivateAggregationRequestsNonReserved) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type2"].push_back( + kBonusPrivateAggregationRequest.Clone()); + + SetUpAndStartSingleSellerAuction(); + + // Nothing should be sent when the auction is started. + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + // On navigation, the requests from the bidding and scoring phase of the + // auction should be passed along. + interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); + EXPECT_THAT( + interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre( + testing::Pair( + "event_type", + ElementsAreRequests( + kWinningBidderGenerateBidPrivateAggregationRequest)), + testing::Pair("event_type2", + ElementsAreRequests(kBonusPrivateAggregationRequest)))); + + WaitForReportResultAndRunCallback(kSellerScriptUrl, + /*report_url=*/absl::nullopt); + + // The non-reserved aggregation requests from the bidder's + // reportWin() method should be immediately passed along. + WaitForReportWinAndRunCallback( + /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, + MakeRequestPtrVector( + kReportWinNonReservedPrivateAggregationRequest.Clone())); + EXPECT_THAT( + interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre( + testing::Pair("event_type", + ElementsAreRequests( + kWinningBidderGenerateBidPrivateAggregationRequest, + kReportWinPrivateAggregationRequest)), + testing::Pair("event_type2", + ElementsAreRequests(kBonusPrivateAggregationRequest)))); + + WaitForCompletion(); +} + +// Check that private aggregation requests of non-reserved event types are +// passed along as expected. This creates an auction which is both passed +// aggregation reports from the bidding and scoring phase of the auction, and +// receives more from each reporting worklet that's invoked. This covers the +// case where a navigation occurs after all reporting scripts have completed. +TEST_F(InterestGroupAuctionReporterTest, + PrivateAggregationRequestsNonReservedLateNavigation) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type2"].push_back( + kBonusPrivateAggregationRequest.Clone()); + + SetUpAndStartSingleSellerAuction(); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + WaitForReportResultAndRunCallback(kSellerScriptUrl, + /*report_url=*/absl::nullopt); + + WaitForReportWinAndRunCallback( + /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, + MakeRequestPtrVector( + kReportWinNonReservedPrivateAggregationRequest.Clone())); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + // When the navigation finally occurs, all previously queued aggregated + // requests should be passed along. + interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); + EXPECT_THAT( + interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre( + testing::Pair("event_type", + ElementsAreRequests( + kWinningBidderGenerateBidPrivateAggregationRequest, + kReportWinPrivateAggregationRequest)), + testing::Pair("event_type2", + ElementsAreRequests(kBonusPrivateAggregationRequest)))); + + WaitForCompletion(); +} + // Test the case that the InterestGroupAutionReporter is destroyed while calling // the top-level seller's reportResult() method, before navigation. This // primarily serves to test UMA. @@ -1465,14 +1628,21 @@ TEST_F(InterestGroupAuctionReporterTest, NoNavigation) { private_aggregation_requests_reserved_[kWinningBidderOrigin].push_back( kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); SetUpAndStartSingleSellerAuction(); + scoped_refptr<FencedFrameReporter> fenced_frame_reporter = + + interest_group_auction_reporter_->fenced_frame_reporter(); WaitForReportResultAndRunCallback( kSellerScriptUrl, kSellerReportUrl, /*ad_beacon_map=*/{}, MakeRequestPtrVector(kReportResultPrivateAggregationRequest.Clone())); WaitForReportWinAndRunCallback( kBidderReportUrl, /*ad_beacon_map=*/{}, - MakeRequestPtrVector(kReportWinPrivateAggregationRequest.Clone())); + MakeRequestPtrVector( + kReportWinPrivateAggregationRequest.Clone(), + kReportWinNonReservedPrivateAggregationRequest.Clone())); interest_group_auction_reporter_.reset(); // Have to spin all message loops to flush any k-anon set join events. @@ -1484,6 +1654,8 @@ testing::UnorderedElementsAre()); EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), testing::UnorderedElementsAre()); + EXPECT_TRUE( + fenced_frame_reporter->GetPrivateAggregationEventMapForTesting().empty()); interest_group_manager_impl_->ExpectReports({}); histogram_tester_.ExpectUniqueSample( "Ads.InterestGroup.Auction.FinalReporterState", @@ -1495,6 +1667,8 @@ TEST_F(InterestGroupAuctionReporterTest, MultipleNavigations) { private_aggregation_requests_reserved_[kWinningBidderOrigin].push_back( kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); SetUpAndStartSingleSellerAuction(); base::RepeatingClosure callback = @@ -1510,7 +1684,9 @@ WaitForReportWinAndRunCallback( kBidderReportUrl, /*ad_beacon_map=*/{}, - MakeRequestPtrVector(kReportWinPrivateAggregationRequest.Clone())); + MakeRequestPtrVector( + kReportWinPrivateAggregationRequest.Clone(), + kReportWinNonReservedPrivateAggregationRequest.Clone())); callback.Run(); callback.Run(); @@ -1519,6 +1695,15 @@ callback.Run(); callback.Run(); + // Non reserved private aggregation requests should have been passed along + // only once. + EXPECT_THAT( + interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting(), + testing::UnorderedElementsAre(testing::Pair( + "event_type", ElementsAreRequests( + kWinningBidderGenerateBidPrivateAggregationRequest, + kReportWinPrivateAggregationRequest)))); interest_group_auction_reporter_.reset(); // It should be safe to invoke the callback after the reporter has been // destroyed. @@ -1556,5 +1741,120 @@ kBidderReportUrl}}); } +// Disable feature kPrivateAggregationApi. +class InterestGroupAuctionReporterPrivateAggregationDisabledTest + : public InterestGroupAuctionReporterTest { + public: + InterestGroupAuctionReporterPrivateAggregationDisabledTest() { + feature_list_.InitAndDisableFeature(content::kPrivateAggregationApi); + } + + protected: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F(InterestGroupAuctionReporterPrivateAggregationDisabledTest, + PrivateAggregationRequestsNonReserved) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + // This is possible currently because we're not checking the feature flags + // when collecting PA requests and sending to InterestGroupAuctionReporter, + // and a compromised worklet can send PA requests to browser process when + // featrue kPrivateAggregationApi is disabled. + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type2"].push_back( + kBonusPrivateAggregationRequest.Clone()); + + SetUpAndStartSingleSellerAuction(); + + // Nothing should be sent when the auction is started. + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + // The requests from the bidding and scoring phase of the auction should not + // be passed along. + interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + WaitForReportResultAndRunCallback(kSellerScriptUrl, + /*report_url=*/absl::nullopt); + + // The non-reserved aggregation requests from the bidder's reportWin() method + // should not be passed along neither. reportWin() could only return PA + // requests if the worklet is compromised when featrue kPrivateAggregationApi + // is disabled. + WaitForReportWinAndRunCallback( + /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, + MakeRequestPtrVector( + kReportWinNonReservedPrivateAggregationRequest.Clone())); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + WaitForCompletion(); +} + +// Disable FLEDGE-specific extensions of Private Aggregation API. +class InterestGroupAuctionReporterPrivateAggregationFledgeExtensionDisabledTest + : public InterestGroupAuctionReporterTest { + public: + InterestGroupAuctionReporterPrivateAggregationFledgeExtensionDisabledTest() { + feature_list_.InitAndEnableFeatureWithParameters( + content::kPrivateAggregationApi, + {{"fledge_extensions_enabled", "false"}}); + } + + protected: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F( + InterestGroupAuctionReporterPrivateAggregationFledgeExtensionDisabledTest, + PrivateAggregationRequestsNonReserved) { + private_aggregation_manager_.SetShouldMatchLoggedRequests(false); + // This is possible currently because we're not checking the feature flags + // when collecting PA requests and sending to InterestGroupAuctionReporter, + // and a compromised worklet can send PA requests to browser process when + // featrue parameter "fledge_extensions_enabled" is set to false. + private_aggregation_event_map_["event_type"].push_back( + kWinningBidderGenerateBidPrivateAggregationRequest.Clone()); + private_aggregation_event_map_["event_type2"].push_back( + kBonusPrivateAggregationRequest.Clone()); + + SetUpAndStartSingleSellerAuction(); + + // Nothing should be sent when the auction is started. + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + // The requests from the bidding and scoring phase of the auction should not + // be passed along. + interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + WaitForReportResultAndRunCallback(kSellerScriptUrl, + /*report_url=*/absl::nullopt); + + // The non-reserved aggregation requests from the bidder's reportWin() method + // should not be passed along neither. reportWin() could only return PA + // requests if the worklet is compromised when feature parameter + // "fledge_extensions_enabled" is set to false. + WaitForReportWinAndRunCallback( + /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, + MakeRequestPtrVector( + kReportWinNonReservedPrivateAggregationRequest.Clone())); + EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() + ->GetPrivateAggregationEventMapForTesting() + .empty()); + + WaitForCompletion(); +} + } // namespace } // namespace content
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index ae08291..c4fca50f 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -7704,6 +7704,15 @@ .ExtractString()), &observer); EXPECT_EQ(GURL("https://example.com/render"), observer.mapped_url()); + + // Run URN to URL mapping callback manually to trigger sending reports, and + // validate the right URLs are requested. Do this instead of navigating to + // the URN because the validation logic checks a fixed URL for this test, + // and don't want to send a random request to port 80 on localhost, which is + // what example.com is mapped to. + observer.on_navigate_callback().Run(); + WaitForUrl(https_server_->GetURL(kSellerHost, "/echo?report_seller")); + WaitForUrl(https_server_->GetURL(kSellerHost, "/echo?report_bidder")); } // Same as above test, but leaves out the extra bidder and uses the older @@ -7829,6 +7838,15 @@ .ExtractString()), &observer); EXPECT_EQ(GURL("https://example.com/render"), observer.mapped_url()); + + // Run URN to URL mapping callback manually to trigger sending reports, and + // validate the right URLs are requested. Do this instead of navigating to + // the URN because the validation logic checks a fixed URL for this test, + // and don't want to send a random request to port 80 on localhost, which is + // what example.com is mapped to. + observer.on_navigate_callback().Run(); + WaitForUrl(https_server_->GetURL(kSellerHost, "/echo?report_seller")); + WaitForUrl(https_server_->GetURL(kSellerHost, "/echo?report_bidder")); } // Use bidder and seller worklet files that validate their arguments all have
diff --git a/content/browser/interest_group/mock_auction_process_manager.cc b/content/browser/interest_group/mock_auction_process_manager.cc index 8eee438..cdf09c9 100644 --- a/content/browser/interest_group/mock_auction_process_manager.cc +++ b/content/browser/interest_group/mock_auction_process_manager.cc
@@ -175,13 +175,13 @@ } } -void MockBidderWorklet::SetBidderTrustedSignalsFetchDuration( +void MockBidderWorklet::SetBidderTrustedSignalsFetchLatency( base::TimeDelta delta) { - trusted_signals_fetch_duration_ = delta; + trusted_signals_fetch_latency_ = delta; } -void MockBidderWorklet::SetBiddingDuration(base::TimeDelta delta) { - bidding_duration_ = delta; +void MockBidderWorklet::SetBiddingLatency(base::TimeDelta delta) { + bidding_latency_ = delta; } void MockBidderWorklet::InvokeGenerateBidCallback( @@ -200,7 +200,7 @@ base::RunLoop run_loop; generate_bid_client_->OnBiddingSignalsReceived( /*priority_vector=*/{}, - /*trusted_signals_fetch_duration=*/trusted_signals_fetch_duration_, + /*trusted_signals_fetch_latency=*/trusted_signals_fetch_latency_, run_loop.QuitClosure()); run_loop.Run(); @@ -217,7 +217,7 @@ base::flat_map<std::string, auction_worklet::mojom::PrioritySignalsDoublePtr>(), /*pa_requests=*/std::move(pa_requests), - /*bidding_duration=*/bidding_duration_, + /*bidding_latency=*/bidding_latency_, /*errors=*/std::vector<std::string>()); return; } @@ -235,7 +235,7 @@ base::flat_map<std::string, auction_worklet::mojom::PrioritySignalsDoublePtr>(), /*pa_requests=*/std::move(pa_requests), - /*bidding_duration=*/bidding_duration_, + /*bidding_latency=*/bidding_latency_, /*errors=*/std::vector<std::string>()); }
diff --git a/content/browser/interest_group/mock_auction_process_manager.h b/content/browser/interest_group/mock_auction_process_manager.h index 8929ac3..58348fa6 100644 --- a/content/browser/interest_group/mock_auction_process_manager.h +++ b/content/browser/interest_group/mock_auction_process_manager.h
@@ -106,11 +106,11 @@ // Waits for GenerateBid() to be invoked. void WaitForGenerateBid(); - // The below functions alter `trusted_signals_fetch_duration` (from - // OnBiddingSignalsReceived()) and `bidding_duration` (from + // The below functions alter `trusted_signals_fetch_latency` (from + // OnBiddingSignalsReceived()) and `bidding_latency` (from // OnGenerateBidComplete()), respectively, to return `delta`. - void SetBidderTrustedSignalsFetchDuration(base::TimeDelta delta); - void SetBiddingDuration(base::TimeDelta delta); + void SetBidderTrustedSignalsFetchLatency(base::TimeDelta delta); + void SetBiddingLatency(base::TimeDelta delta); // Invokes the GenerateBid callback. A bid of base::nullopt means no bid // should be offered. Waits for the GenerateBid() call first, if needed. @@ -167,11 +167,11 @@ // Expected per-bidder timeout values, indexed by interest group name. std::map<std::string, base::TimeDelta> expected_per_buyer_timeouts_; - // To be fed as `trusted_signals_fetch_duration` (from - // OnBiddingSignalsReceived()) and `bidding_duration` (from + // To be fed as `trusted_signals_fetch_latency` (from + // OnBiddingSignalsReceived()) and `bidding_latency` (from // OnGenerateBidComplete()), respectively, - base::TimeDelta trusted_signals_fetch_duration_; - base::TimeDelta bidding_duration_; + base::TimeDelta trusted_signals_fetch_latency_; + base::TimeDelta bidding_latency_; // Receiver is last so that destroying `this` while there's a pending callback // over the pipe will not DCHECK.
diff --git a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc index 308cbcc..66db87a 100644 --- a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc +++ b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc
@@ -5,6 +5,7 @@ #include "content/browser/interest_group/test_interest_group_private_aggregation_manager.h" #include <map> +#include <utility> #include "base/functional/bind.h" #include "base/functional/callback.h" @@ -56,13 +57,22 @@ mojom::AggregationServiceMode aggregation_mode, mojom::DebugModeDetailsPtr debug_mode_details) { EXPECT_EQ(1u, contributions.size()); + const url::Origin& worklet_origin = receiver_set_.current_context(); auction_worklet::mojom::PrivateAggregationRequestPtr request = auction_worklet::mojom::PrivateAggregationRequest::New( auction_worklet::mojom::AggregatableReportContribution:: NewHistogramContribution(std::move(contributions[0])), aggregation_mode, std::move(debug_mode_details)); - const url::Origin& worklet_origin = receiver_set_.current_context(); + if (!should_match_logged_requests_) { + // Currently non-reserved private aggregation requests are not passed to + // LogPrivateAggregationRequestsCallback(), and not stored in + // `logged_private_aggregation_requests_`. + DCHECK(logged_private_aggregation_requests_.empty()); + private_aggregation_requests_[worklet_origin].push_back(std::move(request)); + return; + } + bool found_matching_logged_request = false; InterestGroupAuctionReporter::PrivateAggregationRequests& logged_requests_for_origin = @@ -100,11 +110,17 @@ return std::exchange(private_aggregation_requests_, {}); } +void TestInterestGroupPrivateAggregationManager::SetShouldMatchLoggedRequests( + bool should_match_logged_requests) { + should_match_logged_requests_ = should_match_logged_requests; +} + void TestInterestGroupPrivateAggregationManager::LogPrivateAggregationRequests( const std::map< url::Origin, std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr>>& private_aggregation_requests) { + DCHECK(should_match_logged_requests_ || private_aggregation_requests.empty()); for (auto& pair : private_aggregation_requests) { auto& requests_for_origin = logged_private_aggregation_requests_[pair.first];
diff --git a/content/browser/interest_group/test_interest_group_private_aggregation_manager.h b/content/browser/interest_group/test_interest_group_private_aggregation_manager.h index 7b7377ce..0eedfb2 100644 --- a/content/browser/interest_group/test_interest_group_private_aggregation_manager.h +++ b/content/browser/interest_group/test_interest_group_private_aggregation_manager.h
@@ -76,6 +76,14 @@ InterestGroupAuctionReporter::PrivateAggregationRequests> TakePrivateAggregationRequests(); + // Non-reserved requests are not saved to + // `logged_private_aggregation_requests_`, so should set + // `should_match_logged_requests_` to false to avoid checking whether + // `private_aggregation_requests_` and `logged_private_aggregation_requests_` + // match. `logged_private_aggregation_requests_` should be empty when + // `should_match_logged_requests_` is false. + void SetShouldMatchLoggedRequests(bool should_match_logged_requests); + private: void LogPrivateAggregationRequests( const std::map< @@ -101,6 +109,10 @@ // Bound receivers received by BindNewReceiver. Each one is associated with // the worklet origin passed in to BindNewReceiver(). mojo::ReceiverSet<mojom::PrivateAggregationHost, url::Origin> receiver_set_; + + // `private_aggregation_requests_` and `logged_private_aggregation_requests_` + // are required to match if `should_match_logged_requests_` is true. + bool should_match_logged_requests_ = true; }; } // namespace content
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index 4ca4f52..6aeb68f 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc
@@ -1122,8 +1122,12 @@ info->muted = is_muted_; info->has_presentation = has_presentation_; - info->remote_playback_metadata = remote_playback_metadata_.Clone(); + // Disable Remote Playback by passing empty RemotePlaybackMetadata when there + // are multiple media players. + if (normal_players_.size() == 1u) { + info->remote_playback_metadata = remote_playback_metadata_.Clone(); + } return info; }
diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h index 83154cd..4fd6373 100644 --- a/content/browser/media/session/media_session_impl.h +++ b/content/browser/media/session/media_session_impl.h
@@ -328,7 +328,7 @@ void OnAudioOutputSinkChangingDisabled(); // Update the value of `remote_playback_metadata_`. - void SetRemotePlaybackMetadata( + CONTENT_EXPORT void SetRemotePlaybackMetadata( media_session::mojom::RemotePlaybackMetadataPtr metadata); // Returns whether the action should be routed to |routed_service_|.
diff --git a/content/browser/media/session/media_session_impl_unittest.cc b/content/browser/media/session/media_session_impl_unittest.cc index 7282904..703426f 100644 --- a/content/browser/media/session/media_session_impl_unittest.cc +++ b/content/browser/media/session/media_session_impl_unittest.cc
@@ -747,6 +747,25 @@ ->has_presentation); } +TEST_F(MediaSessionImplTest, SessionInfoRemotePlaybackMetadata) { + EXPECT_FALSE(media_session::test::GetMediaSessionInfoSync(GetMediaSession()) + ->remote_playback_metadata); + + int player1 = player_observer_->StartNewPlayer(); + GetMediaSession()->AddPlayer(player_observer_.get(), player1); + GetMediaSession()->SetRemotePlaybackMetadata( + media_session::mojom::RemotePlaybackMetadata::New( + "video_codec", "audio_codec", false, true, "device_friendly_name", + false)); + EXPECT_TRUE(media_session::test::GetMediaSessionInfoSync(GetMediaSession()) + ->remote_playback_metadata); + + int player2 = player_observer_->StartNewPlayer(); + GetMediaSession()->AddPlayer(player_observer_.get(), player2); + EXPECT_FALSE(media_session::test::GetMediaSessionInfoSync(GetMediaSession()) + ->remote_playback_metadata); +} + TEST_F(MediaSessionImplTest, RaiseActivatesWebContents) { MockWebContentsDelegate delegate; web_contents()->SetDelegate(&delegate);
diff --git a/content/browser/network/socket_broker_impl.cc b/content/browser/network/socket_broker_impl.cc index 2a781f56..9f12f4a8 100644 --- a/content/browser/network/socket_broker_impl.cc +++ b/content/browser/network/socket_broker_impl.cc
@@ -78,6 +78,27 @@ #endif } +void SocketBrokerImpl::CreateUdpSocket(net::AddressFamily address_family, + CreateUdpSocketCallback callback) { + ScopedSocketDescriptor socket(net::CreatePlatformSocket( + net::ConvertAddressFamily(address_family), SOCK_DGRAM, + address_family == AF_UNIX ? 0 : IPPROTO_UDP)); + int rv = net::OK; + if (!socket.is_valid()) { + rv = GetSystemError(); + } else if (!base::SetNonBlocking(socket.get())) { + rv = GetSystemError(); + socket.reset(); + } +#if BUILDFLAG(IS_WIN) + std::move(callback).Run( + network::TransferableSocket(socket.release(), GetNetworkServiceProcess()), + rv); +#else + std::move(callback).Run(network::TransferableSocket(socket.release()), rv); +#endif +} + mojo::PendingRemote<network::mojom::SocketBroker> SocketBrokerImpl::BindNewRemote() { mojo::PendingRemote<network::mojom::SocketBroker> pending_remote;
diff --git a/content/browser/network/socket_broker_impl.h b/content/browser/network/socket_broker_impl.h index 4da44cc..8ec2530 100644 --- a/content/browser/network/socket_broker_impl.h +++ b/content/browser/network/socket_broker_impl.h
@@ -28,6 +28,8 @@ // mojom::SocketBroker implementation. void CreateTcpSocket(net::AddressFamily address_family, CreateTcpSocketCallback callback) override; + void CreateUdpSocket(net::AddressFamily address_family, + CreateUdpSocketCallback callback) override; // Returns a mojo::PendingRemote to this instance. Adds a receiver to // `receivers_`.
diff --git a/content/browser/private_aggregation/private_aggregation_manager.h b/content/browser/private_aggregation/private_aggregation_manager.h index 3c88cfed..9c047ce4 100644 --- a/content/browser/private_aggregation/private_aggregation_manager.h +++ b/content/browser/private_aggregation/private_aggregation_manager.h
@@ -7,6 +7,7 @@ #include "base/functional/callback_forward.h" #include "content/browser/private_aggregation/private_aggregation_budget_key.h" +#include "content/common/content_export.h" #include "content/common/private_aggregation_host.mojom-forward.h" #include "content/public/browser/storage_partition.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -25,7 +26,7 @@ // Interface that mediates data flow between the Private Aggregation API // component and other APIs using it. -class PrivateAggregationManager { +class CONTENT_EXPORT PrivateAggregationManager { public: virtual ~PrivateAggregationManager() = default;
diff --git a/content/browser/resources/quota/quota_internals.css b/content/browser/resources/quota/quota_internals.css index 49caaa2..51685608 100644 --- a/content/browser/resources/quota/quota_internals.css +++ b/content/browser/resources/quota/quota_internals.css
@@ -54,3 +54,6 @@ .total-space { text-align: center; } +#simulate-storage-pressure-activation-message { + color: red; +}
diff --git a/content/browser/resources/quota/quota_internals.html b/content/browser/resources/quota/quota_internals.html index c1a73618..fde2f8d 100644 --- a/content/browser/resources/quota/quota_internals.html +++ b/content/browser/resources/quota/quota_internals.html
@@ -41,6 +41,8 @@ <h2 class="test-storage-pressure-header"> Test Storage Pressure Behavior</h2> + <h3 id="simulate-storage-pressure-activation-message" hidden> + Simulate storage pressure is deactivated in Incognito.</h3> <form> <label>Origin to test: </label> <input type="url" name="origin-to-test" id="origin-to-test" @@ -101,5 +103,3 @@ </template> </body> </html> - -
diff --git a/content/browser/resources/quota/quota_internals.ts b/content/browser/resources/quota/quota_internals.ts index 82bec66..f997985 100644 --- a/content/browser/resources/quota/quota_internals.ts +++ b/content/browser/resources/quota/quota_internals.ts
@@ -266,11 +266,25 @@ } } +async function renderSimulateStoragePressureButton() { + getProxy().isSimulateStoragePressureAvailable().then(result => { + if (!result.available) { + document.body + .querySelector('#simulate-storage-pressure-activation-message') + ?.removeAttribute('hidden'); + document.body.querySelector('#trigger-notification')!.setAttribute( + 'disabled', ''); + } + }); + + document.body.querySelector('#trigger-notification')!.addEventListener( + 'click', () => getProxy().simulateStoragePressure()); +} + document.addEventListener('DOMContentLoaded', () => { renderDiskAvailabilityAndTempPoolSize(); renderEvictionStats(); renderGlobalUsage(); renderUsageAndQuotaStats(); - document.body.querySelector('#trigger-notification')!.addEventListener( - 'click', () => getProxy().simulateStoragePressure()); + renderSimulateStoragePressureButton(); });
diff --git a/content/browser/resources/quota/quota_internals_browser_proxy.ts b/content/browser/resources/quota/quota_internals_browser_proxy.ts index 1222979..c8db200 100644 --- a/content/browser/resources/quota/quota_internals_browser_proxy.ts +++ b/content/browser/resources/quota/quota_internals_browser_proxy.ts
@@ -23,6 +23,9 @@ unlimitedUsage: bigint; } +interface SimulateStoragePressureAvailableResult { + available: boolean; +} export interface RetrieveBucketsTableResult { entries: BucketTableEntry[]; } @@ -68,6 +71,11 @@ this.handler.simulateStoragePressure(newOrigin); } + isSimulateStoragePressureAvailable(): + Promise<SimulateStoragePressureAvailableResult> { + return this.handler.isSimulateStoragePressureAvailable(); + } + retrieveBucketsTable(): Promise<RetrieveBucketsTableResult> { return this.handler.retrieveBucketsTable(); }
diff --git a/content/browser/tracing/background_tracing_manager_browsertest.cc b/content/browser/tracing/background_tracing_manager_browsertest.cc index 4c75b9d..5c059a5 100644 --- a/content/browser/tracing/background_tracing_manager_browsertest.cc +++ b/content/browser/tracing/background_tracing_manager_browsertest.cc
@@ -1304,7 +1304,7 @@ ASSERT_TRUE(this_module); std::string module_id = - base::TransformModuleIDToBreakpadFormat(this_module->GetId()); + base::TransformModuleIDToSymbolServerFormat(this_module->GetId()); std::string desired_frame_pattern = base::StrCat( {"0x[[:xdigit:]]+ - /?", this_module->GetDebugBasename().MaybeAsASCII(),
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 70c48095..cbae35e5 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -936,6 +936,12 @@ base::Time::Now() - auto_reauthn_permission_delegate_->GetAutoReauthnEmbargoStartTime( GetEmbeddingOrigin()); + + // See `kFederatedIdentityAutoReauthnEmbargoDuration`. + render_frame_host().AddMessageToConsole( + blink::mojom::ConsoleMessageLevel::kInfo, + "Auto re-authn was previously triggered less than 10 minutes ago. " + "Only one auto re-authn request can be made every 10 minutes."); } auto_reauthn &= !is_auto_reauthn_embargoed; }
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index f2821868..703b503 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -218,6 +218,7 @@ bool delay_token_response; AccountsDialogAction accounts_dialog_action; IdpSigninStatusMismatchDialogAction idp_signin_status_mismatch_dialog_action; + bool succeed_with_console_message = false; }; static const MockClientIdConfiguration kDefaultClientMetadata{ @@ -782,16 +783,18 @@ main_test_rfh()->GetFederatedAuthRequestIssueCount(absl::nullopt); EXPECT_EQ(0, issue_count); } - CheckConsoleMessages(expectation.devtools_issue_statuses); + CheckConsoleMessages(expectation.devtools_issue_statuses, + configuration.succeed_with_console_message); } } void CheckConsoleMessages( - const std::vector<FederatedAuthRequestResult>& devtools_issue_statuses) { + const std::vector<FederatedAuthRequestResult>& devtools_issue_statuses, + bool succeed_with_console_message) { std::vector<std::string> messages = RenderFrameHostTester::For(main_rfh())->GetConsoleMessages(); - bool did_expect_any_messages = false; + bool did_expect_any_messages = succeed_with_console_message; size_t expected_message_index = messages.size() - 1; for (const auto& expected_status : base::Reversed(devtools_issue_statuses)) { @@ -1773,7 +1776,9 @@ RequestParameters request_parameters = kDefaultRequestParameters; request_parameters.auto_reauthn = true; - RunAuthTest(request_parameters, kExpectationSuccess, kConfigurationValid); + MockConfiguration configuration = kConfigurationValid; + configuration.succeed_with_console_message = true; + RunAuthTest(request_parameters, kExpectationSuccess, configuration); ASSERT_EQ(displayed_accounts().size(), 1u); EXPECT_EQ(displayed_accounts()[0].login_state, LoginState::kSignIn); @@ -1783,6 +1788,14 @@ /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, /*expected_auto_reauthn_embargoed=*/true); + + std::vector<std::string> messages = + RenderFrameHostTester::For(main_rfh())->GetConsoleMessages(); + ASSERT_EQ(1U, messages.size()); + EXPECT_EQ( + "Auto re-authn was previously triggered less than 10 minutes ago. Only " + "one auto re-authn request can be made every 10 minutes.", + messages[0]); } TEST_F(FederatedAuthRequestImplTest, MetricsForSuccessfulSignInCase) {
diff --git a/content/browser/webui/DEPS b/content/browser/webui/DEPS index 270740c7..bc6ec8d 100644 --- a/content/browser/webui/DEPS +++ b/content/browser/webui/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+ash/webui/grit/ash_webui_common_resources_map.h", "+chromeos/ash/grit/ash_resources.h", "+chromeos/ash/grit/ash_resources_map.h", "+components/crash/content/browser/error_reporting",
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc index 0b8a9f69..fa4c1a0 100644 --- a/content/browser/webui/shared_resources_data_source.cc +++ b/content/browser/webui/shared_resources_data_source.cc
@@ -21,6 +21,7 @@ #include "ui/resources/grit/webui_resources_map.h" #if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/webui/grit/ash_webui_common_resources_map.h" #include "chromeos/ash/grit/ash_resources.h" #include "chromeos/ash/grit/ash_resources_map.h" #include "chromeos/grit/chromeos_resources.h" @@ -111,6 +112,8 @@ base::make_span(kMojoBindingsResources, kMojoBindingsResourcesSize)); source->AddResourcePaths(base::make_span(kSkiaResources, kSkiaResourcesSize)); #if BUILDFLAG(IS_CHROMEOS_ASH) + source->AddResourcePaths( + base::make_span(kAshWebuiCommonResources, kAshWebuiCommonResourcesSize)); AddResources(GetChromeosMojoResourceIds(), kChromeosResources, kChromeosResourcesSize, source); AddResources(GetAshMojoResourceIds(), kAshResources, kAshResourcesSize,
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc index 2f9a44f..43d589d2 100644 --- a/content/browser/worker_host/shared_worker_host.cc +++ b/content/browser/worker_host/shared_worker_host.cc
@@ -248,28 +248,22 @@ policy_container_host = std::move(creator_policy_container_host_); } else { // https://html.spec.whatwg.org/C/#creating-a-policy-container-from-a-fetch-response - policy_container_host = base::MakeRefCounted<PolicyContainerHost>( - // This does not parse the referrer policy, which will be - // updated in ServiceWorkerGlobalScope::Initialize - PolicyContainerPolicies(final_response_url, - main_script_load_params->response_head.get(), - nullptr)); + // This does not parse the referrer policy, which will be + // updated in `SharedWorkerGlobalScope::Initialize()`. + PolicyContainerPolicies policies( + final_response_url, main_script_load_params->response_head.get(), + nullptr); - // TODO(https://crbug.com/1410095): Set `is_web_secure_context` to false - // inside `policy_container_host` if the creator is not a secure context. - // Then `worker_client_security_state_` can just copy the bit directly from - // `policy_container_host`, or even use `DeriveClientSecurityState()`. + // A worker context can only be secure if its creator also is. + if (!creator_policy_container_host_->policies().is_web_secure_context) { + policies.is_web_secure_context = false; + } - worker_client_security_state_->ip_address_space = - policy_container_host->ip_address_space(); - worker_client_security_state_->is_web_secure_context = - policy_container_host->policies().is_web_secure_context && - creator_policy_container_host_->policies().is_web_secure_context; - worker_client_security_state_->private_network_request_policy = - DerivePrivateNetworkRequestPolicy( - worker_client_security_state_->ip_address_space, - worker_client_security_state_->is_web_secure_context, - PrivateNetworkRequestContext::kWorker); + worker_client_security_state_ = DeriveClientSecurityState( + policies, PrivateNetworkRequestContext::kWorker); + + policy_container_host = + base::MakeRefCounted<PolicyContainerHost>(std::move(policies)); if (main_script_load_params->response_head->parsed_headers) { worker_client_security_state_->cross_origin_embedder_policy =
diff --git a/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java b/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java index 8307589..98c5b18 100644 --- a/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java
@@ -4,6 +4,8 @@ package org.chromium.content.browser; +import android.view.MotionEvent; + import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; @@ -27,7 +29,19 @@ * https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/measurement/MeasurementManager. */ @CalledByNative - private void registerAttributionSource( + private void registerAttributionSource(GURL registrationUrl, GURL topLevelOrigin, + boolean isDebugKeyAllowed, MotionEvent event) { + // TODO(johnidel): Register with the Android API, see + // https://developer.android.com/design-for-safety/privacy-sandbox/guides/attribution. + // This is dependent on support for the Tiramisu Privacy Sandbox SDK. + } + + /** + * Registers a web attribution trigger with native, see `registerWebTrigger()`: + * https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/measurement/MeasurementManager. + */ + @CalledByNative + private void registerAttributionTrigger( GURL registrationUrl, GURL topLevelOrigin, boolean isDebugKeyAllowed) { // TODO(johnidel): Register with the Android API, see // https://developer.android.com/design-for-safety/privacy-sandbox/guides/attribution.
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/StylusGestureHandler.java b/content/public/android/java/src/org/chromium/content/browser/input/StylusGestureHandler.java index 796980e..8f0666a 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/StylusGestureHandler.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/StylusGestureHandler.java
@@ -8,12 +8,14 @@ import android.graphics.RectF; import android.view.inputmethod.InputConnection; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.OptIn; import androidx.core.os.BuildCompat; import org.chromium.base.Callback; import org.chromium.base.Log; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.PostTask; import org.chromium.blink.mojom.StylusWritingGestureAction; import org.chromium.blink.mojom.StylusWritingGestureData; @@ -23,6 +25,8 @@ import org.chromium.gfx.mojom.Rect; import org.chromium.mojo_base.mojom.String16; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -49,6 +53,32 @@ private static final String TAG = "StylusGestureHandler"; + // Should be kept in sync with StylusHandwritingGesture in tools/metrics/histograms/enums.xml. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // Entries with the DW prefix are used by Samsung's DirectWriting service. All other entries are + // used by Android stylus handwriting. + @IntDef({UmaGestureType.DW_DELETE_TEXT, UmaGestureType.DW_ADD_SPACE_OR_TEXT, + UmaGestureType.DW_REMOVE_SPACES, UmaGestureType.DW_SPLIT_OR_MERGE, + UmaGestureType.SELECT, UmaGestureType.INSERT, UmaGestureType.DELETE, + UmaGestureType.REMOVE_SPACE, UmaGestureType.JOIN_OR_SPLIT, UmaGestureType.SELECT_RANGE, + UmaGestureType.DELETE_RANGE, UmaGestureType.NUM_ENTRIES}) + @Retention(RetentionPolicy.SOURCE) + public @interface UmaGestureType { + int DW_DELETE_TEXT = 0; + int DW_ADD_SPACE_OR_TEXT = 1; + int DW_REMOVE_SPACES = 2; + int DW_SPLIT_OR_MERGE = 3; + int SELECT = 4; + int INSERT = 5; + int DELETE = 6; + int REMOVE_SPACE = 7; + int JOIN_OR_SPLIT = 8; + int SELECT_RANGE = 9; + int DELETE_RANGE = 10; + int NUM_ENTRIES = 11; + } + private final InputConnection mFallback; private final Callback<StylusWritingGestureData> mOnGestureCallback; @@ -78,6 +108,11 @@ return proxy; } + public static void logGestureType(@UmaGestureType int gestureType) { + RecordHistogram.recordEnumeratedHistogram( + "InputMethod.StylusHandwriting.Gesture", gestureType, UmaGestureType.NUM_ENTRIES); + } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, @@ -112,18 +147,25 @@ if (Class.forName(packageName + "SelectGesture").isInstance(gesture)) { gestureData = createSelectGesture(gesture); + logGestureType(UmaGestureType.SELECT); } else if (Class.forName(packageName + "InsertGesture").isInstance(gesture)) { gestureData = createInsertGesture(gesture); + logGestureType(UmaGestureType.INSERT); } else if (Class.forName(packageName + "DeleteGesture").isInstance(gesture)) { gestureData = createDeleteGesture(gesture); + logGestureType(UmaGestureType.DELETE); } else if (Class.forName(packageName + "RemoveSpaceGesture").isInstance(gesture)) { gestureData = createRemoveSpaceGesture(gesture); + logGestureType(UmaGestureType.REMOVE_SPACE); } else if (Class.forName(packageName + "JoinOrSplitGesture").isInstance(gesture)) { gestureData = createJoinOrSplitGesture(gesture); + logGestureType(UmaGestureType.JOIN_OR_SPLIT); } else if (Class.forName(packageName + "SelectRangeGesture").isInstance(gesture)) { gestureData = createSelectRangeGesture(gesture); + logGestureType(UmaGestureType.SELECT_RANGE); } else if (Class.forName(packageName + "DeleteRangeGesture").isInstance(gesture)) { gestureData = createDeleteRangeGesture(gesture); + logGestureType(UmaGestureType.DELETE_RANGE); } return gestureData; }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/StylusGestureHandlerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/StylusGestureHandlerTest.java index 8400e09..07f4da3 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/input/StylusGestureHandlerTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/input/StylusGestureHandlerTest.java
@@ -16,16 +16,19 @@ import org.junit.Assume; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.metrics.HistogramTestRule; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.blink.mojom.StylusWritingGestureAction; import org.chromium.blink.mojom.StylusWritingGestureData; import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner; +import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.gfx.mojom.Rect; import java.lang.reflect.InvocationTargetException; @@ -39,17 +42,27 @@ */ @RunWith(ContentJUnit4ClassRunner.class) @Batch(Batch.PER_CLASS) -@CommandLineFlags.Add({"expose-internals-for-testing", "enable-features=StylusRichGestures"}) +@CommandLineFlags.Add({"enable-features=StylusRichGestures"}) public class StylusGestureHandlerTest { @Rule public ImeActivityTestRule mRule = new ImeActivityTestRule(); - private static String sTargetPackage = "android.view.inputmethod."; - private static String sFallbackText = "this gesture failed"; + @Rule + public HistogramTestRule mHistogramTester = new HistogramTestRule(); + + private static final String TARGET_PACKAGE = "android.view.inputmethod."; + private static final String FALLBACK_TEXT = "this gesture failed"; + private static final String HISTOGRAM_NAME = "InputMethod.StylusHandwriting.Gesture"; private InputConnection mWrappedInputConnection; private StylusWritingGestureData mLastGestureData; + @BeforeClass + public static void setUpClass() { + // Needed for HistogramTestRule. + NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); + } + @Before public void setUp() throws Exception { Assume.assumeTrue("Skipping U+ test on older OS version", BuildCompat.isAtLeastU()); @@ -69,13 +82,13 @@ public void testSelectGesture() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { - Class builderClass = getBuilderForClass(Class.forName(sTargetPackage + "SelectGesture")); + Class builderClass = getBuilderForClass(Class.forName(TARGET_PACKAGE + "SelectGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setGranularity") .invoke(builder, StylusGestureHandler.GRANULARITY_CHARACTER); builderMethods.get("setSelectionArea").invoke(builder, new RectF(0, 0, 10, 10)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -89,8 +102,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(0, 5, 0, 0), mLastGestureData.startRect); assertMojoRectsAreEqual(createMojoRect(10, 5, 0, 0), mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.SELECT)); } @Test @@ -98,12 +114,12 @@ public void testInsertGesture() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { - Class builderClass = getBuilderForClass(Class.forName(sTargetPackage + "InsertGesture")); + Class builderClass = getBuilderForClass(Class.forName(TARGET_PACKAGE + "InsertGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setTextToInsert").invoke(builder, "Foo"); builderMethods.get("setInsertionPoint").invoke(builder, new PointF(15, 31)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -117,8 +133,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(15, 31, 0, 0), mLastGestureData.startRect); assertNull(mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertEquals("Foo", toJavaString(mLastGestureData.textToInsert)); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.INSERT)); } @Test @@ -126,12 +145,12 @@ public void testDeleteGesture() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { - Class builderClass = getBuilderForClass(Class.forName(sTargetPackage + "DeleteGesture")); + Class builderClass = getBuilderForClass(Class.forName(TARGET_PACKAGE + "DeleteGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setGranularity").invoke(builder, StylusGestureHandler.GRANULARITY_WORD); builderMethods.get("setDeletionArea").invoke(builder, new RectF(0, 0, 10, 10)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -145,8 +164,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(0, 5, 0, 0), mLastGestureData.startRect); assertMojoRectsAreEqual(createMojoRect(10, 5, 0, 0), mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.DELETE)); } @Test @@ -155,11 +177,11 @@ throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { Class builderClass = - getBuilderForClass(Class.forName(sTargetPackage + "RemoveSpaceGesture")); + getBuilderForClass(Class.forName(TARGET_PACKAGE + "RemoveSpaceGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setPoints").invoke(builder, new PointF(51, 25), new PointF(105, 30)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -173,8 +195,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(51, 25, 0, 0), mLastGestureData.startRect); assertMojoRectsAreEqual(createMojoRect(105, 30, 0, 0), mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.REMOVE_SPACE)); } @Test @@ -183,11 +208,11 @@ throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { Class builderClass = - getBuilderForClass(Class.forName(sTargetPackage + "JoinOrSplitGesture")); + getBuilderForClass(Class.forName(TARGET_PACKAGE + "JoinOrSplitGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setJoinOrSplitPoint").invoke(builder, new PointF(1, 19)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -201,8 +226,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(1, 19, 0, 0), mLastGestureData.startRect); assertNull(mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.JOIN_OR_SPLIT)); } @Test @@ -211,13 +239,13 @@ throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { Class builderClass = - getBuilderForClass(Class.forName(sTargetPackage + "SelectRangeGesture")); + getBuilderForClass(Class.forName(TARGET_PACKAGE + "SelectRangeGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setGranularity").invoke(builder, StylusGestureHandler.GRANULARITY_WORD); builderMethods.get("setSelectionStartArea").invoke(builder, new RectF(10, 10, 45, 55)); builderMethods.get("setSelectionEndArea").invoke(builder, new RectF(0, 100, 70, 200)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -231,8 +259,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(10, 10, 35, 45), mLastGestureData.startRect); assertMojoRectsAreEqual(createMojoRect(0, 100, 70, 100), mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.SELECT_RANGE)); } @Test @@ -241,14 +272,14 @@ throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { Class builderClass = - getBuilderForClass(Class.forName(sTargetPackage + "DeleteRangeGesture")); + getBuilderForClass(Class.forName(TARGET_PACKAGE + "DeleteRangeGesture")); Map<String, Method> builderMethods = getMethodsForClass(builderClass); Object builder = builderClass.newInstance(); builderMethods.get("setGranularity") .invoke(builder, StylusGestureHandler.GRANULARITY_CHARACTER); builderMethods.get("setDeletionStartArea").invoke(builder, new RectF(10, 10, 45, 55)); builderMethods.get("setDeletionEndArea").invoke(builder, new RectF(0, 100, 70, 200)); - builderMethods.get("setFallbackText").invoke(builder, sFallbackText); + builderMethods.get("setFallbackText").invoke(builder, FALLBACK_TEXT); Object gesture = builderMethods.get("build").invoke(builder); Method performHandwritingGesture = getMethodsForClass(mWrappedInputConnection.getClass()) @@ -262,8 +293,11 @@ mLastGestureData.granularity); assertMojoRectsAreEqual(createMojoRect(10, 10, 35, 45), mLastGestureData.startRect); assertMojoRectsAreEqual(createMojoRect(0, 100, 70, 100), mLastGestureData.endRect); - assertEquals(sFallbackText, toJavaString(mLastGestureData.textAlternative)); + assertEquals(FALLBACK_TEXT, toJavaString(mLastGestureData.textAlternative)); assertNull(mLastGestureData.textToInsert); + assertEquals(1, + mHistogramTester.getHistogramValueCount( + HISTOGRAM_NAME, StylusGestureHandler.UmaGestureType.DELETE_RANGE)); } private static Map<String, Method> getMethodsForClass(Class<?> className) {
diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc index 182ae38..d51a4ad 100644 --- a/content/public/browser/gpu_utils.cc +++ b/content/public/browser/gpu_utils.cc
@@ -169,6 +169,10 @@ gpu_preferences.vulkan_sync_cpu_memory_limit *= 1024 * 1024; } + gpu_preferences.force_separate_egl_display_for_webgl_testing = + command_line->HasSwitch( + switches::kForceSeparateEGLDisplayForWebGLTesting); + // Some of these preferences are set or adjusted in // GpuDataManagerImplPrivate::AppendGpuCommandLine. return gpu_preferences;
diff --git a/content/public/common/main_function_params.h b/content/public/common/main_function_params.h index 0bb4d81d..72aa747 100644 --- a/content/public/common/main_function_params.h +++ b/content/public/common/main_function_params.h
@@ -56,13 +56,6 @@ // tracing after initializing Mojo. bool needs_startup_tracing_after_mojo_init = false; -#if BUILDFLAG(IS_IOS) - // For iOS in order to enter the UIApplication we must store the initial - // argc/argv from main(). - int argc = 0; - const char** argv = nullptr; -#endif - // Used by BrowserTestBase. If set, BrowserMainLoop runs this task instead of // the main message loop. base::OnceClosure ui_task;
diff --git a/content/public/renderer/render_thread.h b/content/public/renderer/render_thread.h index 4f8d259..254a8884 100644 --- a/content/public/renderer/render_thread.h +++ b/content/public/renderer/render_thread.h
@@ -25,7 +25,6 @@ } namespace blink { -class WebResourceRequestSenderDelegate; struct UserAgentMetadata; namespace scheduler { @@ -89,12 +88,6 @@ virtual void AddObserver(RenderThreadObserver* observer) = 0; virtual void RemoveObserver(RenderThreadObserver* observer) = 0; - // Set the ResourceRequestSender delegate object for this process. - // This does not take the ownership of the delegate. It is expected that the - // delegate is kept alive while a request may be dispatched. - virtual void SetResourceRequestSenderDelegate( - blink::WebResourceRequestSenderDelegate* delegate) = 0; - // Post task to all worker threads. Returns number of workers. virtual int PostTaskToAllWebWorkers(base::RepeatingClosure closure) = 0;
diff --git a/content/public/test/DEPS b/content/public/test/DEPS index c1e8598..ab62c324 100644 --- a/content/public/test/DEPS +++ b/content/public/test/DEPS
@@ -68,5 +68,8 @@ ], "browser_test_base.cc": [ "+ui/platform_window/fuchsia/initialize_presenter_api_view.h" + ], + "browser_test_utils.cc": [ + "+ash/webui/grit/ash_webui_common_resources.h" ] }
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 072f2a2f..418b5cc 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -135,7 +135,10 @@ #include "ui/events/keycodes/dom/keycode_converter.h" #include "ui/gfx/geometry/point_f.h" #include "ui/latency/latency_info.h" -#include "ui/resources/grit/webui_resources.h" + +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/webui/grit/ash_webui_common_resources.h" +#endif #if BUILDFLAG(IS_WIN) #include <combaseapi.h> @@ -2042,7 +2045,7 @@ std::string script; scoped_refptr<base::RefCountedMemory> bytes = ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes( - IDR_ASH_COMMON_WEBUI_RESOURCE_TEST_JS); + IDR_ASH_WEBUI_COMMON_WEBUI_RESOURCE_TEST_JS); if (HasGzipHeader(*bytes)) AppendGzippedResource(*bytes, &script);
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index 4f95c38..c3996ae 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc
@@ -186,9 +186,6 @@ observers_.RemoveObserver(observer); } -void MockRenderThread::SetResourceRequestSenderDelegate( - blink::WebResourceRequestSenderDelegate* delegate) {} - void MockRenderThread::RecordAction(const base::UserMetricsAction& action) { }
diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h index db7b69a..1defdcb 100644 --- a/content/public/test/mock_render_thread.h +++ b/content/public/test/mock_render_thread.h
@@ -73,8 +73,6 @@ void RemoveFilter(IPC::MessageFilter* filter) override; void AddObserver(RenderThreadObserver* observer) override; void RemoveObserver(RenderThreadObserver* observer) override; - void SetResourceRequestSenderDelegate( - blink::WebResourceRequestSenderDelegate* delegate) override; void RecordAction(const base::UserMetricsAction& action) override; void RecordComputedAction(const std::string& action) override; int PostTaskToAllWebWorkers(base::RepeatingClosure closure) override;
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 949f31e..08b2ca19 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -376,20 +376,6 @@ content_client_.reset(CreateContentClient()); SetContentClient(content_client_.get()); - // Blink needs to be initialized before calling CreateContentRendererClient() - // because it uses blink internally. - blink_platform_impl_.Initialize(); - blink::Initialize(blink_platform_impl_.Get(), &binders_, - blink_platform_impl_.GetMainThreadScheduler()); - - content_browser_client_.reset(CreateContentBrowserClient()); - content_renderer_client_.reset(CreateContentRendererClient()); - SetBrowserClientForTesting(content_browser_client_.get()); - SetRendererClientForTesting(content_renderer_client_.get()); - - agent_scheduling_group_ = MockAgentSchedulingGroup::Create(*render_thread_); - render_widget_host_ = CreateRenderWidgetHost(); - #if BUILDFLAG(IS_WIN) // This needs to happen sometime before PlatformInitialize. // This isn't actually necessary for most tests: most tests are able to @@ -405,9 +391,26 @@ command_line_ = std::make_unique<base::CommandLine>(base::CommandLine::NO_PROGRAM); params_ = std::make_unique<MainFunctionParams>(command_line_.get()); + // Platform needs to be initialized before blink::Initialize. This is because + // Blink retrieves fonts for EdgeScrollbarNativeThemeFluent, but the platform + // expects the font manager singleton to be uninitialized. platform_ = std::make_unique<RendererMainPlatformDelegate>(*params_); platform_->PlatformInitialize(); + // Blink needs to be initialized before calling CreateContentRendererClient() + // because it uses Blink internally. + blink_platform_impl_.Initialize(); + blink::Initialize(blink_platform_impl_.Get(), &binders_, + blink_platform_impl_.GetMainThreadScheduler()); + + content_browser_client_.reset(CreateContentBrowserClient()); + content_renderer_client_.reset(CreateContentRendererClient()); + SetBrowserClientForTesting(content_browser_client_.get()); + SetRendererClientForTesting(content_renderer_client_.get()); + + agent_scheduling_group_ = MockAgentSchedulingGroup::Create(*render_thread_); + render_widget_host_ = CreateRenderWidgetHost(); + // Ensure that we register any necessary schemes when initializing WebKit, // since we are using a MockRenderThread. RenderThreadImpl::RegisterSchemes();
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 35dabfa..771f8a5 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -365,7 +365,6 @@ deps += [ "//components/cast_streaming/public", "//components/cast_streaming/renderer:resource_provider", - "//components/cast_streaming/renderer:wrapping_renderer_factory_selector", ] }
diff --git a/content/renderer/fluent_scrollbar_browsertest.cc b/content/renderer/fluent_scrollbar_browsertest.cc new file mode 100644 index 0000000..c3527c4f --- /dev/null +++ b/content/renderer/fluent_scrollbar_browsertest.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 "base/test/scoped_feature_list.h" +#include "content/public/test/render_view_test.h" +#include "ui/native_theme/native_theme_features.h" + +namespace content { +class FluentScrollbarImplTest : public RenderViewTest { + public: + explicit FluentScrollbarImplTest() { + feature_list_.InitAndEnableFeature(features::kFluentScrollbar); + } + + ~FluentScrollbarImplTest() override = default; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Ensures that RenderViewTest based tests can properly initialize when Fluent +// scrollbars are enabled. +TEST_F(FluentScrollbarImplTest, FluentScrollbarsInitializeProperly) { + EXPECT_TRUE(ui::IsFluentScrollbarEnabled()); +} +} // namespace content
diff --git a/content/renderer/media/DEPS b/content/renderer/media/DEPS index 644ba19..70faf28e 100644 --- a/content/renderer/media/DEPS +++ b/content/renderer/media/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/cast_streaming/public", - "+components/cast_streaming/renderer", + "+components/cast_streaming/renderer/public", "+third_party/libyuv", '+third_party/webrtc_overrides', ]
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc index 4c75eb4..0dcb6f3b 100644 --- a/content/renderer/pepper/video_decoder_shim.cc +++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -69,26 +69,28 @@ } // namespace struct VideoDecoderShim::PendingDecode { - PendingDecode(uint32_t decode_id, + PendingDecode(absl::optional<uint32_t> decode_id, const scoped_refptr<media::DecoderBuffer>& buffer); ~PendingDecode(); - const uint32_t decode_id; + // |decode_id| is absl::optional because it will be absl::nullopt when the + // decoder is being flushed. + const absl::optional<uint32_t> decode_id; const scoped_refptr<media::DecoderBuffer> buffer; }; VideoDecoderShim::PendingDecode::PendingDecode( - uint32_t decode_id, + absl::optional<uint32_t> decode_id, const scoped_refptr<media::DecoderBuffer>& buffer) - : decode_id(decode_id), buffer(buffer) { -} + : decode_id(decode_id), buffer(buffer) {} VideoDecoderShim::PendingDecode::~PendingDecode() { } struct VideoDecoderShim::PendingFrame { - explicit PendingFrame(uint32_t decode_id); - PendingFrame(uint32_t decode_id, scoped_refptr<media::VideoFrame> frame); + explicit PendingFrame(absl::optional<uint32_t> decode_id); + PendingFrame(absl::optional<uint32_t> decode_id, + scoped_refptr<media::VideoFrame> frame); // This could be expensive to copy, so guard against that. PendingFrame(const PendingFrame&) = delete; @@ -96,16 +98,17 @@ ~PendingFrame(); - const uint32_t decode_id; + // |decode_id| is absl::optional because it will be absl::nullopt when the + // decoder is being flushed. + const absl::optional<uint32_t> decode_id; scoped_refptr<media::VideoFrame> video_frame; }; -VideoDecoderShim::PendingFrame::PendingFrame(uint32_t decode_id) - : decode_id(decode_id) { -} +VideoDecoderShim::PendingFrame::PendingFrame(absl::optional<uint32_t> decode_id) + : decode_id(decode_id) {} VideoDecoderShim::PendingFrame::PendingFrame( - uint32_t decode_id, + absl::optional<uint32_t> decode_id, scoped_refptr<media::VideoFrame> frame) : decode_id(decode_id), video_frame(std::move(frame)) {} @@ -127,13 +130,15 @@ media::VideoDecoderConfig config, media::GpuVideoAcceleratorFactories* gpu_factories); void Decode(uint32_t decode_id, scoped_refptr<media::DecoderBuffer> buffer); + void Flush(); void Reset(); void Stop(); private: void OnInitDone(media::DecoderStatus status); void DoDecode(); - void OnDecodeComplete(media::DecoderStatus status); + void OnDecodeComplete(absl::optional<uint32_t> decode_id, + media::DecoderStatus status); void OnOutputComplete(scoped_refptr<media::VideoFrame> frame); void OnResetComplete(); @@ -147,24 +152,15 @@ using PendingDecodeQueue = base::queue<PendingDecode>; PendingDecodeQueue pending_decodes_; bool awaiting_decoder_ = false; - // VideoDecoder returns pictures without information about the decode buffer - // that generated it. However, when VideoDecoderShim is used for software - // decoding, both media::FFmpegVideoDecoder and media::VpxVideoDecoder always - // generate corresponding frames before decode is finished. This assumption is - // critical so that the Pepper plugin can associate Decode() calls with - // decoded frames which is a requirement of the PPB_VideoDecoder API. In that - // case |decode_id_| is used to store the id of the current buffer while a - // Decode() call is pending. - uint32_t decode_id_ = 0; - // For hardware decoding we can't assume that VideoDecoder always generates - // corresponding frames before decode is finished. In that case, the - // frame can be output before or after the decode completion callback is - // called. In order to allow the Pepper plugin to associate Decode() calls - // with decoded frames we use |decode_counter_| and |timestamp_to_id_cache_| - // to generate and store fake timestamps. The corresponding timestamp will - // be put in the media::DecoderBuffer that's sent to the VideoDecoder. When - // VideoDecoder returns a VideoFrame we use its timestamp to look up the - // Decode() call id in |timestamp_to_id_cache_|. + // We can't assume that VideoDecoder always generates corresponding frames + // before decode is finished. In that case, the frame can be output before + // or after the decode completion callback is called. In order to allow the + // Pepper plugin to associate Decode() calls with decoded frames we use + // |decode_counter_| and |timestamp_to_id_cache_| to generate and store fake + // timestamps. The corresponding timestamp will be put in the + // media::DecoderBuffer that's sent to the VideoDecoder. When VideoDecoder + // returns a VideoFrame we use its timestamp to look up the Decode() call id + // in |timestamp_to_id_cache_|. base::LRUCache<base::TimeDelta, uint32_t> timestamp_to_id_cache_; base::TimeDelta decode_counter_ = base::Microseconds(0u); @@ -256,11 +252,24 @@ DoDecode(); } +void VideoDecoderShim::DecoderImpl::Flush() { + DCHECK(decoder_); + + pending_decodes_.emplace(/*decode_id=*/absl::nullopt, + media::DecoderBuffer::CreateEOSBuffer()); + + DoDecode(); +} + void VideoDecoderShim::DecoderImpl::Reset() { DCHECK(decoder_); // Abort all pending decodes. while (!pending_decodes_.empty()) { const PendingDecode& decode = pending_decodes_.front(); + + // The PepperVideoDecoderHost validates that there's not a pending flush + // when a reset request is received. + DCHECK(decode.decode_id.has_value()); std::unique_ptr<PendingFrame> pending_frame( new PendingFrame(decode.decode_id)); main_task_runner_->PostTask( @@ -315,12 +324,8 @@ awaiting_decoder_ = true; const PendingDecode& decode = pending_decodes_.front(); - // Note that |decode_id_| is set regardless of whether we're doing hardware or - // software decoding. That's because OnDecodeComplete() uses this ID to notify - // the shim on both paths. - decode_id_ = decode.decode_id; - if (use_hw_decoder_) { + if (!decode.buffer->end_of_stream()) { const base::TimeDelta new_counter = decode_counter_ + base::Microseconds(1u); if (new_counter == decode_counter_) { @@ -336,18 +341,20 @@ decode_counter_ = new_counter; DCHECK(timestamp_to_id_cache_.Peek(decode_counter_) == timestamp_to_id_cache_.end()); - timestamp_to_id_cache_.Put(decode_counter_, decode.decode_id); + DCHECK(decode.decode_id.has_value()); + timestamp_to_id_cache_.Put(decode_counter_, decode.decode_id.value()); decode.buffer->set_timestamp(decode_counter_); } decoder_->Decode( decode.buffer, base::BindOnce(&VideoDecoderShim::DecoderImpl::OnDecodeComplete, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), decode.decode_id)); pending_decodes_.pop(); } void VideoDecoderShim::DecoderImpl::OnDecodeComplete( + absl::optional<uint32_t> decode_id, media::DecoderStatus status) { DCHECK(awaiting_decoder_); awaiting_decoder_ = false; @@ -365,37 +372,31 @@ main_task_runner_->PostTask( FROM_HERE, base::BindOnce(&VideoDecoderShim::OnDecodeComplete, shim_, - result, decode_id_)); + result, decode_id)); DoDecode(); } void VideoDecoderShim::DecoderImpl::OnOutputComplete( scoped_refptr<media::VideoFrame> frame) { - // Software decoders are expected to generated frames only when a Decode() + // Software decoders are expected to generate frames only when a Decode() // call is pending. DCHECK(use_hw_decoder_ || awaiting_decoder_); + DCHECK(!frame->metadata().end_of_stream); uint32_t decode_id; - if (!use_hw_decoder_) { - decode_id = decode_id_; + + base::TimeDelta timestamp = frame->timestamp(); + auto it = timestamp_to_id_cache_.Get(timestamp); + if (it != timestamp_to_id_cache_.end()) { + decode_id = it->second; } else { - base::TimeDelta timestamp = frame->timestamp(); - auto it = timestamp_to_id_cache_.Get(timestamp); - if (it != timestamp_to_id_cache_.end()) { - decode_id = it->second; - } else { - NOTREACHED(); - return; - } + NOTREACHED(); + return; } - std::unique_ptr<PendingFrame> pending_frame; - if (!frame->metadata().end_of_stream) { - pending_frame = std::make_unique<PendingFrame>(decode_id, std::move(frame)); - } else { - pending_frame = std::make_unique<PendingFrame>(decode_id); - } + auto pending_frame = + std::make_unique<PendingFrame>(decode_id, std::move(frame)); main_task_runner_->PostTask( FROM_HERE, base::BindOnce(&VideoDecoderShim::OnOutputComplete, shim_, @@ -599,7 +600,12 @@ void VideoDecoderShim::Flush() { DCHECK(RenderThreadImpl::current()); DCHECK_EQ(state_, DECODING); + state_ = FLUSHING; + media_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&VideoDecoderShim::DecoderImpl::Flush, + base::Unretained(decoder_impl_.get()))); + num_pending_decodes_++; } void VideoDecoderShim::Reset() { @@ -622,7 +628,8 @@ host_->NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); } -void VideoDecoderShim::OnDecodeComplete(int32_t result, uint32_t decode_id) { +void VideoDecoderShim::OnDecodeComplete(int32_t result, + absl::optional<uint32_t> decode_id) { DCHECK(RenderThreadImpl::current()); DCHECK(host_); @@ -632,44 +639,60 @@ } num_pending_decodes_--; - completed_decodes_.push(decode_id); + if (decode_id.has_value()) { + completed_decodes_.push(decode_id.value()); + } // If frames are being queued because we're out of textures, don't notify // the host that decode has completed. This exerts "back pressure" to keep // the host from sending buffers that will cause pending_frames_ to grow. if (pending_frames_.empty()) NotifyCompletedDecodes(); + + if (!decode_id.has_value()) { + // The flush request has been completed. This DCHECK is guaranteed by a + // couple of facts: + // + // 1) The PepperVideoDecoderHost doesn't call VideoDecoderShim::Decode() or + // VideoDecoderShim::Flush() if there is a flush in progress, so + // |num_pending_decodes_| shouldn't increase after calling Flush() and + // before the flush is completed. + // + // 2) All pending decode callbacks should have been called. + DCHECK(!num_pending_decodes_); + pending_frames_.push( + std::make_unique<PendingFrame>(/*decode_id=*/absl::nullopt)); + } } void VideoDecoderShim::OnOutputComplete(std::unique_ptr<PendingFrame> frame) { DCHECK(RenderThreadImpl::current()); DCHECK(host_); + DCHECK(frame->video_frame); - if (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(); - - 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(); + 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(); - pending_frames_.push(std::move(frame)); - SendPictures(); + 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(); } + + pending_frames_.push(std::move(frame)); + SendPictures(); } void VideoDecoderShim::SendPictures() { @@ -688,6 +711,19 @@ while (!pending_frames_.empty() && !available_textures_.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_textures_.begin(); uint32_t texture_id = *it; available_textures_.erase(it); @@ -743,7 +779,8 @@ } gl->DeleteTextures(1, &destination_texture_id); } - host_->PictureReady(media::Picture(texture_id, frame->decode_id, + DCHECK(frame->decode_id.has_value()); + host_->PictureReady(media::Picture(texture_id, frame->decode_id.value(), frame->video_frame->visible_rect(), gfx::ColorSpace(), false)); pending_frames_.pop();
diff --git a/content/renderer/pepper/video_decoder_shim.h b/content/renderer/pepper/video_decoder_shim.h index 2aab5db..eecd267 100644 --- a/content/renderer/pepper/video_decoder_shim.h +++ b/content/renderer/pepper/video_decoder_shim.h
@@ -74,7 +74,7 @@ pepper_video_decode_context_provider); void OnInitializeFailed(); - void OnDecodeComplete(int32_t result, uint32_t decode_id); + void OnDecodeComplete(int32_t result, absl::optional<uint32_t> decode_id); void OnOutputComplete(std::unique_ptr<PendingFrame> frame); void SendPictures(); void OnResetComplete();
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 11759a9f..b240a5e 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -859,11 +859,6 @@ observers_.RemoveObserver(observer); } -void RenderThreadImpl::SetResourceRequestSenderDelegate( - blink::WebResourceRequestSenderDelegate* delegate) { - resource_request_sender_delegate_ = delegate; -} - void RenderThreadImpl::InitializeCompositorThread() { blink_platform_impl_->CreateAndSetCompositorThread(); compositor_task_runner_ = blink_platform_impl_->CompositorThreadTaskRunner();
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 4c9e160..d98e688 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -64,7 +64,6 @@ #include "ui/gfx/native_widget_types.h" namespace blink { -class WebResourceRequestSenderDelegate; class WebVideoCaptureImplManager; } @@ -176,11 +175,6 @@ void RemoveFilter(IPC::MessageFilter* filter) override; void AddObserver(RenderThreadObserver* observer) override; void RemoveObserver(RenderThreadObserver* observer) override; - void SetResourceRequestSenderDelegate( - blink::WebResourceRequestSenderDelegate* delegate) override; - blink::WebResourceRequestSenderDelegate* GetResourceRequestSenderDelegate() { - return resource_request_sender_delegate_; - } int PostTaskToAllWebWorkers(base::RepeatingClosure closure) override; base::WaitableEvent* GetShutdownEvent() override; int32_t GetClientId() override; @@ -597,10 +591,6 @@ mojo::Receiver<viz::mojom::CompositingModeWatcher> compositing_mode_watcher_receiver_{this}; - // Delegate is expected to live as long as requests may be sent. - blink::WebResourceRequestSenderDelegate* resource_request_sender_delegate_ = - nullptr; - // Tracks the time the run loop started for this thread. base::TimeTicks run_loop_start_time_;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index e63b39bb..53bfdfdc 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -314,16 +314,6 @@ to_url)); } -blink::WebResourceRequestSenderDelegate* -RendererBlinkPlatformImpl::GetResourceRequestSenderDelegate() { - auto* render_thread = RenderThreadImpl::current(); - - // RenderThreadImpl is null in some tests. - if (!render_thread) - return nullptr; - return render_thread->GetResourceRequestSenderDelegate(); -} - void RendererBlinkPlatformImpl::AppendVariationsThrottles( const url::Origin& top_origin, std::vector<std::unique_ptr<blink::URLLoaderThrottle>>* throttles) {
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index 1c83b5a..beb3fab6 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -88,8 +88,6 @@ blink::WebString ReducedUserAgent() override; blink::UserAgentMetadata UserAgentMetadata() override; bool IsRedirectSafe(const GURL& from_url, const GURL& to_url) override; - blink::WebResourceRequestSenderDelegate* GetResourceRequestSenderDelegate() - override; void AppendVariationsThrottles( const url::Origin& top_origin, std::vector<std::unique_ptr<blink::URLLoaderThrottle>>* throttles)
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn index af0eea2..c446c329 100644 --- a/content/shell/BUILD.gn +++ b/content/shell/BUILD.gn
@@ -579,6 +579,8 @@ deps = [ ":content_shell_app", + ":content_shell_lib", + "//base", "//content/public/app", ] bundle_deps = [
diff --git a/content/shell/app/shell_main.cc b/content/shell/app/shell_main.cc index 30db22c..26b7fd9 100644 --- a/content/shell/app/shell_main.cc +++ b/content/shell/app/shell_main.cc
@@ -13,6 +13,12 @@ #include "sandbox/win/src/sandbox_types.h" #endif +#if BUILDFLAG(IS_IOS) +#include "base/at_exit.h" // nogncheck +#include "content/public/app/content_main_runner.h" // nogncheck +#include "content/shell/browser/shell_application_ios.h" // nogncheck +#endif + #if BUILDFLAG(IS_WIN) #if !defined(WIN_CONSOLE_APP) @@ -37,6 +43,24 @@ return content::ContentMain(std::move(params)); } +#elif BUILDFLAG(IS_IOS) + +int main(int argc, const char** argv) { + // Create this here since it's needed to start the crash handler. + base::AtExitManager at_exit; + + content::ShellMainDelegate delegate; + content::ContentMainParams params(&delegate); + params.argc = argc; + params.argv = argv; + auto runner = content::ContentMainRunner::Create(); + int res = content::RunContentProcess(std::move(params), runner.get()); + if (res != 0) { + return res; + } + return RunShellApplication(argc, argv); +} + #else int main(int argc, const char** argv) {
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc index 97561b6f..cc5b8f3 100644 --- a/content/shell/app/shell_main_delegate.cc +++ b/content/shell/app/shell_main_delegate.cc
@@ -246,11 +246,11 @@ base::trace_event::TraceLog::GetInstance()->SetProcessSortIndex( kTraceEventBrowserProcessSortIndex); -#if BUILDFLAG(IS_ANDROID) - // On Android, we defer to the system message loop when the stack unwinds. - // So here we only create (and leak) a BrowserMainRunner. The shutdown - // of BrowserMainRunner doesn't happen in Chrome Android and doesn't work - // properly on Android at all. +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) + // On Android and iOS, we defer to the system message loop when the stack + // unwinds. So here we only create (and leak) a BrowserMainRunner. The + // shutdown of BrowserMainRunner doesn't happen in Chrome Android/iOS and + // doesn't work properly on Android/iOS at all. std::unique_ptr<BrowserMainRunner> main_runner = BrowserMainRunner::Create(); // In browser tests, the |main_function_params| contains a |ui_task| which // will execute the testing. The task will be executed synchronously inside @@ -264,24 +264,6 @@ // the system message loop for ContentShell, and we're already done thanks // to the |ui_task| for browser tests. return 0; -#elif BUILDFLAG(IS_IOS) - // On iOS, we need to create the UIApplication which owns the main event - // loop. - std::unique_ptr<BrowserMainRunner> main_runner = BrowserMainRunner::Create(); - // In browser tests, the |main_function_params| contains a |ui_task| which - // will execute the testing. The task will be executed synchronously inside - // Initialize() so we don't depend on the BrowserMainRunner being Run(). - int initialize_exit_code = - main_runner->Initialize(std::move(main_function_params)); - DCHECK_LT(initialize_exit_code, 0) - << "BrowserMainRunner::Initialize failed in ShellMainDelegate"; - - RunShellApplication(main_function_params.argc, main_function_params.argv); - - // Return 0 as BrowserMain() should not be called after this, bounce up to - // the system message loop for ContentShell, and we're already done thanks - // to the |ui_task| for browser tests. - return 0; #else if (switches::IsRunWebTestsSwitchPresent()) { // Web tests implement their own BrowserMain() replacement.
diff --git a/content/shell/browser/shell_application_ios.h b/content/shell/browser/shell_application_ios.h index edf2e9e..a8e0380f 100644 --- a/content/shell/browser/shell_application_ios.h +++ b/content/shell/browser/shell_application_ios.h
@@ -13,9 +13,6 @@ // UIApplicationDelegate implementation for web_view_shell. @interface ShellAppDelegate : UIResponder <UIApplicationDelegate> -// The main window for the application. -@property(nonatomic, strong) UIWindow* window; - @end NS_ASSUME_NONNULL_END
diff --git a/content/shell/browser/shell_application_ios.mm b/content/shell/browser/shell_application_ios.mm index 7592b83..363d7df6 100644 --- a/content/shell/browser/shell_application_ios.mm +++ b/content/shell/browser/shell_application_ios.mm
@@ -14,46 +14,43 @@ #include "content/shell/browser/shell_content_browser_client.h" #include "ui/gfx/geometry/size.h" -@implementation ShellAppDelegate +@interface ShellAppSceneDelegate : UIResponder <UIWindowSceneDelegate> +@end + +@implementation ShellAppSceneDelegate @synthesize window = _window; +- (void)scene:(UIScene*)scene + willConnectToSession:(UISceneSession*)session + options:(UISceneConnectionOptions*)connectionOptions { + CHECK_EQ(1u, content::Shell::windows().size()); + UIWindow* window = content::Shell::windows()[0]->window(); + window.windowScene = (UIWindowScene*)scene; + self.window = window; + [self.window makeKeyAndVisible]; +} + +@end + +@implementation ShellAppDelegate + +- (UISceneConfiguration*)application:(UIApplication*)application + configurationForConnectingSceneSession: + (UISceneSession*)connectingSceneSession + options:(UISceneConnectionOptions*)options { + UISceneConfiguration* configuration = [[UISceneConfiguration alloc] init]; + configuration.delegateClass = ShellAppSceneDelegate.class; + return configuration; +} + - (BOOL)application:(UIApplication*)application willFinishLaunchingWithOptions:(NSDictionary*)launchOptions { - // TODO(dtapuska): Using the Shell that was created during construction before - // UIApplication is running doesn't work, so just create a new one here and - // attach it. Figure out how to not create the other one or don't create one - // here. - // CHECK_EQ(1u, content::Shell::windows().size()); - // UIWindow* window = content::Shell::windows()[0]->window(); - content::ShellBrowserContext* browserContext = - content::ShellContentBrowserClient::Get()->browser_context(); - - GURL initial_url(url::kAboutBlankURL); - - // If a URL has been provided as an argument, use it. However, no attempt is - // made here to sanitize this input. - // TODO(crbug.com/1418123): usually this is done with GetStartupURL() and, - // ideally, we'd leverage that once the shell on ios shares more machinery. - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - const auto& args = command_line->GetArgs(); - if (!args.empty()) { - GURL candidate(args[0]); - if (candidate.is_valid()) { - initial_url = candidate; - } - } - - UIWindow* window = content::Shell::CreateNewWindow( - browserContext, initial_url, nullptr, gfx::Size()) - ->window(); - self.window = window; return YES; } - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { - [self.window makeKeyAndVisible]; return YES; }
diff --git a/content/shell/browser/shell_browser_main_parts.cc b/content/shell/browser/shell_browser_main_parts.cc index 1290c62..69b0994e 100644 --- a/content/shell/browser/shell_browser_main_parts.cc +++ b/content/shell/browser/shell_browser_main_parts.cc
@@ -75,7 +75,6 @@ namespace content { namespace { -#if !BUILDFLAG(IS_IOS) GURL GetStartupURL() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kBrowserTest)) @@ -101,7 +100,6 @@ base::MakeAbsoluteFilePath(base::FilePath(args[0]))); #endif } -#endif scoped_refptr<base::RefCountedMemory> PlatformResourceProvider(int key) { if (key == IDR_DIR_HEADER_HTML) { @@ -157,10 +155,8 @@ } void ShellBrowserMainParts::InitializeMessageLoopContext() { -#if !BUILDFLAG(IS_IOS) Shell::CreateNewWindow(browser_context_.get(), GetStartupURL(), nullptr, gfx::Size()); -#endif } void ShellBrowserMainParts::ToolkitInitialized() {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 529fa3c..1d4e764 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1806,6 +1806,7 @@ "../browser/renderer_host/direct_manipulation_win_browsertest.cc", "../browser/renderer_host/render_process_host_sandbox_policy_win_browsertest.cc", "../browser/scheduler/responsiveness/native_event_observer_browsertest_win.cc", + "../renderer/fluent_scrollbar_browsertest.cc", ] deps += [
diff --git a/content/test/data/attribution_reporting/interop/expired_source.json b/content/test/data/attribution_reporting/interop/expired_source.json index b2fa852..e9e224e 100644 --- a/content/test/data/attribution_reporting/interop/expired_source.json +++ b/content/test/data/attribution_reporting/interop/expired_source.json
@@ -35,7 +35,10 @@ "destination": "https://destination.test", "source_event_id": "456", // Rounded to one day (86400 seconds). - "expiry": "88400" + "expiry": "88400", + "aggregation_keys": { + "a": "0x1" + } } } }] @@ -110,18 +113,20 @@ }, "responses": [{ "url": "https://reporter.test/register-trigger", + "debug_permission": true, "response": { "Attribution-Reporting-Register-Trigger": { "event_trigger_data": [ { "trigger_data": "7" } - ] + ], + "debug_reporting": true } } }] }, - // Should not result in an event-level report as the expiry time was + // Should not result in an aggregatable report as the expiry time was // rounded to one day. { "timestamp": "1643408374000", @@ -131,13 +136,19 @@ }, "responses": [{ "url": "https://reporter.test/register-trigger", + "debug_permission": true, "response": { "Attribution-Reporting-Register-Trigger": { - "event_trigger_data": [ + "aggregatable_trigger_data": [ { - "trigger_data": "6" + "source_keys": ["a"], + "key_piece": "0x1" } - ] + ], + "aggregatable_values": { + "a": 123 + }, + "debug_reporting": true } } }] @@ -223,6 +234,28 @@ "report_time": "1643498374001", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } + ], + "verbose_debug_reports": [ + { + "payload": [ { + "body": { + "attribution_destination": "https://destination.test" + }, + "type": "trigger-no-matching-source" + } ], + "report_time": "1643321973000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" + }, + { + "payload": [ { + "body": { + "attribution_destination": "https://destination.test" + }, + "type": "trigger-no-matching-source" + } ], + "report_time": "1643408374000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" + } ] } }
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json index 74897b8..3ed8a29e 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
@@ -6,6 +6,23 @@ "input": { "sources": [ { + "timestamp": "1643235571000", + "registration_request": { + "source_origin": "https://example.source.test", + "attribution_src_url": "https://example.reporter.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://example.reporter.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://example.destination.test", + "source_event_id": "888" + } + } + }] + }, + { "timestamp": "1643235573000", "registration_request": { "source_origin": "https://example.source.test", @@ -85,13 +102,40 @@ "response": { "Attribution-Reporting-Register-Source": { "destination": "https://destination.test", - "source_event_id": "444" + "source_event_id": "444", + "aggregation_keys": { + "a": "0x1" + } } } }] } ], "triggers": [ + // Should not result in an event-level report as the filter data doesn't + // match. This doesn't count for the limit. + { + "timestamp": "1643235572000", + "registration_request": { + "attribution_src_url": "https://example.reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://example.reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "4", + "filters": { + "source_type": ["event"] + } + } + ] + } + } + }] + }, // Should result in an event-level report. { "timestamp": "1643235574000", @@ -175,7 +219,7 @@ } }] }, - // Should not result in an event-level report due to reporting origin limit + // Should not result in an aggregatable report due to reporting origin limit // regardless of source type. { "timestamp": "1643235582000", @@ -189,11 +233,15 @@ "response": { "Attribution-Reporting-Register-Trigger": { "debug_reporting": true, - "event_trigger_data": [ + "aggregatable_trigger_data": [ { - "trigger_data": "4" + "source_keys": ["a"], + "key_piece": "0x10" } - ] + ], + "aggregatable_values": { + "a": 321 + } } } }]
diff --git a/content/test/data/attribution_reporting/interop/top_level_filter_data.json b/content/test/data/attribution_reporting/interop/top_level_filter_data.json index b240dfb2..e815819 100644 --- a/content/test/data/attribution_reporting/interop/top_level_filter_data.json +++ b/content/test/data/attribution_reporting/interop/top_level_filter_data.json
@@ -18,6 +18,9 @@ "filter_data": { "product": ["123", "456"], "geo": [] + }, + "aggregation_keys": { + "a": "0x1" } } } @@ -124,17 +127,23 @@ }, "responses": [{ "url": "https://reporter.test/register-trigger", + "debug_permission": true, "response": { "Attribution-Reporting-Register-Trigger": { - "event_trigger_data": [ + "aggregatable_trigger_data": [ { - "trigger_data": "1" + "source_keys": ["a"], + "key_piece": "0x10" } ], + "aggregatable_values": { + "a": 123 + }, "not_filters": { "geo": [], "source_type": ["event"] - } + }, + "debug_reporting": true } } }] @@ -172,11 +181,15 @@ "url": "https://reporter.test/register-trigger", "response": { "Attribution-Reporting-Register-Trigger": { - "event_trigger_data": [ + "aggregatable_trigger_data": [ { - "trigger_data": "4" + "source_keys": ["a"], + "key_piece": "0x20" } ], + "aggregatable_values": { + "a": 321 + }, "not_filters": { "product": [], "geo": ["US"], @@ -309,6 +322,19 @@ ] }, "output": { + "aggregatable_results": [ + { + "payload": { + "attribution_destination": "https://destination.test", + "histograms": [ { + "key": "0x21", + "value": 321 + } ] + }, + "report_time": "1643239178001", + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-aggregate-attribution" + } + ], "event_level_results": [ { "payload": { @@ -324,18 +350,6 @@ }, { "payload": { - "attribution_destination": "https://destination.test", - "randomized_trigger_rate": 0.0024, - "scheduled_report_time": "1643411973", - "source_event_id": "123", - "source_type": "navigation", - "trigger_data": "4" - }, - "report_time": "1643411973000", - "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" - }, - { - "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024, "scheduled_report_time": "1643411973", @@ -371,6 +385,18 @@ } ], "report_time": "1643235574000", "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" + }, + { + "payload": [ { + "body": { + "attribution_destination": "https://destination.test", + "source_event_id": "123", + "source_site": "https://source.test" + }, + "type": "trigger-no-matching-filter-data" + } ], + "report_time": "1643235577000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" } ] }
diff --git a/content/test/data/interest_group/bidding_argument_validator.js b/content/test/data/interest_group/bidding_argument_validator.js index 117da4e9..0a29a6a74 100644 --- a/content/test/data/interest_group/bidding_argument_validator.js +++ b/content/test/data/interest_group/bidding_argument_validator.js
@@ -8,9 +8,9 @@ validateInterestGroup(interestGroup); validateAuctionSignals(auctionSignals); validatePerBuyerSignals(perBuyerSignals); - validateDirectFromSellerSignals(directFromSellerSignals); validateTrustedBiddingSignals(trustedBiddingSignals); - validateBrowserSignals(browserSignals); + validateBrowserSignals(browserSignals, /*isGenerateBid=*/true); + validateDirectFromSellerSignals(directFromSellerSignals); // Bid 2 to outbid other parties bidding 1 at auction. const ad = interestGroup.ads[0]; @@ -22,6 +22,17 @@ }; } +function reportWin(auctionSignals, perBuyerSignals, sellerSignals, + browserSignals, directFromSellerSignals) { + validateAuctionSignals(auctionSignals); + validatePerBuyerSignals(perBuyerSignals); + validateSellerSignals(sellerSignals); + validateBrowserSignals(browserSignals, /*isGenerateBid=*/false); + validateDirectFromSellerSignals(directFromSellerSignals); + + sendReportTo(browserSignals.interestGroupOwner + '/echo?report_bidder'); +} + function validateInterestGroup(interestGroup) { if (!interestGroup) throw 'No interest group'; @@ -141,21 +152,48 @@ throw 'Wrong trustedBiddingSignals ' + trustedBiddingSignalsJSON; } -function validateBrowserSignals(browserSignals) { - if (Object.keys(browserSignals).length !== 5) { - throw 'Wrong number of browser signals fields ' + - JSON.stringify(browserSignals); - } +function validateBrowserSignals(browserSignals, isGenerateBid) { + // Common fields for generateBid() and reportWin(). if (browserSignals.topWindowHostname !== 'c.test') throw 'Wrong topWindowHostname ' + browserSignals.topWindowHostname; if (!browserSignals.seller.startsWith('https://b.test')) throw 'Wrong seller ' + browserSignals.seller; if ('topLevelSeller' in browserSignals) throw 'Wrong topLevelSeller ' + browserSignals.topLevelSeller; - if (browserSignals.joinCount !== 1) - throw 'Wrong joinCount ' + browserSignals.joinCount; - if (browserSignals.bidCount !== 0) - throw 'Wrong bidCount ' + bidCount; - if (browserSignals.prevWins.length !== 0) - throw 'Wrong prevWins ' + JSON.stringify(browserSignals.prevWins); + + if (isGenerateBid) { + if (Object.keys(browserSignals).length !== 5) { + throw 'Wrong number of browser signals fields ' + + JSON.stringify(browserSignals); + } + if (browserSignals.joinCount !== 1) + throw 'Wrong joinCount ' + browserSignals.joinCount; + if (browserSignals.bidCount !== 0) + throw 'Wrong bidCount ' + bidCount; + if (browserSignals.prevWins.length !== 0) + throw 'Wrong prevWins ' + JSON.stringify(browserSignals.prevWins); + } else { + if (Object.keys(browserSignals).length !== 8) { + throw 'Wrong number of browser signals fields ' + + JSON.stringify(browserSignals); + } + if (!browserSignals.interestGroupOwner.startsWith('https://a.test')) + throw 'Wrong interestGroupOwner ' + browserSignals.interestGroupOwner; + if (browserSignals.interestGroupName !== 'cars') + throw 'Wrong interestGroupName ' + browserSignals.interestGroupName; + if (browserSignals.renderUrl !== "https://example.com/render") + throw 'Wrong renderUrl ' + browserSignals.renderUrl; + if (browserSignals.bid !== 2) + throw 'Wrong bid ' + browserSignals.bid; + if (browserSignals.highestScoringOtherBid !== 0) { + throw 'Wrong highestScoringOtherBid ' + + browserSignals.highestScoringOtherBid; + } + } +} + +function validateSellerSignals(sellerSignals) { + const sellerSignalsJson = JSON.stringify(sellerSignals); + if (sellerSignalsJson !== '["seller signals for winner"]') + throw 'Wrong sellerSignals ' + sellerSignals; }
diff --git a/content/test/data/interest_group/decision_argument_validator.js b/content/test/data/interest_group/decision_argument_validator.js index bd8f3a82..72e405a 100644 --- a/content/test/data/interest_group/decision_argument_validator.js +++ b/content/test/data/interest_group/decision_argument_validator.js
@@ -9,11 +9,20 @@ validateBid(bid); validateAuctionConfig(auctionConfig); validateTrustedScoringSignals(trustedScoringSignals); - validateBrowserSignals(browserSignals); + validateBrowserSignals(browserSignals, /*isScoreAd=*/true); validateDirectFromSellerSignals(directFromSellerSignals); return bid; } +function reportResult(auctionConfig, browserSignals, directFromSellerSignals) { + validateAuctionConfig(auctionConfig); + validateBrowserSignals(browserSignals, /*isScoreAd=*/false); + validateDirectFromSellerSignals(directFromSellerSignals); + + sendReportTo(auctionConfig.seller + '/echo?report_seller'); + return ['seller signals for winner']; +} + function validateAdMetadata(adMetadata) { const adMetadataJSON = JSON.stringify(adMetadata); if (adMetadataJSON !== @@ -122,7 +131,8 @@ } } -function validateBrowserSignals(browserSignals) { +function validateBrowserSignals(browserSignals, isScoreAd) { + // Fields common to scoreAd() and reportResult(). if (browserSignals.topWindowHostname !== 'c.test') throw 'Wrong topWindowHostname ' + browserSignals.topWindowHostname; if ('topLevelSeller' in browserSignals) @@ -133,11 +143,33 @@ throw 'Wrong interestGroupOwner ' + browserSignals.interestGroupOwner; if (browserSignals.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; - const adComponentsJSON = JSON.stringify(browserSignals.adComponents); - if (adComponentsJSON !== '["https://example.com/render-component"]') - throw 'Wrong adComponents ' + browserSignals.adComponents; - if (browserSignals.biddingDurationMsec < 0) - throw 'Wrong biddingDurationMsec ' + browserSignals.biddingDurationMsec; + if (browserSignals.dataVersion !== 1234) + throw 'Wrong dataVersion ' + browserSignals.dataVersion; + + // Fields that vary by method. + if (isScoreAd) { + if (Object.keys(browserSignals).length !== 6) { + throw 'Wrong number of browser signals fields ' + + JSON.stringify(browserSignals); + } + const adComponentsJSON = JSON.stringify(browserSignals.adComponents); + if (adComponentsJSON !== '["https://example.com/render-component"]') + throw 'Wrong adComponents ' + browserSignals.adComponents; + if (browserSignals.biddingDurationMsec < 0) + throw 'Wrong biddingDurationMsec ' + browserSignals.biddingDurationMsec; + } else { + if (Object.keys(browserSignals).length !== 7) { + throw 'Wrong number of browser signals fields ' + + JSON.stringify(browserSignals); + } + validateBid(browserSignals.bid); + if (browserSignals.desirability !== 2) + throw 'Wrong desireability ' + browserSignals.desirability; + if (browserSignals.highestScoringOtherBid !== 0) { + throw 'Wrong highestScoringOtherBid ' + + browserSignals.highestScoringOtherBid; + } + } } function validateDirectFromSellerSignals(directFromSellerSignals) {
diff --git a/device/bluetooth/floss/floss_features.cc b/device/bluetooth/floss/floss_features.cc index 328f3901..9a04923 100644 --- a/device/bluetooth/floss/floss_features.cc +++ b/device/bluetooth/floss/floss_features.cc
@@ -14,6 +14,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) // Enables Floss client if supported by platform BASE_FEATURE(kFlossEnabled, "Floss", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kFlossIsAvailable, + "FlossIsAvailable", + base::FEATURE_ENABLED_BY_DEFAULT); #endif bool IsFlossEnabled() {
diff --git a/device/bluetooth/floss/floss_features.h b/device/bluetooth/floss/floss_features.h index 7fd5c8a..0b803499 100644 --- a/device/bluetooth/floss/floss_features.h +++ b/device/bluetooth/floss/floss_features.h
@@ -15,6 +15,7 @@ // The feature is defined in Ash and propagated to Lacros over crosapi. #if BUILDFLAG(IS_CHROMEOS_ASH) DEVICE_BLUETOOTH_EXPORT BASE_DECLARE_FEATURE(kFlossEnabled); +DEVICE_BLUETOOTH_EXPORT BASE_DECLARE_FEATURE(kFlossIsAvailable); #endif // A helper method that has the appropriate behavior on both Ash and Lacros.
diff --git a/device/bluetooth/test/bluetooth_test_bluez.cc b/device/bluetooth/test/bluetooth_test_bluez.cc index 88237ba1..07106e80 100644 --- a/device/bluetooth/test/bluetooth_test_bluez.cc +++ b/device/bluetooth/test/bluetooth_test_bluez.cc
@@ -65,15 +65,13 @@ std::unique_ptr<bluez::BluezDBusManagerSetter> dbus_setter = bluez::BluezDBusManager::GetSetterForTesting(); - fake_bluetooth_adapter_client_ = new bluez::FakeBluetoothAdapterClient; - dbus_setter->SetBluetoothAdapterClient( - std::unique_ptr<bluez::BluetoothAdapterClient>( - fake_bluetooth_adapter_client_)); + auto adapter_client = std::make_unique<bluez::FakeBluetoothAdapterClient>(); + fake_bluetooth_adapter_client_ = adapter_client.get(); + dbus_setter->SetBluetoothAdapterClient(std::move(adapter_client)); - fake_bluetooth_device_client_ = new bluez::FakeBluetoothDeviceClient; - dbus_setter->SetBluetoothDeviceClient( - std::unique_ptr<bluez::BluetoothDeviceClient>( - fake_bluetooth_device_client_)); + auto device_client = std::make_unique<bluez::FakeBluetoothDeviceClient>(); + fake_bluetooth_device_client_ = device_client.get(); + dbus_setter->SetBluetoothDeviceClient(std::move(device_client)); // Make the fake adapter post tasks without delay in order to avoid timing // issues. @@ -94,6 +92,8 @@ discovery_sessions_.clear(); adapter_ = nullptr; + fake_bluetooth_adapter_client_ = nullptr; + fake_bluetooth_device_client_ = nullptr; bluez::BluezDBusManager::Shutdown(); BluetoothTestBase::TearDown(); }
diff --git a/device/fido/features.cc b/device/fido/features.cc index 48a7906..62b7e344 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -34,7 +34,7 @@ BASE_FEATURE(kWebAuthPasskeysUI, "WebAuthenticationPasskeysUI", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kWebAuthnNoEmptyDisplayNameCBOR, "WebAuthenticationNoEmptyDisplayNameCBOR",
diff --git a/device/fido/fido_discovery_factory.cc b/device/fido/fido_discovery_factory.cc index 6fe9982..133141ca 100644 --- a/device/fido/fido_discovery_factory.cc +++ b/device/fido/fido_discovery_factory.cc
@@ -99,12 +99,7 @@ return {}; case FidoTransportProtocol::kInternal: { #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) - std::unique_ptr<FidoDiscoveryBase> discovery = - MaybeCreatePlatformDiscovery(); - if (discovery) { - return SingleDiscovery(std::move(discovery)); - } - return {}; + return MaybeCreatePlatformDiscovery(); #else return {}; #endif @@ -213,17 +208,18 @@ #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_MAC) -std::unique_ptr<FidoDiscoveryBase> +std::vector<std::unique_ptr<FidoDiscoveryBase>> FidoDiscoveryFactory::MaybeCreatePlatformDiscovery() const { - return mac_touch_id_config_ - ? std::make_unique<fido::mac::FidoTouchIdDiscovery>( - *mac_touch_id_config_) - : nullptr; + if (mac_touch_id_config_) { + return SingleDiscovery(std::make_unique<fido::mac::FidoTouchIdDiscovery>( + *mac_touch_id_config_)); + } + return {}; } #endif #if BUILDFLAG(IS_CHROMEOS) -std::unique_ptr<FidoDiscoveryBase> +std::vector<std::unique_ptr<FidoDiscoveryBase>> FidoDiscoveryFactory::MaybeCreatePlatformDiscovery() const { if (base::FeatureList::IsEnabled(kWebAuthCrosPlatformAuthenticator)) { auto discovery = std::make_unique<FidoChromeOSDiscovery>( @@ -231,9 +227,9 @@ std::move(get_assertion_request_for_legacy_credential_check_)); discovery->set_require_power_button_mode( require_legacy_cros_authenticator_); - return discovery; + return SingleDiscovery(std::move(discovery)); } - return nullptr; + return {}; } void FidoDiscoveryFactory::set_generate_request_id_callback(
diff --git a/device/fido/fido_discovery_factory.h b/device/fido/fido_discovery_factory.h index 2a47752..353dba41 100644 --- a/device/fido/fido_discovery_factory.h +++ b/device/fido/fido_discovery_factory.h
@@ -134,7 +134,8 @@ private: #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) - std::unique_ptr<FidoDiscoveryBase> MaybeCreatePlatformDiscovery() const; + std::vector<std::unique_ptr<FidoDiscoveryBase>> MaybeCreatePlatformDiscovery() + const; #endif #if BUILDFLAG(IS_MAC)
diff --git a/device/gamepad/gamepad_id_list.h b/device/gamepad/gamepad_id_list.h index 768e7511..ccedb73 100644 --- a/device/gamepad/gamepad_id_list.h +++ b/device/gamepad/gamepad_id_list.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include <stdint.h> +#include <tuple> #include <unordered_set> #include <vector>
diff --git a/docs/infra/using_led.md b/docs/infra/using_led.md index 188040f..51c7ef9 100644 --- a/docs/infra/using_led.md +++ b/docs/infra/using_led.md
@@ -41,7 +41,7 @@ list of features via `led help`.) 1. Select a builder whose builds you'd like to reproduce. (Example: -[linux-rel][7]) +[ToTLinux][7]) 2. Record its full builder name, along with its bucket. (The bucket name is present in the URL of the builder page, and is very likely "chromium/ci".) 3. Checkout the [tools/build][3] repo (if not already present) and navigate to @@ -53,7 +53,7 @@ script. 5. Launch a build with the given recipe change. This can be done with a single chained LED invocation, eg: -`led get-builder chromium/ci:linux-rel | led edit-recipe-bundle | led launch` +`led get-builder chromium/ci:ToTLinux | led edit-recipe-bundle | led launch` 6. The LED invocation above will print out a link to the build that was launched. Repeat steps 4 & 5 until the triggered builds behave as expected with the new recipe change. @@ -70,7 +70,7 @@ [4]: /tools/mb/mb_config.pyl [5]: /testing/buildbot/ [6]: https://chromium.googlesource.com/chromium/tools/build/+/HEAD/recipes/recipe_modules/chromium_tests/trybots.py -[7]: https://ci.chromium.org/p/chromium/builders/ci/linux-rel +[7]: https://ci.chromium.org/p/chromium/builders/ci/ToTLinux [8]: https://chromium.googlesource.com/chromium/tools/build/+/HEAD/recipes/recipe_modules/chromium/api.py [9]: https://chromium.googlesource.com/chromium/tools/build/+/HEAD/recipes/recipe_modules/chromium_tests/api.py [10]: https://chromium.googlesource.com/chromium/tools/build/+/HEAD/recipes/recipes.py
diff --git a/docs/security/sheriff.md b/docs/security/sheriff.md index 88c173a..f52167c 100644 --- a/docs/security/sheriff.md +++ b/docs/security/sheriff.md
@@ -229,6 +229,13 @@ [go/url-spoofs](http://go/url-spoofs) for a guide to triaging these. * **SQLite bugs** can be assigned to mek@. CC drhsqlite@ for upstream issues. +Note that **even when you are handing off triage to another team or point of +contact**, it is your responsibility to ensure that the `Security_Severity` and +`FoundIn` fields are set as soon as possible (and definitely before the end of +your sheriffing shift). Work with your point of contact to set these. For +instance, you may want to set initial/provisional values for these fields and +ask them whether it matches their understanding. + Tips for reproducing bugs: * Assume that test cases may be malicious. You should only reproduce bugs
diff --git a/docs/webapps/README.md b/docs/webapps/README.md index d4ce5748..aef1602d 100644 --- a/docs/webapps/README.md +++ b/docs/webapps/README.md
@@ -144,6 +144,9 @@ - If you need to change something in the WebAppProvider system, you should probably use a command. - Commands talk to the system using locks they are granted. The locks should offer access to "managers" that the commands can use. +- Commands expose a `ToDebugValue()` method that is logged on completion and exposed in the chrome://web-app-internals. This can be very helpful for debugging and bug reports. + +Note: There are DVLOGs in the `WebAppCommandManager` that can be helpful. ### Locks / `WebAppLockManager` @@ -151,6 +154,8 @@ Locks contain assessors that allow the user to access parts of the web app system. This is the safest way to read from the system. +Note: There are DVLOGs in the `WebAppLockManager` that can be helpful. + ### OS Integration Anything that involves talking to the operating system. Usually has to do with adding, modifying, or removing the os entity that we register for the web app. @@ -188,6 +193,22 @@ - [/docs/webapps/why-is-this-test-failing.md][36] - [/docs/webapps/how-to-create-webapp-integration-tests.md][37] +## Debugging + +### chrome://web-app-internals + +This page allows you to see all of the internal information about the WebAppProvider system, including a truncated log of the debug information of the last run commands. + +It is often very useful to ask users to attach a copy of this page in bug reports. + +The integration tests will print out the [contents of this page][57] if a test fails, which can help debug that failure as well. + +### DVLOGs + +The codebase has a number of useful DVLOGs: +- web_app_command_manager.cc: These will log various state changes of commands and the debug values on completion. +- web_app_lock_manager.cc: This will log lock requests and any 'held or pending' lock holders for the requested lock at the time of the request. This does not necessarily mean those locks are blocking (as they may be shared locks) so you will have to look at the request locations to determine the status. + ## Testing Please read [Testing In Chromium][42] for general guidance on writing tests in chromium. @@ -212,6 +233,7 @@ - WebContents and other UI elements do not work in unit tests, and the appropriate fakes must be used (see [External Dependencies][49]). - If one of the external dependencies of the system cannot be faked out yet or the feature is tightly coupled to this, then it might make sense to use a browser test instead (or make that dependency fake-able). +- Please use the [`WebAppTest`][56] base class to help ensure things are set up well for you. ### Browser tests @@ -224,7 +246,7 @@ Browser tests are much more expensive to run, as they basically run a fully functional browser with it's own profile directory. These tests are usually only created to test functionality that requires multiple parts of the system to be running or dependencies like the Sync service to be fully running and functional. It is good practice to have browsertests be as true-to-user-action as possible, to make sure that as much of our stack is exercised. -An example set of browser tests are in [`web_app_browsertest.cc`][38] +An example set of browser tests are in [`web_app_browsertest.cc`][38]. Please use the [`WebAppControllerBrowserTest`][55] base class to help ensure the system is set up correctly. ### Integration tests @@ -369,3 +391,6 @@ [52]: isolated_web_apps.md [53]: /chrome/browser/web_applications/url_handler_prefs.h [54]: webui_web_apps.md +[55]: https://source.chromium.org/search?q=WebAppControllerBrowserTest +[56]: https://source.chromium.org/search?q=web_app_test.h +[57]: https://source.chromium.org/search?q=WebAppInternalsHandler::BuildDebugInfo
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index ee52d03..2eb66fde 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn
@@ -27,6 +27,8 @@ "async_api_function.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + public_deps = [ "//base", "//extensions/browser:browser_sources", @@ -121,6 +123,9 @@ "core_extensions_browser_api_provider.cc", "core_extensions_browser_api_provider.h", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//extensions/browser:browser_sources", "//extensions/browser/api:api_registration",
diff --git a/extensions/browser/api/alarms/BUILD.gn b/extensions/browser/api/alarms/BUILD.gn index 6f90268b..689ece62 100644 --- a/extensions/browser/api/alarms/BUILD.gn +++ b/extensions/browser/api/alarms/BUILD.gn
@@ -17,6 +17,8 @@ "alarms_api_constants.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//extensions/common",
diff --git a/extensions/browser/api/app_current_window_internal/BUILD.gn b/extensions/browser/api/app_current_window_internal/BUILD.gn index c29916c..f9ef7a0e 100644 --- a/extensions/browser/api/app_current_window_internal/BUILD.gn +++ b/extensions/browser/api/app_current_window_internal/BUILD.gn
@@ -13,6 +13,8 @@ "app_current_window_internal_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/common",
diff --git a/extensions/browser/api/app_runtime/BUILD.gn b/extensions/browser/api/app_runtime/BUILD.gn index 8173740..6dee7b4 100644 --- a/extensions/browser/api/app_runtime/BUILD.gn +++ b/extensions/browser/api/app_runtime/BUILD.gn
@@ -13,6 +13,8 @@ "app_runtime_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//extensions/common", "//extensions/common/api",
diff --git a/extensions/browser/api/app_window/BUILD.gn b/extensions/browser/api/app_window/BUILD.gn index 3b46419..9a5e18e 100644 --- a/extensions/browser/api/app_window/BUILD.gn +++ b/extensions/browser/api/app_window/BUILD.gn
@@ -13,6 +13,8 @@ "app_window_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//content/public/browser",
diff --git a/extensions/browser/api/audio/BUILD.gn b/extensions/browser/api/audio/BUILD.gn index 432e659..ba6d0276 100644 --- a/extensions/browser/api/audio/BUILD.gn +++ b/extensions/browser/api/audio/BUILD.gn
@@ -19,6 +19,8 @@ "pref_names.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + public_deps = [ "//extensions/browser:browser_sources" ] deps = [
diff --git a/extensions/browser/api/automation_internal/BUILD.gn b/extensions/browser/api/automation_internal/BUILD.gn index 4b3d3c6..2bc57b2f 100644 --- a/extensions/browser/api/automation_internal/BUILD.gn +++ b/extensions/browser/api/automation_internal/BUILD.gn
@@ -18,6 +18,8 @@ "automation_internal_api_delegate.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + public_deps = [ "//extensions/browser:browser_sources" ] deps = [
diff --git a/extensions/browser/api/bluetooth/BUILD.gn b/extensions/browser/api/bluetooth/BUILD.gn index 334ae9c..9d041d2 100644 --- a/extensions/browser/api/bluetooth/BUILD.gn +++ b/extensions/browser/api/bluetooth/BUILD.gn
@@ -23,6 +23,8 @@ "bluetooth_private_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//components/device_event_log",
diff --git a/extensions/browser/api/bluetooth_low_energy/BUILD.gn b/extensions/browser/api/bluetooth_low_energy/BUILD.gn index 48e8dd1..a1b5f41 100644 --- a/extensions/browser/api/bluetooth_low_energy/BUILD.gn +++ b/extensions/browser/api/bluetooth_low_energy/BUILD.gn
@@ -23,6 +23,8 @@ "utils.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//device/bluetooth", "//device/bluetooth/public/cpp",
diff --git a/extensions/browser/api/bluetooth_socket/BUILD.gn b/extensions/browser/api/bluetooth_socket/BUILD.gn index 9b932ce0..b0625628 100644 --- a/extensions/browser/api/bluetooth_socket/BUILD.gn +++ b/extensions/browser/api/bluetooth_socket/BUILD.gn
@@ -17,6 +17,8 @@ "bluetooth_socket_event_dispatcher.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/browser/api:async_api_function",
diff --git a/extensions/browser/api/cec_private/BUILD.gn b/extensions/browser/api/cec_private/BUILD.gn index 66e6c168..4fb0523 100644 --- a/extensions/browser/api/cec_private/BUILD.gn +++ b/extensions/browser/api/cec_private/BUILD.gn
@@ -13,6 +13,8 @@ "cec_private_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//chromeos/ash/components/dbus/cec_service", "//extensions/common",
diff --git a/extensions/browser/api/declarative_net_request/BUILD.gn b/extensions/browser/api/declarative_net_request/BUILD.gn index 9d206f8..1fc492f 100644 --- a/extensions/browser/api/declarative_net_request/BUILD.gn +++ b/extensions/browser/api/declarative_net_request/BUILD.gn
@@ -15,6 +15,8 @@ "web_contents_helper.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//content/public/browser",
diff --git a/extensions/browser/api/diagnostics/BUILD.gn b/extensions/browser/api/diagnostics/BUILD.gn index bb65a9b..97e04dc1 100644 --- a/extensions/browser/api/diagnostics/BUILD.gn +++ b/extensions/browser/api/diagnostics/BUILD.gn
@@ -16,6 +16,8 @@ "diagnostics_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//chromeos/ash/components/dbus", "//chromeos/ash/components/dbus/debug_daemon",
diff --git a/extensions/browser/api/dns/BUILD.gn b/extensions/browser/api/dns/BUILD.gn index 0a9c429..a80cf17f 100644 --- a/extensions/browser/api/dns/BUILD.gn +++ b/extensions/browser/api/dns/BUILD.gn
@@ -13,6 +13,8 @@ "dns_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/common",
diff --git a/extensions/browser/api/feedback_private/BUILD.gn b/extensions/browser/api/feedback_private/BUILD.gn index 40c1221..5aa7f77 100644 --- a/extensions/browser/api/feedback_private/BUILD.gn +++ b/extensions/browser/api/feedback_private/BUILD.gn
@@ -17,6 +17,8 @@ "feedback_service.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//build:chromeos_buildflags",
diff --git a/extensions/browser/api/file_handlers/BUILD.gn b/extensions/browser/api/file_handlers/BUILD.gn index 10784dd..766a98b 100644 --- a/extensions/browser/api/file_handlers/BUILD.gn +++ b/extensions/browser/api/file_handlers/BUILD.gn
@@ -22,6 +22,8 @@ sources += [ "non_native_file_system_delegate.h" ] } + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base:base", "//build:chromeos_buildflags",
diff --git a/extensions/browser/api/file_system/BUILD.gn b/extensions/browser/api/file_system/BUILD.gn index 98e0992..fec41894 100644 --- a/extensions/browser/api/file_system/BUILD.gn +++ b/extensions/browser/api/file_system/BUILD.gn
@@ -18,6 +18,8 @@ "saved_files_service_interface.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//build:chromeos_buildflags",
diff --git a/extensions/browser/api/i18n/BUILD.gn b/extensions/browser/api/i18n/BUILD.gn index f869a72..5c035f07 100644 --- a/extensions/browser/api/i18n/BUILD.gn +++ b/extensions/browser/api/i18n/BUILD.gn
@@ -13,6 +13,8 @@ "i18n_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//components/language/core/browser:browser",
diff --git a/extensions/browser/api/idle/BUILD.gn b/extensions/browser/api/idle/BUILD.gn index 7eebc80..5acbe0e 100644 --- a/extensions/browser/api/idle/BUILD.gn +++ b/extensions/browser/api/idle/BUILD.gn
@@ -20,6 +20,8 @@ "idle_manager_factory.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//components/keyed_service/content",
diff --git a/extensions/browser/api/lock_screen_data/BUILD.gn b/extensions/browser/api/lock_screen_data/BUILD.gn index 9d91e0f..b76c3ed 100644 --- a/extensions/browser/api/lock_screen_data/BUILD.gn +++ b/extensions/browser/api/lock_screen_data/BUILD.gn
@@ -21,6 +21,8 @@ "operation_result.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//components/keyed_service/content",
diff --git a/extensions/browser/api/management/BUILD.gn b/extensions/browser/api/management/BUILD.gn index 37a366d8..6425cf6 100644 --- a/extensions/browser/api/management/BUILD.gn +++ b/extensions/browser/api/management/BUILD.gn
@@ -16,6 +16,8 @@ "management_api_delegate.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//content/public/browser",
diff --git a/extensions/browser/api/media_perception_private/BUILD.gn b/extensions/browser/api/media_perception_private/BUILD.gn index d5ac1bcc..6294d47 100644 --- a/extensions/browser/api/media_perception_private/BUILD.gn +++ b/extensions/browser/api/media_perception_private/BUILD.gn
@@ -18,6 +18,8 @@ "media_perception_private_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//chromeos/ash/components/dbus",
diff --git a/extensions/browser/api/messaging/BUILD.gn b/extensions/browser/api/messaging/BUILD.gn index ae975329..ed8e365 100644 --- a/extensions/browser/api/messaging/BUILD.gn +++ b/extensions/browser/api/messaging/BUILD.gn
@@ -23,6 +23,8 @@ "messaging_delegate.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ ":native_messaging", "//base", @@ -46,6 +48,8 @@ "native_messaging_channel.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//ui/gfx:native_widget_types",
diff --git a/extensions/browser/api/metrics_private/BUILD.gn b/extensions/browser/api/metrics_private/BUILD.gn index 73286264..f626dc7 100644 --- a/extensions/browser/api/metrics_private/BUILD.gn +++ b/extensions/browser/api/metrics_private/BUILD.gn
@@ -14,6 +14,8 @@ "metrics_private_delegate.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//components/variations", "//content/public/browser",
diff --git a/extensions/browser/api/mime_handler_private/BUILD.gn b/extensions/browser/api/mime_handler_private/BUILD.gn index f68527b..34348d4 100644 --- a/extensions/browser/api/mime_handler_private/BUILD.gn +++ b/extensions/browser/api/mime_handler_private/BUILD.gn
@@ -13,6 +13,8 @@ "mime_handler_private.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/common:common_constants",
diff --git a/extensions/browser/api/networking_private/BUILD.gn b/extensions/browser/api/networking_private/BUILD.gn index 86c38dd..9ae8caa 100644 --- a/extensions/browser/api/networking_private/BUILD.gn +++ b/extensions/browser/api/networking_private/BUILD.gn
@@ -25,6 +25,8 @@ "networking_private_event_router_factory.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//components/keyed_service/content",
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc index cfa797871..a351c654 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos.cc +++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -389,8 +389,7 @@ NET_LOG(USER) << "networkingPrivate.setProperties for: " << NetworkId(network); GetManagedConfigurationHandler()->SetProperties( - network->path(), base::Value(std::move(properties)), - std::move(success_callback), + network->path(), properties, std::move(success_callback), base::BindOnce(&NetworkHandlerFailureCallback, std::move(failure_callback))); } @@ -419,7 +418,7 @@ properties.GetDict(), ::onc::network_config::kGUID); NET_LOG(USER) << "networkingPrivate.CreateNetwork. GUID=" << guid; GetManagedConfigurationHandler()->CreateConfiguration( - user_id_hash, properties, + user_id_hash, properties.GetDict(), base::BindOnce(&NetworkHandlerCreateCallback, std::move(success_callback)), base::BindOnce(&NetworkHandlerFailureCallback,
diff --git a/extensions/browser/api/offscreen/BUILD.gn b/extensions/browser/api/offscreen/BUILD.gn index e609665..e9732fbf 100644 --- a/extensions/browser/api/offscreen/BUILD.gn +++ b/extensions/browser/api/offscreen/BUILD.gn
@@ -21,6 +21,8 @@ "offscreen_document_manager.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//components/keyed_service/content",
diff --git a/extensions/browser/api/power/BUILD.gn b/extensions/browser/api/power/BUILD.gn index f6fe6a1..05735160 100644 --- a/extensions/browser/api/power/BUILD.gn +++ b/extensions/browser/api/power/BUILD.gn
@@ -13,6 +13,8 @@ "power_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//content/public/common",
diff --git a/extensions/browser/api/printer_provider/BUILD.gn b/extensions/browser/api/printer_provider/BUILD.gn index fc2157d..2fb9160 100644 --- a/extensions/browser/api/printer_provider/BUILD.gn +++ b/extensions/browser/api/printer_provider/BUILD.gn
@@ -20,6 +20,8 @@ "printer_provider_print_job.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//components/keyed_service/content", "//content/public/browser",
diff --git a/extensions/browser/api/runtime/BUILD.gn b/extensions/browser/api/runtime/BUILD.gn index 192cb0c..ba71b00 100644 --- a/extensions/browser/api/runtime/BUILD.gn +++ b/extensions/browser/api/runtime/BUILD.gn
@@ -15,6 +15,8 @@ "runtime_api_delegate.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//components/prefs", "//content/public/browser",
diff --git a/extensions/browser/api/serial/BUILD.gn b/extensions/browser/api/serial/BUILD.gn index 79bfa3d..42d6e5b 100644 --- a/extensions/browser/api/serial/BUILD.gn +++ b/extensions/browser/api/serial/BUILD.gn
@@ -17,6 +17,8 @@ "serial_port_manager.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/common", "//extensions/common/api",
diff --git a/extensions/browser/api/socket/BUILD.gn b/extensions/browser/api/socket/BUILD.gn index 09d5ab8..308664f 100644 --- a/extensions/browser/api/socket/BUILD.gn +++ b/extensions/browser/api/socket/BUILD.gn
@@ -24,6 +24,8 @@ "udp_socket.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//content/public/browser",
diff --git a/extensions/browser/api/sockets_tcp/BUILD.gn b/extensions/browser/api/sockets_tcp/BUILD.gn index 772a5236..73264860 100644 --- a/extensions/browser/api/sockets_tcp/BUILD.gn +++ b/extensions/browser/api/sockets_tcp/BUILD.gn
@@ -15,6 +15,8 @@ "tcp_socket_event_dispatcher.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//content/public/browser",
diff --git a/extensions/browser/api/sockets_tcp_server/BUILD.gn b/extensions/browser/api/sockets_tcp_server/BUILD.gn index fa5cc9a9..9d93f72 100644 --- a/extensions/browser/api/sockets_tcp_server/BUILD.gn +++ b/extensions/browser/api/sockets_tcp_server/BUILD.gn
@@ -15,6 +15,8 @@ "tcp_server_socket_event_dispatcher.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//content/public/common",
diff --git a/extensions/browser/api/sockets_udp/BUILD.gn b/extensions/browser/api/sockets_udp/BUILD.gn index 14e58e9a..9678c8c 100644 --- a/extensions/browser/api/sockets_udp/BUILD.gn +++ b/extensions/browser/api/sockets_udp/BUILD.gn
@@ -15,6 +15,8 @@ "udp_socket_event_dispatcher.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//extensions/browser/api/socket", "//extensions/common",
diff --git a/extensions/browser/api/storage/BUILD.gn b/extensions/browser/api/storage/BUILD.gn index 6c0f830..190bcc4b 100644 --- a/extensions/browser/api/storage/BUILD.gn +++ b/extensions/browser/api/storage/BUILD.gn
@@ -31,6 +31,8 @@ "weak_unlimited_settings_storage.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//components/keyed_service/content",
diff --git a/extensions/browser/api/system_cpu/BUILD.gn b/extensions/browser/api/system_cpu/BUILD.gn index 11b7144..2f39c29 100644 --- a/extensions/browser/api/system_cpu/BUILD.gn +++ b/extensions/browser/api/system_cpu/BUILD.gn
@@ -16,6 +16,8 @@ "system_cpu_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//extensions/browser/api/system_info",
diff --git a/extensions/browser/api/system_info/BUILD.gn b/extensions/browser/api/system_info/BUILD.gn index 24c76a8..ff4c344 100644 --- a/extensions/browser/api/system_info/BUILD.gn +++ b/extensions/browser/api/system_info/BUILD.gn
@@ -15,6 +15,8 @@ "system_info_provider.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//components/storage_monitor", "//content/public/browser",
diff --git a/extensions/browser/api/system_memory/BUILD.gn b/extensions/browser/api/system_memory/BUILD.gn index 1f67bce..91a592e 100644 --- a/extensions/browser/api/system_memory/BUILD.gn +++ b/extensions/browser/api/system_memory/BUILD.gn
@@ -15,6 +15,8 @@ "system_memory_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//extensions/browser/api/system_info", "//extensions/common/api",
diff --git a/extensions/browser/api/system_network/BUILD.gn b/extensions/browser/api/system_network/BUILD.gn index f7cc08a..497c48d 100644 --- a/extensions/browser/api/system_network/BUILD.gn +++ b/extensions/browser/api/system_network/BUILD.gn
@@ -13,6 +13,8 @@ "system_network_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/common/api",
diff --git a/extensions/browser/api/system_storage/BUILD.gn b/extensions/browser/api/system_storage/BUILD.gn index 6280e55..813ee79 100644 --- a/extensions/browser/api/system_storage/BUILD.gn +++ b/extensions/browser/api/system_storage/BUILD.gn
@@ -15,6 +15,8 @@ "system_storage_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//components/storage_monitor", "//content/public/browser",
diff --git a/extensions/browser/api/test/BUILD.gn b/extensions/browser/api/test/BUILD.gn index 80d7cde..eaef5e3 100644 --- a/extensions/browser/api/test/BUILD.gn +++ b/extensions/browser/api/test/BUILD.gn
@@ -17,6 +17,8 @@ "test_api_observer_registry.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//base", "//content/public/common",
diff --git a/extensions/browser/api/virtual_keyboard/BUILD.gn b/extensions/browser/api/virtual_keyboard/BUILD.gn index 8964ca32..9a607e8 100644 --- a/extensions/browser/api/virtual_keyboard/BUILD.gn +++ b/extensions/browser/api/virtual_keyboard/BUILD.gn
@@ -14,6 +14,8 @@ "virtual_keyboard_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//build:chromeos_buildflags", "//extensions/browser/api/virtual_keyboard_private",
diff --git a/extensions/browser/api/virtual_keyboard_private/BUILD.gn b/extensions/browser/api/virtual_keyboard_private/BUILD.gn index 0c576c0..58a314f 100644 --- a/extensions/browser/api/virtual_keyboard_private/BUILD.gn +++ b/extensions/browser/api/virtual_keyboard_private/BUILD.gn
@@ -13,6 +13,8 @@ "virtual_keyboard_private_api.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//extensions/common/api" ] public_deps = [ @@ -24,6 +26,8 @@ source_set("virtual_keyboard_delegate") { sources = [ "virtual_keyboard_delegate.h" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//content/public/browser", "//extensions/common/api",
diff --git a/extensions/browser/api/webcam_private/BUILD.gn b/extensions/browser/api/webcam_private/BUILD.gn index c13fc2b0d85..e4eac8cd 100644 --- a/extensions/browser/api/webcam_private/BUILD.gn +++ b/extensions/browser/api/webcam_private/BUILD.gn
@@ -23,6 +23,8 @@ "webcam_private_api_chromeos.cc", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + deps = [ "//chromeos/dbus/ip_peripheral", "//extensions/browser/api/serial",
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc index a3a4115..0d0732d 100644 --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc
@@ -114,8 +114,8 @@ base::FEATURE_DISABLED_BY_DEFAULT); // File Handlers. -BASE_FEATURE(kWebFileHandlers, - "WebFileHandlers", +BASE_FEATURE(kExtensionWebFileHandlers, + "ExtensionWebFileHandlers", base::FEATURE_DISABLED_BY_DEFAULT); // IsValidSourceUrl enforcement for ExtensionHostMsg_OpenChannelToExtension IPC.
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h index 22aff15f..f71242d 100644 --- a/extensions/common/extension_features.h +++ b/extensions/common/extension_features.h
@@ -42,7 +42,7 @@ BASE_DECLARE_FEATURE(kExtensionSidePanelIntegration); -BASE_DECLARE_FEATURE(kWebFileHandlers); +BASE_DECLARE_FEATURE(kExtensionWebFileHandlers); BASE_DECLARE_FEATURE(kExtensionSourceUrlEnforcement);
diff --git a/extensions/common/manifest_handlers/file_handler_manifest_unittest.cc b/extensions/common/manifest_handlers/file_handler_manifest_unittest.cc index 83ad7b4..f86dc70 100644 --- a/extensions/common/manifest_handlers/file_handler_manifest_unittest.cc +++ b/extensions/common/manifest_handlers/file_handler_manifest_unittest.cc
@@ -94,7 +94,8 @@ class WebFileHandlersTest : public ManifestTest { public: WebFileHandlersTest() : channel_(version_info::Channel::DEV) { - feature_list_.InitAndEnableFeature(extensions_features::kWebFileHandlers); + feature_list_.InitAndEnableFeature( + extensions_features::kExtensionWebFileHandlers); } protected:
diff --git a/extensions/common/manifest_handlers/web_file_handlers_info.cc b/extensions/common/manifest_handlers/web_file_handlers_info.cc index 4fe90104..5243d31 100644 --- a/extensions/common/manifest_handlers/web_file_handlers_info.cc +++ b/extensions/common/manifest_handlers/web_file_handlers_info.cc
@@ -224,13 +224,14 @@ const Extension* extension, std::string* error, std::vector<InstallWarning>* warnings) const { - // TODO(1313786): Validate that icons exist. + // TODO(1313786): Verify that icons exist. return true; } bool WebFileHandlers::SupportsWebFileHandlers(const int manifest_version) { return manifest_version >= 3 && - base::FeatureList::IsEnabled(extensions_features::kWebFileHandlers); + base::FeatureList::IsEnabled( + extensions_features::kExtensionWebFileHandlers); } } // namespace extensions
diff --git a/extensions/renderer/BUILD.gn b/extensions/renderer/BUILD.gn index f473618f..ee198edd 100644 --- a/extensions/renderer/BUILD.gn +++ b/extensions/renderer/BUILD.gn
@@ -124,6 +124,8 @@ "extension_interaction_provider.h", "extension_js_runner.cc", "extension_js_runner.h", + "extension_localization_throttle.cc", + "extension_localization_throttle.h", "extension_throttle_entry.cc", "extension_throttle_entry.h", "extension_throttle_manager.cc", @@ -158,8 +160,6 @@ "ipc_message_sender.h", "lazy_background_page_native_handler.cc", "lazy_background_page_native_handler.h", - "localization_peer.cc", - "localization_peer.h", "logging_native_handler.cc", "logging_native_handler.h", "module_system.cc", @@ -355,13 +355,13 @@ "bindings/listener_tracker_unittest.cc", "bindings/returns_async_builder.cc", "bindings/returns_async_builder.h", + "extension_localization_throttle_unittest.cc", "extension_throttle_simulation_unittest.cc", "extension_throttle_test_support.cc", "extension_throttle_test_support.h", "extension_throttle_unittest.cc", "feature_cache_unittest.cc", "gc_callback_unittest.cc", - "localization_peer_unittest.cc", "module_system_test.cc", "module_system_test.h", "module_system_unittest.cc", @@ -388,6 +388,7 @@ "//gin", "//gin:gin_test", "//ipc:test_support", + "//services/network:test_support", "//testing/gmock", "//testing/gtest", "//third_party/blink/public:blink",
diff --git a/extensions/renderer/DEPS b/extensions/renderer/DEPS index 50d4b6a8..11bfa95 100644 --- a/extensions/renderer/DEPS +++ b/extensions/renderer/DEPS
@@ -38,6 +38,10 @@ ] specific_include_rules = { + "extension_localization_throttle_unittest.cc": [ + "+net/base/request_priority.h", + "+services/network/test/test_url_loader_client.h", + ], "extension_throttle_manager.cc": [ # For net::IsLocalhost. "+net/base/url_util.h",
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index 784afb3..a30fd3c 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -177,8 +177,10 @@ } void AutomationInternalCustomBindings::StopCachingAccessibilityTrees() { - message_filter_->Detach(); - message_filter_.reset(); + if (message_filter_) { + message_filter_->Detach(); + message_filter_.reset(); + } } //
diff --git a/extensions/renderer/extension_localization_throttle.cc b/extensions/renderer/extension_localization_throttle.cc new file mode 100644 index 0000000..d045667 --- /dev/null +++ b/extensions/renderer/extension_localization_throttle.cc
@@ -0,0 +1,251 @@ +// 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 "extensions/renderer/extension_localization_throttle.h" + +#include "base/memory/ptr_util.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "content/public/renderer/render_thread.h" +#include "extensions/common/constants.h" +#include "extensions/renderer/shared_l10n_map.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" +#include "mojo/public/cpp/system/data_pipe_drainer.h" +#include "mojo/public/cpp/system/data_pipe_producer.h" +#include "mojo/public/cpp/system/string_data_source.h" +#include "services/network/public/mojom/early_hints.mojom.h" +#include "services/network/public/mojom/url_loader.mojom.h" +#include "third_party/blink/public/platform/web_url.h" +#include "url/gurl.h" + +namespace extensions { + +namespace { + +const char kCancelReason[] = "ExtensionLocalizationThrottle"; + +class ExtensionLocalizationURLLoader : public network::mojom::URLLoaderClient, + public network::mojom::URLLoader, + public mojo::DataPipeDrainer::Client { + public: + ExtensionLocalizationURLLoader( + const std::string& extension_id, + mojo::PendingRemote<network::mojom::URLLoaderClient> + destination_url_loader_client) + : extension_id_(extension_id), + destination_url_loader_client_( + std::move(destination_url_loader_client)) {} + ~ExtensionLocalizationURLLoader() override = default; + + bool Start( + mojo::PendingRemote<network::mojom::URLLoader> source_url_loader_remote, + mojo::PendingReceiver<network::mojom::URLLoaderClient> + source_url_client_receiver, + mojo::ScopedDataPipeConsumerHandle body, + mojo::ScopedDataPipeProducerHandle producer_handle) { + source_url_loader_.Bind(std::move(source_url_loader_remote)); + source_url_client_receiver_.Bind(std::move(source_url_client_receiver)); + + data_drainer_ = + std::make_unique<mojo::DataPipeDrainer>(this, std::move(body)); + data_producer_ = + std::make_unique<mojo::DataPipeProducer>(std::move(producer_handle)); + return true; + } + + // network::mojom::URLLoaderClient implementation (called from the source of + // the response): + void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override { + // OnReceiveEarlyHints() shouldn't be called because + // ExtensionLocalizationURLLoader is + // created by ExtensionLocalizationThrottle::WillProcessResponse(), which is + // equivalent to OnReceiveResponse(). + NOTREACHED(); + } + void OnReceiveResponse( + network::mojom::URLResponseHeadPtr response_head, + mojo::ScopedDataPipeConsumerHandle body, + absl::optional<mojo_base::BigBuffer> cached_metadata) override { + // OnReceiveResponse() shouldn't be called because + // ExtensionLocalizationURLLoader is + // created by ExtensionLocalizationThrottle::WillProcessResponse(), which is + // equivalent to OnReceiveResponse(). + NOTREACHED(); + } + void OnReceiveRedirect( + const net::RedirectInfo& redirect_info, + network::mojom::URLResponseHeadPtr response_head) override { + // OnReceiveRedirect() shouldn't be called because + // ExtensionLocalizationURLLoader is + // created by ExtensionLocalizationThrottle::WillProcessResponse(), which is + // equivalent to OnReceiveResponse(). + NOTREACHED(); + } + void OnUploadProgress(int64_t current_position, + int64_t total_size, + OnUploadProgressCallback ack_callback) override { + // OnUploadProgress() shouldn't be called because + // ExtensionLocalizationURLLoader is + // created by ExtensionLocalizationThrottle::WillProcessResponse(), which is + // equivalent to OnReceiveResponse(). + NOTREACHED(); + } + void OnTransferSizeUpdated(int32_t transfer_size_diff) override { + destination_url_loader_client_->OnTransferSizeUpdated(transfer_size_diff); + } + void OnComplete(const network::URLLoaderCompletionStatus& status) override { + original_complete_status_ = status; + MaybeSendOnComplete(); + } + + // network::mojom::URLLoader implementation (called from the destination of + // the response): + void FollowRedirect( + const std::vector<std::string>& removed_headers, + const net::HttpRequestHeaders& modified_headers, + const net::HttpRequestHeaders& modified_cors_exempt_headers, + const absl::optional<GURL>& new_url) override { + // ExtensionLocalizationURLLoader starts handling the request after + // OnReceivedResponse(). A redirect response is not expected. + NOTREACHED(); + } + void SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) override { + source_url_loader_->SetPriority(priority, intra_priority_value); + } + void PauseReadingBodyFromNet() override { + source_url_loader_->PauseReadingBodyFromNet(); + } + void ResumeReadingBodyFromNet() override { + source_url_loader_->ResumeReadingBodyFromNet(); + } + + // mojo::DataPipeDrainer + void OnDataAvailable(const void* data, size_t num_bytes) override { + data_.append(static_cast<const char*>(data), num_bytes); + } + void OnDataComplete() override { + data_drainer_.reset(); + + if (!data_.empty()) { + ReplaceMessages(); + } + + // Safe to use Unretained(this) because `this` owns `data_producer_`. + data_producer_->Write( + std::make_unique<mojo::StringDataSource>( + base::StringPiece(data_), mojo::StringDataSource::AsyncWritingMode:: + STRING_STAYS_VALID_UNTIL_COMPLETION), + base::BindOnce(&ExtensionLocalizationURLLoader::OnDataWritten, + base::Unretained(this))); + } + + private: + void OnDataWritten(MojoResult result) { + data_producer_.reset(); + data_write_result_ = result; + MaybeSendOnComplete(); + } + + void MaybeSendOnComplete() { + if (!original_complete_status_ || !data_write_result_) { + return; + } + if (*data_write_result_ != MOJO_RESULT_OK) { + destination_url_loader_client_->OnComplete( + network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES)); + } else { + destination_url_loader_client_->OnComplete(*original_complete_status_); + } + } + + void ReplaceMessages() { + IPC::Sender* message_sender = content::RenderThread::Get(); + extensions::SharedL10nMap::GetInstance().ReplaceMessages( + extension_id_, &data_, message_sender); + } + + const std::string extension_id_; + std::unique_ptr<mojo::DataPipeDrainer> data_drainer_; + std::unique_ptr<mojo::DataPipeProducer> data_producer_; + std::string data_; + + absl::optional<network::URLLoaderCompletionStatus> original_complete_status_; + absl::optional<MojoResult> data_write_result_; + + mojo::Receiver<network::mojom::URLLoaderClient> source_url_client_receiver_{ + this}; + mojo::Remote<network::mojom::URLLoader> source_url_loader_; + mojo::Remote<network::mojom::URLLoaderClient> destination_url_loader_client_; +}; + +} // namespace + +// static +std::unique_ptr<ExtensionLocalizationThrottle> +ExtensionLocalizationThrottle::MaybeCreate(const blink::WebURL& request_url) { + if (!request_url.ProtocolIs(extensions::kExtensionScheme)) { + return nullptr; + } + return base::WrapUnique(new ExtensionLocalizationThrottle()); +} + +ExtensionLocalizationThrottle::ExtensionLocalizationThrottle() = default; + +ExtensionLocalizationThrottle::~ExtensionLocalizationThrottle() = default; + +void ExtensionLocalizationThrottle::DetachFromCurrentSequence() {} + +void ExtensionLocalizationThrottle::WillProcessResponse( + const GURL& response_url, + network::mojom::URLResponseHead* response_head, + bool* defer) { + // ExtensionURLLoader can only redirect requests within the + // chrome-extension:// scheme. + DCHECK(response_url.SchemeIs(extensions::kExtensionScheme)); + if (!base::StartsWith(response_head->mime_type, "text/css", + base::CompareCase::INSENSITIVE_ASCII)) { + return; + } + + mojo::ScopedDataPipeConsumerHandle body; + mojo::ScopedDataPipeProducerHandle producer_handle; + MojoResult create_pipe_result = + mojo::CreateDataPipe(/*options=*/nullptr, producer_handle, body); + + if (create_pipe_result != MOJO_RESULT_OK || force_error_for_test_) { + delegate_->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES, kCancelReason); + return; + } + + mojo::PendingRemote<network::mojom::URLLoader> new_remote; + mojo::PendingRemote<network::mojom::URLLoaderClient> url_loader_client; + mojo::PendingReceiver<network::mojom::URLLoaderClient> new_receiver = + url_loader_client.InitWithNewPipeAndPassReceiver(); + mojo::PendingRemote<network::mojom::URLLoader> source_loader; + mojo::PendingReceiver<network::mojom::URLLoaderClient> source_client_receiver; + + auto loader = std::make_unique<ExtensionLocalizationURLLoader>( + response_url.host(), std::move(url_loader_client)); + + ExtensionLocalizationURLLoader* loader_rawptr = loader.get(); + // `loader` will be deleted when `new_remote` is disconnected. + // `new_remote` is binded to ThrottlingURLLoader::url_loader_. So when + // ThrottlingURLLoader is deleted, `loader` will be deleted. + mojo::MakeSelfOwnedReceiver(std::move(loader), + new_remote.InitWithNewPipeAndPassReceiver()); + delegate_->InterceptResponse(std::move(new_remote), std::move(new_receiver), + &source_loader, &source_client_receiver, &body); + + // ExtensionURLLoader always send a valid DataPipeConsumerHandle. So + // InterceptResponse() must return a valid `body`. + DCHECK(body); + loader_rawptr->Start(std::move(source_loader), + std::move(source_client_receiver), std::move(body), + std::move(producer_handle)); +} + +} // namespace extensions
diff --git a/extensions/renderer/extension_localization_throttle.h b/extensions/renderer/extension_localization_throttle.h new file mode 100644 index 0000000..b697247 --- /dev/null +++ b/extensions/renderer/extension_localization_throttle.h
@@ -0,0 +1,48 @@ +// 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 EXTENSIONS_RENDERER_EXTENSION_LOCALIZATION_THROTTLE_H_ +#define EXTENSIONS_RENDERER_EXTENSION_LOCALIZATION_THROTTLE_H_ + +#include "base/memory/weak_ptr.h" +#include "mojo/public/cpp/system/data_pipe.h" +#include "services/network/public/mojom/url_response_head.mojom.h" +#include "third_party/blink/public/common/loader/url_loader_throttle.h" + +namespace blink { +class WebURL; +} // namespace blink + +namespace extensions { + +// ExtensionLocalizationThrottle is used to pre-process CSS files +// requested by extensions to replace localization templates with the +// appropriate localized strings. +class ExtensionLocalizationThrottle : public blink::URLLoaderThrottle { + public: + // Creates a ExtensionLocalizationThrottle only when `request_url` + // is a chrome-extention scheme URL. + static std::unique_ptr<ExtensionLocalizationThrottle> MaybeCreate( + const blink::WebURL& request_url); + + ~ExtensionLocalizationThrottle() override; + + // Implements blink::URLLoaderThrottle. + void DetachFromCurrentSequence() override; + void WillProcessResponse(const GURL& response_url, + network::mojom::URLResponseHead* response_head, + bool* defer) override; + + // Force CreateDataPipe to result in an error. + void ForceCreateDataPipeErrorForTest() { force_error_for_test_ = true; } + + private: + ExtensionLocalizationThrottle(); + + bool force_error_for_test_ = false; +}; + +} // namespace extensions + +#endif // EXTENSIONS_RENDERER_EXTENSION_LOCALIZATION_THROTTLE_H_
diff --git a/extensions/renderer/extension_localization_throttle_unittest.cc b/extensions/renderer/extension_localization_throttle_unittest.cc new file mode 100644 index 0000000..ef6ec9c --- /dev/null +++ b/extensions/renderer/extension_localization_throttle_unittest.cc
@@ -0,0 +1,485 @@ +// 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 "extensions/renderer/extension_localization_throttle.h" + +#include "base/test/task_environment.h" +#include "extensions/renderer/shared_l10n_map.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "mojo/public/cpp/system/data_pipe_utils.h" +#include "mojo/public/cpp/system/string_data_source.h" +#include "net/base/request_priority.h" +#include "services/network/test/test_url_loader_client.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/loader/url_loader_throttle.h" +#include "third_party/blink/public/platform/web_url.h" + +namespace extensions { +namespace { + +class FakeURLLoader final : public network::mojom::URLLoader { + public: + enum class Status { + kInitial, + kPauseReading, + kResumeReading, + }; + + explicit FakeURLLoader( + mojo::PendingReceiver<network::mojom::URLLoader> url_loader_receiver) + : receiver_(this, std::move(url_loader_receiver)) {} + ~FakeURLLoader() override = default; + + FakeURLLoader(const FakeURLLoader&) = delete; + FakeURLLoader& operator=(const FakeURLLoader&) = delete; + + // network::mojom::URLLoader overrides. + void FollowRedirect( + const std::vector<std::string>& removed_headers, + const net::HttpRequestHeaders& modified_headers, + const net::HttpRequestHeaders& modified_cors_exempt_headers, + const absl::optional<GURL>& new_url) override { + NOTREACHED(); + } + void SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) override { + set_priority_called_ = true; + } + void PauseReadingBodyFromNet() override { status_ = Status::kPauseReading; } + void ResumeReadingBodyFromNet() override { status_ = Status::kResumeReading; } + + bool set_priority_called() const { return set_priority_called_; } + + Status status() const { return status_; } + + private: + bool set_priority_called_ = false; + + Status status_ = Status::kInitial; + + mojo::Receiver<network::mojom::URLLoader> receiver_; +}; + +class FakeDelegate : public blink::URLLoaderThrottle::Delegate { + public: + // Implements blink::URLLoaderThrottle::Delegate. + void CancelWithError(int error_code, + base::StringPiece custom_reason) override { + cancel_error_code_ = error_code; + cancel_custom_reason_ = std::string(custom_reason); + } + void Resume() override { NOTREACHED(); } + + void SetPriority(net::RequestPriority priority) override { NOTREACHED(); } + void UpdateDeferredResponseHead( + network::mojom::URLResponseHeadPtr new_response_head, + mojo::ScopedDataPipeConsumerHandle body) override { + NOTREACHED(); + } + void PauseReadingBodyFromNet() override { NOTREACHED(); } + void ResumeReadingBodyFromNet() override { NOTREACHED(); } + void InterceptResponse( + mojo::PendingRemote<network::mojom::URLLoader> new_loader, + mojo::PendingReceiver<network::mojom::URLLoaderClient> + new_client_receiver, + mojo::PendingRemote<network::mojom::URLLoader>* original_loader, + mojo::PendingReceiver<network::mojom::URLLoaderClient>* + original_client_receiver, + mojo::ScopedDataPipeConsumerHandle* body) override { + is_intercepted_ = true; + + destination_loader_remote_.Bind(std::move(new_loader)); + ASSERT_TRUE( + mojo::FusePipes(std::move(new_client_receiver), + mojo::PendingRemote<network::mojom::URLLoaderClient>( + destination_loader_client_.CreateRemote()))); + source_url_loader_ = std::make_unique<FakeURLLoader>( + original_loader->InitWithNewPipeAndPassReceiver()); + + *original_client_receiver = + source_loader_client_remote_.BindNewPipeAndPassReceiver(); + + DCHECK(!source_body_handle_); + + mojo::ScopedDataPipeConsumerHandle consumer_handle; + EXPECT_EQ(MOJO_RESULT_OK, + mojo::CreateDataPipe(/*options=*/nullptr, source_body_handle_, + consumer_handle)); + body->swap(consumer_handle); + + destination_loader_client()->OnReceiveResponse( + network::mojom::URLResponseHead::New(), std::move(consumer_handle), + absl::nullopt); + } + + void LoadResponseBody(const std::string& body) { + mojo::BlockingCopyFromString(body, source_body_handle_); + } + + void CompleteResponse() { + source_loader_client_remote()->OnComplete( + network::URLLoaderCompletionStatus()); + source_body_handle_.reset(); + } + + bool is_intercepted() const { return is_intercepted_; } + const absl::optional<int>& cancel_error_code() const { + return cancel_error_code_; + } + const absl::optional<std::string>& cancel_custom_reason() const { + return cancel_custom_reason_; + } + + mojo::Remote<network::mojom::URLLoader>& destination_loader_remote() { + return destination_loader_remote_; + } + + network::TestURLLoaderClient* destination_loader_client() { + return &destination_loader_client_; + } + + FakeURLLoader* source_url_loader() { return source_url_loader_.get(); } + + mojo::Remote<network::mojom::URLLoaderClient>& source_loader_client_remote() { + return source_loader_client_remote_; + } + + mojo::ScopedDataPipeProducerHandle& source_body_handle() { + return source_body_handle_; + } + + private: + bool is_intercepted_ = false; + absl::optional<int> cancel_error_code_; + absl::optional<std::string> cancel_custom_reason_; + + // The chain of mojom::URLLoaderClient: + // [Blink side] + // destination_loader_client_ + // <- ExtensionLocalizationURLLoader::destination_url_loader_client_ + // <- ExtensionLocalizationURLLoader + // <- ExtensionLocalizationURLLoader::source_url_client_receiver_ + // <- source_loader_client_remote_ + // [Browser process side] + + // The chain of mojom::URLLoader: + // [Blink side] + // destination_loader_remote_ + // -> ExtensionLocalizationURLLoader (SelfOwnedReceiver) + // -> ExtensionLocalizationURLLoader::source_url_loader_ + // -> source_url_loader_ + // [Browser process side] + + mojo::Remote<network::mojom::URLLoader> destination_loader_remote_; + network::TestURLLoaderClient destination_loader_client_; + + std::unique_ptr<FakeURLLoader> source_url_loader_; + mojo::Remote<network::mojom::URLLoaderClient> source_loader_client_remote_; + + mojo::ScopedDataPipeProducerHandle source_body_handle_; +}; + +class ExtensionLocalizationThrottleTest : public testing::Test { + protected: + void SetUp() override { + extensions::SharedL10nMap::L10nMessagesMap messages; + messages.insert(std::make_pair("hello", "hola")); + messages.insert(std::make_pair("world", "mundo")); + extensions::SharedL10nMap::GetInstance().SetMessagesForTesting( + "some_id", std::move(messages)); + } + // Be the first member so it is destroyed last. + base::test::TaskEnvironment task_environment_; +}; + +TEST_F(ExtensionLocalizationThrottleTest, DoNotCreate) { + EXPECT_FALSE(ExtensionLocalizationThrottle::MaybeCreate( + blink::WebURL(GURL("https://example.com/test.css")))); + EXPECT_FALSE(ExtensionLocalizationThrottle::MaybeCreate( + blink::WebURL(GURL("http://example.com/test.css")))); +} + +TEST_F(ExtensionLocalizationThrottleTest, DoNotIntercept) { + const GURL url("chrome-extension://some_id/test.txt"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/plain"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); +} + +TEST_F(ExtensionLocalizationThrottleTest, OneMessage) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + delegate->LoadResponseBody("__MSG_hello__!"); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + delegate->destination_loader_client()->response_body_release(), + &response)); + EXPECT_EQ("hola!", response); + EXPECT_EQ( + net::OK, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, TwoMessages) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + delegate->LoadResponseBody("__MSG_hello__ __MSG"); + task_environment_.RunUntilIdle(); + delegate->LoadResponseBody("_world__!"); + delegate->CompleteResponse(); + + delegate->destination_loader_client()->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + delegate->destination_loader_client()->response_body_release(), + &response)); + EXPECT_EQ("hola mundo!", response); + EXPECT_EQ( + net::OK, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, EmptyData) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + delegate->destination_loader_client()->response_body_release(), + &response)); + EXPECT_EQ("", response); + EXPECT_EQ( + net::OK, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, SourceSideError) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + delegate->LoadResponseBody("__MSG_hello__!"); + + delegate->source_loader_client_remote()->OnComplete( + network::URLLoaderCompletionStatus(net::ERR_OUT_OF_MEMORY)); + delegate->source_body_handle().reset(); + + delegate->destination_loader_client()->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + delegate->destination_loader_client()->response_body_release(), + &response)); + EXPECT_EQ("hola!", response); + EXPECT_EQ( + net::ERR_OUT_OF_MEMORY, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, WriteError) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + // Release the body to cause write error. + delegate->destination_loader_client()->response_body_release(); + task_environment_.RunUntilIdle(); + + delegate->LoadResponseBody("__MSG_hello__!"); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + EXPECT_EQ( + net::ERR_INSUFFICIENT_RESOURCES, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, CreateDataPipeError) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + throttle->ForceCreateDataPipeErrorForTest(); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_FALSE(delegate->is_intercepted()); + + ASSERT_TRUE(delegate->cancel_error_code()); + EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, *delegate->cancel_error_code()); + ASSERT_TRUE(delegate->cancel_custom_reason()); + EXPECT_EQ("ExtensionLocalizationThrottle", *delegate->cancel_custom_reason()); +} + +TEST_F(ExtensionLocalizationThrottleTest, URLLoaderChain) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + FakeURLLoader* source_url_loader = delegate->source_url_loader(); + mojo::Remote<network::mojom::URLLoader>& destination_loader_remote = + delegate->destination_loader_remote(); + + ASSERT_TRUE(source_url_loader); + EXPECT_FALSE(source_url_loader->set_priority_called()); + EXPECT_EQ(FakeURLLoader::Status::kInitial, source_url_loader->status()); + + destination_loader_remote->SetPriority(net::LOW, 1); + task_environment_.RunUntilIdle(); + EXPECT_TRUE(source_url_loader->set_priority_called()); + + destination_loader_remote->PauseReadingBodyFromNet(); + task_environment_.RunUntilIdle(); + EXPECT_EQ(FakeURLLoader::Status::kPauseReading, source_url_loader->status()); + + destination_loader_remote->ResumeReadingBodyFromNet(); + task_environment_.RunUntilIdle(); + EXPECT_EQ(FakeURLLoader::Status::kResumeReading, source_url_loader->status()); + + delegate->LoadResponseBody("__MSG_hello__!"); + delegate->CompleteResponse(); + delegate->destination_loader_client()->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + delegate->destination_loader_client()->response_body_release(), + &response)); + EXPECT_EQ("hola!", response); + EXPECT_EQ( + net::OK, + delegate->destination_loader_client()->completion_status().error_code); +} + +TEST_F(ExtensionLocalizationThrottleTest, + URLLoaderClientOnTransferSizeUpdated) { + const GURL url("chrome-extension://some_id/test.css"); + auto throttle = + ExtensionLocalizationThrottle::MaybeCreate(blink::WebURL(url)); + ASSERT_TRUE(throttle); + + auto delegate = std::make_unique<FakeDelegate>(); + throttle->set_delegate(delegate.get()); + + auto response_head = network::mojom::URLResponseHead::New(); + response_head->mime_type = "text/css"; + bool defer = false; + throttle->WillProcessResponse(url, response_head.get(), &defer); + EXPECT_FALSE(defer); + EXPECT_TRUE(delegate->is_intercepted()); + + network::TestURLLoaderClient* destination_loader_client = + delegate->destination_loader_client(); + mojo::Remote<network::mojom::URLLoaderClient>& source_loader_client_remote = + delegate->source_loader_client_remote(); + + ASSERT_TRUE(destination_loader_client); + EXPECT_EQ(0, destination_loader_client->body_transfer_size()); + + source_loader_client_remote->OnTransferSizeUpdated(/*transfer_size_diff=*/10); + task_environment_.RunUntilIdle(); + EXPECT_EQ(10, destination_loader_client->body_transfer_size()); + + delegate->LoadResponseBody("__MSG_hello__!"); + delegate->CompleteResponse(); + destination_loader_client->RunUntilComplete(); + + std::string response; + EXPECT_TRUE(mojo::BlockingCopyToString( + destination_loader_client->response_body_release(), &response)); + EXPECT_EQ("hola!", response); + EXPECT_EQ(net::OK, destination_loader_client->completion_status().error_code); +} + +} // namespace +} // namespace extensions
diff --git a/extensions/renderer/localization_peer.cc b/extensions/renderer/localization_peer.cc deleted file mode 100644 index c6a39218..0000000 --- a/extensions/renderer/localization_peer.cc +++ /dev/null
@@ -1,265 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "extensions/renderer/localization_peer.h" - -#include <memory> -#include <utility> - -#include "base/functional/bind.h" -#include "base/memory/ptr_util.h" -#include "base/strings/string_util.h" -#include "extensions/common/constants.h" -#include "extensions/common/extension_messages.h" -#include "extensions/common/message_bundle.h" -#include "extensions/renderer/shared_l10n_map.h" -#include "ipc/ipc_sender.h" -#include "net/base/net_errors.h" -#include "net/http/http_response_headers.h" - -ExtensionLocalizationPeer::DataPipeState::DataPipeState() - : source_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), - destination_watcher_(FROM_HERE, - mojo::SimpleWatcher::ArmingPolicy::MANUAL) {} - -ExtensionLocalizationPeer::DataPipeState::~DataPipeState() = default; - -ExtensionLocalizationPeer::ExtensionLocalizationPeer( - scoped_refptr<blink::WebRequestPeer> peer, - IPC::Sender* message_sender, - const GURL& request_url) - : original_peer_(std::move(peer)), - message_sender_(message_sender), - request_url_(request_url) {} - -ExtensionLocalizationPeer::~ExtensionLocalizationPeer() = default; - -// static -scoped_refptr<blink::WebRequestPeer> -ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( - scoped_refptr<blink::WebRequestPeer> peer, - IPC::Sender* message_sender, - const std::string& mime_type, - const GURL& request_url) { - // Return the given |peer| as is if content is not text/css or it doesn't - // belong to extension scheme. - return (request_url.SchemeIs(extensions::kExtensionScheme) && - base::StartsWith(mime_type, "text/css", - base::CompareCase::INSENSITIVE_ASCII)) - ? base::WrapRefCounted(new ExtensionLocalizationPeer( - std::move(peer), message_sender, request_url)) - : std::move(peer); -} - -void ExtensionLocalizationPeer::OnUploadProgress(uint64_t position, - uint64_t size) { - NOTREACHED(); -} - -bool ExtensionLocalizationPeer::OnReceivedRedirect( - const net::RedirectInfo& redirect_info, - network::mojom::URLResponseHeadPtr head, - std::vector<std::string>*) { - NOTREACHED(); - return false; -} - -void ExtensionLocalizationPeer::OnReceivedResponse( - network::mojom::URLResponseHeadPtr head, - base::TimeTicks response_arrival_at_renderer) { - response_head_ = std::move(head); -} - -void ExtensionLocalizationPeer::OnStartLoadingResponseBody( - mojo::ScopedDataPipeConsumerHandle body) { - data_pipe_state_.body_state_ = DataPipeState::BodyState::kReadingBody; - data_pipe_state_.source_handle_ = std::move(body); - data_pipe_state_.source_watcher_.Watch( - data_pipe_state_.source_handle_.get(), - MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, - base::BindRepeating(&ExtensionLocalizationPeer::OnReadableBody, - base::Unretained(this))); - data_pipe_state_.source_watcher_.ArmOrNotify(); -} - -void ExtensionLocalizationPeer::OnTransferSizeUpdated(int transfer_size_diff) { - original_peer_->OnTransferSizeUpdated(transfer_size_diff); -} - -void ExtensionLocalizationPeer::OnCompletedRequest( - const network::URLLoaderCompletionStatus& status) { - if (completion_status_.has_value()) { - // This means that we've already returned error status to the original peer - // due to an error on the data pipe. - return; - } - completion_status_ = status; - - if (status.error_code != net::OK) { - data_pipe_state_.source_watcher_.Cancel(); - data_pipe_state_.source_handle_.reset(); - data_pipe_state_.destination_watcher_.Cancel(); - data_pipe_state_.destination_handle_.reset(); - data_pipe_state_.body_state_ = DataPipeState::BodyState::kDone; - } - - if (data_pipe_state_.body_state_ != DataPipeState::BodyState::kDone) { - // Still reading, or sending the body. Wait until all data has been read, - // and sent to the |original_peer_|. - return; - } - - // We've sent all the body to the peer. Complete the request. - CompleteRequest(); -} - -void ExtensionLocalizationPeer::OnReadableBody( - MojoResult, - const mojo::HandleSignalsState&) { - DCHECK(data_pipe_state_.source_handle_.is_valid()); - DCHECK_EQ(DataPipeState::BodyState::kReadingBody, - data_pipe_state_.body_state_); - - const void* buffer; - uint32_t read_bytes = 0; - MojoResult result = data_pipe_state_.source_handle_->BeginReadData( - &buffer, &read_bytes, MOJO_READ_DATA_FLAG_NONE); - - if (result == MOJO_RESULT_SHOULD_WAIT) { - data_pipe_state_.source_watcher_.ArmOrNotify(); - return; - } - - if (result == MOJO_RESULT_FAILED_PRECONDITION) { - data_pipe_state_.source_watcher_.Cancel(); - data_pipe_state_.source_handle_.reset(); - StartSendingBody(); - return; - } - - if (result != MOJO_RESULT_OK) { - // Something went wrong. - data_pipe_state_.source_watcher_.Cancel(); - data_pipe_state_.source_handle_.reset(); - completion_status_ = network::URLLoaderCompletionStatus(net::ERR_FAILED); - data_pipe_state_.body_state_ = DataPipeState::BodyState::kDone; - CompleteRequest(); - return; - } - - data_.append(static_cast<const char*>(buffer), read_bytes); - - result = data_pipe_state_.source_handle_->EndReadData(read_bytes); - DCHECK_EQ(MOJO_RESULT_OK, result); - data_pipe_state_.source_watcher_.ArmOrNotify(); -} - -void ExtensionLocalizationPeer::StartSendingBody() { - DCHECK(!data_pipe_state_.source_handle_.is_valid()); - DCHECK_EQ(DataPipeState::BodyState::kReadingBody, - data_pipe_state_.body_state_); - - data_pipe_state_.body_state_ = DataPipeState::BodyState::kSendingBody; - - ReplaceMessages(); - - mojo::ScopedDataPipeConsumerHandle consumer_to_send; - MojoResult result = mojo::CreateDataPipe( - nullptr, data_pipe_state_.destination_handle_, consumer_to_send); - if (result != MOJO_RESULT_OK) { - completion_status_ = - network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES); - data_pipe_state_.body_state_ = DataPipeState::BodyState::kDone; - CompleteRequest(); - return; - } - - original_peer_->OnReceivedResponse(std::move(response_head_)); - original_peer_->OnStartLoadingResponseBody(std::move(consumer_to_send)); - - data_pipe_state_.destination_watcher_.Watch( - data_pipe_state_.destination_handle_.get(), - MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, - base::BindRepeating(&ExtensionLocalizationPeer::OnWritableBody, - base::Unretained(this))); - data_pipe_state_.destination_watcher_.ArmOrNotify(); -} - -void ExtensionLocalizationPeer::OnWritableBody( - MojoResult, - const mojo::HandleSignalsState&) { - DCHECK(data_pipe_state_.destination_handle_.is_valid()); - DCHECK_EQ(DataPipeState::BodyState::kSendingBody, - data_pipe_state_.body_state_); - - uint32_t available = data_.size() - data_pipe_state_.sent_in_bytes_; - MojoResult result = data_pipe_state_.destination_handle_->WriteData( - data_.data() + data_pipe_state_.sent_in_bytes_, &available, - MOJO_WRITE_DATA_FLAG_NONE); - if (result == MOJO_RESULT_SHOULD_WAIT) { - data_pipe_state_.destination_watcher_.ArmOrNotify(); - return; - } - - if (result != MOJO_RESULT_OK) { - // The pipe is closed on the receiver side. - data_ = std::string(); - data_pipe_state_.destination_watcher_.Cancel(); - data_pipe_state_.destination_handle_.reset(); - data_pipe_state_.body_state_ = DataPipeState::BodyState::kDone; - completion_status_ = network::URLLoaderCompletionStatus(net::ERR_FAILED); - CompleteRequest(); - return; - } - - data_pipe_state_.sent_in_bytes_ += available; - - if (data_pipe_state_.sent_in_bytes_ == data_.size()) { - // We sent all of the data. - data_ = std::string(); - data_pipe_state_.destination_watcher_.Cancel(); - data_pipe_state_.destination_handle_.reset(); - data_pipe_state_.body_state_ = DataPipeState::BodyState::kDone; - if (completion_status_.has_value()) - CompleteRequest(); - return; - } - - // Wait until the pipe is ready to send the next chunk of data. - data_pipe_state_.destination_watcher_.ArmOrNotify(); -} - -void ExtensionLocalizationPeer::ReplaceMessages() { - if (!message_sender_ || data_.empty()) - return; - - if (!request_url_.is_valid()) - return; - - std::string extension_id = request_url_.host(); - if (extensions::SharedL10nMap::GetInstance().ReplaceMessages( - extension_id, &data_, message_sender_)) { - data_.resize(data_.size()); - } -} - -void ExtensionLocalizationPeer::CompleteRequest() { - DCHECK(completion_status_.has_value()); - // Body should have been sent to the origial peer at this point when it's - // from a data pipe. - DCHECK_EQ(DataPipeState::BodyState::kDone, data_pipe_state_.body_state_); - - if (completion_status_->error_code != net::OK) { - // We failed to load the resource. - network::URLLoaderCompletionStatus aborted_status = - completion_status_.value(); - aborted_status.error_code = net::ERR_ABORTED; - original_peer_->OnCompletedRequest(aborted_status); - return; - } - - original_peer_->OnCompletedRequest(completion_status_.value()); -}
diff --git a/extensions/renderer/localization_peer.h b/extensions/renderer/localization_peer.h deleted file mode 100644 index bb32ae0..0000000 --- a/extensions/renderer/localization_peer.h +++ /dev/null
@@ -1,146 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef EXTENSIONS_RENDERER_LOCALIZATION_PEER_H_ -#define EXTENSIONS_RENDERER_LOCALIZATION_PEER_H_ - -#include <stdint.h> - -#include <memory> -#include <string> - -#include "mojo/public/cpp/system/data_pipe.h" -#include "mojo/public/cpp/system/simple_watcher.h" -#include "services/network/public/cpp/url_loader_completion_status.h" -#include "services/network/public/mojom/url_response_head.mojom.h" -#include "third_party/blink/public/platform/web_request_peer.h" - -namespace IPC { -class Sender; -} - -// The ExtensionLocalizationPeer is a proxy to a -// blink::WebRequestPeer instance. It is used to pre-process -// CSS files requested by extensions to replace localization templates with the -// appropriate localized strings. -// -// Call the factory method CreateExtensionLocalizationPeer() to obtain an -// instance of ExtensionLocalizationPeer based on the original Peer. -// -// The main flow of method calls is like this: -// 1. OnReceivedResponse() when the response header is ready. -// 2-a. OnStartLoadingResponseBody() when the body streaming starts. It starts -// to read the body from the data pipe. After finishing to read the whole -// body, this class replaces the body using the message catalogs, sends the -// response header, sends a data pipe to the original peer, and starts to -// send the body over the data pipe. -// 2-b. OnCompletedRequest() when the final status is available. The status code -// is stored as a member. -// 3. CompleteRequest() when both of 2-a and 2-b finish. Sends the stored -// status code to the original peer. -// -// Note that OnCompletedRequest() can be called at any time, even before -// OnReceivedResponse(). -class ExtensionLocalizationPeer : public blink::WebRequestPeer { - public: - static scoped_refptr<blink::WebRequestPeer> CreateExtensionLocalizationPeer( - scoped_refptr<blink::WebRequestPeer> peer, - IPC::Sender* message_sender, - const std::string& mime_type, - const GURL& request_url); - - ExtensionLocalizationPeer(const ExtensionLocalizationPeer&) = delete; - ExtensionLocalizationPeer& operator=(const ExtensionLocalizationPeer&) = - delete; - - // blink::WebRequestPeer methods. - void OnUploadProgress(uint64_t position, uint64_t size) override; - bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, - network::mojom::URLResponseHeadPtr head, - std::vector<std::string>*) override; - void OnReceivedResponse( - network::mojom::URLResponseHeadPtr head, - base::TimeTicks response_arrival_at_renderer) override; - void OnStartLoadingResponseBody( - mojo::ScopedDataPipeConsumerHandle body) override; - void OnTransferSizeUpdated(int transfer_size_diff) override; - void OnCompletedRequest( - const network::URLLoaderCompletionStatus& status) override; - - private: - friend class ExtensionLocalizationPeerTest; - - // Use CreateExtensionLocalizationPeer to create an instance. - ExtensionLocalizationPeer(scoped_refptr<blink::WebRequestPeer> peer, - IPC::Sender* message_sender, - const GURL& request_url); - - void OnReadableBody(MojoResult, const mojo::HandleSignalsState&); - void StartSendingBody(); - void OnWritableBody(MojoResult, const mojo::HandleSignalsState&); - - // Loads message catalogs, and replaces all __MSG_some_name__ templates within - // loaded file. - void ReplaceMessages(); - - void CompleteRequest(); - - ~ExtensionLocalizationPeer() override; - - // Original peer that handles the request once we are done processing data_. - scoped_refptr<blink::WebRequestPeer> original_peer_; - - // We just pass though the response info. This holds the copy of the original. - network::mojom::URLResponseHeadPtr response_head_; - - struct DataPipeState { - DataPipeState(); - ~DataPipeState(); - - // Data pipe for reading the body which is passed on - // OnStartLoadingResponseBody() and its watcher. When reading the body - // reaches to the end, the handle will be reset. - mojo::ScopedDataPipeConsumerHandle source_handle_; - mojo::SimpleWatcher source_watcher_; - - // Data pipe for pushing the body to the |original_peer_| and its - // watcher. - mojo::ScopedDataPipeProducerHandle destination_handle_; - mojo::SimpleWatcher destination_watcher_; - - // Size sent to the destination. - size_t sent_in_bytes_ = 0; - - // Shows the state of streaming the body to the |original_peer_|. - enum class BodyState { - // Before getting |source_handle_|. - kInitial, - // Reading the body from |source_handle_|. - kReadingBody, - // Sending the body via |destination_handle_|. - kSendingBody, - // Sent all the body to |destination_handle_|. - kDone - }; - BodyState body_state_ = BodyState::kInitial; - }; - - DataPipeState data_pipe_state_; - - // Set when OnCompletedRequest() is called, and sent to the original peer on - // CompleteRequest(). - absl::optional<network::URLLoaderCompletionStatus> completion_status_; - - // Sends ExtensionHostMsg_GetMessageBundle message to the browser to fetch - // message catalog. - IPC::Sender* message_sender_; - - // Buffer for incoming data. We wait until OnCompletedRequest before using it. - std::string data_; - - // Original request URL. - GURL request_url_; -}; - -#endif // EXTENSIONS_RENDERER_LOCALIZATION_PEER_H_
diff --git a/extensions/renderer/localization_peer_unittest.cc b/extensions/renderer/localization_peer_unittest.cc deleted file mode 100644 index 6477d3c..0000000 --- a/extensions/renderer/localization_peer_unittest.cc +++ /dev/null
@@ -1,303 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "extensions/renderer/localization_peer.h" - -#include <stdint.h> - -#include <map> -#include <memory> -#include <string> - -#include "base/functional/bind.h" -#include "base/memory/scoped_refptr.h" -#include "base/run_loop.h" -#include "base/test/task_environment.h" -#include "extensions/common/message_bundle.h" -#include "extensions/renderer/shared_l10n_map.h" -#include "ipc/ipc_sender.h" -#include "ipc/ipc_sync_message.h" -#include "mojo/public/cpp/system/data_pipe_utils.h" -#include "net/base/net_errors.h" -#include "net/url_request/redirect_info.h" -#include "services/network/public/cpp/url_loader_completion_status.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -using testing::_; -using testing::DoAll; -using testing::Invoke; -using testing::Return; -using testing::StrEq; - -static const char* const kExtensionUrl_1 = - "chrome-extension://some_id/popup.css"; - -static const char* const kExtensionUrl_2 = - "chrome-extension://some_id2/popup.css"; - -static const char* const kExtensionUrl_3 = - "chrome-extension://some_id3/popup.css"; - -void MessageDeleter(IPC::Message* message) { - delete message; -} - -class MockIpcMessageSender : public IPC::Sender { - public: - MockIpcMessageSender() { - ON_CALL(*this, Send(_)) - .WillByDefault(DoAll(Invoke(MessageDeleter), Return(true))); - } - - MockIpcMessageSender(const MockIpcMessageSender&) = delete; - MockIpcMessageSender& operator=(const MockIpcMessageSender&) = delete; - - ~MockIpcMessageSender() override = default; - - MOCK_METHOD1(Send, bool(IPC::Message* message)); -}; - -class MockRequestPeer : public blink::WebRequestPeer { - public: - MockRequestPeer() - : body_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) { - } - - MockRequestPeer(const MockRequestPeer&) = delete; - MockRequestPeer& operator=(const MockRequestPeer&) = delete; - - MOCK_METHOD2(OnUploadProgress, void(uint64_t position, uint64_t size)); - MOCK_METHOD3(OnReceivedRedirect, - bool(const net::RedirectInfo& redirect_info, - network::mojom::URLResponseHeadPtr head, - std::vector<std::string>*)); - MOCK_METHOD2(OnReceivedResponse, - void(network::mojom::URLResponseHeadPtr head, base::TimeTicks)); - void OnStartLoadingResponseBody( - mojo::ScopedDataPipeConsumerHandle body) override { - body_handle_ = std::move(body); - body_watcher_.Watch( - body_handle_.get(), - MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, - base::BindRepeating(&MockRequestPeer::OnReadable, - base::Unretained(this))); - } - MOCK_METHOD2(OnDownloadedData, void(int len, int encoded_data_length)); - MOCK_METHOD1(OnReceivedDataInternal, void(std::string data)); - MOCK_METHOD1(OnTransferSizeUpdated, void(int transfer_size_diff)); - MOCK_METHOD1(OnCompletedRequest, - void(const network::URLLoaderCompletionStatus& status)); - - void RunUntilBodyBecomesReady() { - base::RunLoop loop; - EXPECT_FALSE(wait_for_body_callback_); - wait_for_body_callback_ = loop.QuitClosure(); - loop.Run(); - } - - private: - friend class testing::StrictMock<MockRequestPeer>; - - void OnReadable(MojoResult, const mojo::HandleSignalsState&) { - uint32_t available_bytes = 64 * 1024; - std::vector<char> buffer(available_bytes); - MojoResult result = body_handle_->ReadData(buffer.data(), &available_bytes, - MOJO_READ_DATA_FLAG_NONE); - - if (result == MOJO_RESULT_SHOULD_WAIT) - return; - - if (result == MOJO_RESULT_FAILED_PRECONDITION) { - body_watcher_.Cancel(); - OnReceivedDataInternal(body_); - DCHECK(wait_for_body_callback_); - std::move(wait_for_body_callback_).Run(); - return; - } - - ASSERT_EQ(MOJO_RESULT_OK, result); - buffer.resize(available_bytes); - body_.append(buffer.begin(), buffer.end()); - } - - ~MockRequestPeer() override = default; - - std::string body_; - mojo::SimpleWatcher body_watcher_; - mojo::ScopedDataPipeConsumerHandle body_handle_; - base::OnceClosure wait_for_body_callback_; -}; - -} // namespace - -class ExtensionLocalizationPeerTest : public testing::Test { - protected: - void SetUp() override { sender_ = std::make_unique<MockIpcMessageSender>(); } - - void SetUpExtensionLocalizationPeer(const std::string& mime_type, - const GURL& request_url) { - original_peer_ = - base::MakeRefCounted<testing::StrictMock<MockRequestPeer>>(); - - scoped_refptr<blink::WebRequestPeer> peer = - ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( - original_peer_, sender_.get(), mime_type, request_url); - filter_peer_ = base::WrapRefCounted( - static_cast<ExtensionLocalizationPeer*>(peer.get())); - } - - std::string GetData() { return filter_peer_->data_; } - - void SetData(const std::string& data) { - MojoCreateDataPipeOptions options; - options.struct_size = sizeof(MojoCreateDataPipeOptions); - options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE; - options.element_num_bytes = 1; - options.capacity_num_bytes = data.size(); - mojo::ScopedDataPipeProducerHandle producer; - mojo::ScopedDataPipeConsumerHandle consumer; - MojoResult result = mojo::CreateDataPipe(&options, producer, consumer); - EXPECT_EQ(MOJO_RESULT_OK, result); - filter_peer_->OnStartLoadingResponseBody(std::move(consumer)); - mojo::BlockingCopyFromString(data, producer); - producer.reset(); - } - - mojo::ScopedDataPipeConsumerHandle CreateEmptyBodyDataPipe() const { - mojo::ScopedDataPipeConsumerHandle consumer; - mojo::ScopedDataPipeProducerHandle producer; - MojoResult result = mojo::CreateDataPipe(nullptr, producer, consumer); - DCHECK_EQ(MOJO_RESULT_OK, result); - return consumer; - } - - base::test::TaskEnvironment scoped_environment_; - std::unique_ptr<MockIpcMessageSender> sender_; - scoped_refptr<MockRequestPeer> original_peer_; - scoped_refptr<ExtensionLocalizationPeer> filter_peer_; -}; - -TEST_F(ExtensionLocalizationPeerTest, CreateWithWrongMimeType) { - scoped_refptr<blink::WebRequestPeer> peer = - ExtensionLocalizationPeer::CreateExtensionLocalizationPeer( - nullptr, sender_.get(), "text/html", GURL(kExtensionUrl_1)); - EXPECT_EQ(nullptr, peer); -} - -TEST_F(ExtensionLocalizationPeerTest, CreateWithValidInput) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1)); - EXPECT_TRUE(nullptr != filter_peer_.get()); -} - -MATCHER_P(IsURLRequestEqual, status, "") { - return arg.status() == status; -} - -TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestBadURLLoaderStatus) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1)); - - // This test simulates completion before receiving the response header. - network::URLLoaderCompletionStatus status(net::ERR_ABORTED); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)); - - filter_peer_->OnCompletedRequest(status); -} - -TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestEmptyData) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1)); - - EXPECT_CALL(*original_peer_, OnReceivedDataInternal(std::string())); - EXPECT_CALL(*sender_, Send(_)).Times(0); - - EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)); - network::URLLoaderCompletionStatus status(net::OK); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)); - - filter_peer_->OnStartLoadingResponseBody(CreateEmptyBodyDataPipe()); - filter_peer_->OnCompletedRequest(status); - original_peer_->RunUntilBodyBecomesReady(); -} - -TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestNoCatalogs) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1)); - - const std::string kExpectedData = "some text"; - EXPECT_CALL(*sender_, Send(_)); - - EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)).Times(1); - EXPECT_CALL(*original_peer_, OnReceivedDataInternal(kExpectedData)).Times(1); - network::URLLoaderCompletionStatus status(net::OK); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)).Times(1); - - SetData(kExpectedData); - filter_peer_->OnCompletedRequest(status); - original_peer_->RunUntilBodyBecomesReady(); - - // Test if Send gets called again (it shouldn't be) when first call returned - // an empty dictionary. - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1)); - EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)).Times(1); - EXPECT_CALL(*original_peer_, OnReceivedDataInternal(kExpectedData)).Times(1); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)).Times(1); - SetData(kExpectedData); - filter_peer_->OnCompletedRequest(status); - original_peer_->RunUntilBodyBecomesReady(); -} - -TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestWithCatalogs) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_2)); - - { - extensions::SharedL10nMap::L10nMessagesMap messages; - messages.insert(std::make_pair("text", "new text")); - extensions::SharedL10nMap::GetInstance().SetMessagesForTesting( - "some_id2", std::move(messages)); - } - - // We already have messages in memory, Send will be skipped. - EXPECT_CALL(*sender_, Send(_)).Times(0); - - // __MSG_text__ gets replaced with "new text". - std::string data("some new text"); - EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)); - EXPECT_CALL(*original_peer_, OnReceivedDataInternal(data)); - - network::URLLoaderCompletionStatus status(net::OK); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)); - - SetData("some __MSG_text__"); - filter_peer_->OnCompletedRequest(status); - original_peer_->RunUntilBodyBecomesReady(); -} - -TEST_F(ExtensionLocalizationPeerTest, OnCompletedRequestReplaceMessagesFails) { - SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_3)); - - { - extensions::SharedL10nMap::L10nMessagesMap messages; - messages.insert(std::make_pair("text", "new text")); - extensions::SharedL10nMap::GetInstance().SetMessagesForTesting( - "some_id3", std::move(messages)); - } - - std::string message("some __MSG_missing_message__"); - - // We already have messages in memory, Send will be skipped. - EXPECT_CALL(*sender_, Send(_)).Times(0); - - // __MSG_missing_message__ is missing, so message stays the same. - EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)); - EXPECT_CALL(*original_peer_, OnReceivedDataInternal(message)); - - network::URLLoaderCompletionStatus status(net::OK); - EXPECT_CALL(*original_peer_, OnCompletedRequest(status)); - - SetData(message); - filter_peer_->OnCompletedRequest(status); - original_peer_->RunUntilBodyBecomesReady(); -}
diff --git a/extensions/renderer/resources/test_custom_bindings.js b/extensions/renderer/resources/test_custom_bindings.js index 937d25a..507b81e3 100644 --- a/extensions/renderer/resources/test_custom_bindings.js +++ b/extensions/renderer/resources/test_custom_bindings.js
@@ -271,7 +271,7 @@ let errorMsg = 'API Test Error in ' + testName(currentTest); if (message) - errorMessage += ': ' + message; + errorMsg += ': ' + message; if (typeof expected == 'object') { if (chromeTest.checkDeepEq(expected, actual)) {
diff --git a/fuchsia_web/BUILD.gn b/fuchsia_web/BUILD.gn index d6fb9d2..d90edc8 100644 --- a/fuchsia_web/BUILD.gn +++ b/fuchsia_web/BUILD.gn
@@ -12,7 +12,6 @@ testonly = true deps = [ "runners:cast_runner", - "runners:web_runner", "shell", "webengine:web_engine", ]
diff --git a/fuchsia_web/README.md b/fuchsia_web/README.md index 589640c..2179d74 100644 --- a/fuchsia_web/README.md +++ b/fuchsia_web/README.md
@@ -17,7 +17,6 @@ * `./common` contains code shared by both WebEngine and Runners. * `./runners`contains implementations of Fuchsia `sys.runner`. * `./runners/cast` Enables the Fuchsia system to launch Cast applications. - * `./runners/web` Enables the Fuchsia system to launch HTTP or HTTPS URLs. * `./shell` contains WebEngineShell, a simple wrapper for launching URLs in WebEngine from the command line. * `./webengine` contains the WebEngine implementation. WebEngine is an @@ -55,77 +54,3 @@ contains code shared by all browser tests, and `//fuchsia_web/common/test`, which contains code shared by tests for both WebEngine and Runners. - -## Building and deploying the WebRunner service - -When you build `web_runner`, Chromium will automatically generate scripts for -you that will automatically provision a device with Fuchsia and then install -`web_runner` and its dependencies. - -To build and run `web_runner`, follow these steps: - -1. (Optional) Ensure that you have a device ready to boot into Fuchsia. - - If you wish to have `web_runner` manage the OS deployment process, then you - should have the device booting into - [Zedboot](https://fuchsia.googlesource.com/zircon/+/master/docs/targets/usb_setup.md). - -2. Build `web_runner`. - - ```bash - $ autoninja -C out/fuchsia web_runner - ``` - -3. Install `web_runner`. - - * For devices running Zedboot: - - ```bash - $ out/fuchsia/bin/install_web_runner -d - ``` - - * For devices already booted into Fuchsia: - - You will need to add command line flags specifying the device's IP - address and the path to the `ssh_config` used by the device - (located at `$FUCHSIA_OUT_DIR/ssh-keys/ssh_config`): - - ```bash - $ out/fuchsia/bin/install_web_runner -d --ssh-config $PATH_TO_SSH_CONFIG - ``` - -4. Press Alt-Esc key on your device to switch back to terminal mode or run -`fx shell` from the host. - -5. Launch a webpage. - - ```bash - $ tiles_ctl add https://www.chromium.org/ - ``` - -6. Press Alt-Esc to switch back to graphical view if needed. The browser -window should be displayed and ready to use. - -7. You can deploy and run new versions of Chromium without needing to reboot. - - First kill any running processes: - - ```bash - $ killall context_provider.cm; killall web_runner.cmx - ``` - - Then repeat steps 1 through 6 from the installation instructions, excluding - step #3 (running Tiles). - - -### Closing a webpage - -1. Press the Windows key to return to the terminal. - -2. Instruct tiles_ctl to remove the webpage's window tile. The tile's number is - reported by step 6, or it can be found by running `tiles_ctl list` and - noting the ID of the "url" entry. - - ```bash - $ tiles_ctl remove TILE_NUMBER - ```
diff --git a/fuchsia_web/runners/BUILD.gn b/fuchsia_web/runners/BUILD.gn index 8718708..4ecfc093 100644 --- a/fuchsia_web/runners/BUILD.gn +++ b/fuchsia_web/runners/BUILD.gn
@@ -4,7 +4,6 @@ assert(is_fuchsia) -import("//build/buildflag_header.gni") import("//build/config/fuchsia/generate_runner_scripts.gni") import("//build/config/fuchsia/symbol_archive.gni") import("//testing/test.gni") @@ -14,18 +13,7 @@ # Only allow use by targets in this directory unless explicitly specified. visibility = [ ":*" ] -declare_args() { - # Set to a non-zero value to enable remote debugging on that port in WebRunner. - web_runner_remote_debugging_port = 0 -} - -buildflag_header("buildflags") { - header = "buildflags.h" - flags = - [ "WEB_RUNNER_REMOTE_DEBUGGING_PORT=$web_runner_remote_debugging_port" ] -} - -# Files common to both cast_runner and web_runner targets. +# Abstractions for use by runners that show web content. source_set("common") { sources = [ "common/web_component.cc", @@ -34,7 +22,6 @@ "common/web_content_runner.h", ] deps = [ - ":buildflags", "//base", "//fuchsia_web/runners/common/modular", "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp", @@ -115,7 +102,6 @@ sources = [ "cast/main.cc" ] deps = [ - ":buildflags", ":cast_runner_core", ":common", "//base", @@ -133,7 +119,7 @@ # TODO(crbug.com/1212191): Moving flag parsing to web_instance should # eliminate the dependencies that cause these files to be added. Remove them # and add the targets that generate these to assert_no_deps in -# cast_runner_core and web_runner_exe. +# cast_runner_core. _web_instance_host_deps_files_to_exclude = [ "lib/libEGL.so", "lib/libGLESv2.so", @@ -305,70 +291,3 @@ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml", ] } - -executable("web_runner_exe") { - assert_no_deps = [ - "//content/public/common", - "//media", - "//third_party/blink/common", - ] - - sources = [ "web/main.cc" ] - deps = [ - ":buildflags", - ":common", - "//base", - "//components/fuchsia_component_support", - "//fuchsia_web/common", - "//fuchsia_web/webinstance_host:webinstance_host_v1", - "//third_party/fuchsia-sdk/sdk/pkg/sys_inspect_cpp", - ] -} - -fuchsia_component("web_runner_component") { - manifest = "web/web_runner.cmx" - data_deps = [ ":web_runner_exe" ] -} - -fuchsia_package("web_runner_pkg") { - package_name = "web_runner" - deps = [ ":web_runner_component" ] - excluded_files = _web_instance_host_deps_files_to_exclude -} - -fuchsia_package_installer("web_runner") { - visibility += [ "//fuchsia_web:gn_all" ] - package = ":web_runner_pkg" - package_name = "web_runner" - package_deps = [ [ - "//fuchsia_web/webengine:web_engine", - "web_engine", - ] ] -} - -test("web_runner_integration_tests") { - sources = [ "web/web_runner_smoke_test.cc" ] - deps = [ - "//base", - "//base/test:test_support", - "//fuchsia_web/common/test:run_all_integration_tests", - "//fuchsia_web/runners/common/modular", - "//net:test_support", - "//testing/gtest", - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.sys:fuchsia.sys_hlcpp", - ] - package_deps = [ - [ - "//fuchsia_web/webengine:web_engine", - "web_engine", - ], - [ - ":web_runner_pkg", - "web_runner", - ], - ] - additional_manifest_fragments = [ - "//build/config/fuchsia/test/web_instance.shard.test-cml", - "//fuchsia_web/runners/web/web_runner_integration_tests.test-cml", - ] -}
diff --git a/fuchsia_web/runners/common/web_content_runner.cc b/fuchsia_web/runners/common/web_content_runner.cc index cad2ca0..059c72c 100644 --- a/fuchsia_web/runners/common/web_content_runner.cc +++ b/fuchsia_web/runners/common/web_content_runner.cc
@@ -22,7 +22,6 @@ #include "base/functional/bind.h" #include "base/logging.h" #include "base/strings/stringprintf.h" -#include "fuchsia_web/runners/buildflags.h" #include "fuchsia_web/runners/common/web_component.h" #include "url/gurl.h" @@ -103,9 +102,6 @@ CreateUniqueComponentName(), this, std::make_unique<base::StartupContext>(std::move(startup_info)), std::move(controller_request)); -#if BUILDFLAG(WEB_RUNNER_REMOTE_DEBUGGING_PORT) != 0 - component->EnableRemoteDebugging(); -#endif component->StartComponent(); component->LoadUrl(url, std::vector<fuchsia::net::http::Header>()); RegisterComponent(std::move(component));
diff --git a/fuchsia_web/runners/web/DEPS b/fuchsia_web/runners/web/DEPS deleted file mode 100644 index bf2c25d..0000000 --- a/fuchsia_web/runners/web/DEPS +++ /dev/null
@@ -1,5 +0,0 @@ -specific_include_rules = { - "web_runner_smoke_test\.cc": [ - "+net", - ], -}
diff --git a/fuchsia_web/runners/web/OWNERS b/fuchsia_web/runners/web/OWNERS deleted file mode 100644 index d0de80c..0000000 --- a/fuchsia_web/runners/web/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -per-file *.cmx=set noparent -per-file *.cmx=file://build/fuchsia/SECURITY_OWNERS
diff --git a/fuchsia_web/runners/web/main.cc b/fuchsia_web/runners/web/main.cc deleted file mode 100644 index b115c5c5..0000000 --- a/fuchsia_web/runners/web/main.cc +++ /dev/null
@@ -1,92 +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 <lib/sys/cpp/component_context.h> -#include <lib/sys/inspect/cpp/component.h> - -#include "base/command_line.h" -#include "base/files/file_util.h" -#include "base/fuchsia/file_utils.h" -#include "base/fuchsia/process_context.h" -#include "base/fuchsia/scoped_service_binding.h" -#include "base/message_loop/message_pump_type.h" -#include "base/run_loop.h" -#include "base/task/single_thread_task_executor.h" -#include "components/fuchsia_component_support/inspect.h" -#include "fuchsia_web/common/init_logging.h" -#include "fuchsia_web/runners/buildflags.h" -#include "fuchsia_web/runners/common/web_content_runner.h" -#include "fuchsia_web/webinstance_host/web_instance_host_v1.h" - -namespace { - -WebContentRunner::WebInstanceConfig GetWebInstanceConfig() { - WebContentRunner::WebInstanceConfig config; - - config.params.set_features( - fuchsia::web::ContextFeatureFlags::NETWORK | - fuchsia::web::ContextFeatureFlags::AUDIO | - fuchsia::web::ContextFeatureFlags::VULKAN | - fuchsia::web::ContextFeatureFlags::HARDWARE_VIDEO_DECODER | - fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM); - - config.params.set_service_directory( - base::OpenDirectoryHandle(base::FilePath(base::kServiceDirectoryPath))); - CHECK(config.params.service_directory()); - - config.params.set_data_directory(base::OpenDirectoryHandle( - base::FilePath(base::kPersistedDataDirectoryPath))); - CHECK(config.params.data_directory()); - - // DRM services require cdm_data_directory to be populated, so create a - // directory under /data and use that as the cdm_data_directory. - base::FilePath cdm_data_path = - base::FilePath(base::kPersistedDataDirectoryPath).Append("cdm_data"); - base::File::Error error; - CHECK(base::CreateDirectoryAndGetError(cdm_data_path, &error)) << error; - config.params.set_cdm_data_directory( - base::OpenDirectoryHandle(cdm_data_path)); - CHECK(config.params.cdm_data_directory()); - -#if BUILDFLAG(WEB_RUNNER_REMOTE_DEBUGGING_PORT) != 0 - config.params.set_remote_debugging_port( - BUILDFLAG(WEB_RUNNER_REMOTE_DEBUGGING_PORT)); -#endif - return config; -} - -} // namespace - -int main(int argc, char** argv) { - base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO); - base::RunLoop run_loop; - - base::CommandLine::Init(argc, argv); - CHECK(InitLoggingFromCommandLine(*base::CommandLine::ForCurrentProcess())) - << "Failed to initialize logging."; - - LogComponentStartWithVersion("web_runner"); - - WebInstanceHostV1 web_instance_host; - WebContentRunner runner( - base::BindRepeating( - &WebInstanceHostV1::CreateInstanceForContextWithCopiedArgs, - base::Unretained(&web_instance_host)), - base::BindRepeating(&GetWebInstanceConfig)); - base::ScopedServiceBinding<fuchsia::sys::Runner> binding( - base::ComponentContextForProcess()->outgoing().get(), &runner); - - // Publish version information for this component to Inspect. - sys::ComponentInspector inspect(base::ComponentContextForProcess()); - fuchsia_component_support::PublishVersionInfoToInspect(&inspect); - - base::ComponentContextForProcess()->outgoing()->ServeFromStartupInfo(); - - // Run until there are no Components, or the last service client channel is - // closed. - // TODO(https://crbug.com/952560): Implement Components v2 graceful exit. - run_loop.Run(); - - return 0; -}
diff --git a/fuchsia_web/runners/web/web_runner.cmx b/fuchsia_web/runners/web/web_runner.cmx deleted file mode 100644 index 7903f745..0000000 --- a/fuchsia_web/runners/web/web_runner.cmx +++ /dev/null
@@ -1,43 +0,0 @@ -{ - "program": { - "binary": "web_runner_exe" - }, - "sandbox": { - "features": [ - "isolated-persistent-storage" - ], - "services": [ - "fuchsia.accessibility.semantics.SemanticsManager", - "fuchsia.buildinfo.Provider", - "fuchsia.camera3.DeviceWatcher", - "fuchsia.device.NameProvider", - "fuchsia.feedback.ComponentDataRegister", - "fuchsia.feedback.CrashReportingProductRegister", - "fuchsia.fonts.Provider", - "fuchsia.hwinfo.Product", - "fuchsia.input.virtualkeyboard.ControllerCreator", - "fuchsia.intl.PropertyProvider", - "fuchsia.kernel.VmexResource", - "fuchsia.logger.LogSink", - "fuchsia.media.Audio", - "fuchsia.media.AudioDeviceEnumerator", - "fuchsia.media.ProfileProvider", - "fuchsia.media.SessionAudioConsumerFactory", - "fuchsia.media.drm.Widevine", - "fuchsia.mediacodec.CodecFactory", - "fuchsia.memorypressure.Provider", - "fuchsia.net.interfaces.State", - "fuchsia.net.name.Lookup", - "fuchsia.posix.socket.Provider", - "fuchsia.process.Launcher", - "fuchsia.sys.Environment", - "fuchsia.sys.Loader", - "fuchsia.sysmem.Allocator", - "fuchsia.ui.composition.Allocator", - "fuchsia.ui.composition.Flatland", - "fuchsia.ui.input3.Keyboard", - "fuchsia.ui.scenic.Scenic", - "fuchsia.vulkan.loader.Loader" - ] - } -}
diff --git a/fuchsia_web/runners/web/web_runner_integration_tests.test-cml b/fuchsia_web/runners/web/web_runner_integration_tests.test-cml deleted file mode 100644 index 7c35422c..0000000 --- a/fuchsia_web/runners/web/web_runner_integration_tests.test-cml +++ /dev/null
@@ -1,19 +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. -{ - use: [ - { - protocol: "fuchsia.sys.Environment", - }, - ], - facets: { - "fuchsia.test": { - "deprecated-allowed-packages": [ - "cursor", - "web_engine", - "web_runner", - ], - }, - }, -}
diff --git a/fuchsia_web/runners/web/web_runner_smoke_test.cc b/fuchsia_web/runners/web/web_runner_smoke_test.cc deleted file mode 100644 index 50a3c5d..0000000 --- a/fuchsia_web/runners/web/web_runner_smoke_test.cc +++ /dev/null
@@ -1,271 +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 <fuchsia/modular/cpp/fidl.h> -#include <fuchsia/modular/cpp/fidl_test_base.h> -#include <fuchsia/sys/cpp/fidl.h> -#include <lib/sys/cpp/component_context.h> - -#include "base/command_line.h" -#include "base/files/file_enumerator.h" -#include "base/fuchsia/process_context.h" -#include "base/fuchsia/scoped_service_binding.h" -#include "base/fuchsia/service_provider_impl.h" -#include "base/functional/bind.h" -#include "base/process/process.h" -#include "base/strings/stringprintf.h" -#include "base/test/task_environment.h" -#include "build/build_config.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "net/test/embedded_test_server/http_request.h" -#include "net/test/embedded_test_server/http_response.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using net::test_server::HttpRequest; -using net::test_server::HttpResponse; - -namespace { - -class WebRunnerSmokeTest : public testing::Test { - public: - WebRunnerSmokeTest() = default; - WebRunnerSmokeTest(const WebRunnerSmokeTest&) = delete; - WebRunnerSmokeTest& operator=(const WebRunnerSmokeTest&) = delete; - - void SetUp() final { - // TODO(crbug.com/1309100) Update WebRunner to support headless mode. - if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - "ozone-platform") == "headless") { - GTEST_SKIP() << "Headless mode is not supported in WebRunner. " - "Skipping the test."; - } - - test_server_.RegisterRequestHandler(base::BindRepeating( - &WebRunnerSmokeTest::HandleRequest, base::Unretained(this))); - ASSERT_TRUE(test_server_.Start()); - service_provider_ = base::ServiceProviderImpl::CreateForOutgoingDirectory( - &outgoing_directory_); - } - - fuchsia::sys::LaunchInfo LaunchInfoWithServices() { - auto services = fuchsia::sys::ServiceList::New(); - service_provider_->AddBinding(services->provider.NewRequest()); - fuchsia::sys::LaunchInfo launch_info; - launch_info.additional_services = std::move(services); - return launch_info; - } - - std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) { - GURL absolute_url = test_server_.GetURL(request.relative_url); - if (absolute_url.path() == "/test.html") { - EXPECT_FALSE(test_html_requested_); - test_html_requested_ = true; - auto http_response = - std::make_unique<net::test_server::BasicHttpResponse>(); - http_response->set_code(net::HTTP_OK); - http_response->set_content("<!doctype html><img src=\"/img.png\">"); - http_response->set_content_type("text/html"); - return http_response; - } else if (absolute_url.path() == "/window_close.html") { - auto http_response = - std::make_unique<net::test_server::BasicHttpResponse>(); - http_response->set_code(net::HTTP_OK); - http_response->set_content( - "<!doctype html><script>window.close();</script>"); - http_response->set_content_type("text/html"); - return http_response; - } else if (absolute_url.path() == "/img.png") { - EXPECT_FALSE(test_image_requested_); - test_image_requested_ = true; - // All done! - run_loop_.Quit(); - } - return nullptr; - } - - protected: - // Returns a fuchsia.sys.Launcher to be used when launching web_runner. The - // returned instance belongs to a fuchsia.sys.Environment that has access to - // all services available to this test component. This is necessary because - // the default Launcher available to tests run by the Fuchsia test_manager - // does not have access to system services. - fuchsia::sys::Launcher* GetLauncher() { - if (runner_environment_launcher_) - return runner_environment_launcher_.get(); - - // Collect the names of all services provided to the test. Calling stat() in - // /svc is problematic; see https://fxbug.dev/100207. Tell the enumerator - // not to recurse, to return both files and directories, and to report only - // the names of entries. - std::vector<std::string> runner_services; - base::FileEnumerator file_enum(base::FilePath("/svc"), /*recursive=*/false, - base::FileEnumerator::NAMES_ONLY); - for (auto file = file_enum.Next(); !file.empty(); file = file_enum.Next()) { - runner_services.push_back(file.BaseName().value()); - } - - auto environment = base::ComponentContextForProcess() - ->svc() - ->Connect<fuchsia::sys::Environment>(); - - // Provide all of this test component's services to the runner. - auto services = fuchsia::sys::ServiceList::New(); - services->names = std::move(runner_services); - services->host_directory = - base::ComponentContextForProcess()->svc()->CloneChannel(); - - fuchsia::sys::EnvironmentPtr runner_environment; - environment->CreateNestedEnvironment( - runner_environment.NewRequest(), - runner_environment_controller_.NewRequest(), - base::StringPrintf("web_runners:%lu", base::Process::Current().Pid()), - std::move(services), - {.inherit_parent_services = false, - .use_parent_runners = false, - .delete_storage_on_death = true}); - - runner_environment->GetLauncher(runner_environment_launcher_.NewRequest()); - runner_environment_launcher_.set_error_handler([](zx_status_t status) { - ZX_LOG(ERROR, status) << "Launcher disconnected."; - }); - runner_environment_controller_.set_error_handler([](zx_status_t status) { - ZX_LOG(ERROR, status) << "EnvironmentController disconnected."; - }); - - return runner_environment_launcher_.get(); - } - - bool test_html_requested_ = false; - bool test_image_requested_ = false; - - base::test::SingleThreadTaskEnvironment task_environment_{ - base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; - - sys::OutgoingDirectory outgoing_directory_; - fuchsia::sys::EnvironmentControllerPtr runner_environment_controller_; - fuchsia::sys::LauncherPtr runner_environment_launcher_; - std::unique_ptr<base::ServiceProviderImpl> service_provider_; - - net::EmbeddedTestServer test_server_; - - base::RunLoop run_loop_; -}; - -// Verify that the Component loads and fetches the desired page. -TEST_F(WebRunnerSmokeTest, RequestHtmlAndImage) { - fuchsia::sys::LaunchInfo launch_info = LaunchInfoWithServices(); - launch_info.url = test_server_.GetURL("/test.html").spec(); - - fuchsia::sys::ComponentControllerSyncPtr controller; - GetLauncher()->CreateComponent(std::move(launch_info), - controller.NewRequest()); - - run_loop_.Run(); - - EXPECT_TRUE(test_html_requested_); - EXPECT_TRUE(test_image_requested_); -} - -// Verify that the Component can be terminated via the Lifecycle API. -TEST_F(WebRunnerSmokeTest, LifecycleTerminate) { - fidl::InterfaceHandle<fuchsia::io::Directory> directory; - - fuchsia::sys::LaunchInfo launch_info = LaunchInfoWithServices(); - launch_info.url = test_server_.GetURL("/test.html").spec(); - launch_info.directory_request = directory.NewRequest(); - - fuchsia::sys::ComponentControllerPtr controller; - GetLauncher()->CreateComponent(std::move(launch_info), - controller.NewRequest()); - - sys::ServiceDirectory component_services(std::move(directory)); - auto lifecycle = component_services.Connect<fuchsia::modular::Lifecycle>(); - ASSERT_TRUE(lifecycle); - - // Terminate() the component, and expect that |controller| disconnects us. - base::RunLoop loop; - controller.set_error_handler( - [quit_loop = loop.QuitClosure()](zx_status_t status) { - EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); - quit_loop.Run(); - }); - lifecycle->Terminate(); - loop.Run(); - - EXPECT_FALSE(controller); -} - -// Verify that if the Frame disconnects, the Component tears down. -TEST_F(WebRunnerSmokeTest, ComponentExitOnFrameClose) { - fuchsia::sys::LaunchInfo launch_info = LaunchInfoWithServices(); - launch_info.url = test_server_.GetURL("/window_close.html").spec(); - - fuchsia::sys::ComponentControllerPtr controller; - GetLauncher()->CreateComponent(std::move(launch_info), - controller.NewRequest()); - - // Script in the page will execute window.close(), which should teardown the - // Component, causing |controller| to be disconnected. - base::RunLoop loop; - controller.set_error_handler( - [quit_loop = loop.QuitClosure()](zx_status_t status) { - EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); - quit_loop.Run(); - }); - loop.Run(); - - EXPECT_FALSE(controller); -} - -class MockModuleContext - : public fuchsia::modular::testing::ModuleContext_TestBase { - public: - MockModuleContext() = default; - - MockModuleContext(const MockModuleContext&) = delete; - MockModuleContext& operator=(const MockModuleContext&) = delete; - - ~MockModuleContext() override = default; - - MOCK_METHOD0(RemoveSelfFromStory, void()); - - void NotImplemented_(const std::string& name) override { - NOTIMPLEMENTED() << name; - } -}; - -// Verify that Modular's RemoveSelfFromStory() is called on teardown. -TEST_F(WebRunnerSmokeTest, RemoveSelfFromStoryOnFrameClose) { - fuchsia::sys::LaunchInfo launch_info = LaunchInfoWithServices(); - launch_info.url = test_server_.GetURL("/window_close.html").spec(); - - MockModuleContext module_context; - EXPECT_CALL(module_context, RemoveSelfFromStory); - base::ScopedServiceBinding<fuchsia::modular::ModuleContext> binding( - &outgoing_directory_, &module_context); - launch_info.additional_services->names.emplace_back( - fuchsia::modular::ModuleContext::Name_); - - fuchsia::sys::ComponentControllerPtr controller; - GetLauncher()->CreateComponent(std::move(launch_info), - controller.NewRequest()); - - // Script in the page will execute window.close(), which should teardown the - // Component, causing |controller| to be disconnected. - base::RunLoop loop; - controller.set_error_handler( - [quit_loop = loop.QuitClosure()](zx_status_t status) { - EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); - quit_loop.Run(); - }); - loop.Run(); - - EXPECT_FALSE(controller); - - // Spin the loop again to ensure that RemoveSelfFromStory is processed. - base::RunLoop().RunUntilIdle(); -} - -} // anonymous namespace
diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc index c1e9d822..c062333 100644 --- a/gin/array_buffer.cc +++ b/gin/array_buffer.cc
@@ -161,12 +161,8 @@ size_t allocation_granularity = address_space->allocation_granularity(); v8::PlatformSharedMemoryHandle v8_handle; -#if BUILDFLAG(IS_MAC) +#if BUILDFLAG(IS_APPLE) v8_handle = v8::SharedMemoryHandleFromMachMemoryEntry(handle); -#elif BUILDFLAG(IS_IOS) - // TODO(https://crbug.com/1412835): Use the same as Android until we get - // mach_vm support, then roll this into the IS_MAC block. - v8_handle = v8::SharedMemoryHandleFromFileDescriptor(handle); #elif BUILDFLAG(IS_FUCHSIA) v8_handle = v8::SharedMemoryHandleFromVMO(handle->get()); #elif BUILDFLAG(IS_WIN)
diff --git a/google_apis/drive/drive_api_requests_unittest.cc b/google_apis/drive/drive_api_requests_unittest.cc index 68654b6..4828aa7 100644 --- a/google_apis/drive/drive_api_requests_unittest.cc +++ b/google_apis/drive/drive_api_requests_unittest.cc
@@ -16,11 +16,11 @@ #include "base/files/scoped_temp_dir.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" -#include "base/json/json_reader.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/task_environment.h" +#include "base/test/values_test_util.h" #include "base/time/time.h" #include "base/values.h" #include "google_apis/common/dummy_auth_service.h" @@ -2034,15 +2034,13 @@ http_request_.relative_url); EXPECT_EQ("application/json", http_request_.headers["Content-Type"]); - std::unique_ptr<base::Value> expected = base::JSONReader::ReadDeprecated( + base::Value::Dict expected = base::test::ParseJsonDict( "{\"additionalRoles\":[\"commenter\"], \"role\":\"reader\", " "\"type\":\"user\",\"value\":\"user@example.com\"}"); - ASSERT_TRUE(expected); - std::unique_ptr<base::Value> result = - base::JSONReader::ReadDeprecated(http_request_.content); + base::Value::Dict result = base::test::ParseJsonDict(http_request_.content); EXPECT_TRUE(http_request_.has_content); - EXPECT_EQ(*expected, *result); + EXPECT_EQ(expected, result); // Add "can edit" permission to users in "example.com". error = OTHER_ERROR; @@ -2067,13 +2065,12 @@ http_request_.relative_url); EXPECT_EQ("application/json", http_request_.headers["Content-Type"]); - expected = base::JSONReader::ReadDeprecated( + expected = base::test::ParseJsonDict( "{\"role\":\"writer\", \"type\":\"domain\",\"value\":\"example.com\"}"); - ASSERT_TRUE(expected); - result = base::JSONReader::ReadDeprecated(http_request_.content); + result = base::test::ParseJsonDict(http_request_.content); EXPECT_TRUE(http_request_.has_content); - EXPECT_EQ(*expected, *result); + EXPECT_EQ(expected, result); } TEST_F(DriveApiRequestsTest, BatchUploadRequest) {
diff --git a/google_apis/gcm/engine/connection_factory_impl.cc b/google_apis/gcm/engine/connection_factory_impl.cc index 02d141c..b0a39ca9 100644 --- a/google_apis/gcm/engine/connection_factory_impl.cc +++ b/google_apis/gcm/engine/connection_factory_impl.cc
@@ -119,11 +119,13 @@ weak_ptr_factory_.GetWeakPtr())); } - if (connecting_ || waiting_for_backoff_) + if (connecting_ || waiting_for_backoff_) { return; // Connection attempt already in progress or pending. + } - if (IsEndpointReachable()) + if (IsEndpointReachable()) { return; // Already connected. + } ConnectWithBackoff(); } @@ -171,16 +173,21 @@ } std::string ConnectionFactoryImpl::GetConnectionStateString() const { - if (IsEndpointReachable()) + if (IsEndpointReachable()) { return "CONNECTED"; - if (handshake_in_progress_) + } + if (handshake_in_progress_) { return "HANDSHAKE IN PROGRESS"; - if (connecting_) + } + if (connecting_) { return "CONNECTING"; - if (waiting_for_backoff_) + } + if (waiting_for_backoff_) { return "WAITING FOR BACKOFF"; - if (waiting_for_network_online_) + } + if (waiting_for_network_online_) { return "WAITING FOR NETWORK CHANGE"; + } return "NOT CONNECTED"; } @@ -203,23 +210,15 @@ listener_->OnDisconnected(); } - UMA_HISTOGRAM_ENUMERATION("GCM.ConnectionResetReason", reason, - CONNECTION_RESET_COUNT); recorder_->RecordConnectionResetSignaled(reason); - if (!last_login_time_.is_null()) { - UMA_HISTOGRAM_CUSTOM_TIMES("GCM.ConnectionUpTime", - NowTicks() - last_login_time_, base::Seconds(1), - base::Hours(24), 50); - // |last_login_time_| will be reset below, before attempting the new - // connection. - } // SignalConnectionReset can be called at any time without regard to whether // a connection attempt is currently in progress. Only notify the event // tracker if there is an event in progress. if (event_tracker_.IsEventInProgress()) { - if (reason == LOGIN_FAILURE) + if (reason == LOGIN_FAILURE) { event_tracker_.ConnectionLoginFailed(); + } event_tracker_.EndConnectionAttempt(); } @@ -271,8 +270,9 @@ } base::TimeTicks ConnectionFactoryImpl::NextRetryAttempt() const { - if (!backoff_entry_) + if (!backoff_entry_) { return base::TimeTicks(); + } return backoff_entry_->GetReleaseTime(); } @@ -296,8 +296,9 @@ GURL ConnectionFactoryImpl::GetCurrentEndpoint() const { // Note that IsEndpointReachable() returns false anytime connecting_ is true, // so while connecting this always uses |next_endpoint_|. - if (IsEndpointReachable()) + if (IsEndpointReachable()) { return mcs_endpoints_[last_successful_endpoint_]; + } return mcs_endpoints_[next_endpoint_]; } @@ -426,11 +427,9 @@ } if (result != net::OK) { LOG(ERROR) << "Failed to connect to MCS endpoint with error " << result; - UMA_HISTOGRAM_BOOLEAN("GCM.ConnectionSuccessRate", false); recorder_->RecordConnectionFailure(result); CloseSocket(); backoff_entry_->InformOfRequest(false); - base::UmaHistogramSparse("GCM.ConnectionFailureErrorCode", result); event_tracker_.ConnectionAttemptFailed(result); event_tracker_.EndConnectionAttempt(); @@ -438,15 +437,14 @@ // If there are other endpoints available, use the next endpoint on the // subsequent retry. next_endpoint_++; - if (next_endpoint_ >= mcs_endpoints_.size()) + if (next_endpoint_ >= mcs_endpoints_.size()) { next_endpoint_ = 0; + } connecting_ = false; Connect(); return; } - UMA_HISTOGRAM_BOOLEAN("GCM.ConnectionSuccessRate", true); - UMA_HISTOGRAM_COUNTS_1M("GCM.ConnectionEndpoint", next_endpoint_); recorder_->RecordConnectionSuccess(); // Reset the endpoint back to the default. @@ -460,8 +458,9 @@ DVLOG(1) << "MCS endpoint socket connection success, starting login."; // |peer_addr| is only non-null if result == net::OK and the connection is not // through a proxy. - if (peer_addr) + if (peer_addr) { peer_addr_ = peer_addr.value(); + } InitHandler(std::move(receive_stream), std::move(send_stream)); } @@ -471,7 +470,6 @@ // TODO(zea): Consider how to handle errors that may require some sort of // user intervention (login page, etc.). LOG(ERROR) << "ConnectionHandler failed with net error: " << result; - base::UmaHistogramSparse("GCM.ConnectionDisconnectErrorCode", result); SignalConnectionReset(SOCKET_FAILURE); return; } @@ -487,15 +485,17 @@ event_tracker_.ConnectionAttemptSucceeded(); - if (listener_) + if (listener_) { listener_->OnConnected(GetCurrentEndpoint(), peer_addr_); + } } void ConnectionFactoryImpl::CloseSocket() { // The connection handler needs to be reset, else it'll attempt to keep using // the destroyed socket. - if (connection_handler_) + if (connection_handler_) { connection_handler_->Reset(); + } socket_.reset(); peer_addr_ = net::IPEndPoint();
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc index c3590dd06..7da0ed5 100644 --- a/gpu/command_buffer/service/command_buffer_service.cc +++ b/gpu/command_buffer/service/command_buffer_service.cc
@@ -218,6 +218,13 @@ } handler->BeginDecoding(); + + // BeginDecoding can cause context loss due to resuming shared image access. + if (state_.error != error::kNoError) { + handler->EndDecoding(); + return; + } + int end = put_offset_ < state_.get_offset ? num_entries_ : put_offset_; while (put_offset_ != state_.get_offset) { int num_entries = end - state_.get_offset;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index 129088d..e7da934 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -354,6 +354,22 @@ } #endif +void PassthroughResources::SuspendSharedImageAccessIfNeeded() { + for (auto& [texture_id, shared_image_data] : texture_shared_image_map) { + shared_image_data.SuspendAccessIfNeeded(); + } +} + +bool PassthroughResources::ResumeSharedImageAccessIfNeeded(gl::GLApi* api) { + bool success = true; + for (auto& [texture_id, shared_image_data] : texture_shared_image_map) { + if (!shared_image_data.ResumeAccessIfNeeded(api)) { + success = false; + } + } + return success; +} + void PassthroughResources::Destroy(gl::GLApi* api, gl::ProgressReporter* progress_reporter) { bool have_context = !!api; @@ -441,6 +457,8 @@ PassthroughResources::SharedImageData& PassthroughResources::SharedImageData::operator=(SharedImageData&& other) { scoped_access_ = std::move(other.scoped_access_); + access_mode_ = std::move(other.access_mode_); + other.access_mode_.reset(); representation_ = std::move(other.representation_); return *this; } @@ -508,10 +526,41 @@ // necessary. scoped_access_ = representation_->BeginScopedAccess( mode, SharedImageRepresentation::AllowUnclearedAccess::kNo); + if (scoped_access_) { + access_mode_.emplace(mode); + return true; + } + return false; +} +void PassthroughResources::SharedImageData::EndAccess() { + DCHECK(is_being_accessed()); + scoped_access_.reset(); + access_mode_.reset(); +} + +bool PassthroughResources::SharedImageData::ResumeAccessIfNeeded( + gl::GLApi* api) { + // Do not resume access if BeginAccess was never called or if a scoped access + // is already present. + if (!is_being_accessed() || scoped_access_) { + return true; + } + scoped_access_ = representation_->BeginScopedAccess( + access_mode_.value(), + SharedImageRepresentation::AllowUnclearedAccess::kNo); return !!scoped_access_; } +void PassthroughResources::SharedImageData::SuspendAccessIfNeeded() { + // Suspend access if shared image is being accessed and doesn't support + // concurrent read access on other clients or devices. + if (is_being_accessed() && + representation_->NeedsSuspendAccessForDXGIKeyedMutex()) { + scoped_access_.reset(); + } +} + GLES2DecoderPassthroughImpl::PendingQuery::PendingQuery() = default; GLES2DecoderPassthroughImpl::PendingQuery::~PendingQuery() { // Run all callbacks when a query is destroyed even if it did not complete. @@ -2056,6 +2105,14 @@ gpu_trace_commands_ = gpu_tracer_->IsTracing() && *gpu_decoder_category_; gpu_debug_commands_ = log_commands() || debug() || gpu_trace_commands_; +#if BUILDFLAG(IS_WIN) + if (!resources_->ResumeSharedImageAccessIfNeeded(api())) { + LOG(ERROR) << " GLES2DecoderPassthroughImpl: Failed to resume shared " + "image access."; + group_->LoseContexts(error::kUnknown); + } +#endif + auto it = active_queries_.find(GL_COMMANDS_ISSUED_CHROMIUM); if (it != active_queries_.end()) { DCHECK_EQ(it->second.command_processing_start_time, base::TimeTicks()); @@ -2064,6 +2121,10 @@ } void GLES2DecoderPassthroughImpl::EndDecoding() { +#if BUILDFLAG(IS_WIN) + resources_->SuspendSharedImageAccessIfNeeded(); +#endif + gpu_tracer_->EndDecoding(); auto it = active_queries_.find(GL_COMMANDS_ISSUED_CHROMIUM);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h index b09a9eb2..2a20e8ba 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h
@@ -31,6 +31,7 @@ #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image/shared_image_representation.h" #include "gpu/command_buffer/service/texture_manager.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_fence.h" @@ -87,6 +88,9 @@ bool HasTexturesPendingDestruction() const; #endif + void SuspendSharedImageAccessIfNeeded(); + bool ResumeSharedImageAccessIfNeeded(gl::GLApi* api); + // Mappings from client side IDs to service side IDs. ClientServiceMap<GLuint, GLuint> texture_id_map; ClientServiceMap<GLuint, GLuint> buffer_id_map; @@ -124,21 +128,23 @@ return representation_.get(); } + // Returns true between a successful BeginAccess and the following EndAccess + // even if access is currently suspended. + bool is_being_accessed() const { return access_mode_.has_value(); } + void EnsureClear(gl::GLApi* api, const FeatureInfo* feature_info); bool BeginAccess(GLenum mode, gl::GLApi* api); + void EndAccess(); - void EndAccess() { - DCHECK(is_being_accessed()); - scoped_access_.reset(); - } - - bool is_being_accessed() const { return !!scoped_access_; } + bool ResumeAccessIfNeeded(gl::GLApi* api); + void SuspendAccessIfNeeded(); private: std::unique_ptr<GLTexturePassthroughImageRepresentation> representation_; std::unique_ptr<GLTexturePassthroughImageRepresentation::ScopedAccess> scoped_access_; + absl::optional<GLenum> access_mode_; }; // Mapping of client texture IDs to GLTexturePassthroughImageRepresentations. // TODO(ericrk): Remove this once TexturePassthrough holds a reference to
diff --git a/gpu/command_buffer/service/shared_image/compound_image_backing.cc b/gpu/command_buffer/service/shared_image/compound_image_backing.cc index 37241ae..9c83736 100644 --- a/gpu/command_buffer/service/shared_image/compound_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/compound_image_backing.cc
@@ -582,7 +582,7 @@ manager, this, tracker, std::move(real_rep)); } -void CompoundImageBacking::OnMemoryDump( +base::trace_event::MemoryAllocatorDump* CompoundImageBacking::OnMemoryDump( const std::string& dump_name, base::trace_event::MemoryAllocatorDumpGuid client_guid, base::trace_event::ProcessMemoryDump* pmd, @@ -616,6 +616,7 @@ backing->OnMemoryDump(element_dump_name, element_client_guid, pmd, client_tracing_id); } + return dump; } const std::vector<SkPixmap>& CompoundImageBacking::GetSharedMemoryPixmaps() {
diff --git a/gpu/command_buffer/service/shared_image/compound_image_backing.h b/gpu/command_buffer/service/shared_image/compound_image_backing.h index 04f0bf5..d8f3662 100644 --- a/gpu/command_buffer/service/shared_image/compound_image_backing.h +++ b/gpu/command_buffer/service/shared_image/compound_image_backing.h
@@ -154,10 +154,11 @@ std::unique_ptr<SharedMemoryImageBacking> shm_backing, base::WeakPtr<SharedImageBackingFactory> gpu_backing_factory); - void OnMemoryDump(const std::string& dump_name, - base::trace_event::MemoryAllocatorDumpGuid client_guid, - base::trace_event::ProcessMemoryDump* pmd, - uint64_t client_tracing_id) override; + base::trace_event::MemoryAllocatorDump* OnMemoryDump( + const std::string& dump_name, + base::trace_event::MemoryAllocatorDumpGuid client_guid, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override; // Returns a SkPixmap for shared memory backing. const std::vector<SkPixmap>& GetSharedMemoryPixmaps();
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing.h b/gpu/command_buffer/service/shared_image/d3d_image_backing.h index abc01222..91c1833 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_backing.h +++ b/gpu/command_buffer/service/shared_image/d3d_image_backing.h
@@ -130,6 +130,11 @@ absl::optional<gl::DCLayerOverlayImage> GetDCLayerOverlayImage(); + bool has_keyed_mutex() const { + return dxgi_shared_handle_state_ && + dxgi_shared_handle_state_->has_keyed_mutex(); + } + scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state_for_testing() const { return dxgi_shared_handle_state_;
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc index 41200217..4a2e2ef 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc
@@ -21,15 +21,20 @@ : GLTexturePassthroughImageRepresentation(manager, backing, tracker), textures_(std::move(textures)) {} +GLTexturePassthroughD3DImageRepresentation:: + ~GLTexturePassthroughD3DImageRepresentation() = default; + +bool GLTexturePassthroughD3DImageRepresentation:: + NeedsSuspendAccessForDXGIKeyedMutex() const { + return static_cast<D3DImageBacking*>(backing())->has_keyed_mutex(); +} + const scoped_refptr<gles2::TexturePassthrough>& GLTexturePassthroughD3DImageRepresentation::GetTexturePassthrough( int plane_index) { return textures_[plane_index]; } -GLTexturePassthroughD3DImageRepresentation:: - ~GLTexturePassthroughD3DImageRepresentation() = default; - bool GLTexturePassthroughD3DImageRepresentation::BeginAccess(GLenum mode) { D3DImageBacking* d3d_image_backing = static_cast<D3DImageBacking*>(backing()); for (int plane = 0; plane < format().NumberOfPlanes(); plane++) {
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.h b/gpu/command_buffer/service/shared_image/d3d_image_representation.h index 6c9cdcf..1138027 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_representation.h +++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.h
@@ -34,6 +34,8 @@ std::vector<scoped_refptr<gles2::TexturePassthrough>> textures); ~GLTexturePassthroughD3DImageRepresentation() override; + bool NeedsSuspendAccessForDXGIKeyedMutex() const override; + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough( int plane_index) override;
diff --git a/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.cc b/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.cc index d9101fb..9b9ca3d 100644 --- a/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.cc +++ b/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.cc
@@ -4,6 +4,7 @@ #include "gpu/command_buffer/service/shared_image/gl_image_native_pixmap.h" +#include "ui/gfx/color_space.h" #include "ui/ozone/public/native_pixmap_gl_binding.h" #include "ui/ozone/public/ozone_platform.h" #include "ui/ozone/public/surface_factory_ozone.h" @@ -16,25 +17,12 @@ scoped_refptr<gfx::NativePixmap> pixmap, GLenum target, GLuint texture_id) { - return CreateForPlane(size, format, gfx::BufferPlane::DEFAULT, - std::move(pixmap), gfx::ColorSpace(), target, - texture_id); -} - -scoped_refptr<GLImageNativePixmap> GLImageNativePixmap::CreateForPlane( - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane, - scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id) { DCHECK_GT(texture_id, 0u); auto image = base::WrapRefCounted(new GLImageNativePixmap(size)); - if (!image->InitializeFromNativePixmap(format, plane, std::move(pixmap), - color_space, target, texture_id)) { + if (!image->InitializeFromNativePixmap(format, std::move(pixmap), target, + texture_id)) { return nullptr; } return image; @@ -46,17 +34,16 @@ bool GLImageNativePixmap::InitializeFromNativePixmap( gfx::BufferFormat format, - gfx::BufferPlane plane, scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, GLenum target, GLuint texture_id) { pixmap_gl_binding_ = ui::OzonePlatform::GetInstance() ->GetSurfaceFactoryOzone() ->GetCurrentGLOzone() - ->ImportNativePixmap(std::move(pixmap), format, plane, size_, - color_space, target, texture_id); + ->ImportNativePixmap(std::move(pixmap), format, + gfx::BufferPlane::DEFAULT, size_, + gfx::ColorSpace(), target, texture_id); return !!pixmap_gl_binding_; }
diff --git a/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.h b/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.h index 4087360..df91f82 100644 --- a/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.h +++ b/gpu/command_buffer/service/shared_image/gl_image_native_pixmap.h
@@ -8,7 +8,6 @@ #include <stdint.h> #include "gpu/gpu_gles2_export.h" -#include "ui/gfx/color_space.h" #include "ui/gfx/native_pixmap.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_image.h" @@ -30,20 +29,6 @@ GLenum target, GLuint texture_id); - // Create an EGLImage from a given NativePixmap and plane and bind - // |texture_id| to |target| followed by binding the image to |target|. The - // color space is for the external sampler: When we sample the YUV buffer as - // RGB, we need to tell it the encoding (BT.601, BT.709, or BT.2020) and range - // (limited or null), and |color_space| conveys this. - static scoped_refptr<GLImageNativePixmap> CreateForPlane( - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane, - scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id); - // Overridden from GLImage: gfx::Size GetSize() override; @@ -54,9 +39,7 @@ // Create a NativePixmapGLBinding from a given NativePixmap. Returns true iff // the binding was successfully created. bool InitializeFromNativePixmap(gfx::BufferFormat format, - gfx::BufferPlane plane, scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, GLenum target, GLuint texture_id);
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing.h b/gpu/command_buffer/service/shared_image/iosurface_image_backing.h index d216f5f..40ecc36 100644 --- a/gpu/command_buffer/service/shared_image/iosurface_image_backing.h +++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing.h
@@ -250,10 +250,11 @@ private: // SharedImageBacking: - void OnMemoryDump(const std::string& dump_name, - base::trace_event::MemoryAllocatorDumpGuid client_guid, - base::trace_event::ProcessMemoryDump* pmd, - uint64_t client_tracing_id) override; + base::trace_event::MemoryAllocatorDump* OnMemoryDump( + const std::string& dump_name, + base::trace_event::MemoryAllocatorDumpGuid client_guid, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override; SharedImageBackingType GetType() const override; gfx::Rect ClearedRect() const final; void SetClearedRect(const gfx::Rect& cleared_rect) final; @@ -277,6 +278,7 @@ MemoryTypeTracker* tracker, scoped_refptr<SharedContextState> context_state) override; void SetPurgeable(bool purgeable) override; + bool IsPurgeable() const override; void Update(std::unique_ptr<gfx::GpuFence> in_fence) override; // IOSurfaceBackingEGLState::Client:
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm b/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm index 04da6be4..94b8add 100644 --- a/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm +++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing.mm
@@ -684,13 +684,13 @@ return std::move(shared_events_and_signal_values_); } -void IOSurfaceImageBacking::OnMemoryDump( +base::trace_event::MemoryAllocatorDump* IOSurfaceImageBacking::OnMemoryDump( const std::string& dump_name, base::trace_event::MemoryAllocatorDumpGuid client_guid, base::trace_event::ProcessMemoryDump* pmd, uint64_t client_tracing_id) { - SharedImageBacking::OnMemoryDump(dump_name, client_guid, pmd, - client_tracing_id); + auto* dump = SharedImageBacking::OnMemoryDump(dump_name, client_guid, pmd, + client_tracing_id); size_t size_bytes = 0u; if (format().is_single_plane()) { @@ -704,8 +704,6 @@ } } - base::trace_event::MemoryAllocatorDump* dump = - pmd->CreateAllocatorDump(dump_name); dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, base::trace_event::MemoryAllocatorDump::kUnitsBytes, static_cast<uint64_t>(size_bytes)); @@ -737,6 +735,8 @@ anonymous_dump->AddScalar("width", "pixels", size().width()); anonymous_dump->AddScalar("height", "pixels", size().height()); } + + return dump; } SharedImageBackingType IOSurfaceImageBacking::GetType() const { @@ -896,6 +896,10 @@ IOSurfaceSetPurgeable(io_surface_, purgeable, &old_state); } +bool IOSurfaceImageBacking::IsPurgeable() const { + return purgeable_; +} + void IOSurfaceImageBacking::Update(std::unique_ptr<gfx::GpuFence> in_fence) { if (in_fence) { // TODO(dcastagna): Don't wait for the fence if the SharedImage is going
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.cc b/gpu/command_buffer/service/shared_image/shared_image_backing.cc index 8b12c0b..79f95054 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
@@ -124,7 +124,7 @@ return false; } -void SharedImageBacking::OnMemoryDump( +base::trace_event::MemoryAllocatorDump* SharedImageBacking::OnMemoryDump( const std::string& dump_name, base::trace_event::MemoryAllocatorDumpGuid client_guid, base::trace_event::ProcessMemoryDump* pmd, @@ -139,11 +139,14 @@ dump->AddString("dimensions", "", size().ToString()); dump->AddString("format", "", format().ToString()); dump->AddString("usage", "", CreateLabelForSharedImageUsage(usage())); + dump->AddScalar("purgeable", "bool", IsPurgeable()); // Add ownership edge to `client_guid` which expresses shared ownership with // the client process. pmd->CreateSharedGlobalAllocatorDump(client_guid); pmd->AddOwnershipEdge(dump->guid(), client_guid, kNonOwningEdgeImportance); + + return dump; } std::unique_ptr<GLTextureImageRepresentation> @@ -388,4 +391,8 @@ return nullptr; } +bool SharedImageBacking::IsPurgeable() const { + return false; +} + } // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.h b/gpu/command_buffer/service/shared_image/shared_image_backing.h index daee888..c2c2f69 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_backing.h +++ b/gpu/command_buffer/service/shared_image/shared_image_backing.h
@@ -14,6 +14,7 @@ #include "base/metrics/histogram_macros.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" +#include "base/trace_event/memory_allocator_dump.h" #include "base/trace_event/memory_allocator_dump_guid.h" #include "build/build_config.h" #include "components/viz/common/resources/resource_format.h" @@ -169,6 +170,7 @@ // than allocating and freeing the image. See investigation in // https://crbug.com/1347282. virtual void SetPurgeable(bool purgeable) {} + virtual bool IsPurgeable() const; virtual void Update(std::unique_ptr<gfx::GpuFence> in_fence); @@ -197,7 +199,7 @@ // add additional ownership edges linked to `client_guid` but they must call // SharedImageBacking::OnMemoryDump() first (or do something equivalent) to // create a MemoryAllocatorDump and ownership edge. - virtual void OnMemoryDump( + virtual base::trace_event::MemoryAllocatorDump* OnMemoryDump( const std::string& dump_name, base::trace_event::MemoryAllocatorDumpGuid client_guid, base::trace_event::ProcessMemoryDump* pmd,
diff --git a/gpu/command_buffer/service/shared_image/shared_image_manager.cc b/gpu/command_buffer/service/shared_image/shared_image_manager.cc index 59d645e3..354e016 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_manager.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_manager.cc
@@ -423,14 +423,21 @@ if (args.level_of_detail == base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND) { size_t total_size = 0; - for (auto& backing : images_) - total_size += backing->GetEstimatedSizeForMemoryDump(); + size_t total_purgeable_size = 0; + for (auto& backing : images_) { + size_t size = backing->GetEstimatedSizeForMemoryDump(); + total_size += size; + total_purgeable_size += backing->IsPurgeable() ? size : 0; + } base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(base_dump_name); dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, base::trace_event::MemoryAllocatorDump::kUnitsBytes, total_size); + dump->AddScalar("purgeable_size", + base::trace_event::MemoryAllocatorDump::kUnitsBytes, + total_purgeable_size); // Early out, no need for more detail in a BACKGROUND dump. return true;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc b/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc index 89e6141..2b0246c 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc
@@ -8,6 +8,7 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/task/thread_pool/thread_pool_instance.h" +#include "base/trace_event/memory_allocator_dump.h" #include "base/trace_event/process_memory_dump.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/shared_image_usage.h" @@ -95,16 +96,26 @@ auto* dump = pmd.GetAllocatorDump("gpu/shared_images"); ASSERT_NE(nullptr, dump); - ASSERT_EQ(dump->entries().size(), 1u); + ASSERT_EQ(dump->entries().size(), 2u); - // There should be a single memory dump entry with total size of both - // backings. - auto& entry = dump->entries()[0]; - DCHECK_EQ(entry.name, base::trace_event::MemoryAllocatorDump::kNameSize); - DCHECK_EQ(entry.units, base::trace_event::MemoryAllocatorDump::kUnitsBytes); - DCHECK_EQ(entry.entry_type, - base::trace_event::MemoryAllocatorDump::Entry::kUint64); - DCHECK_EQ(entry.value_uint64, kSizeBytes1 + kSizeBytes2); + for (const auto& entry : dump->entries()) { + if (entry.name == "size") { + EXPECT_EQ(entry.name, base::trace_event::MemoryAllocatorDump::kNameSize); + EXPECT_EQ(entry.units, + base::trace_event::MemoryAllocatorDump::kUnitsBytes); + EXPECT_EQ(entry.entry_type, + base::trace_event::MemoryAllocatorDump::Entry::kUint64); + EXPECT_EQ(entry.value_uint64, kSizeBytes1 + kSizeBytes2); + } else { + EXPECT_EQ(entry.name, "purgeable_size"); + EXPECT_EQ(entry.units, + base::trace_event::MemoryAllocatorDump::kUnitsBytes); + EXPECT_EQ(entry.entry_type, + base::trace_event::MemoryAllocatorDump::Entry::kUint64); + // Nothing is purgeable. + EXPECT_EQ(entry.value_uint64, 0u); + } + } } TEST(SharedImageManagerTest, TransferRefSameTracker) {
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 d6ccca367..8020b9c 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_representation.cc
@@ -124,6 +124,11 @@ return GetTexturePassthrough(0); } +bool GLTexturePassthroughImageRepresentation:: + NeedsSuspendAccessForDXGIKeyedMutex() const { + return false; +} + bool SkiaImageRepresentation::SupportsMultipleConcurrentReadAccess() { return false; }
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.h b/gpu/command_buffer/service/shared_image/shared_image_representation.h index 1a6a1729..cee7ed1 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation.h +++ b/gpu/command_buffer/service/shared_image/shared_image_representation.h
@@ -263,6 +263,10 @@ gpu::TextureBase* GetTextureBase(int plane_index) override; + // Returns true if access must be suspended in between GL decoder tasks due to + // DXGI keyed mutex. Only implemented for D3D GL representation. + virtual bool NeedsSuspendAccessForDXGIKeyedMutex() const; + private: friend class WrappedGLTexturePassthroughCompoundImageRepresentation; };
diff --git a/gpu/command_buffer/service/shared_image/shared_memory_image_backing.cc b/gpu/command_buffer/service/shared_image/shared_memory_image_backing.cc index aaabf6c..11bd637a 100644 --- a/gpu/command_buffer/service/shared_image/shared_memory_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/shared_memory_image_backing.cc
@@ -168,13 +168,13 @@ tracker); } -void SharedMemoryImageBacking::OnMemoryDump( +base::trace_event::MemoryAllocatorDump* SharedMemoryImageBacking::OnMemoryDump( const std::string& dump_name, base::trace_event::MemoryAllocatorDumpGuid client_guid, base::trace_event::ProcessMemoryDump* pmd, uint64_t client_tracing_id) { - SharedImageBacking::OnMemoryDump(dump_name, client_guid, pmd, - client_tracing_id); + auto* dump = SharedImageBacking::OnMemoryDump(dump_name, client_guid, pmd, + client_tracing_id); // Add a |shared_memory_guid| which expresses shared ownership between the // various GPU dumps. @@ -183,6 +183,7 @@ pmd->CreateSharedMemoryOwnershipEdge(client_guid, shared_memory_guid, kNonOwningEdgeImportance); } + return dump; } SharedMemoryImageBacking::SharedMemoryImageBacking(
diff --git a/gpu/command_buffer/service/shared_image/shared_memory_image_backing.h b/gpu/command_buffer/service/shared_image/shared_memory_image_backing.h index b6d44fd..b235fe1 100644 --- a/gpu/command_buffer/service/shared_image/shared_memory_image_backing.h +++ b/gpu/command_buffer/service/shared_image/shared_memory_image_backing.h
@@ -70,10 +70,11 @@ MemoryTypeTracker* tracker) override; private: - void OnMemoryDump(const std::string& dump_name, - base::trace_event::MemoryAllocatorDumpGuid client_guid, - base::trace_event::ProcessMemoryDump* pmd, - uint64_t client_tracing_id) override; + base::trace_event::MemoryAllocatorDump* OnMemoryDump( + const std::string& dump_name, + base::trace_event::MemoryAllocatorDumpGuid client_guid, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override; // Set for shared memory GMB. SharedMemoryRegionWrapper shared_memory_wrapper_;
diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc index f840946..84f7ada 100644 --- a/gpu/config/gpu_info.cc +++ b/gpu/config/gpu_info.cc
@@ -306,6 +306,9 @@ std::string max_msaa_samples; std::string machine_model_name; std::string machine_model_version; + std::string gl_implementation; + std::string angle_implementation; + std::string display_type; std::string gl_version; std::string gl_vendor; std::string gl_renderer; @@ -373,6 +376,9 @@ enumerator->AddString("pixelShaderVersion", pixel_shader_version); enumerator->AddString("vertexShaderVersion", vertex_shader_version); enumerator->AddString("maxMsaaSamples", max_msaa_samples); + enumerator->AddString("glImplementation", gl_implementation); + enumerator->AddString("angleImplementation", angle_implementation); + enumerator->AddString("displayType", display_type); enumerator->AddString("glVersion", gl_version); enumerator->AddString("glVendor", gl_vendor); enumerator->AddString("glRenderer", gl_renderer);
diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h index ce69fbb..4eeb453 100644 --- a/gpu/config/gpu_info.h +++ b/gpu/config/gpu_info.h
@@ -366,6 +366,15 @@ // See machine_model_name's comment. std::string machine_model_version; + // The GL implementation. + std::string gl_implementation; + + // The ANGLE implementation. + std::string angle_implementation; + + // The DisplayType requested from ANGLE. + std::string display_type; + // The GL_VERSION string. std::string gl_version;
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc index 040328e..2439e56 100644 --- a/gpu/config/gpu_info_collector.cc +++ b/gpu/config/gpu_info_collector.cc
@@ -199,6 +199,52 @@ } #endif +std::string GetDisplayTypeString(gl::DisplayType type) { + switch (type) { + case gl::DEFAULT: + return "DEFAULT"; + case gl::SWIFT_SHADER: + return "SWIFT_SHADER"; + case gl::ANGLE_WARP: + return "ANGLE_WARP"; + case gl::ANGLE_D3D9: + return "ANGLE_D3D9"; + case gl::ANGLE_D3D11: + return "ANGLE_D3D11"; + case gl::ANGLE_OPENGL: + return "ANGLE_OPENGL"; + case gl::ANGLE_OPENGLES: + return "ANGLE_OPENGLES"; + case gl::ANGLE_NULL: + return "ANGLE_NULL"; + case gl::ANGLE_D3D11_NULL: + return "ANGLE_D3D11_NULL"; + case gl::ANGLE_OPENGL_NULL: + return "ANGLE_OPENGL_NULL"; + case gl::ANGLE_OPENGLES_NULL: + return "ANGLE_OPENGLES_NULL"; + case gl::ANGLE_VULKAN: + return "ANGLE_VULKAN"; + case gl::ANGLE_VULKAN_NULL: + return "ANGLE_VULKAN_NULL"; + case gl::ANGLE_D3D11on12: + return "ANGLE_D3D11on12"; + case gl::ANGLE_SWIFTSHADER: + return "ANGLE_SWIFTSHADER"; + case gl::ANGLE_OPENGL_EGL: + return "ANGLE_OPENGL_EGL"; + case gl::ANGLE_OPENGLES_EGL: + return "ANGLE_OPENGLES_EGL"; + case gl::ANGLE_METAL: + return "ANGLE_METAL"; + case gl::ANGLE_METAL_NULL: + return "ANGLE_METAL_NULL"; + default: + NOTREACHED(); + return ""; + } +} + #if BUILDFLAG(USE_DAWN) void ForceDawnTogglesForWebGPU( bool enable_unsafe_webgpu, @@ -299,12 +345,17 @@ gl::GetRequestedGLImplementationFromCommandLine(command_line, &fallback_to_software); - // If GL is disabled then we don't need GPUInfo. - if (implementation == gl::kGLImplementationDisabled) { - gpu_info->gl_vendor = "Disabled"; - gpu_info->gl_renderer = "Disabled"; - gpu_info->gl_version = "Disabled"; - return true; + if (implementation.has_value()) { + gpu_info->gl_implementation = implementation->GLString(); + gpu_info->angle_implementation = implementation->ANGLEString(); + + // If GL is disabled then we don't need GPUInfo. + if (implementation == gl::kGLImplementationDisabled) { + gpu_info->gl_vendor = "Disabled"; + gpu_info->gl_renderer = "Disabled"; + gpu_info->gl_version = "Disabled"; + return true; + } } if (implementation == gl::GetSoftwareGLImplementation()) { @@ -336,7 +387,9 @@ bool CollectGraphicsInfoGL(GPUInfo* gpu_info, gl::GLDisplay* display) { TRACE_EVENT0("startup", "gpu_info_collector::CollectGraphicsInfoGL"); - DCHECK_NE(gl::GetGLImplementation(), gl::kGLImplementationNone); + gl::GLImplementationParts implementation = gl::GetGLImplementationParts(); + DCHECK_NE(implementation, gl::kGLImplementationNone); + gl::GLDisplayEGL* egl_display = display->GetAs<gl::GLDisplayEGL>(); // Now that we can check GL extensions, update passthrough support info. if (!gl::PassthroughCommandDecoderSupported()) { @@ -355,6 +408,12 @@ return false; } + gpu_info->gl_implementation = implementation.GLString(); + gpu_info->angle_implementation = implementation.ANGLEString(); + if (egl_display) { + gpu_info->display_type = + GetDisplayTypeString(egl_display->GetDisplayType()); + } gpu_info->gl_renderer = GetGLString(GL_RENDERER); gpu_info->gl_vendor = GetGLString(GL_VENDOR); gpu_info->gl_version = GetGLString(GL_VERSION); @@ -386,7 +445,6 @@ base::UmaHistogramSparse("GPU.MaxMSAASampleCount", max_samples); #if BUILDFLAG(IS_ANDROID) - gl::GLDisplayEGL* egl_display = display->GetAs<gl::GLDisplayEGL>(); gpu_info->can_support_threaded_texture_mailbox = egl_display->ext->b_EGL_KHR_fence_sync && egl_display->ext->b_EGL_KHR_image_base &&
diff --git a/gpu/config/gpu_preferences.h b/gpu/config/gpu_preferences.h index 6483e339..5c5fb83 100644 --- a/gpu/config/gpu_preferences.h +++ b/gpu/config/gpu_preferences.h
@@ -293,6 +293,10 @@ // Disables oppr debug crash dumps. bool disable_oopr_debug_crash_dump = false; + // Forces the use of a separate EGL display for WebGL contexts even when one + // GPU is used. + bool force_separate_egl_display_for_webgl_testing = false; + // Please update gpu_preferences_unittest.cc when making additions or // changes to this struct. };
diff --git a/gpu/config/gpu_preferences_unittest.cc b/gpu/config/gpu_preferences_unittest.cc index 14310f1..8138e04 100644 --- a/gpu/config/gpu_preferences_unittest.cc +++ b/gpu/config/gpu_preferences_unittest.cc
@@ -98,6 +98,8 @@ EXPECT_EQ(left.enable_chromeos_direct_video_decoder, right.enable_chromeos_direct_video_decoder); #endif + EXPECT_EQ(left.force_separate_egl_display_for_webgl_testing, + right.force_separate_egl_display_for_webgl_testing); } } // namespace @@ -188,6 +190,7 @@ #if BUILDFLAG(IS_CHROMEOS) GPU_PREFERENCES_FIELD(enable_chromeos_direct_video_decoder, true); #endif + GPU_PREFERENCES_FIELD(force_separate_egl_display_for_webgl_testing, true); input_prefs.texture_target_exception_list.emplace_back( gfx::BufferUsage::SCANOUT, gfx::BufferFormat::RGBA_8888); @@ -280,6 +283,7 @@ #if BUILDFLAG(IS_CHROMEOS) PRINT_BOOL(enable_chromeos_direct_video_decoder); #endif + PRINT_BOOL(force_separate_egl_display_for_webgl_testing); printf("}\n"); }
diff --git a/gpu/config/gpu_switches.cc b/gpu/config/gpu_switches.cc index 7f797c6..21872a1 100644 --- a/gpu/config/gpu_switches.cc +++ b/gpu/config/gpu_switches.cc
@@ -121,4 +121,9 @@ // Override value for the GPU watchdog timeout in seconds. const char kGpuWatchdogTimeoutSeconds[] = "gpu-watchdog-timeout-seconds"; +// Force the use of a separate EGL display for WebGL contexts. Used for testing +// multi-GPU pathways on devices with only one valid GPU. +const char kForceSeparateEGLDisplayForWebGLTesting[] = + "force-separate-egl-display-for-webgl-testing"; + } // namespace switches
diff --git a/gpu/config/gpu_switches.h b/gpu/config/gpu_switches.h index 4fd1f9a..4970fcd 100644 --- a/gpu/config/gpu_switches.h +++ b/gpu/config/gpu_switches.h
@@ -39,6 +39,7 @@ GPU_EXPORT extern const char kVulkanSyncCpuMemoryLimitMb[]; GPU_EXPORT extern const char kForceBrowserCrashOnGpuCrash[]; GPU_EXPORT extern const char kGpuWatchdogTimeoutSeconds[]; +GPU_EXPORT extern const char kForceSeparateEGLDisplayForWebGLTesting[]; } // namespace switches
diff --git a/gpu/ipc/client/client_shared_image_interface.cc b/gpu/ipc/client/client_shared_image_interface.cc index 0da96eb..bdc5287 100644 --- a/gpu/ipc/client/client_shared_image_interface.cc +++ b/gpu/ipc/client/client_shared_image_interface.cc
@@ -153,8 +153,9 @@ SkAlphaType alpha_type, uint32_t usage) { DCHECK(gpu::IsValidClientUsage(usage)); - auto mailboxes = proxy_->CreateSwapChain(format, size, color_space, - surface_origin, alpha_type, usage); + auto mailboxes = + proxy_->CreateSwapChain(viz::SharedImageFormat::SinglePlane(format), size, + color_space, surface_origin, alpha_type, usage); AddMailbox(mailboxes.front_buffer); AddMailbox(mailboxes.back_buffer); return mailboxes;
diff --git a/gpu/ipc/client/shared_image_interface_proxy.cc b/gpu/ipc/client/shared_image_interface_proxy.cc index cbe84ced..5782332 100644 --- a/gpu/ipc/client/shared_image_interface_proxy.cc +++ b/gpu/ipc/client/shared_image_interface_proxy.cc
@@ -402,7 +402,7 @@ } SharedImageInterface::SwapChainMailboxes -SharedImageInterfaceProxy::CreateSwapChain(viz::ResourceFormat format, +SharedImageInterfaceProxy::CreateSwapChain(viz::SharedImageFormat format, const gfx::Size& size, const gfx::ColorSpace& color_space, GrSurfaceOrigin surface_origin,
diff --git a/gpu/ipc/client/shared_image_interface_proxy.h b/gpu/ipc/client/shared_image_interface_proxy.h index 93809b4..8ff3160 100644 --- a/gpu/ipc/client/shared_image_interface_proxy.h +++ b/gpu/ipc/client/shared_image_interface_proxy.h
@@ -72,7 +72,7 @@ void Flush(); SharedImageInterface::SwapChainMailboxes CreateSwapChain( - viz::ResourceFormat format, + viz::SharedImageFormat format, const gfx::Size& size, const gfx::ColorSpace& color_space, GrSurfaceOrigin surface_origin,
diff --git a/gpu/ipc/common/gpu_channel.mojom b/gpu/ipc/common/gpu_channel.mojom index f12d8bf..ab41c299 100644 --- a/gpu/ipc/common/gpu_channel.mojom +++ b/gpu/ipc/common/gpu_channel.mojom
@@ -704,7 +704,7 @@ Mailbox back_buffer_mailbox; // Pixel format of the front and back buffers. - viz.mojom.ResourceFormat format; + viz.mojom.SharedImageFormat format; // Size of the buffers. gfx.mojom.Size size;
diff --git a/gpu/ipc/common/gpu_info.mojom b/gpu/ipc/common/gpu_info.mojom index 7802ac5..171ee28 100644 --- a/gpu/ipc/common/gpu_info.mojom +++ b/gpu/ipc/common/gpu_info.mojom
@@ -153,6 +153,9 @@ string max_msaa_samples; string machine_model_name; string machine_model_version; + string gl_implementation; + string angle_implementation; + string display_type; string gl_version; string gl_vendor; string gl_renderer;
diff --git a/gpu/ipc/common/gpu_info_mojom_traits.cc b/gpu/ipc/common/gpu_info_mojom_traits.cc index cde175ac..e2fa912 100644 --- a/gpu/ipc/common/gpu_info_mojom_traits.cc +++ b/gpu/ipc/common/gpu_info_mojom_traits.cc
@@ -455,6 +455,9 @@ data.ReadMaxMsaaSamples(&out->max_msaa_samples) && data.ReadMachineModelName(&out->machine_model_name) && data.ReadMachineModelVersion(&out->machine_model_version) && + data.ReadGlImplementation(&out->gl_implementation) && + data.ReadAngleImplementation(&out->angle_implementation) && + data.ReadDisplayType(&out->display_type) && data.ReadGlVersion(&out->gl_version) && data.ReadGlVendor(&out->gl_vendor) && data.ReadGlRenderer(&out->gl_renderer) &&
diff --git a/gpu/ipc/common/gpu_info_mojom_traits.h b/gpu/ipc/common/gpu_info_mojom_traits.h index d054a3e..7f9615b7 100644 --- a/gpu/ipc/common/gpu_info_mojom_traits.h +++ b/gpu/ipc/common/gpu_info_mojom_traits.h
@@ -308,6 +308,18 @@ return input.machine_model_version; } + static const std::string& gl_implementation(const gpu::GPUInfo& input) { + return input.gl_implementation; + } + + static const std::string& angle_implementation(const gpu::GPUInfo& input) { + return input.angle_implementation; + } + + static const std::string& display_type(const gpu::GPUInfo& input) { + return input.display_type; + } + static const std::string& gl_version(const gpu::GPUInfo& input) { return input.gl_version; }
diff --git a/gpu/ipc/common/gpu_preferences.mojom b/gpu/ipc/common/gpu_preferences.mojom index 776f3b0..fc036af 100644 --- a/gpu/ipc/common/gpu_preferences.mojom +++ b/gpu/ipc/common/gpu_preferences.mojom
@@ -110,4 +110,6 @@ [EnableIf=is_chromeos] bool enable_chromeos_direct_video_decoder; + + bool force_separate_egl_display_for_webgl_testing; };
diff --git a/gpu/ipc/common/gpu_preferences_mojom_traits.h b/gpu/ipc/common/gpu_preferences_mojom_traits.h index 10e605b..3aed0ee 100644 --- a/gpu/ipc/common/gpu_preferences_mojom_traits.h +++ b/gpu/ipc/common/gpu_preferences_mojom_traits.h
@@ -266,6 +266,9 @@ prefs.enable_chromeos_direct_video_decoder(); #endif + out->force_separate_egl_display_for_webgl_testing = + prefs.force_separate_egl_display_for_webgl_testing(); + return true; } @@ -461,6 +464,10 @@ return prefs.enable_chromeos_direct_video_decoder; } #endif + static bool force_separate_egl_display_for_webgl_testing( + const gpu::GpuPreferences& prefs) { + return prefs.force_separate_egl_display_for_webgl_testing; + } }; } // namespace mojo
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.cc b/gpu/ipc/service/gles2_command_buffer_stub.cc index a0077eca..729f4e94 100644 --- a/gpu/ipc/service/gles2_command_buffer_stub.cc +++ b/gpu/ipc/service/gles2_command_buffer_stub.cc
@@ -187,6 +187,9 @@ gpu_preference = gl::GpuPreference::kDefault; } + // Query and initialize the default display for this GPU preference, + // ignoring any queried display key for now. For simplicity we need + // to initialize the default display per-GPU first. // We may be requesting a new GPU/display, so get or initialize the display. gl::GLDisplay* display = gl::init::GetOrInitializeGLOneOffPlatformImplementation( @@ -194,6 +197,23 @@ /*init_extensions=*/true, /*gpu_preference=*/gpu_preference); + // If the user queries a key to create a distinct display on this GPU, + // check if this display already exists, and if not, initialize it from + // the default display on this GPU. + gl::DisplayKey display_key = gl::DisplayKey::kDefault; + if (manager->gpu_preferences().force_separate_egl_display_for_webgl_testing && + features::SupportsEGLDualGPURendering()) { + display_key = gl::DisplayKey::kSeparateEGLDisplayForWebGLTesting; + } + + if (display_key != gl::DisplayKey::kDefault) { + gl::GLDisplay* keyed_display = gl::GetDisplay(gpu_preference, display_key); + if (!keyed_display->IsInitialized()) { + keyed_display->InitializeFromDisplay(display); + } + display = keyed_display; + } + if (offscreen) { // Do we want to create an offscreen rendering context suitable // for directly drawing to a separately supplied surface? In that
diff --git a/gpu/ipc/service/shared_image_stub.cc b/gpu/ipc/service/shared_image_stub.cc index 3602933c..631d5b9e 100644 --- a/gpu/ipc/service/shared_image_stub.cc +++ b/gpu/ipc/service/shared_image_stub.cc
@@ -399,9 +399,8 @@ if (!factory_->CreateSwapChain( params->front_buffer_mailbox, params->back_buffer_mailbox, - viz::SharedImageFormat::SinglePlane(params->format), params->size, - params->color_space, params->surface_origin, params->alpha_type, - params->usage)) { + params->format, params->size, params->color_space, + params->surface_origin, params->alpha_type, params->usage)) { DLOG(ERROR) << "SharedImageStub: Unable to create swap chain"; OnError(); return;
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index 45dff07..d7076b70 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -18,6 +18,8 @@ import("//tools/grit/repack.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") +assert(!is_ios && !is_android) + if (headless_use_policy) { assert(headless_use_prefs, "'headless_use_policy' requires 'headless_use_prefs'.") @@ -379,8 +381,8 @@ ] } - if (is_linux || is_chromeos) { - sources += [ "lib/browser/headless_browser_main_parts_linux.cc" ] + if (is_posix) { + sources += [ "lib/browser/headless_browser_main_parts_posix.cc" ] } if (is_win) {
diff --git a/headless/lib/browser/DEPS b/headless/lib/browser/DEPS index 0a82454..1817055e8 100644 --- a/headless/lib/browser/DEPS +++ b/headless/lib/browser/DEPS
@@ -31,6 +31,9 @@ "+components/keyed_service/content", "+services/device/public/cpp/geolocation/system_geolocation_source_mac.h", ], + "headless_browser_main_parts_posix.cc": [ + "+device/bluetooth", + ], "headless_browser_context_impl.cc": [ "+components/keyed_service/content", "+components/origin_trials",
diff --git a/headless/lib/browser/headless_browser_main_parts.h b/headless/lib/browser/headless_browser_main_parts.h index 9ec7ef1..d48e3f95 100644 --- a/headless/lib/browser/headless_browser_main_parts.h +++ b/headless/lib/browser/headless_browser_main_parts.h
@@ -48,7 +48,7 @@ #if BUILDFLAG(IS_MAC) void PreCreateMainMessageLoop() override; #endif -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN) void PostCreateMainMessageLoop() override; #endif void QuitMainMessageLoop();
diff --git a/headless/lib/browser/headless_browser_main_parts_linux.cc b/headless/lib/browser/headless_browser_main_parts_posix.cc similarity index 95% rename from headless/lib/browser/headless_browser_main_parts_linux.cc rename to headless/lib/browser/headless_browser_main_parts_posix.cc index 89e4640..f351d3f 100644 --- a/headless/lib/browser/headless_browser_main_parts_linux.cc +++ b/headless/lib/browser/headless_browser_main_parts_posix.cc
@@ -19,17 +19,18 @@ #include "content/public/browser/browser_thread.h" #include "headless/lib/browser/headless_browser_impl.h" -#if !BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_LINUX) #include "base/command_line.h" #include "components/os_crypt/key_storage_config_linux.h" #include "components/os_crypt/os_crypt.h" #include "headless/public/switches.h" -#endif -#if defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(USE_DBUS) #include "device/bluetooth/dbus/bluez_dbus_manager.h" #endif +#endif // BUILDFLAG(IS_LINUX) + namespace headless { namespace { @@ -119,7 +120,7 @@ } // namespace -#if !BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_LINUX) constexpr char kProductName[] = "HeadlessChrome"; #endif @@ -127,11 +128,12 @@ BrowserShutdownHandler::Install( base::BindOnce(&HeadlessBrowserImpl::Shutdown, browser_->GetWeakPtr())); -#if defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_LINUX) + +#if defined(USE_DBUS) bluez::BluezDBusManager::Initialize(/*system_bus=*/nullptr); #endif -#if !BUILDFLAG(IS_CHROMEOS) // Set up crypt config. This needs to be done before anything starts the // network service, as the raw encryption key needs to be shared with the // network service for encrypted cookie storage. @@ -149,7 +151,7 @@ config->should_use_preference = false; config->user_data_path = base::FilePath(); OSCrypt::SetConfig(std::move(config)); -#endif // !BUILDFLAG(IS_CHROMEOS) +#endif // BUILDFLAG(IS_LINUX) } } // namespace headless
diff --git a/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json b/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json index 7fca0247..6d01363 100644 --- a/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json
@@ -48,10 +48,6 @@ { "builder": "linux-chromeos-rel", "group": "tryserver.chromium.chromiumos" - }, - { - "builder": "linux-chromeos-rel-rts", - "group": "tryserver.chromium.chromiumos" } ] }
diff --git a/infra/config/generated/builders/try/dawn-mac-x64-deps-rel/properties.json b/infra/config/generated/builders/try/dawn-mac-x64-deps-rel/properties.json index 2614aef..d48feee 100644 --- a/infra/config/generated/builders/try/dawn-mac-x64-deps-rel/properties.json +++ b/infra/config/generated/builders/try/dawn-mac-x64-deps-rel/properties.json
@@ -79,7 +79,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json b/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json index 39c2e90..eddd79f 100644 --- a/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json +++ b/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json
@@ -86,7 +86,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json b/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json index 67d8fb1..0b18ffb 100644 --- a/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json +++ b/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json
@@ -86,7 +86,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-pro-rel/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-pro-rel/properties.json index 9299b87c..6c69de97 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-pro-rel/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-pro-rel/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/properties.json index 5424281e..92acc04 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-asan/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-dbg/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-dbg/properties.json index 27a6b12..48814d2 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-dbg/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-dbg/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/properties.json index 99ba6e3..e574a8f 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-exp/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/properties.json index 02b632e..fdda450 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-amd-retina-rel/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json index f0b987a..dfe4dc5 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json
@@ -81,7 +81,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/properties.json index db962664..6b26675 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel/properties.json
@@ -77,7 +77,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/properties.json index 4a14980..52ca5b5 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-asan/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-dbg/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-dbg/properties.json index 3e566154..6220524 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-dbg/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-dbg/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/properties.json index 233573e..a484892 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-exp/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/properties.json index b824e32..bbe9487 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-intel-rel/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-exp/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-exp/properties.json index e1433509..96b1d42 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-exp/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-exp/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/properties.json index 2c6578d7c0..fdd54f6 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/properties.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-nvidia-retina-rel/properties.json
@@ -75,7 +75,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-try-mac-amd-retina-dbg/properties.json b/infra/config/generated/builders/try/gpu-try-mac-amd-retina-dbg/properties.json index b9b0246..8df025b3 100644 --- a/infra/config/generated/builders/try/gpu-try-mac-amd-retina-dbg/properties.json +++ b/infra/config/generated/builders/try/gpu-try-mac-amd-retina-dbg/properties.json
@@ -76,7 +76,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/gpu-try-mac-intel-dbg/properties.json b/infra/config/generated/builders/try/gpu-try-mac-intel-dbg/properties.json index 9552db2..8b2ba0f8 100644 --- a/infra/config/generated/builders/try/gpu-try-mac-intel-dbg/properties.json +++ b/infra/config/generated/builders/try/gpu-try-mac-intel-dbg/properties.json
@@ -80,7 +80,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-asan/properties.json b/infra/config/generated/builders/try/ios-asan/properties.json index 76185f0..2f40b34 100644 --- a/infra/config/generated/builders/try/ios-asan/properties.json +++ b/infra/config/generated/builders/try/ios-asan/properties.json
@@ -46,7 +46,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-blink-dbg-fyi/properties.json b/infra/config/generated/builders/try/ios-blink-dbg-fyi/properties.json index b7e5f60..783f03c 100644 --- a/infra/config/generated/builders/try/ios-blink-dbg-fyi/properties.json +++ b/infra/config/generated/builders/try/ios-blink-dbg-fyi/properties.json
@@ -41,7 +41,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-catalyst/properties.json b/infra/config/generated/builders/try/ios-catalyst/properties.json index 1d704ca..3cab6e7 100644 --- a/infra/config/generated/builders/try/ios-catalyst/properties.json +++ b/infra/config/generated/builders/try/ios-catalyst/properties.json
@@ -42,7 +42,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-device/properties.json b/infra/config/generated/builders/try/ios-device/properties.json index 1f6ff987..1866536 100644 --- a/infra/config/generated/builders/try/ios-device/properties.json +++ b/infra/config/generated/builders/try/ios-device/properties.json
@@ -42,7 +42,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json b/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json index b7e2fc3..234765a 100644 --- a/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json +++ b/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json
@@ -40,7 +40,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-m1-simulator-cronet/properties.json b/infra/config/generated/builders/try/ios-m1-simulator-cronet/properties.json index 250ef9c..3d4e8dc4 100644 --- a/infra/config/generated/builders/try/ios-m1-simulator-cronet/properties.json +++ b/infra/config/generated/builders/try/ios-m1-simulator-cronet/properties.json
@@ -41,7 +41,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-m1-simulator/properties.json b/infra/config/generated/builders/try/ios-m1-simulator/properties.json index ea8cbc5..73538b2c 100644 --- a/infra/config/generated/builders/try/ios-m1-simulator/properties.json +++ b/infra/config/generated/builders/try/ios-m1-simulator/properties.json
@@ -44,7 +44,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json b/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json index 1037fb4d..72ca2fe 100644 --- a/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json
@@ -44,7 +44,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-compilator/properties.json b/infra/config/generated/builders/try/ios-simulator-compilator/properties.json index c5102e2c..a5bdee0 100644 --- a/infra/config/generated/builders/try/ios-simulator-compilator/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-compilator/properties.json
@@ -56,7 +56,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-cronet/properties.json b/infra/config/generated/builders/try/ios-simulator-cronet/properties.json index cabdb15..d114291 100644 --- a/infra/config/generated/builders/try/ios-simulator-cronet/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-cronet/properties.json
@@ -45,7 +45,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json index 7bdaf0c..ca71d90 100644 --- a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
@@ -59,7 +59,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-inverse-fieldtrials-fyi/properties.json b/infra/config/generated/builders/try/ios-simulator-inverse-fieldtrials-fyi/properties.json index 4106088f..8237a690 100644 --- a/infra/config/generated/builders/try/ios-simulator-inverse-fieldtrials-fyi/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-inverse-fieldtrials-fyi/properties.json
@@ -44,7 +44,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json b/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json index 4bc1e8b..b962a0b 100644 --- a/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json
@@ -41,7 +41,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios-simulator-noncq/properties.json b/infra/config/generated/builders/try/ios-simulator-noncq/properties.json index 43392e0..78b29e5 100644 --- a/infra/config/generated/builders/try/ios-simulator-noncq/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-noncq/properties.json
@@ -42,7 +42,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios15-beta-simulator/properties.json b/infra/config/generated/builders/try/ios15-beta-simulator/properties.json index b0b12dad..eb6cf3cf 100644 --- a/infra/config/generated/builders/try/ios15-beta-simulator/properties.json +++ b/infra/config/generated/builders/try/ios15-beta-simulator/properties.json
@@ -41,7 +41,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json b/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json index f097107..0a662e4b 100644 --- a/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json +++ b/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json
@@ -41,7 +41,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios16-beta-simulator/properties.json b/infra/config/generated/builders/try/ios16-beta-simulator/properties.json index 03355b5..c398c01 100644 --- a/infra/config/generated/builders/try/ios16-beta-simulator/properties.json +++ b/infra/config/generated/builders/try/ios16-beta-simulator/properties.json
@@ -42,7 +42,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/ios16-sdk-simulator/properties.json b/infra/config/generated/builders/try/ios16-sdk-simulator/properties.json index 5957989..0a65aced 100644 --- a/infra/config/generated/builders/try/ios16-sdk-simulator/properties.json +++ b/infra/config/generated/builders/try/ios16-sdk-simulator/properties.json
@@ -41,7 +41,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/linux-chromeos-rel-rts/properties.json b/infra/config/generated/builders/try/linux-chromeos-rel-rts/properties.json deleted file mode 100644 index 298b7f96..0000000 --- a/infra/config/generated/builders/try/linux-chromeos-rel-rts/properties.json +++ /dev/null
@@ -1,69 +0,0 @@ -{ - "$build/chromium_tests_builder_config": { - "builder_config": { - "builder_db": { - "entries": [ - { - "builder_id": { - "bucket": "ci", - "builder": "linux-chromeos-rel", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-chromiumos-archive", - "builder_group": "chromium.chromiumos", - "execution_mode": "COMPILE_AND_TEST", - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Release", - "config": "chromium", - "target_arch": "intel", - "target_bits": 64 - }, - "legacy_gclient_config": { - "apply_configs": [ - "use_clang_coverage", - "chromeos" - ], - "config": "chromium" - } - } - } - ] - }, - "builder_ids": [ - { - "bucket": "ci", - "builder": "linux-chromeos-rel", - "project": "chromium" - } - ], - "rts_config": { - "condition": "ALWAYS" - } - } - }, - "$build/code_coverage": { - "coverage_test_types": [ - "unit", - "overall" - ], - "use_clang_coverage": true - }, - "$build/reclient": { - "instance": "rbe-chromium-untrusted", - "jobs": 150, - "metrics_project": "chromium-reclient-metrics" - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "tryserver.chromium.chromiumos", - "recipe": "chromium_trybot" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/mac-arm64-on-arm64-rel/properties.json b/infra/config/generated/builders/try/mac-arm64-on-arm64-rel/properties.json index 7af887c..55eadd1f 100644 --- a/infra/config/generated/builders/try/mac-arm64-on-arm64-rel/properties.json +++ b/infra/config/generated/builders/try/mac-arm64-on-arm64-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-builder-next-rel/properties.json b/infra/config/generated/builders/try/mac-builder-next-rel/properties.json index f39d9cb..ac76b6f 100644 --- a/infra/config/generated/builders/try/mac-builder-next-rel/properties.json +++ b/infra/config/generated/builders/try/mac-builder-next-rel/properties.json
@@ -41,7 +41,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-code-coverage/properties.json b/infra/config/generated/builders/try/mac-code-coverage/properties.json index 7cf02a2e..3698408 100644 --- a/infra/config/generated/builders/try/mac-code-coverage/properties.json +++ b/infra/config/generated/builders/try/mac-code-coverage/properties.json
@@ -42,7 +42,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-dawn-rel/properties.json b/infra/config/generated/builders/try/mac-dawn-rel/properties.json index d2bab81..f4f5d7b 100644 --- a/infra/config/generated/builders/try/mac-dawn-rel/properties.json +++ b/infra/config/generated/builders/try/mac-dawn-rel/properties.json
@@ -86,7 +86,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-fieldtrial-tester/properties.json b/infra/config/generated/builders/try/mac-fieldtrial-tester/properties.json index 21b288e..a87bb25 100644 --- a/infra/config/generated/builders/try/mac-fieldtrial-tester/properties.json +++ b/infra/config/generated/builders/try/mac-fieldtrial-tester/properties.json
@@ -75,7 +75,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-inverse-fieldtrials-fyi-rel/properties.json b/infra/config/generated/builders/try/mac-inverse-fieldtrials-fyi-rel/properties.json index 28ed9851f..0d27240 100644 --- a/infra/config/generated/builders/try/mac-inverse-fieldtrials-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac-inverse-fieldtrials-fyi-rel/properties.json
@@ -187,7 +187,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-official/properties.json b/infra/config/generated/builders/try/mac-official/properties.json index e2b3a3d..0d42bdb 100644 --- a/infra/config/generated/builders/try/mac-official/properties.json +++ b/infra/config/generated/builders/try/mac-official/properties.json
@@ -41,7 +41,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-osxbeta-rel/properties.json b/infra/config/generated/builders/try/mac-osxbeta-rel/properties.json index eda7837..8b1fed9 100644 --- a/infra/config/generated/builders/try/mac-osxbeta-rel/properties.json +++ b/infra/config/generated/builders/try/mac-osxbeta-rel/properties.json
@@ -78,7 +78,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-perfetto-rel/properties.json b/infra/config/generated/builders/try/mac-perfetto-rel/properties.json index 59720f791..77573496e 100644 --- a/infra/config/generated/builders/try/mac-perfetto-rel/properties.json +++ b/infra/config/generated/builders/try/mac-perfetto-rel/properties.json
@@ -39,7 +39,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-rel-cft/properties.json b/infra/config/generated/builders/try/mac-rel-cft/properties.json index e6f73f17..c59cacd1 100644 --- a/infra/config/generated/builders/try/mac-rel-cft/properties.json +++ b/infra/config/generated/builders/try/mac-rel-cft/properties.json
@@ -43,7 +43,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-rel-compilator/properties.json b/infra/config/generated/builders/try/mac-rel-compilator/properties.json index 237ed229..d54c72c3 100644 --- a/infra/config/generated/builders/try/mac-rel-compilator/properties.json +++ b/infra/config/generated/builders/try/mac-rel-compilator/properties.json
@@ -167,7 +167,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json b/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json index 919930c..d968c03 100644 --- a/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json +++ b/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json
@@ -50,7 +50,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-updater-try-builder-dbg/properties.json b/infra/config/generated/builders/try/mac-updater-try-builder-dbg/properties.json index 9eddfddc..405cb1a 100644 --- a/infra/config/generated/builders/try/mac-updater-try-builder-dbg/properties.json +++ b/infra/config/generated/builders/try/mac-updater-try-builder-dbg/properties.json
@@ -75,7 +75,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac-updater-try-builder-rel/properties.json b/infra/config/generated/builders/try/mac-updater-try-builder-rel/properties.json index 62fcde3..3147b4b 100644 --- a/infra/config/generated/builders/try/mac-updater-try-builder-rel/properties.json +++ b/infra/config/generated/builders/try/mac-updater-try-builder-rel/properties.json
@@ -75,7 +75,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac10.13-blink-rel/properties.json b/infra/config/generated/builders/try/mac10.13-blink-rel/properties.json index 116201c9..4502f6b 100644 --- a/infra/config/generated/builders/try/mac10.13-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac10.13-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac10.14-blink-rel/properties.json b/infra/config/generated/builders/try/mac10.14-blink-rel/properties.json index c4fec30..3b496ff 100644 --- a/infra/config/generated/builders/try/mac10.14-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac10.14-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac10.15-blink-rel/properties.json b/infra/config/generated/builders/try/mac10.15-blink-rel/properties.json index 461a6483..d215810 100644 --- a/infra/config/generated/builders/try/mac10.15-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac10.15-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac10.15-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac10.15-wpt-content-shell-fyi-rel/properties.json index d4026dd..52c417b 100644 --- a/infra/config/generated/builders/try/mac10.15-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac10.15-wpt-content-shell-fyi-rel/properties.json
@@ -39,7 +39,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac11-arm64-rel/properties.json b/infra/config/generated/builders/try/mac11-arm64-rel/properties.json index b9920ea..96ed2f0 100644 --- a/infra/config/generated/builders/try/mac11-arm64-rel/properties.json +++ b/infra/config/generated/builders/try/mac11-arm64-rel/properties.json
@@ -79,7 +79,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac11-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac11-wpt-content-shell-fyi-rel/properties.json index c15b2fa5..fdb7d154 100644 --- a/infra/config/generated/builders/try/mac11-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac11-wpt-content-shell-fyi-rel/properties.json
@@ -39,7 +39,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac11.0-blink-rel/properties.json b/infra/config/generated/builders/try/mac11.0-blink-rel/properties.json index 735a38d0..fff13ac 100644 --- a/infra/config/generated/builders/try/mac11.0-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac11.0-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac11.0.arm64-blink-rel/properties.json b/infra/config/generated/builders/try/mac11.0.arm64-blink-rel/properties.json index 1cc655d..12605102 100644 --- a/infra/config/generated/builders/try/mac11.0.arm64-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac11.0.arm64-blink-rel/properties.json
@@ -41,7 +41,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12-arm64-rel-compilator/properties.json b/infra/config/generated/builders/try/mac12-arm64-rel-compilator/properties.json index 3431ba84..d229737f9 100644 --- a/infra/config/generated/builders/try/mac12-arm64-rel-compilator/properties.json +++ b/infra/config/generated/builders/try/mac12-arm64-rel-compilator/properties.json
@@ -80,7 +80,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12-arm64-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac12-arm64-wpt-content-shell-fyi-rel/properties.json index 6df664d..f35adc5e 100644 --- a/infra/config/generated/builders/try/mac12-arm64-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac12-arm64-wpt-content-shell-fyi-rel/properties.json
@@ -40,7 +40,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12-tests/properties.json b/infra/config/generated/builders/try/mac12-tests/properties.json index f7680c0c..ac840a8 100644 --- a/infra/config/generated/builders/try/mac12-tests/properties.json +++ b/infra/config/generated/builders/try/mac12-tests/properties.json
@@ -80,7 +80,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac12-wpt-content-shell-fyi-rel/properties.json index 0c90107a..b5fc594 100644 --- a/infra/config/generated/builders/try/mac12-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac12-wpt-content-shell-fyi-rel/properties.json
@@ -39,7 +39,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12.0-blink-rel/properties.json b/infra/config/generated/builders/try/mac12.0-blink-rel/properties.json index 6cb6847..0b4d44e 100644 --- a/infra/config/generated/builders/try/mac12.0-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac12.0-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac12.0.arm64-blink-rel/properties.json b/infra/config/generated/builders/try/mac12.0.arm64-blink-rel/properties.json index 6ef31d5b..490e43c 100644 --- a/infra/config/generated/builders/try/mac12.0.arm64-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac12.0.arm64-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac13-arm64-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac13-arm64-wpt-content-shell-fyi-rel/properties.json index b4e1bae7..73b615a 100644 --- a/infra/config/generated/builders/try/mac13-arm64-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac13-arm64-wpt-content-shell-fyi-rel/properties.json
@@ -40,7 +40,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac13-blink-rel/properties.json b/infra/config/generated/builders/try/mac13-blink-rel/properties.json index 7bbd741a..68119fd 100644 --- a/infra/config/generated/builders/try/mac13-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac13-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac13-wpt-content-shell-fyi-rel/properties.json b/infra/config/generated/builders/try/mac13-wpt-content-shell-fyi-rel/properties.json index 58bafdb..1855a01 100644 --- a/infra/config/generated/builders/try/mac13-wpt-content-shell-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/mac13-wpt-content-shell-fyi-rel/properties.json
@@ -39,7 +39,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac13.arm64-blink-rel/properties.json b/infra/config/generated/builders/try/mac13.arm64-blink-rel/properties.json index 12f25827..f0d0ea9 100644 --- a/infra/config/generated/builders/try/mac13.arm64-blink-rel/properties.json +++ b/infra/config/generated/builders/try/mac13.arm64-blink-rel/properties.json
@@ -40,7 +40,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json index 98246237..b59355c 100644 --- a/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json
@@ -89,7 +89,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_10.14_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_10.14_rel_ng/properties.json index 69bbc45..06872e20 100644 --- a/infra/config/generated/builders/try/mac_chromium_10.14_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_10.14_rel_ng/properties.json
@@ -82,7 +82,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_10.15_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_10.15_rel_ng/properties.json index 7986aa6..44c7097 100644 --- a/infra/config/generated/builders/try/mac_chromium_10.15_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_10.15_rel_ng/properties.json
@@ -82,7 +82,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_11.0_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_11.0_rel_ng/properties.json index 6a6425ca..f6a3f55 100644 --- a/infra/config/generated/builders/try/mac_chromium_11.0_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_11.0_rel_ng/properties.json
@@ -80,7 +80,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_archive_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_archive_rel_ng/properties.json index 1dd403c..1565954 100644 --- a/infra/config/generated/builders/try/mac_chromium_archive_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_archive_rel_ng/properties.json
@@ -41,7 +41,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_asan_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_asan_rel_ng/properties.json index 6a9eaab..4c06e9e 100644 --- a/infra/config/generated/builders/try/mac_chromium_asan_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_asan_rel_ng/properties.json
@@ -75,7 +75,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 300, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json index 03b0dcb1..cf07f3c 100644 --- a/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json
@@ -116,7 +116,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json index 06cce01..7bac97e 100644 --- a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json
@@ -224,7 +224,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_chromium_dbg_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_dbg_ng/properties.json index 899b9f36..8638d028 100644 --- a/infra/config/generated/builders/try/mac_chromium_dbg_ng/properties.json +++ b/infra/config/generated/builders/try/mac_chromium_dbg_ng/properties.json
@@ -77,7 +77,8 @@ "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json index e3d8624..b140910 100644 --- a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json +++ b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json
@@ -42,7 +42,8 @@ }, "$build/reclient": { "instance": "rbe-chromium-untrusted", - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json index 69a4c08..a3b36eb 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json
@@ -75,7 +75,8 @@ "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250, - "metrics_project": "chromium-reclient-metrics" + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 8a146c2..b0a17fc1 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -490,9 +490,6 @@ * [linux-1mbu-compile-fyi-rel](https://ci.chromium.org/p/chromium/builders/try/linux-1mbu-compile-fyi-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-1mbu-compile-fyi-rel"")) * Experiment percentage: 5.0 -* [linux-chromeos-rel-rts](https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-rts) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-chromeos-rel-rts"")) - * Experiment percentage: 5.0 - * [linux-rel-ml](https://ci.chromium.org/p/chromium/builders/try/linux-rel-ml) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-rel-ml"")) * Experiment percentage: 5.0
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 461c55ab..5b5eecb 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -2488,27 +2488,6 @@ includable_only: true } builders { - name: "chromium/try/linux-chromeos-rel-rts" - experiment_percentage: 5 - 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/linux-chromeos-rel-rts/.+" - } - } - builders { name: "chromium/try/linux-clang-tidy-rel" includable_only: true }
diff --git a/infra/config/generated/luci/cr-buildbucket-dev.cfg b/infra/config/generated/luci/cr-buildbucket-dev.cfg index e59c2eb..4bf30476 100644 --- a/infra/config/generated/luci/cr-buildbucket-dev.cfg +++ b/infra/config/generated/luci/cr-buildbucket-dev.cfg
@@ -334,7 +334,8 @@ ' "$build/reclient": {' ' "instance": "rbe-chromium-trusted",' ' "jobs": 250,' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -423,7 +424,8 @@ ' "$build/reclient": {' ' "instance": "rbe-chromium-trusted",' ' "jobs": 250,' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],'
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index af4a6be..58e624c 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -36667,6 +36667,7 @@ dimensions: "cores:32" dimensions: "cpu:x86-64" dimensions: "free_space:standard" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:1" exe { @@ -48322,10 +48323,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48406,10 +48403,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48490,10 +48483,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48574,10 +48563,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48654,10 +48639,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48736,10 +48717,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48820,10 +48797,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48903,10 +48876,6 @@ '}' execution_timeout_secs: 32400 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -48999,10 +48968,6 @@ ' "recipe": "findit/chromium/single_revision"' '}' execution_timeout_secs: 28800 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -49057,10 +49022,6 @@ ' "recipe": "gofindit/chromium/single_revision"' '}' execution_timeout_secs: 28800 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { @@ -55013,10 +54974,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-cipd-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55097,10 +55054,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-cipd-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55221,10 +55174,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55315,10 +55264,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55409,10 +55354,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55502,10 +55443,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55601,10 +55538,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55696,10 +55629,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55790,10 +55719,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -55958,10 +55883,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56052,10 +55973,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56145,10 +56062,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56244,10 +56157,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56339,10 +56248,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56439,10 +56344,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56533,10 +56434,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56619,10 +56516,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56713,10 +56606,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56807,10 +56696,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56901,10 +56786,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -56995,10 +56876,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57089,10 +56966,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57183,10 +57056,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57277,10 +57146,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57371,10 +57236,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57465,10 +57326,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57559,10 +57416,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57653,10 +57506,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57747,10 +57596,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57841,10 +57686,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -57933,10 +57774,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58019,10 +57856,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58109,10 +57942,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58207,10 +58036,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58301,10 +58126,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58394,10 +58215,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58493,10 +58310,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58588,10 +58401,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58682,10 +58491,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58776,10 +58581,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58869,10 +58670,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -58963,10 +58760,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59057,10 +58850,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59150,10 +58939,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59243,10 +59028,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59337,10 +59118,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59431,10 +59208,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59525,10 +59298,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59619,10 +59388,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59713,10 +59478,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59807,10 +59568,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59901,10 +59658,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -59994,10 +59747,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60088,10 +59837,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60182,10 +59927,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60276,10 +60017,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60370,10 +60107,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60464,10 +60197,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60558,10 +60287,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60651,10 +60376,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60744,10 +60465,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60838,10 +60555,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60932,10 +60645,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -60946,10 +60655,6 @@ value: 100 } experiments { - key: "luci.buildbucket.omit_python2" - value: 0 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -61018,10 +60723,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61032,10 +60733,6 @@ value: 100 } experiments { - key: "luci.buildbucket.omit_python2" - value: 0 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -61117,10 +60814,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61211,10 +60904,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61305,10 +60994,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61398,10 +61083,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61493,10 +61174,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61588,10 +61265,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61681,10 +61354,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61775,10 +61444,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61869,10 +61534,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -61963,10 +61624,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62049,10 +61706,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62145,10 +61798,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62237,10 +61886,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62329,10 +61974,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62421,10 +62062,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62513,10 +62150,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62606,10 +62239,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62699,10 +62328,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62791,10 +62416,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62883,10 +62504,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -62975,10 +62592,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63067,10 +62680,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63196,10 +62805,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63290,10 +62895,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63384,10 +62985,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63477,10 +63074,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63583,10 +63176,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63677,10 +63266,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63763,10 +63348,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63857,10 +63438,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -63951,10 +63528,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64037,10 +63610,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64131,10 +63700,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64225,10 +63790,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64319,10 +63880,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64412,10 +63969,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64519,10 +64072,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64614,10 +64163,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64708,10 +64253,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64810,10 +64351,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64900,10 +64437,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -64990,10 +64523,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65080,10 +64609,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65170,10 +64695,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65260,10 +64781,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65350,10 +64867,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65440,10 +64953,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65530,10 +65039,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65620,10 +65125,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65710,10 +65211,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65800,10 +65297,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65890,10 +65383,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -65980,10 +65469,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66070,10 +65555,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66160,10 +65641,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66249,10 +65726,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66338,10 +65811,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66427,10 +65896,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66516,10 +65981,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66605,10 +66066,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66694,10 +66151,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66783,10 +66236,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66872,10 +66321,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -66961,10 +66406,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67050,10 +66491,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67139,10 +66576,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67228,10 +66661,6 @@ '}' execution_timeout_secs: 43200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67317,10 +66746,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67407,10 +66832,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67497,10 +66918,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67587,10 +67004,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67677,10 +67090,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67767,10 +67176,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67857,10 +67262,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -67947,10 +67348,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68037,10 +67434,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68127,10 +67520,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68217,10 +67606,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68307,10 +67692,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68397,10 +67778,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68486,10 +67863,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68575,10 +67948,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -68744,10 +68113,6 @@ execution_timeout_secs: 7200 expiration_secs: 7200 caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -68840,10 +68205,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -68936,10 +68297,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69032,10 +68389,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69102,7 +68455,8 @@ ' "$build/reclient": {' ' "instance": "rbe-chromium-untrusted",' ' "jobs": 300,' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -69121,10 +68475,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_13c100" path: "xcode_ios_13c100.app" } @@ -69217,10 +68567,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69313,10 +68659,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69409,10 +68751,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69505,10 +68843,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69601,10 +68935,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -69695,10 +69025,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69791,10 +69117,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69888,10 +69210,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -69984,10 +69302,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70080,10 +69394,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70176,10 +69486,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70272,10 +69578,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70368,10 +69670,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70464,10 +69762,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70560,10 +69854,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70656,10 +69946,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_14c18" path: "xcode_ios_14c18.app" } @@ -70752,10 +70038,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -70844,10 +70126,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -70941,10 +70219,6 @@ name: "unused_builder_cache" path: "builder" } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71036,10 +70310,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71129,10 +70399,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71222,10 +70488,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71316,10 +70578,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71410,10 +70668,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71504,10 +70758,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71597,10 +70847,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71803,10 +71049,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71897,10 +71139,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -71991,10 +71229,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72085,10 +71319,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72179,10 +71409,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72273,10 +71499,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72367,10 +71589,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72461,10 +71679,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72555,10 +71769,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72641,10 +71851,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72735,10 +71941,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72828,10 +72030,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -72922,10 +72120,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73016,10 +72210,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73109,10 +72299,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73204,10 +72390,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73256,99 +72438,6 @@ description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel\">linux-chromeos-rel</a>." } builders { - name: "linux-chromeos-rel-rts" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builder:linux-chromeos-rel-rts" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-18.04" - dimensions: "pool:luci.chromium.try" - 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/try/linux-chromeos-rel-rts/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "tryserver.chromium.chromiumos",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium_trybot"' - '}' - execution_timeout_secs: 14400 - expiration_secs: 7200 - grace_period { - seconds: 120 - } - caches { - name: "win_toolchain" - path: "win_toolchain" - } - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - task_template_canary_percentage { - value: 5 - } - 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: "try_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_try_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_try_test_results" - test_results { - predicate { - test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "linux-clang-tidy-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -73384,10 +72473,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73478,10 +72563,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73570,10 +72651,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73664,10 +72741,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73758,10 +72831,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73852,10 +72921,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -73946,10 +73011,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74040,10 +73101,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74134,10 +73191,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74228,10 +73281,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74322,10 +73371,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74408,10 +73453,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74502,10 +73543,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74596,10 +73633,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74690,10 +73723,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74783,10 +73812,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74878,10 +73903,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -74973,10 +73994,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75067,10 +74084,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75151,10 +74164,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75245,10 +74254,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75339,10 +74344,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75433,10 +74434,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75527,10 +74524,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75620,10 +74613,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75719,10 +74708,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75813,10 +74798,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -75907,10 +74888,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76004,10 +74981,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76097,10 +75070,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76190,10 +75159,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76281,10 +75246,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76407,10 +75368,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76498,10 +75455,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76592,10 +75545,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76685,10 +75634,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76778,10 +75723,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76872,10 +75813,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -76965,10 +75902,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77064,10 +75997,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77159,10 +76088,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77253,10 +76178,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77347,10 +76268,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77441,10 +76358,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77535,10 +76448,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77629,10 +76538,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77722,10 +76627,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77816,10 +76717,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -77910,10 +76807,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78004,10 +76897,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78097,10 +76986,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78196,10 +77081,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78291,10 +77172,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78385,10 +77262,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78479,10 +77352,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78565,10 +77434,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78659,10 +77524,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78756,10 +77617,6 @@ name: "builder" path: "linux_debug" } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78850,10 +77707,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -78948,10 +77801,6 @@ name: "builder" path: "linux_debug" } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79042,10 +77891,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79135,10 +77980,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79234,10 +78075,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79329,10 +78166,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79422,10 +78255,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79507,10 +78336,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79601,10 +78426,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79751,7 +78572,8 @@ ' "$build/reclient": {' ' "instance": "rbe-chromium-untrusted",' ' "jobs": 300,' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -79768,10 +78590,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79861,10 +78679,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -79954,10 +78768,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80022,7 +78832,8 @@ ' "$build/reclient": {' ' "instance": "rbe-chromium-untrusted",' ' "jobs": 300,' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -80041,10 +78852,6 @@ seconds: 120 } caches { - name: "win_toolchain" - path: "win_toolchain" - } - caches { name: "xcode_ios_13c100" path: "xcode_ios_13c100.app" } @@ -80137,10 +78944,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80229,10 +79032,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80322,10 +79121,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80415,10 +79210,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80507,10 +79298,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80600,10 +79387,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80693,10 +79476,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80786,10 +79565,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80883,10 +79658,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -80976,10 +79747,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81066,10 +79833,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81158,10 +79921,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81250,10 +80009,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81343,10 +80098,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81436,10 +80187,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81529,10 +80276,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81622,10 +80365,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81715,10 +80454,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81808,10 +80543,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81901,10 +80632,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -81994,10 +80721,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82087,10 +80810,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82181,10 +80900,6 @@ grace_period { seconds: 240 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82275,10 +80990,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82368,10 +81079,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82461,10 +81168,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82554,10 +81257,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82647,10 +81346,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82740,10 +81435,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82833,10 +81524,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -82926,10 +81613,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83019,10 +81702,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83112,10 +81791,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83205,10 +81880,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83298,10 +81969,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83391,10 +82058,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83484,10 +82147,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83577,10 +82236,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83670,10 +82325,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83763,10 +82414,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83856,10 +82503,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -83948,10 +82591,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84015,7 +82654,8 @@ '{' ' "$build/reclient": {' ' "instance": "rbe-chromium-untrusted",' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -84032,10 +82672,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84099,7 +82735,8 @@ '{' ' "$build/reclient": {' ' "instance": "rbe-chromium-untrusted",' - ' "metrics_project": "chromium-reclient-metrics"' + ' "metrics_project": "chromium-reclient-metrics",' + ' "scandeps_server": true' ' },' ' "$recipe_engine/resultdb/test_presentation": {' ' "column_keys": [],' @@ -84116,10 +82753,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84210,10 +82843,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84303,10 +82932,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84317,10 +82942,6 @@ value: 100 } experiments { - key: "luci.buildbucket.omit_python2" - value: 0 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -84388,10 +83009,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84402,10 +83019,6 @@ value: 100 } experiments { - key: "luci.buildbucket.omit_python2" - value: 0 - } - experiments { key: "luci.recipes.use_python3" value: 100 } @@ -84482,10 +83095,6 @@ name: "unused_builder_cache" path: "builder" } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84567,10 +83176,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84652,10 +83257,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84737,10 +83338,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -84831,10 +83428,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85037,10 +83630,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85166,10 +83755,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85260,10 +83845,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85354,10 +83935,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85444,10 +84021,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85536,10 +84109,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85630,10 +84199,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85715,10 +84280,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85809,10 +84370,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85903,10 +84460,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -85996,10 +84549,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86095,10 +84644,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86189,10 +84734,6 @@ grace_period { seconds: 240 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86281,10 +84822,6 @@ '}' execution_timeout_secs: 21600 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86407,10 +84944,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86533,10 +85066,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86624,10 +85153,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86715,10 +85240,6 @@ '}' execution_timeout_secs: 7200 expiration_secs: 7200 - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86809,10 +85330,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86903,10 +85420,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -86989,10 +85502,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87083,10 +85592,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87177,10 +85682,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87271,10 +85772,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87365,10 +85862,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87459,10 +85952,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87553,10 +86042,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87647,10 +86132,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87741,10 +86222,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87835,10 +86312,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -87929,10 +86402,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88023,10 +86492,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88117,10 +86582,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88211,10 +86672,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88304,10 +86761,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88384,10 +86837,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage { @@ -88478,10 +86927,6 @@ grace_period { seconds: 120 } - caches { - name: "win_toolchain" - path: "win_toolchain" - } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" task_template_canary_percentage {
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 01a7e659..54ed149 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -17548,9 +17548,6 @@ name: "buildbucket/luci.chromium.try/linux-chromeos-rel-compilator" } builders { - name: "buildbucket/luci.chromium.try/linux-chromeos-rel-rts" - } - builders { name: "buildbucket/luci.chromium.try/linux-clang-tidy-rel" } builders { @@ -18453,9 +18450,6 @@ name: "buildbucket/luci.chromium.try/linux-chromeos-rel-compilator" } builders { - name: "buildbucket/luci.chromium.try/linux-chromeos-rel-rts" - } - builders { name: "buildbucket/luci.chromium.try/linux-lacros-dbg" } builders {
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 091fd9f0..14d1e4d5 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -409,7 +409,7 @@ reclient_bootstrap_env = None, reclient_profiler_service = None, reclient_publish_trace = None, - reclient_scandeps_server = False, + reclient_scandeps_server = None, reclient_cache_silo = None, reclient_ensure_verified = None, reclient_disable_bq_upload = None, @@ -807,6 +807,9 @@ if code_coverage != None: properties["$build/code_coverage"] = code_coverage + if reclient_scandeps_server == args.DEFAULT and os and os.category == os_category.MAC: + reclient_scandeps_server = True + reclient = _reclient_property( instance = reclient_instance, service = reclient_service,
diff --git a/infra/config/subprojects/chromium/angle.try.star b/infra/config/subprojects/chromium/angle.try.star index 5124944..3b8d26d 100644 --- a/infra/config/subprojects/chromium/angle.try.star +++ b/infra/config/subprojects/chromium/angle.try.star
@@ -15,12 +15,6 @@ os = os.LINUX_DEFAULT, cpu = cpu.X86_64, build_numbers = True, - caches = [ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), - ], cq_group = "cq", execution_timeout = 2 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed
diff --git a/infra/config/subprojects/chromium/ci/chromium.cft.star b/infra/config/subprojects/chromium/ci/chromium.cft.star index 331eb11a..42aa502e 100644 --- a/infra/config/subprojects/chromium/ci/chromium.cft.star +++ b/infra/config/subprojects/chromium/ci/chromium.cft.star
@@ -51,7 +51,6 @@ console_view_entry = consoles.console_view_entry( short_name = "mac-rel-cft", ), - reclient_scandeps_server = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.coverage.star b/infra/config/subprojects/chromium/ci/chromium.coverage.star index a0955f5..837a5c71 100644 --- a/infra/config/subprojects/chromium/ci/chromium.coverage.star +++ b/infra/config/subprojects/chromium/ci/chromium.coverage.star
@@ -188,7 +188,6 @@ coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, - reclient_scandeps_server = True, use_clang_coverage = True, xcode = xcode.x14main, ) @@ -259,6 +258,7 @@ name = "linux-fuzz-coverage", executable = "recipe:chromium_fuzz_coverage", builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = [ consoles.console_view_entry( category = "linux-fuzz", @@ -351,7 +351,6 @@ coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - reclient_scandeps_server = True, use_clang_coverage = True, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star index 13209e0..9101fc4a 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -364,7 +364,6 @@ category = "mac asan", short_name = "rel", ), - reclient_scandeps_server = True, ) ci.builder( @@ -396,7 +395,6 @@ category = "mac asan", short_name = "med", ), - reclient_scandeps_server = True, ) ci.builder( @@ -598,7 +596,6 @@ short_name = "ios", ), execution_timeout = 4 * time.hour, - reclient_scandeps_server = True, xcode = xcode.x14main, ) @@ -745,7 +742,6 @@ short_name = "mac-asan", ), execution_timeout = 4 * time.hour, - reclient_scandeps_server = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 36894ee..6970c09 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -954,7 +954,6 @@ short_name = "64rel", ), notifies = ["chrome-memory-safety"], - reclient_scandeps_server = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star index 4c58360..6f36aac 100644 --- a/infra/config/subprojects/chromium/ci/chromium.mac.star +++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -21,7 +21,6 @@ execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - reclient_scandeps_server = True, service_account = ci.DEFAULT_SERVICE_ACCOUNT, thin_tester_cores = 8, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star index d0a56a1..307c4ed 100644 --- a/infra/config/subprojects/chromium/ci/chromium.memory.star +++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -405,7 +405,6 @@ category = "mac", short_name = "bld", ), - reclient_scandeps_server = True, ) linux_memory_builder( @@ -653,6 +652,5 @@ category = "iOS", short_name = "asn", ), - reclient_scandeps_server = True, xcode = xcode.x14main, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star index 6eeecd82..141fafbf 100644 --- a/infra/config/subprojects/chromium/ci/chromium.star +++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -538,7 +538,6 @@ category = "mac", short_name = "dbg", ), - reclient_scandeps_server = True, ) ci.builder( @@ -576,7 +575,6 @@ ], }, }, - reclient_scandeps_server = True, ) ci.builder( @@ -602,7 +600,6 @@ category = "mac|arm", short_name = "dbg", ), - reclient_scandeps_server = True, ) ci.builder( @@ -640,7 +637,6 @@ ], }, }, - reclient_scandeps_server = True, ) ci.builder( @@ -670,7 +666,6 @@ # TODO(crbug.com/1279290) builds with PGO change take long time. # Keep in sync with mac-official in try/chromium.star. execution_timeout = 9 * time.hour, - reclient_scandeps_server = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star index 15c9b66..ef35d52 100644 --- a/infra/config/subprojects/chromium/ci/chromium.updater.star +++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -160,7 +160,6 @@ category = "debug|mac", short_name = "bld", ), - reclient_scandeps_server = True, ) ci.builder( @@ -186,7 +185,6 @@ category = "release|mac", short_name = "bld", ), - reclient_scandeps_server = True, ) ci.builder( @@ -213,7 +211,6 @@ category = "debug|mac", short_name = "bld", ), - reclient_scandeps_server = True, ) ci.builder( @@ -240,7 +237,6 @@ category = "release|mac", short_name = "bld", ), - reclient_scandeps_server = True, ) ci.builder( @@ -266,7 +262,6 @@ category = "debug|mac", short_name = "bld-asan", ), - reclient_scandeps_server = True, ) ci.thin_tester(
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star index d053dc7..efdcddd 100644 --- a/infra/config/subprojects/chromium/gpu.try.star +++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -13,12 +13,6 @@ os = os.LINUX_DEFAULT, cpu = cpu.X86_64, build_numbers = True, - caches = [ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), - ], cq_group = "cq", execution_timeout = 6 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed
diff --git a/infra/config/subprojects/chromium/swangle.try.star b/infra/config/subprojects/chromium/swangle.try.star index 9fc48f7..c14f9a6 100644 --- a/infra/config/subprojects/chromium/swangle.try.star +++ b/infra/config/subprojects/chromium/swangle.try.star
@@ -16,12 +16,6 @@ os = os.LINUX_DEFAULT, cpu = cpu.X86_64, build_numbers = True, - caches = [ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), - ], cq_group = "cq", execution_timeout = 2 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 43bdd65b..da70c6c 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -13,12 +13,6 @@ bucket = "try", cpu = cpu.X86_64, build_numbers = True, - caches = [ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), - ], cq_group = "cq", # Max. pending time for builds. CQ considers builds pending >2h as timed # out: http://shortn/_8PaHsdYmlq. Keep this in sync.
diff --git a/infra/config/subprojects/chromium/try/presubmit.star b/infra/config/subprojects/chromium/try/presubmit.star index c808e7d..bba04a6 100644 --- a/infra/config/subprojects/chromium/try/presubmit.star +++ b/infra/config/subprojects/chromium/try/presubmit.star
@@ -18,8 +18,6 @@ execution_timeout = 15 * time.minute, main_list_view = "try", - # TODO(crbug.com/1362440): remove this. - omit_python2 = False, # Default priority for buildbucket is 30, see # https://chromium.googlesource.com/infra/infra/+/bb68e62b4380ede486f65cd32d9ff3f1bbe288e4/appengine/cr-buildbucket/creation.py#42 # This will improve our turnaround time for landing infra/config changes @@ -130,6 +128,9 @@ branch_selector = branches.selector.ALL_BRANCHES, executable = "recipe:presubmit", execution_timeout = 40 * time.minute, + + # TODO(crbug.com/1366979): remove this. + omit_python2 = False, properties = { "$depot_tools/presubmit": { "runhooks": True,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index f373ab2..586fefc2 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -345,23 +345,3 @@ ], ), ) - -# RTS builders - -try_.builder( - name = "linux-chromeos-rel-rts", - mirrors = [ - "ci/linux-chromeos-rel", - ], - try_settings = builder_config.try_settings( - rts_config = builder_config.rts_config( - condition = builder_config.rts_condition.ALWAYS, - ), - ), - builderless = False, - coverage_test_types = ["unit", "overall"], - tryjob = try_.job( - experiment_percentage = 5, - ), - use_clang_coverage = True, -)
diff --git a/infra/config/subprojects/codesearch/codesearch.star b/infra/config/subprojects/codesearch/codesearch.star index 0c01777..78a939c24 100644 --- a/infra/config/subprojects/codesearch/codesearch.star +++ b/infra/config/subprojects/codesearch/codesearch.star
@@ -39,13 +39,6 @@ try_.defaults.pool.set("luci.chromium.try") try_.defaults.service_account.set("chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com") -try_.defaults.caches.set([ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), -]) - consoles.list_view( name = "tryserver.chromium.codesearch", )
diff --git a/infra/config/subprojects/findit/findit.star b/infra/config/subprojects/findit/findit.star index 14eafbf..6f817f02 100644 --- a/infra/config/subprojects/findit/findit.star +++ b/infra/config/subprojects/findit/findit.star
@@ -46,13 +46,6 @@ defaults.pool.set("luci.chromium.findit") defaults.service_account.set("findit-builder@chops-service-accounts.iam.gserviceaccount.com") -defaults.caches.set([ - swarming.cache( - name = "win_toolchain", - path = "win_toolchain", - ), -]) - # Builders are defined in lexicographic order by name # Same as findit_variable, except now with a specified recipe, as this is no
diff --git a/infra/config/subprojects/webrtc/webrtc.fyi.star b/infra/config/subprojects/webrtc/webrtc.fyi.star index d21e2dc..da35b640 100644 --- a/infra/config/subprojects/webrtc/webrtc.fyi.star +++ b/infra/config/subprojects/webrtc/webrtc.fyi.star
@@ -250,7 +250,6 @@ build_gs_bucket = "chromium-webrtc", ), os = os.MAC_ANY, - reclient_scandeps_server = True, xcode = xcode.x14main, ) @@ -270,7 +269,6 @@ build_gs_bucket = "chromium-webrtc", ), os = os.MAC_ANY, - reclient_scandeps_server = True, ) builder( @@ -375,7 +373,6 @@ build_gs_bucket = "chromium-webrtc", ), os = os.MAC_ANY, - reclient_scandeps_server = True, xcode = xcode.x14main, ) @@ -396,6 +393,5 @@ build_gs_bucket = "chromium-webrtc", ), os = os.MAC_ANY, - reclient_scandeps_server = True, xcode = xcode.x14main, )
diff --git a/infra/config/subprojects/webrtc/webrtc.star b/infra/config/subprojects/webrtc/webrtc.star index 19d8048..f1a78a4 100644 --- a/infra/config/subprojects/webrtc/webrtc.star +++ b/infra/config/subprojects/webrtc/webrtc.star
@@ -155,7 +155,6 @@ build_gs_bucket = "chromium-webrtc", ), os = os.MAC_ANY, - reclient_scandeps_server = True, xcode = xcode.x14main, )
diff --git a/ios/chrome/app/memory_monitor.mm b/ios/chrome/app/memory_monitor.mm index 148418c..5bf4aa1 100644 --- a/ios/chrome/app/memory_monitor.mm +++ b/ios/chrome/app/memory_monitor.mm
@@ -62,13 +62,16 @@ void AsynchronousFreeMemoryMonitor() { UpdateMemoryValues(); base::ThreadPool::PostDelayedTask( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, base::BindOnce(&AsynchronousFreeMemoryMonitor), kMemoryMonitorDelay); } } // namespace void StartFreeMemoryMonitor() { - base::ThreadPool::PostTask( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::BindOnce(&AsynchronousFreeMemoryMonitor)); + base::ThreadPool::PostTask(FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&AsynchronousFreeMemoryMonitor)); }
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 0219a45..bcc2a00 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2502,6 +2502,9 @@ <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION" desc="Footer text shown when the user is trying to add a new credential manually via settings [iOS only]" meaning="Telling user to ensure provided password matches password on the website."> Make sure you're saving your current password for this site. </message> + <message name="IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION" desc="Footer text shown when the user is trying to add or edit a credential manually via settings and the note typed by user is too long. [iOS only]"> + Notes can save up to 1000 characters. + </message> <message name="IDS_IOS_SETTINGS_PASSWORDS_MISSING_TLD_DESCRIPTION" desc="Footer text shown when the website field data misses the top-level domain when creating a new credential via settings [iOS only]" meaning="Suggesting user to add the top-level domain in the website text."> Did you mean <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>? </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..d89fef1f5 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +b0e86532582d24aa56837dbd4012e3dd944fedd6 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb index 31ab980..5fbad79 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">You can now use Chromium any time that you tap links in messages, documents and other apps.</translation> <translation id="7165402419892018581">Choose Chromium for auto-fill</translation> <translation id="7175400662502680481">Your password was exposed in a data breach. Password Manager recommends changing it now.</translation> +<translation id="7192111075364461693">Chromium notifications are currently turned off in your device settings.</translation> <translation id="7208566199746267865">Chromium saves you time by bringing your accounts to the web. You can add or remove accounts in Settings.</translation> <translation id="725427773388857052">Chromium can help keep you safe from data breaches, unsafe websites and more.</translation> <translation id="7255976941681861701">Get to know the new Chromium menu</translation> @@ -132,6 +133,7 @@ • If you turn on sync, metrics may also include info about URLs that you visit.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">This account and any unsaved data will be removed from Chromium.</translation> <translation id="894437814105052438">When you sign out, Chromium won't sync any new data to your Google Account. Data previously synced stays in the account.</translation> +<translation id="8963279154877372067">Allow Chromium notifications to get price drop alerts</translation> <translation id="9022552996538154597">Sign in to Chromium</translation> <translation id="9059693977935746710">You won't need to remember this password. It will be saved to Password Manager for <ph name="EMAIL" /></translation> <translation id="9089354809943900324">Chromium is out of date</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb index bf2b728..09063fd 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">Енді хабарларда, құжаттарда және басқа қолданбаларда сілтемелерді түртіп, Chromium браузерін кез келген уақытта пайдалана аласыз.</translation> <translation id="7165402419892018581">Автотолтыру үшін Chromium браузерін таңдаңыз</translation> <translation id="7175400662502680481">Деректердің қолды болуы салдарынан құпия сөзіңіз жария етілді. Құпия сөздер реттегіші оны дереу өзгертуді ұсынады.</translation> +<translation id="7192111075364461693">Қазіргі уақытта құрылғы параметрлерінде Chromium хабарландырулары өшірілген.</translation> <translation id="7208566199746267865">Chromium браузері аккаунттарыңызды вебке алып келу арқылы уақыт үнемдейді. "Параметрлер" бөлімінде аккаунттарды қосуға немесе жоюға болады.</translation> <translation id="725427773388857052">Chromium деректердің қолды болуынан, қауіпті веб-сайттардан және басқа зиянды нәрселерден қорғайды.</translation> <translation id="7255976941681861701">Жаңа Chromium мәзірімен танысу</translation> @@ -132,6 +133,7 @@ • Егер синхрондауды қоссаңыз, көрсеткіштерде сіз кіретін URL мекенжайлары туралы ақпарат қамтылуы мүмкін.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">Бұл аккаунт және кез келген сақталмаған дерек Chromium браузерінен өшіріледі.</translation> <translation id="894437814105052438">Сіз аккаунттан шыққанда, Chromium жаңа деректерді Google аккаунтыңызбен синхрондамайды. Бұған дейін синхрондалған деректер аккаунтыңызда қалады.</translation> +<translation id="8963279154877372067">Chromium хабарландыруларының бағаның төмендеуі туралы ескертулерді алуына рұқсат ету</translation> <translation id="9022552996538154597">Chromium жүйесіне кіру</translation> <translation id="9059693977935746710">Бұл құпия сөзді есте сақтаудың қажеті жоқ. Ол <ph name="EMAIL" /> аккаунтына арналған Құпия сөздер реттегішіне сақталады.</translation> <translation id="9089354809943900324">Chromium ескірген</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb index cd99fb8..4176548 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">ឥឡូវនេះ អ្នកអាចប្រើ Chromium រាល់ពេលដែលអ្នកចុចលើតំណនៅក្នុងសារ ឯកសារ និងកម្មវិធីផ្សេងទៀត។</translation> <translation id="7165402419892018581">ជ្រើសរើស Chromium សម្រាប់ការបំពេញស្វ័យប្រវត្តិ</translation> <translation id="7175400662502680481">ពាក្យសម្ងាត់របស់អ្នកត្រូវបានបញ្ចេញនៅក្នុងការបែកធ្លាយទិន្នន័យ។ កម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់ណែនាំឱ្យផ្លាស់ប្ដូរពាក្យសម្ងាត់នេះឥឡូវនេះ។</translation> +<translation id="7192111075364461693">បច្ចុប្បន្ន ការជូនដំណឹងនៅលើ Chromium ត្រូវបានបិទនៅក្នុងការកំណត់ឧបករណ៍របស់អ្នក។</translation> <translation id="7208566199746267865">Chromium សន្សំពេលវេលាដោយប្រើគណនីរបស់អ្នកនៅលើបណ្តាញអ៊ីនធឺណិត។ អ្នកអាចបញ្ចូល ឬលុបគណនីនៅក្នុងការកំណត់។</translation> <translation id="725427773388857052">Chromium អាចជួយរក្សាសុវត្ថិភាពរបស់អ្នកពីការបែកធ្លាយទិន្នន័យ គេហទំព័រដែលគ្មានសុវត្ថិភាព និងអ្វីៗជាច្រើនទៀត។</translation> <translation id="7255976941681861701">ស្វែងយល់អំពីម៉ឺនុយ Chromium ថ្មី</translation> @@ -132,6 +133,7 @@ • ប្រសិនបើអ្នកបើកសមកាលកម្ម មេទ្រិកក៏អាចរួមបញ្ចូលព័ត៌មានអំពី URL ដែលអ្នកចូលផងដែរ។<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">គណនីនេះ និងទិន្នន័យដែលមិនបានរក្សាទុកទាំងឡាយនឹងត្រូវបានលុបចេញពី Chromium។</translation> <translation id="894437814105052438">នៅពេលអ្នកចេញពីគណនី Chromium នឹងមិនធ្វើសមកាលកម្មទិន្នន័យថ្មីទៅគណនី Google របស់អ្នកទេ។ ទិន្នន័យដែលបានធ្វើសមកាលកម្មពីមុនបន្តស្ថិតនៅក្នុងគណនី។</translation> +<translation id="8963279154877372067">អនុញ្ញាតការជូនដំណឹងនៅលើ Chromium ដើម្បីទទួលបានការជូនដំណឹងអំពីការធ្លាក់តម្លៃ</translation> <translation id="9022552996538154597">ចូលទៅ Chromium</translation> <translation id="9059693977935746710">អ្នកនឹងមិនចាំបាច់ចងចាំពាក្យសម្ងាត់នេះទេ។ ពាក្យសម្ងាត់នោះនឹងត្រូវបានរក្សាទុកទៅក្នុងកម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់សម្រាប់ <ph name="EMAIL" /></translation> <translation id="9089354809943900324">Chromium ហួសសម័យហើយ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb index 89978ce..61b0ded 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">Dabar galite naudoti „Chromium“ bet kada palietę nuorodas pranešimuose, dokumentuose ir kitose programose.</translation> <translation id="7165402419892018581">„Chromium“ pasirinkimas automatinio pildymo funkcijai</translation> <translation id="7175400662502680481">Jūsų slaptažodis atskleistas įvykus duomenų saugos pažeidimui. Slaptažodžių tvarkytuvė rekomenduoja pakeisti jį dabar.</translation> +<translation id="7192111075364461693">„Chromium“ pranešimai šiuo metu išjungti įrenginio nustatymuose.</translation> <translation id="7208566199746267865">„Chromium“ taupo laiką naudodama paskyras žiniatinklyje. Paskyras galite pridėti arba pašalinti nustatymuose.</translation> <translation id="725427773388857052">„Chromium“ gali padėti apsisaugoti nuo duomenų saugos pažeidimų, nesaugių svetainių ir pan.</translation> <translation id="7255976941681861701">Susipažinkite su nauju „Chromium“ meniu</translation> @@ -132,6 +133,7 @@ • Jei įjungsite sinchronizavimą, į metriką taip pat gali būti įtraukta informacijos apie URL, kuriais lankotės.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">Ši paskyra ir bet kokie neišsaugoti duomenys bus pašalinti iš „Chromium“.</translation> <translation id="894437814105052438">Kai atsijungsite, „Chromium“ nesinchronizuos jokių naujų duomenų su jūsų „Google“ paskyra. Anksčiau sinchronizuoti duomenys lieka paskyroje.</translation> +<translation id="8963279154877372067">Leiskite „Chromium“ pranešimams gauti įspėjimus apie sumažintas kainas</translation> <translation id="9022552996538154597">Prisijungti prie „Chromium“</translation> <translation id="9059693977935746710">Jums nereikia prisiminti šio slaptažodžio. Jis bus išsaugotas Slaptažodžių tvarkytuvėje kaip priskirtas el. pašto adresui <ph name="EMAIL" /></translation> <translation id="9089354809943900324">„Chromium“ versija yra pasenusi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb index 8382da7..a38a6a2 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">Teraz możesz używać Chromium za każdym razem, gdy klikniesz link w wiadomościach, dokumentach i w innych aplikacjach.</translation> <translation id="7165402419892018581">Wybieranie Chromium do autouzupełniania</translation> <translation id="7175400662502680481">Wskutek naruszenia bezpieczeństwa danych doszło do ujawnienia hasła. Menedżer haseł zaleca, aby jak najszybciej je zmienić.</translation> +<translation id="7192111075364461693">Powiadomienia Chromium są aktualnie wyłączone w ustawieniach urządzenia.</translation> <translation id="7208566199746267865">Chromium oszczędza Twój czas, zapisując konta w internecie. Konta możesz dodawać i usuwać w Ustawieniach.</translation> <translation id="725427773388857052">Chromium pomaga chronić Cię przed naruszeniami bezpieczeństwa danych, niebezpiecznymi stronami internetowymi i innymi zagrożeniami.</translation> <translation id="7255976941681861701">Poznaj nowe menu Chromium</translation> @@ -132,6 +133,7 @@ • Jeśli włączysz synchronizację, dane mogą też zawierać informacje o adresach URL, które odwiedzasz.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">To konto razem z wszelkimi niezapisanymi danymi zostanie usunięte z Chromium.</translation> <translation id="894437814105052438">Gdy się wylogujesz, Chromium nie zsynchronizuje żadnych nowych danych z Twoim kontem Google. Dane, które zostały zsynchronizowane wcześniej, pozostaną na koncie.</translation> +<translation id="8963279154877372067">Zezwalaj na powiadomienia Chromium, aby otrzymywać alerty o obniżkach cen</translation> <translation id="9022552996538154597">Zaloguj się w Chromium</translation> <translation id="9059693977935746710">Nie musisz go zapamiętywać. Menedżer haseł zapisze je na koncie <ph name="EMAIL" /></translation> <translation id="9089354809943900324">Chromium jest nieaktualny</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr-Latn.xtb index 4106913..ee9a9ea 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr-Latn.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">Sada možete da koristite Chromium svaki put kada dodirnete linkove u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="7165402419892018581">Odaberite Chromium za automatsko popunjavanje</translation> <translation id="7175400662502680481">Vaša lozinka je otkrivena pri upadu u podatke. Menadžer lozinki preporučuje da je odmah promenite.</translation> +<translation id="7192111075364461693">Chromium obaveštenja su trenutno isključena u podešavanjima uređaja.</translation> <translation id="7208566199746267865">Chromium vam štedi vreme tako što postavlja naloge na veb. Možete da dodajete ili uklanjate naloge u podešavanjima.</translation> <translation id="725427773388857052">Chromium može da vas štiti od upada u podatke, nebezbednih veb-sajtova i drugih stvari.</translation> <translation id="7255976941681861701">Upoznajte novi Chromium meni</translation> @@ -130,6 +131,7 @@ • Ako uključite sinhronizaciju, pokazatelji mogu da obuhvataju informacije o URL-ovima koje posećujete.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">Ovaj nalog i svi nesačuvani podaci ukloniće se iz Chromium-a.</translation> <translation id="894437814105052438">Kada se odjavite, Chromium ne sinhronizuje nikakve nove podatke sa Google nalogom. Prethodno sinhronizovani podaci ostaju na nalogu.</translation> +<translation id="8963279154877372067">Dozvolite Chromium obaveštenja da biste dobijali obaveštenja o sniženjima</translation> <translation id="9022552996538154597">Prijavljivanje na Chromium</translation> <translation id="9059693977935746710">Ne morate da zapamtite ovu lozinku. Čuva se u Menadžeru lozinki za <ph name="EMAIL" /></translation> <translation id="9089354809943900324">Chromium je zastareo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb index 5b41a374..1cf1f47 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">Сада можете да користите Chromium сваки пут када додирнете линкове у порукама, документима и другим апликацијама.</translation> <translation id="7165402419892018581">Одаберите Chromium за аутоматско попуњавање</translation> <translation id="7175400662502680481">Ваша лозинка је откривена при упаду у податке. Менаџер лозинки препоручује да је одмах промените.</translation> +<translation id="7192111075364461693">Chromium обавештења су тренутно искључена у подешавањима уређаја.</translation> <translation id="7208566199746267865">Chromium вам штеди време тако што поставља налоге на веб. Можете да додајете или уклањате налоге у подешавањима.</translation> <translation id="725427773388857052">Chromium може да вас штити од упада у податке, небезбедних веб-сајтова и других ствари.</translation> <translation id="7255976941681861701">Упознајте нови Chromium мени</translation> @@ -130,6 +131,7 @@ • Ако укључите синхронизацију, показатељи могу да обухватају информације о URL-овима које посећујете.<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">Овај налог и сви несачувани подаци уклониће се из Chromium-а.</translation> <translation id="894437814105052438">Када се одјавите, Chromium не синхронизује никакве нове податке са Google налогом. Претходно синхронизовани подаци остају на налогу.</translation> +<translation id="8963279154877372067">Дозволите Chromium обавештења да бисте добијали обавештења о снижењима</translation> <translation id="9022552996538154597">Пријављивање на Chromium</translation> <translation id="9059693977935746710">Не морате да запамтите ову лозинку. Чува се у Менаџеру лозинки за <ph name="EMAIL" /></translation> <translation id="9089354809943900324">Chromium је застарео</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb index 90db4e47..28b88c2 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb
@@ -92,6 +92,7 @@ <translation id="7118091470949186573">اب جب بھی آپ پیغامات، دستاویزات اور دیگر ایپس میں لنکس کو تھپتھپائیں تو آپ Chromium استعمال کرسکتے ہیں۔</translation> <translation id="7165402419892018581">آٹو فل کے لیے Chromium کا انتخاب کریں</translation> <translation id="7175400662502680481">ڈیٹا کی خلاف ورزی میں آپ کا پاس ورڈ افشاء ہو گیا۔ پاس ورڈ مینیجر اسے ابھی تبدیل کرنے کی تجویز کرتا ہے۔</translation> +<translation id="7192111075364461693">Chromium کی اطلاعات فی الحال آپ کے آلے کی ترتیبات میں آف ہیں۔</translation> <translation id="7208566199746267865">Chromium آپ کے اکاؤنٹس کو ویب پر لا کر آپ کا وقت بچاتا ہے۔ آپ ترتیبات میں اکاؤنٹس کو شامل کر سکتے یا ہٹا سکتے ہیں۔</translation> <translation id="725427773388857052">Chromium آپ کو ڈیٹا کی خلاف ورزیوں، غیر محفوظ ویب سائٹس اور بہت کچھ سے محفوظ رکھنے میں مدد کر سکتا ہے۔</translation> <translation id="7255976941681861701">نئے Chromium مینو کو جانیں</translation> @@ -130,6 +131,7 @@ • اگر آپ مطابقت پذیری کو آن کرتے ہیں تو میٹرکس میں ان URLs کے بارے میں معلومات بھی شامل ہو سکتی ہیں جنہیں آپ ملاحظہ کرتے ہیں۔<ph name="END_INDENT" /></translation> <translation id="8776843108004031667">اس اکاؤنٹ اور کسی بھی غیر محفوظ ڈیٹا کو Chromium سے ہٹا دیا جائے گا۔</translation> <translation id="894437814105052438">آپ کے سائن آؤٹ کرنے پر، Chromium کوئی بھی نیا ڈیٹا آپ کے Google اکاؤنٹ کے ساتھ سِنک نہیں کرے گا۔ پہلے کا سِنک کردہ ڈیٹا اکاؤنٹ میں باقی رہے گا۔</translation> +<translation id="8963279154877372067">قیمت میں کمی کے الرٹس موصول کرنے کے لیے Chromium کی اطلاعات کو اجازت دیں</translation> <translation id="9022552996538154597">Chromium میں سائن ان کریں</translation> <translation id="9059693977935746710">آپ کو یہ پاس ورڈ یاد رکھنے کی ضرورت نہیں ہوگی۔ اسے پاس ورڈ مینیجر میں <ph name="EMAIL" /> کے لیے محفوظ کیا جائے گا</translation> <translation id="9089354809943900324">Chromium پرانا ہے</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb index 6bc8cab..031994d3 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">To sign out of your Google Account on all websites, <ph name="BEGIN_LINK" />sign out of Chrome<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome couldn't check for updates. Try again later.</translation> <translation id="2732745070297234559">Chrome couldn't check all passwords. Try again tomorrow.</translation> +<translation id="2736805085127235148">Chrome notifications are currently turned off in your device settings.</translation> <translation id="2767464022270041271">No saved passwords. Google Password Manager can check your passwords when you save them.</translation> <translation id="2869959624320573933">Sign In to Chrome</translation> <translation id="2957447865124070833">Select <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome is up to date</translation> <translation id="7939179037291298976">From your iPhone's settings, open 'Password options' and select 'Chrome'</translation> <translation id="8022947259858476807">Use Chrome by default to open links, search from widgets and auto-fill passwords in other apps</translation> +<translation id="804638182476029347">Allow Chrome notifications to get price drop alerts</translation> <translation id="81358522153858150">Chrome now supports user policies for your managed account</translation> <translation id="8160472928944011082">Chrome can't update</translation> <translation id="8357607116237445042">Choose whether to clear your Chrome data from this device or keep it</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb index 30cd737..2e57186 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">Барлық веб-сайтта Google аккаунтынан шығу үшін <ph name="BEGIN_LINK" />Chrome-нан шығыңыз<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome жаңа нұсқалардың бар-жоғын тексере алмады. Кейінірек қайталап көріңіз.</translation> <translation id="2732745070297234559">Chrome барлық құпия сөзді тексере алмады. Ертең қайталап көріңіз.</translation> +<translation id="2736805085127235148">Қазіргі уақытта құрылғы параметрлерінде Chrome хабарландырулары өшірілген.</translation> <translation id="2767464022270041271">Ешқандай құпия сөз сақталмаған. Google Құпия сөз менеджері құпия сөздерді сақтаған кезде оларды тексере алады.</translation> <translation id="2869959624320573933">Chrome-ға кіріңіз</translation> <translation id="2957447865124070833"><ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /> браузерін таңдаңыз.</translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome жаңартылған</translation> <translation id="7939179037291298976">iPhone параметрлерінен "Құпия сөз опциялары" бөлімін ашып, "Chrome" параметрін таңдаңыз</translation> <translation id="8022947259858476807">Сілтемелерді ашу, виджеттерден іздеу және басқа қолданбаларда құпия сөздерді автотолтыру үшін Chrome браузерін әдепкісінше пайдаланыңыз.</translation> +<translation id="804638182476029347">Chrome хабарландыруларының бағаның төмендеуі туралы ескертулерді алуына рұқсат ету</translation> <translation id="81358522153858150">Chrome енді басқарылатын аккаунттар үшін пайдаланушы саясаттарына қолдау көрсетеді</translation> <translation id="8160472928944011082">Chrome жаңартылмайды.</translation> <translation id="8357607116237445042">Chrome деректері осы құрылғыдан өшірілсін бе әлде сақталсын ба?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb index 2b6d59d6..c097bd15 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">ដើម្បីចេញពីគណនី Google របស់អ្នកនៅលើគ្រប់គេហទំព័រ សូម<ph name="BEGIN_LINK" />ចេញពី Chrome<ph name="END_LINK" />។</translation> <translation id="2695886661449553974">Chrome មិនអាចពិនិត្យរកកំណែថ្មីបានទេ។ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។</translation> <translation id="2732745070297234559">Chrome មិនអាចពិនិត្យពាក្យសម្ងាត់ទាំងអស់បានទេ។ សូមព្យាយាមម្ដងទៀតនៅថ្ងៃស្អែក។</translation> +<translation id="2736805085127235148">បច្ចុប្បន្ន ការជូនដំណឹងនៅលើ Chrome ត្រូវបានបិទនៅក្នុងការកំណត់ឧបករណ៍របស់អ្នក។</translation> <translation id="2767464022270041271">មិនមានពាក្យសម្ងាត់ដែលបានរក្សាទុកទេ។ កម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់អាចពិនិត្យមើលពាក្យសម្ងាត់របស់អ្នក នៅពេលអ្នករក្សាទុកពាក្យសម្ងាត់ទាំងនោះ។</translation> <translation id="2869959624320573933">ចូល Chrome</translation> <translation id="2957447865124070833">ជ្រើសរើស <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome នេះជាកំណែថ្មីហើយ</translation> <translation id="7939179037291298976">ពីការកំណត់ iPhone របស់អ្នក សូមបើក "ជម្រើសពាក្យសម្ងាត់" រួចជ្រើសរើស "Chrome"</translation> <translation id="8022947259858476807">ប្រើ Chrome តាមលំនាំដើម ដើម្បីបើកតំណ ស្វែងរកពីធាតុក្រាហ្វិក និងបំពេញពាក្យសម្ងាត់ដោយស្វ័យប្រវត្តិនៅក្នុងកម្មវិធីផ្សេងទៀត</translation> +<translation id="804638182476029347">អនុញ្ញាតការជូនដំណឹងនៅលើ Chrome ដើម្បីទទួលបានការជូនដំណឹងអំពីការធ្លាក់តម្លៃ</translation> <translation id="81358522153858150">ឥឡូវនេះ Chrome អាចដំណើរការគោលការណ៍អ្នកប្រើប្រាស់សម្រាប់គណនីរបស់អ្នកដែលស្ថិតក្រោមការគ្រប់គ្រងបានហើយ</translation> <translation id="8160472928944011082">Chrome មិនអាចដំឡើងកំណែបានទេ</translation> <translation id="8357607116237445042">ជ្រើសរើសថាតើត្រូវសម្អាតទិន្នន័យ Chrome របស់អ្នកពីឧបករណ៍នេះ ឬរក្សាទុកវា</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb index 2881af5..f02c312 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">Jei norite atsijungti nuo „Google“ paskyros visose svetainėse, <ph name="BEGIN_LINK" />atsijunkite nuo „Chrome“<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">„Chrome“ nepavyko patikrinti, ar yra naujinių. Bandykite dar kartą vėliau.</translation> <translation id="2732745070297234559">„Chrome“ nepavyko patikrinti visų slaptažodžių. Rytoj bandykite dar kartą.</translation> +<translation id="2736805085127235148">„Chrome“ pranešimai šiuo metu išjungti įrenginio nustatymuose.</translation> <translation id="2767464022270041271">Nėra išsaugotų slaptažodžių. „Google“ slaptažodžių tvarkyklė gali tikrinti slaptažodžius, kai juos išsaugote.</translation> <translation id="2869959624320573933">Prisijunkite prie „Chrome“</translation> <translation id="2957447865124070833">Pasirinkite <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">„Google Chrome“ yra naujausios versijos</translation> <translation id="7939179037291298976">„iPhone“ nustatymuose atidarykite „Slaptažodžio parinktys“ ir pasirinkite „Chrome“</translation> <translation id="8022947259858476807">Naudokite „Chrome“ pagal numatytuosius nustatymus, kad atidarytumėte nuorodas, ieškotumėte iš valdiklių ir automatiškai pildytumėte slaptažodžius kitose programose</translation> +<translation id="804638182476029347">Leiskite „Chrome“ pranešimams gauti įspėjimus apie sumažintas kainas</translation> <translation id="81358522153858150">Dabar „Chrome“ palaiko valdomos paskyros naudotojo politiką</translation> <translation id="8160472928944011082">Nepavyko atnaujinti „Chrome“</translation> <translation id="8357607116237445042">Pasirinkite, ar norite išvalyti „Chrome“ duomenis iš šio įrenginio ar juos palikti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb index 17e1e90..97b682e 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">Aby wylogować się z konta Google na wszystkich stronach, <ph name="BEGIN_LINK" />wyloguj się z Chrome<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome nie udało się sprawdzić dostępności aktualizacji. Spróbuj ponownie później.</translation> <translation id="2732745070297234559">Przeglądarce Chrome nie udało się sprawdzić wszystkich haseł. Spróbuj ponownie jutro.</translation> +<translation id="2736805085127235148">Powiadomienia Chrome są aktualnie wyłączone w ustawieniach urządzenia.</translation> <translation id="2767464022270041271">Brak zapisanych haseł. Menedżer haseł Google może sprawdzać Twoje hasła, gdy je zapiszesz.</translation> <translation id="2869959624320573933">Zaloguj się w Chrome</translation> <translation id="2957447865124070833">Wybierz <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Masz aktualną wersję Google Chrome</translation> <translation id="7939179037291298976">W ustawieniach iPhone'a otwórz „Hasła” i wybierz „Chrome”</translation> <translation id="8022947259858476807">Używaj domyślnie Chrome, aby otwierać linki, wyszukiwać z widżetów i korzystać z autouzupełniania haseł w innych aplikacjach</translation> +<translation id="804638182476029347">Zezwalaj na powiadomienia Chrome, aby otrzymywać alerty o obniżkach cen</translation> <translation id="81358522153858150">Chrome obsługuje teraz zasady dotyczące użytkowników na koncie zarządzanym</translation> <translation id="8160472928944011082">Nie udało się zaktualizować Chrome</translation> <translation id="8357607116237445042">Zdecyduj, czy chcesz usunąć swoje dane z Chrome z tego urządzenia czy je na nim zachować</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr-Latn.xtb index bd96852..a023de29 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr-Latn.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">Da biste se odjavili sa Google naloga na svim veb-sajtovima, <ph name="BEGIN_LINK" />odjavite se iz Chrome-a<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome ne može da traži ažuriranja. Probajte ponovo kasnije.</translation> <translation id="2732745070297234559">Chrome nije uspeo da proveri sve lozinke. Probajte ponovo sutra.</translation> +<translation id="2736805085127235148">Chrome obaveštenja su trenutno isključena u podešavanjima uređaja.</translation> <translation id="2767464022270041271">Nema sačuvanih lozinki. Google menadžer lozinki može da vam proverava lozinke kada ih sačuvate.</translation> <translation id="2869959624320573933">Prijavite se u Chrome</translation> <translation id="2957447865124070833">Izaberite <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome je aktuelan</translation> <translation id="7939179037291298976">U podešavanjima iPhone-a otvorite „Password Options“ (Opcije za lozinke) i izaberite „Chrome“</translation> <translation id="8022947259858476807">Podrazumevano koristite Chrome da biste otvarali linkove, pretraživali iz vidžeta i automatski popunjavali lozinke u drugim aplikacijama</translation> +<translation id="804638182476029347">Dozvolite Chrome obaveštenja da biste dobijali obaveštenja o sniženjima</translation> <translation id="81358522153858150">Chrome sada podržava smernice za korisnika za upravljani nalog</translation> <translation id="8160472928944011082">Chrome ne može da se ažurira</translation> <translation id="8357607116237445042">Odaberite da li ćete obrisati Chrome podatke sa ovog uređaja ili ih zadržati</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb index 8960216..362f0633 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">Да бисте се одјавили са Google налога на свим веб-сајтовима, <ph name="BEGIN_LINK" />одјавите се из Chrome-а<ph name="END_LINK" />.</translation> <translation id="2695886661449553974">Chrome не може да тражи ажурирања. Пробајте поново касније.</translation> <translation id="2732745070297234559">Chrome није успео да провери све лозинке. Пробајте поново сутра.</translation> +<translation id="2736805085127235148">Chrome обавештења су тренутно искључена у подешавањима уређаја.</translation> <translation id="2767464022270041271">Нема сачуваних лозинки. Google менаџер лозинки може да вам проверава лозинке када их сачувате.</translation> <translation id="2869959624320573933">Пријавите се у Chrome</translation> <translation id="2957447865124070833">Изаберите <ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /></translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome је актуелан</translation> <translation id="7939179037291298976">У подешавањима iPhone-а отворите „Password Options“ (Опције за лозинке) и изаберите „Chrome“</translation> <translation id="8022947259858476807">Подразумевано користите Chrome да бисте отварали линкове, претраживали из виџета и аутоматски попуњавали лозинке у другим апликацијама</translation> +<translation id="804638182476029347">Дозволите Chrome обавештења да бисте добијали обавештења о снижењима</translation> <translation id="81358522153858150">Chrome сада подржава смернице за корисника за управљани налог</translation> <translation id="8160472928944011082">Chrome не може да се ажурира</translation> <translation id="8357607116237445042">Одаберите да ли ћете обрисати Chrome податке са овог уређаја или их задржати</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb index 88af62b..9ca0d74 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb
@@ -31,6 +31,7 @@ <translation id="2689064829982324496">سبھی ویب سائٹس پر اپنے Google اکاؤنٹ سے سائن آؤٹ کرنے کے لیے <ph name="BEGIN_LINK" />Chrome سے سائن آؤٹ کریں<ph name="END_LINK" />۔</translation> <translation id="2695886661449553974">Chrome اپ ڈیٹس چیک نہیں کر سکا۔ بعد میں دوبارہ کوشش کریں۔</translation> <translation id="2732745070297234559">Chrome سبھی پاس ورڈز چیک نہیں کر سکا۔ کل دوبارہ کوشش کریں۔</translation> +<translation id="2736805085127235148">Chrome کی اطلاعات فی الحال آپ کے آلے کی ترتیبات میں آف ہیں۔</translation> <translation id="2767464022270041271">کوئی محفوظ کردہ پاس ورڈز نہیں۔ جب آپ اپنے پاس ورڈز کو محفوظ کرتے ہیں تو Google پاس ورڈ مینیجر انہیں چیک کر سکتا ہے۔</translation> <translation id="2869959624320573933">Chrome میں سائن ان کریں</translation> <translation id="2957447865124070833"><ph name="BEGIN_BOLD" />Chrome<ph name="END_BOLD" /> منتخب کریں</translation> @@ -114,6 +115,7 @@ <translation id="7855730255114109580">Google Chrome اپ ٹو ڈیٹ ہے</translation> <translation id="7939179037291298976">اپنے iPhone کی ترتیبات سے، "پاس ورڈ کے اختیارات" کھولیں اور "Chrome" کو منتخب کریں</translation> <translation id="8022947259858476807">لنکس کھولنے، ویجیٹس سے تلاش کرنے اور دیگر ایپس میں پاس ورڈز کو آٹو فل کرنے کیلئے، Chrome کا بطور ڈیفالٹ استعمال کریں</translation> +<translation id="804638182476029347">قیمت میں کمی کے الرٹس موصول کرنے کے لیے Chrome اطلاعات کی اجازت دیں</translation> <translation id="81358522153858150">Chrome اب آپ کے نظم کردہ اکاؤنٹ کے لیے صارف کی پالیسیوں کو سپورٹ کرتا ہے</translation> <translation id="8160472928944011082">Chrome اپ ڈیٹ نہیں کیا جا سکتا</translation> <translation id="8357607116237445042">منتخب کریں کہ آیا اپنے Chrome ڈیٹا کو اس آلے سے صاف کرنا ہے یا اسے رکھنا ہے</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 125db3e7..cd95a31 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -161,6 +161,7 @@ <translation id="21133533946938348">تثبيت علامة التبويب</translation> <translation id="2116625576999540962">تم نقل <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> من العناصر</translation> <translation id="2122754583996902531">تتم إدارة متصفّحك. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">هل تريد تلقِّي تنبيهات عن تغيير الأسعار؟</translation> <translation id="2139867232736819575">البحث عن النص الذي نسخته</translation> <translation id="214201757571129614">تسجيل الدخول…</translation> <translation id="2149973817440762519">تعديل الإشارة</translation> @@ -253,6 +254,7 @@ <translation id="2797029671965852011">عرض السجلّ</translation> <translation id="2800683595868705743">الخروج من أداة تغيير علامات التبويب</translation> <translation id="2815198996063984598">2- انقر على تطبيق المتصفِّح التلقائي.</translation> +<translation id="2822917246944009066">تم تثبيت علامة التبويب.</translation> <translation id="2830972654601096923">إدارة العناوين...</translation> <translation id="2834399722155632105">3. انقر على Password Options (خيارات كلمات المرور).</translation> <translation id="2834956026595107950"><ph name="TITLE" />، <ph name="STATE" />، <ph name="URL" /></translation> @@ -903,6 +905,7 @@ <translation id="7431991332293347422">التحكُّم في كيفية استخدامنا لسِجل التصفُّح لتخصيص البحث والمزيد</translation> <translation id="7435356471928173109">أوقَف المشرف وضع "التصفُّح الآمن".</translation> <translation id="7438481509621345350">ستظهر لك قصص من <ph name="CHANNEL_NAME" /> عند فتح علامة تبويب جديدة</translation> +<translation id="7446583256109515732">تمت إزالة تثبيت علامة التبويب.</translation> <translation id="7454057999980797137">الولاية/المقاطعة</translation> <translation id="7459628154744868585">"الحماية المحسَّنة" مفعَّلة</translation> <translation id="746684838091935575">3- اختَر Chrome.</translation> @@ -1134,6 +1137,7 @@ <translation id="9148126808321036104">تسجيل الدخول مرة أخرى</translation> <translation id="9157836665414082580">إيقاف مربعات الحوار</translation> <translation id="9162432979321511934">فعِّل AutoFill Passwords (الملء التلقائي لكلمات المرور).</translation> +<translation id="9165320910061267720">لتلقِّي تنبيهات بشأن انخفاض الأسعار، عليك تفعيل الإشعارات من إعدادات iOS.</translation> <translation id="9177438225260810839">البحث في علامات التبويب المفتوحة</translation> <translation id="9188680907066685419">تسجيل الخروج من الحساب المُدار</translation> <translation id="9193147658040604536">اسحب علامة التبويب هنا لتثبيتها.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 1ea58f6..86bf550 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Замацаваць укладку</translation> <translation id="2116625576999540962">Перамешчана элементаў: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="2122754583996902531">Ваш браўзер знаходзіцца пад кіраваннем. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Уключыць абвесткі аб зніжэнні цэн?</translation> <translation id="2139867232736819575">Пошук скапіраванага тэксту</translation> <translation id="214201757571129614">Увайсці…</translation> <translation id="2149973817440762519">Рэдагаваць закладку</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Паказаць гісторыю</translation> <translation id="2800683595868705743">Выйсці з пераключальніка ўкладак</translation> <translation id="2815198996063984598">2. Націсніце "Стандартны браўзер".</translation> +<translation id="2822917246944009066">Укладка замацавана</translation> <translation id="2830972654601096923">Кіраваць адрасамі...</translation> <translation id="2834399722155632105">3. Націсніце Password Options ("Налады пароляў").</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Мікрафон</translation> <translation id="3240426699337459095">Спасылка скапіравана</translation> <translation id="3244271242291266297">ММ</translation> +<translation id="3245744387817103524">Не ўдалося захаваць змяненне.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> з <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Адкрытыя ўкладкі</translation> <translation id="3272527697863656322">Скасаваць</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> хв</translation> <translation id="3448016392200048164">Раздзелены кадр</translation> <translation id="345565170154308620">Кіраваць паролямі...</translation> +<translation id="3464194322481586217">Не ўдалося адсачыць цану.</translation> <translation id="3469166899695866866">Спыніць спампоўку?</translation> <translation id="3470502288861289375">Ідзе капіраванне...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{для {COUNT} сайта або праграмы}one{для {COUNT} сайта або праграмы}few{для {COUNT} сайтаў або праграм}many{для {COUNT} сайтаў або праграм}other{для {COUNT} сайта або праграмы}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">Сайты могуць выкарыстоўваць файлы cookie для паляпшэння сваёй функцыянальнасці: напрыклад, для захавання інфармацыі пра тое, што вы ўвайшлі ва ўліковы запіс, або каб запамінаць тавары ў кошыку. Сайты не могуць выкарыстоўваць файлы cookie для адсочвання вашых дзеянняў у браўзеры на розных сайтах, напрыклад, каб персаналізаваць рэкламу.</translation> +<translation id="6476253015009698798">Адсочванне цэн на гэтай старонцы недаступнае.</translation> <translation id="6476800141292307438">Старонка перакладаецца на мову "<ph name="LANGUAGE" />". Параметры знаходзяцца ў ніжняй частцы экрана.</translation> <translation id="648164694371393720">Памылка аўтэнтыфікацыі</translation> <translation id="6482629121755362506">Выдалена элементаў: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">Паштовы індэкс</translation> <translation id="6781260999953472352">Уключыць сінхранізацыю?</translation> <translation id="6785453220513215166">Адпраўка справаздачы аб збоях...</translation> +<translation id="6790502149545262384">Неўзабаве пры адкрыцці новай укладкі вы будзеце бачыць гісторыі з сайта "<ph name="CHANNEL_NAME" />".</translation> <translation id="6797885426782475225">Галасавы пошук</translation> <translation id="6801927553864092214">Для прагляду вэб-старонак у прыватным рэжыме адкрыйце ўкладку інкогніта</translation> <translation id="6807889908376551050">Паказаць усе...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">Кіраванне тым, як ваша гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку і ў іншых мэтах</translation> <translation id="7435356471928173109">Выключаны адміністратарам</translation> <translation id="7438481509621345350">Цяпер пры адкрыцці новай укладкі вы будзеце бачыць змесціва з сайта "<ph name="CHANNEL_NAME" />".</translation> +<translation id="7446583256109515732">Укладка адмацавана</translation> <translation id="7454057999980797137">Штат/акруга</translation> <translation id="7459628154744868585">Палепшаная абарона ўключана</translation> <translation id="746684838091935575">3. Выберыце Chrome.</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Сэрвісы Google</translation> <translation id="9148126808321036104">Увайсці зноў</translation> <translation id="9157836665414082580">Не паказваць дыялогі</translation> +<translation id="9162432979321511934">Уключыце аўтазапаўненне пароляў</translation> +<translation id="9165320910061267720">Каб атрымліваць абвесткі аб зніжэнні цэн, уключыце апавяшчэнні ў наладах iOS.</translation> <translation id="9177438225260810839">Пошук у адкрытых укладках</translation> <translation id="9188680907066685419">Выйсці з уліковага запісу пад кіраваннем</translation> <translation id="9193147658040604536">Каб замацаваць укладку, перацягніце яе сюды</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index b6dd98b5..d6d43351 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Фиксиране на раздела</translation> <translation id="2116625576999540962">Преместихте <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> елемента</translation> <translation id="2122754583996902531">Браузърът ви е управляван. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Да се включат ли известията за цени?</translation> <translation id="2139867232736819575">Търсене на копирания текст</translation> <translation id="214201757571129614">Вход…</translation> <translation id="2149973817440762519">Редактиране на отметката</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Показване на историята</translation> <translation id="2800683595868705743">Излизане от превключвателя на раздели</translation> <translation id="2815198996063984598">2. Докоснете „Стандартно прилож. за браузър“.</translation> +<translation id="2822917246944009066">Разделът е фиксиран</translation> <translation id="2830972654601096923">Управление на адресите...</translation> <translation id="2834399722155632105">3. Докоснете „Опции за паролите“.</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето и др.</translation> <translation id="7435356471928173109">Изключено от администратора ви</translation> <translation id="7438481509621345350">Когато отворите нов раздел, вече ще виждате материали от <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">Разделът е освободен</translation> <translation id="7454057999980797137">Щат/държава</translation> <translation id="7459628154744868585">Режимът за подобрена защита е включен</translation> <translation id="746684838091935575">3. Изберете Chrome.</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Влезте отново</translation> <translation id="9157836665414082580">Диалогови прозорци: Блокиране</translation> <translation id="9162432979321511934">Включете AutoFill Passwords</translation> +<translation id="9165320910061267720">За да получавате известия за сигнали за понижение на цената, трябва да включите известията от настройките на iOS.</translation> <translation id="9177438225260810839">Търсене в отворените раздели</translation> <translation id="9188680907066685419">Излизане от управляван профил</translation> <translation id="9193147658040604536">Плъзнете тук за фиксиране на раздела</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 7c5c537..f156f82 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Potvrdite svoj identitet da uvijek možete pristupati sinhroniziranim podacima</translation> <translation id="1870148520156231997">Otkrij lozinku</translation> <translation id="1872096359983322073">Svjetiljka</translation> +<translation id="1886370402958071554">Izbriši adresu</translation> <translation id="1891796056033961979">Vaše sačuvane oznake, lozinke, postavke i druge stvari su sada dostupne s ovog ekrana.</translation> <translation id="1894023287452300670">Pratite cijenu ovdje</translation> <translation id="1911619930368729126">Otpremi na Google disk</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Traži detaljnije</translation> <translation id="2273327106802955778">Meni Više</translation> <translation id="2286505070150039482">Istaknuti tekst</translation> +<translation id="2287614783861766820">{count,plural, =1{Adresa će se izbrisati s uređaja.}one{Adrese će se izbrisati s uređaja.}few{Adrese će se izbrisati s uređaja.}other{Adrese će se izbrisati s uređaja.}}</translation> <translation id="2299218006564889602">Lozinke se šifriraju na uređaju prije nego što se pohrane u Googleov Upravitelj lozinki.</translation> <translation id="2302742851632557585">Promijenite lozinku na web lokaciji</translation> <translation id="2316709634732130529">Koristi predloženu lozinku</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Vaše sačuvane oznake, lozinke, postavke i druge stvari su sada ovdje</translation> <translation id="4334428914252001502">Jedan nepročitani članak.</translation> <translation id="4338650699862464074">Googleu šalje URL-ove stranica koje ste posjetili.</translation> +<translation id="4342054591427973606">{count,plural, =1{Adresa će se izbrisati s ovog uređaja i drugih uređaja na kojima ste prijavljeni.}one{Adrese će se izbrisati s ovog uređaja i drugih uređaja na kojima ste prijavljeni.}few{Adrese će se izbrisati s ovog uređaja i drugih uređaja na kojima ste prijavljeni.}other{Adrese će se izbrisati s ovog uređaja i drugih uređaja na kojima ste prijavljeni.}}</translation> <translation id="4343046787186034850">Pristup kameri i mikrofonu je dozvoljen</translation> <translation id="4359125752503270327">Ova stranica će se otvoriti u drugoj aplikaciji.</translation> <translation id="4375040482473363939">Pretraživanje putem QR koda</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Prijavite se pomoću upravljanog računa</translation> <translation id="5234764350956374838">Odbaci</translation> <translation id="5245322853195994030">Otkaži sinhronizaciju</translation> +<translation id="5271265092610673171">{count,plural, =1{Obavezno polje je prazno. Popunite ga prije pohranjivanja.}one{Neka obavezna polja su prazna. Popunite ih prije pohranjivanja.}few{Neka obavezna polja su prazna. Popunite ih prije pohranjivanja.}other{Neka obavezna polja su prazna. Popunite ih prije pohranjivanja.}}</translation> <translation id="5271549068863921519">Sačuvaj lozinku</translation> <translation id="5295239312320826323">Ukloniti račun <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Prikaži</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 999139e..0db5489 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Fixa la pestanya</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elements desplaçats</translation> <translation id="2122754583996902531">El navegador està gestionat. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Vols activar les alertes de preus?</translation> <translation id="2139867232736819575">Cerca el text que has copiat</translation> <translation id="214201757571129614">Inicia la sessió…</translation> <translation id="2149973817440762519">Edita l'adreça d'interès</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Mostra l'historial</translation> <translation id="2800683595868705743">Surt del selector de pestanyes</translation> <translation id="2815198996063984598">2. Toca Aplicació de navegador predeterminada.</translation> +<translation id="2822917246944009066">S'ha fixat la pestanya</translation> <translation id="2830972654601096923">Gestiona les adreces...</translation> <translation id="2834399722155632105">3. Toca Opcions de contrasenya</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Micròfon</translation> <translation id="3240426699337459095">S'ha copiat l'enllaç.</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">No s'ha pogut desar el canvi.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> de <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Pestanyes obertes</translation> <translation id="3272527697863656322">Cancel·la</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Visualització dividida</translation> <translation id="345565170154308620">Gestiona les contrasenyes...</translation> +<translation id="3464194322481586217">No s'ha pogut fer el seguiment del preu.</translation> <translation id="3469166899695866866">Vols aturar la baixada?</translation> <translation id="3470502288861289375">S'està copiant...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{per a {COUNT} lloc web o aplicació}other{per a {COUNT} llocs web i aplicacions}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">Els llocs web poden fer servir galetes per millorar la teva experiència de navegació, per exemple, per mantenir la teva sessió iniciada o per recordar els elements que tens al carretó electrònic. Els llocs web no poden fer servir galetes per veure la teva activitat de navegació en diferents llocs web, per exemple, per personalitzar els anuncis.</translation> +<translation id="6476253015009698798">El seguiment de preus no està disponible per a aquesta pàgina.</translation> <translation id="6476800141292307438">La pàgina s'està traduint a <ph name="LANGUAGE" />. Tens opcions disponibles a la part inferior de la pantalla.</translation> <translation id="648164694371393720">Error d’autenticació</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elements suprimits</translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">Codi postal</translation> <translation id="6781260999953472352">Vols activar la sincronització?</translation> <translation id="6785453220513215166">S'està enviant l'informe d'error...</translation> +<translation id="6790502149545262384">Aviat, quan obris una pestanya nova, veuràs històries de: <ph name="CHANNEL_NAME" />.</translation> <translation id="6797885426782475225">Cerca per veu</translation> <translation id="6801927553864092214">Per navegar de manera privada, obre una pestanya d'incògnit</translation> <translation id="6807889908376551050">Mostra-ho tot...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca i més</translation> <translation id="7435356471928173109">Desactivada per l'administrador</translation> <translation id="7438481509621345350">Quan obris una pestanya nova, ara veuràs històries de: <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">S'ha deixat de fixar la pestanya</translation> <translation id="7454057999980797137">Província</translation> <translation id="7459628154744868585">La protecció millorada està activada</translation> <translation id="746684838091935575">3. Selecciona Chrome.</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Serveis de Google</translation> <translation id="9148126808321036104">Torna a iniciar la sessió</translation> <translation id="9157836665414082580">Suprimeix quadres de diàleg</translation> +<translation id="9162432979321511934">Activa l'opció Emplena automàticament les contrasenyes</translation> +<translation id="9165320910061267720">Per rebre notificacions d'alertes de baixada de preu, cal que activis les notificacions a la configuració d'iOS.</translation> <translation id="9177438225260810839">Cerca a les pestanyes obertes</translation> <translation id="9188680907066685419">Tanqueu la sessió del compte gestionat</translation> <translation id="9193147658040604536">Arrossega la pestanya fins aquí per fixar-la</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 29f684d..9cdc315 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Choose folder</translation> <translation id="1254424942107648268">Find Previous</translation> <translation id="1258491128795710625">What’s new</translation> +<translation id="1264156759663453185">The selected text is too large for partial translation.</translation> <translation id="1265739287306757398">Learn How</translation> <translation id="1272079795634619415">Stop</translation> <translation id="1275718070701477396">Selected</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Nickname</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> selected</translation> <translation id="1715515772563243997">If you trust <ph name="SITE" />, you can use a saved password to sign in.</translation> +<translation id="173842016780303328">Partial translation failed.</translation> <translation id="1740468249224277719">Double tap to install.</translation> <translation id="1752547299766512813">Save Passwords</translation> <translation id="1753905327828125965">Most Visited</translation> @@ -226,7 +228,6 @@ <translation id="2648803196158606475">Delete Read</translation> <translation id="2653659639078652383">Submit</translation> <translation id="2664621323652615289">Stop</translation> -<translation id="2667896873740639878">This address is saved in your Google Account(<ph name="USER_EMAIL" />). You can use this address across Google products on any device.</translation> <translation id="2671426118752779020">You can use the passwords that you saved to Google Password Manager in other apps on your iPhone.</translation> <translation id="2690858294534178585">Camera is in use</translation> <translation id="26915454213703967">Search inside image with Google</translation> @@ -244,6 +245,7 @@ <translation id="2747003861858887689">Previous field</translation> <translation id="2749231692441336879">Following <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">just now</translation> +<translation id="2768727608073497433">The selected text is empty.</translation> <translation id="2773292004659987824">Incognito Search</translation> <translation id="277771892408211951">Select language</translation> <translation id="2780046210906776326">No Email Accounts</translation> @@ -672,7 +674,6 @@ <translation id="5860033963881614850">Off</translation> <translation id="5869029295770560994">OK, got it</translation> <translation id="5871497086027727873">1 item moved</translation> -<translation id="5881445640183527870">{count,plural, =1{This address will be deleted from your Google Account(<ph name="USER_EMAIL" />) and from this device.}other{These addresses will be deleted from your Google Account(<ph name="USER_EMAIL" />) and from this device.}}</translation> <translation id="5896576662943111387">Built for iOS</translation> <translation id="5897956970858271241">Visit copied link</translation> <translation id="5899314093904173337">To share with people nearby, let them scan this QR code with their camera or QR scanner app</translation> @@ -706,6 +707,7 @@ <translation id="6066301408025741299">Tap to cancel.</translation> <translation id="6071409777669089905">Unpin tab</translation> <translation id="6084848228346514841">Select tabs</translation> +<translation id="6100617279104942061">Signed in as <ph name="USER_EMAIL" />. Opens settings.</translation> <translation id="6103540626693881831">On-device encryption</translation> <translation id="6119050551270742952">Current web page is on Incognito</translation> <translation id="6122191549521593678">Online</translation> @@ -1135,6 +1137,7 @@ <translation id="9098541895599151034">Delete <ph name="NUMBER_OF_ACCOUNTS" /> passwords?</translation> <translation id="9100610230175265781">Passphrase required</translation> <translation id="9107664647686727385">Check for compromised passwords</translation> +<translation id="9120217828624527905">Switch to full-page translation</translation> <translation id="9124387962554796433">Google may use your history to personalise Search and other Google services.</translation> <translation id="9137526406337347448">Google Services</translation> <translation id="9148126808321036104">Sign in again</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 c575511..f4eaa0dc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Fijar pestaña</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementos movidos</translation> <translation id="2122754583996902531">Tu navegador está administrado. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">¿Quieres activar las alertas de precios?</translation> <translation id="2139867232736819575">Buscar el texto copiado</translation> <translation id="214201757571129614">Acceder…</translation> <translation id="2149973817440762519">Editar marcador</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Mostrar Historial</translation> <translation id="2800683595868705743">Salir del alternador de pestañas</translation> <translation id="2815198996063984598">2. Presiona la app de navegador predeterminada.</translation> +<translation id="2822917246944009066">Se fijó la pestaña.</translation> <translation id="2830972654601096923">Administrar direcciones…</translation> <translation id="2834399722155632105">3. Presiona Opciones de contraseña</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Controla cómo se usa tu historial de navegación para personalizar la Búsqueda y mucho más</translation> <translation id="7435356471928173109">El administrador desactivó la función</translation> <translation id="7438481509621345350">Ahora, cuando abras una nueva pestaña, verás historias de <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">Se dejó de fijar la pestaña.</translation> <translation id="7454057999980797137">Estado/condado</translation> <translation id="7459628154744868585">Se activó la Protección mejorada</translation> <translation id="746684838091935575">3. Selecciona Chrome.</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Accede nuevamente</translation> <translation id="9157836665414082580">Suprimir diálogos</translation> <translation id="9162432979321511934">Activa la función Autocompletar contraseñas.</translation> +<translation id="9165320910061267720">Para recibir notificaciones sobre alertas de descuentos, debes activarlas en la configuración de iOS.</translation> <translation id="9177438225260810839">Buscar pestañas abiertas</translation> <translation id="9188680907066685419">Salir de la cuenta administrada</translation> <translation id="9193147658040604536">Arrastra la pestaña aquí para fijarla</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 99a034a..f8edc6f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Fijar pestaña</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementos eliminados</translation> <translation id="2122754583996902531">Tu navegador está administrado. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">¿Activar las alertas de precios?</translation> <translation id="2139867232736819575">Buscar el texto que has copiado</translation> <translation id="214201757571129614">Iniciar sesión…</translation> <translation id="2149973817440762519">Editar marcador</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Mostrar historial</translation> <translation id="2800683595868705743">Salir de la función de cambio de pestaña</translation> <translation id="2815198996063984598">2. Toca Aplicación de navegador predeterminada.</translation> +<translation id="2822917246944009066">Pestaña fijada</translation> <translation id="2830972654601096923">Gestionar tus direcciones...</translation> <translation id="2834399722155632105">3. Toca Opciones de las contraseñas</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" /> (<ph name="URL" />)</translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Controla cómo se usa el historial de navegación para personalizar la Búsqueda y más</translation> <translation id="7435356471928173109">Desactivada por tu administrador</translation> <translation id="7438481509621345350">Ahora verás contenido de <ph name="CHANNEL_NAME" /> cuando abras una pestaña nueva.</translation> +<translation id="7446583256109515732">Pestaña no fijada</translation> <translation id="7454057999980797137">Región</translation> <translation id="7459628154744868585">La protección mejorada está activada</translation> <translation id="746684838091935575">3. Selecciona Chrome.</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Volver a iniciar sesión</translation> <translation id="9157836665414082580">Quitar cuadros de diálogo</translation> <translation id="9162432979321511934">Activa Autocompletar contraseñas</translation> +<translation id="9165320910061267720">Para recibir notificaciones de alertas por bajada de precio, deberás activarlas en los ajustes de iOS.</translation> <translation id="9177438225260810839">Buscar en las pestañas abiertas</translation> <translation id="9188680907066685419">Cierra sesión en la cuenta gestionada</translation> <translation id="9193147658040604536">Arrastra aquí para fijar la pestaña</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 4dd328f1..62cf0e6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Ainguratu fitxa</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementu mugitu dira</translation> <translation id="2122754583996902531">Arakatzailea kudeatuta dago. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Prezioen alertak aktibatu nahi dituzu?</translation> <translation id="2139867232736819575">Bilatu kopiatu duzun testua</translation> <translation id="214201757571129614">Hasi saioa…</translation> <translation id="2149973817440762519">Editatu laster-marka</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Erakutsi historia</translation> <translation id="2800683595868705743">Irten fitxa-aldatzailetik</translation> <translation id="2815198996063984598">2. Sakatu Arakatzaile lehenetsia</translation> +<translation id="2822917246944009066">Ainguratu da fitxa</translation> <translation id="2830972654601096923">Kudeatu helbideak…</translation> <translation id="2834399722155632105">3. Sakatu Password Options (pasahitzen aukerak).</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Mikrofonoa</translation> <translation id="3240426699337459095">Esteka kopiatu da</translation> <translation id="3244271242291266297">HH</translation> +<translation id="3245744387817103524">Ezin izan da gorde aldaketa.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" /> (<ph name="INDEX" />/<ph name="NUM_SUGGESTIONS" />)</translation> <translation id="3268451620468152448">Ireki fitxak</translation> <translation id="3272527697863656322">Utzi</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Ikuspegi zatitua</translation> <translation id="345565170154308620">Kudeatu pasahitzak…</translation> +<translation id="3464194322481586217">Ezin izan da egin prezioaren jarraipena.</translation> <translation id="3469166899695866866">Deskarga eten nahi duzu?</translation> <translation id="3470502288861289375">Kopiatzen…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} webgune edo aplikaziorako}other{{COUNT} webgune edo aplikaziotarako}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">Webguneek cookieak erabil ditzakete arakatze-zerbitzua hobetzeko; adibidez, saioa hasita mantentzeko edo erosketa-saskiko produktuak gogoratzeko. Webguneek ezin dituzte erabili cookieak beste webguneetan egiten dituzun arakatze-jarduerak ikusteko, hala nola iragarkiak pertsonalizatzeko.</translation> +<translation id="6476253015009698798">Ezin da egin orri honetako produktuen prezioen jarraipena.</translation> <translation id="6476800141292307438">Orria itzultzen ari gara. <ph name="LANGUAGE" /> erabiliko da orria bistaratzeko. Pantailaren behealdean agertzen dira dauden aukerak.</translation> <translation id="648164694371393720">Autentifikazio-errorea</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementu ezabatu dira</translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">Posta-kodea</translation> <translation id="6781260999953472352">Sinkronizazioa aktibatu nahi duzu?</translation> <translation id="6785453220513215166">Hutsegite-txostena bidaltzen…</translation> +<translation id="6790502149545262384">Laster, <ph name="CHANNEL_NAME" /> webguneko istorioak ikusiko dituzu fitxa berri bat irekitzean.</translation> <translation id="6797885426782475225">Ahozko bilaketa</translation> <translation id="6801927553864092214">Sarea modu pribatuan arakatzeko, ireki ezkutuko moduko fitxa bat</translation> <translation id="6807889908376551050">Erakutsi guztiak…</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">Kontrolatu arakatze-historia nola erabiltzen den Bilaketa eta beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="7435356471928173109">Administratzaileak desaktibatu du</translation> <translation id="7438481509621345350">Aurrerantzean, <ph name="CHANNEL_NAME" /> webguneko istorioak ikusiko dituzu fitxa berri bat irekitzean.</translation> +<translation id="7446583256109515732">Kendu zaio aingura fitxari</translation> <translation id="7454057999980797137">Probintzia</translation> <translation id="7459628154744868585">Babes hobetua aktibatuta dago</translation> <translation id="746684838091935575">3. Hautatu Chrome</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Google-ren zerbitzuak</translation> <translation id="9148126808321036104">Hasi saioa berriro</translation> <translation id="9157836665414082580">Ezkutatu leihoak</translation> +<translation id="9162432979321511934">Aktibatu pasahitzen betetze automatikoa</translation> +<translation id="9165320910061267720">Prezio-jaitsierei buruzko alerten jakinarazpenak jasotzeko, iOS-eko ezarpenetan jakinarazpenak aktibatu beharko dituzu.</translation> <translation id="9177438225260810839">Bilatu fitxa irekietan</translation> <translation id="9188680907066685419">Amaitu saioa kontu kudeatuan</translation> <translation id="9193147658040604536">Fitxa ainguratzeko, arrasta ezazu hona</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index d4dcc8c..6fcd58b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -318,6 +318,7 @@ <translation id="3227137524299004712">Mikrofoni</translation> <translation id="3240426699337459095">Linkki kopioitu</translation> <translation id="3244271242291266297">KK</translation> +<translation id="3245744387817103524">Muutosta ei voitu tallentaa.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" />/<ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Avoimet välilehdet</translation> <translation id="3272527697863656322">Peru</translation> @@ -340,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Jaettu näkymä</translation> <translation id="345565170154308620">Salasanavalinnat…</translation> +<translation id="3464194322481586217">Hintaa ei voitu seurata.</translation> <translation id="3469166899695866866">Pysäytetäänkö lataus?</translation> <translation id="3470502288861289375">Kopioidaan…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} sivustolta tai sovelluksesta}other{{COUNT} sivustolta tai sovelluksesta}}</translation> @@ -768,6 +770,7 @@ <translation id="6464397691496239022">Sivustot voivat käyttää evästeitä selauskokemuksesi parantamiseen, esimerkiksi pitää sinut kirjautuneena tai muistaa ostoskorisi sisällön. Sivustot eivät näe selaustoimintaasi eri sivustoilla evästeiden kautta esim. personoidakseen mainoksia.</translation> +<translation id="6476253015009698798">Hintaseuranta ei ole käytettävissä tällä sivulla.</translation> <translation id="6476800141292307438">Käännetään sivua kielelle <ph name="LANGUAGE" />. Vaihtoehdot näkyvät näytön alareunan lähellä.</translation> <translation id="648164694371393720">Todennusvirhe</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> kohdetta poistettu</translation> @@ -819,6 +822,7 @@ <translation id="6780034285637185932">Postinumero</translation> <translation id="6781260999953472352">Laitetaanko synkronointi päälle?</translation> <translation id="6785453220513215166">Lähetetään virheraporttia…</translation> +<translation id="6790502149545262384">Näet pian tarinoita täältä avatessasi uuden välilehden: <ph name="CHANNEL_NAME" />.</translation> <translation id="6797885426782475225">Puhehaku</translation> <translation id="6801927553864092214">Voit selata verkkoa yksityisesti avaamalla incognito-välilehden.</translation> <translation id="6807889908376551050">Näytä kaikki...</translation> @@ -1129,6 +1133,7 @@ <translation id="9137526406337347448">Googlen palvelut</translation> <translation id="9148126808321036104">Kirjaudu sisään uudelleen</translation> <translation id="9157836665414082580">Estä valintaikkunat</translation> +<translation id="9162432979321511934">Laita Täytä salasanat automaattisesti päälle.</translation> <translation id="9165320910061267720">Jos haluat saada ilmoituksia hinnan laskusta, sinun on laitettava ilmoitukset päälle iOS-asetuksista.</translation> <translation id="9177438225260810839">Hae avoimilta välilehdiltä</translation> <translation id="9188680907066685419">Kirjaudu ulos hallinnoidulta tililtä</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index d288c79..6ee0e60 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -318,6 +318,7 @@ <translation id="3227137524299004712">Micro</translation> <translation id="3240426699337459095">Le lien a bien été copié.</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Impossible d'enregistrer votre modification.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> sur <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Onglets ouverts</translation> <translation id="3272527697863656322">Annuler</translation> @@ -340,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Vue fractionnée</translation> <translation id="345565170154308620">Gérer les mots de passe…</translation> +<translation id="3464194322481586217">Impossible de suivre le prix.</translation> <translation id="3469166899695866866">Arrêter le téléchargement ?</translation> <translation id="3470502288861289375">Copie en cours…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{pour {COUNT} site ou appli}one{pour {COUNT} site ou appli}other{pour {COUNT} sites ou applis}}</translation> @@ -768,6 +770,7 @@ <translation id="6464397691496239022">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation (par exemple, pour maintenir votre connexion ou mémoriser les articles de votre panier). En revanche, ils ne peuvent pas en utiliser pour voir votre activité de navigation sur l'ensemble des différents sites (par exemple, pour personnaliser les annonces).</translation> +<translation id="6476253015009698798">Le suivi des prix n'est pas disponible pour cette page.</translation> <translation id="6476800141292307438">Traduction de la page en <ph name="LANGUAGE" />. Options disponibles au bas de l'écran.</translation> <translation id="648164694371393720">Erreur d'authentification</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> éléments supprimés.</translation> @@ -819,6 +822,7 @@ <translation id="6780034285637185932">Code postal</translation> <translation id="6781260999953472352">Activer la synchronisation ?</translation> <translation id="6785453220513215166">Envoi du rapport d'erreur en cours…</translation> +<translation id="6790502149545262384">Vous verrez bientôt les stories de <ph name="CHANNEL_NAME" /> quand vous ouvrirez un onglet.</translation> <translation id="6797885426782475225">Recherche vocale</translation> <translation id="6801927553864092214">Pour parcourir le Web en mode privé, ouvrez un onglet de navigation privée</translation> <translation id="6807889908376551050">Tout afficher…</translation> @@ -1130,6 +1134,7 @@ <translation id="9137526406337347448">Google Services</translation> <translation id="9148126808321036104">Nouvelle connexion</translation> <translation id="9157836665414082580">Supprimer les boîtes de dialogue</translation> +<translation id="9162432979321511934">Activez "Préremplir les mots de passe"</translation> <translation id="9165320910061267720">Pour recevoir des alertes en cas de baisse de prix, vous devez activer les notifications dans les paramètres iOS.</translation> <translation id="9177438225260810839">Rechercher dans les onglets ouverts</translation> <translation id="9188680907066685419">Se déconnecter d'un compte géré</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index d926fd3..a24aaed 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -318,6 +318,7 @@ <translation id="3227137524299004712">Micrófono</translation> <translation id="3240426699337459095">Copiouse a ligazón</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Non se puido gardar o cambio.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> de <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Pestanas abertas</translation> <translation id="3272527697863656322">Cancelar</translation> @@ -340,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Vista dividida</translation> <translation id="345565170154308620">Xestionar contrasinais…</translation> +<translation id="3464194322481586217">Non se puido facer un seguimento do prezo.</translation> <translation id="3469166899695866866">Queres deter a descarga?</translation> <translation id="3470502288861289375">Copiando...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{de {COUNT} sitio ou aplicación}other{de {COUNT} sitios ou aplicacións}}</translation> @@ -768,6 +770,7 @@ <translation id="6464397691496239022">Os sitios poden utilizar cookies para mellorar a túa experiencia de navegación a través de funcións como manter a sesión iniciada ou lembrar artigos da túa cesta da compra. Non poden utilizalas para ver a túa actividade de navegación en distintos sitios (por exemplo, co fin de personalizar anuncios).</translation> +<translation id="6476253015009698798">O seguimento de prezos non está dispoñible para esta páxina.</translation> <translation id="6476800141292307438">Traducindo a páxina ao <ph name="LANGUAGE" />. Hai opcións dispoñibles na parte inferior da pantalla.</translation> <translation id="648164694371393720">Produciuse un erro de autenticación</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementos eliminados</translation> @@ -819,6 +822,7 @@ <translation id="6780034285637185932">Código postal</translation> <translation id="6781260999953472352">Queres activar a sincronización?</translation> <translation id="6785453220513215166">Enviando informe de erros...</translation> +<translation id="6790502149545262384">Dentro de pouco verás as historias de <ph name="CHANNEL_NAME" /> cando abras unha pestana nova.</translation> <translation id="6797885426782475225">Busca por voz</translation> <translation id="6801927553864092214">Para navegar de forma privada, abre unha pestana do modo de incógnito</translation> <translation id="6807889908376551050">Mostrar todas...</translation> @@ -1129,6 +1133,7 @@ <translation id="9137526406337347448">Servizos de Google</translation> <translation id="9148126808321036104">Iniciar sesión de novo</translation> <translation id="9157836665414082580">Suprimir cadros de diálogos</translation> +<translation id="9162432979321511934">Activa a opción Autofill Passwords (Autocompletar contrasinais)</translation> <translation id="9165320910061267720">Para recibir notificacións de alertas sobre baixadas de prezos, tes que activalas na configuración de iOS.</translation> <translation id="9177438225260810839">Realiza buscas nas pestanas abertas</translation> <translation id="9188680907066685419">Pechar sesión na conta xestionada</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 85ec209..839f726 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">ટૅબ પિન કરો</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> આઇટમ ખસેડી</translation> <translation id="2122754583996902531">તમારું બ્રાઉઝર મેનેજ કરવામાં આવી રહ્યું છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">'કિંમતમાં ફેરફાર'ની સુવિધા ચાલુ કરીએ?</translation> <translation id="2139867232736819575">તમે કૉપિ કરેલી ટેક્સ્ટ માટે શોધ કરો</translation> <translation id="214201757571129614">સાઇન ઇન કરો…</translation> <translation id="2149973817440762519">બુકમાર્કમાં ફેરફાર કરો</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">ઇતિહાસ બતાવો</translation> <translation id="2800683595868705743">ટેબ સ્વિચર છોડી દો</translation> <translation id="2815198996063984598">2. ડિફૉલ્ટ બ્રાઉઝર ઍપ પર ટૅપ કરો</translation> +<translation id="2822917246944009066">ટૅબ પિન કર્યું</translation> <translation id="2830972654601096923">સરનામા મેનેજ કરો…</translation> <translation id="2834399722155632105">3. પાસવર્ડના વિકલ્પો પર ટૅપ કરો</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">માઇક્રોફોન</translation> <translation id="3240426699337459095">લિંક કૉપિ કરી</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">તમારો ફેરફાર સાચવી શકાયો નથી.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="NUM_SUGGESTIONS" /> માનું <ph name="INDEX" /></translation> <translation id="3268451620468152448">ઓપન ટેબ્સ</translation> <translation id="3272527697863656322">રદ કરો</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> મિનિટ</translation> <translation id="3448016392200048164">વિભાજિત દૃશ્ય</translation> <translation id="345565170154308620">પાસવર્ડ મેનેજ કરો…</translation> +<translation id="3464194322481586217">કિંમત ટ્રૅક કરી શક્યા નથી.</translation> <translation id="3469166899695866866">ડાઉનલોડ રોકીએ?</translation> <translation id="3470502288861289375">કૉપિ કરી રહ્યું છે...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} સાઇટ અથવા ઍપ માટે}one{{COUNT} સાઇટ અથવા ઍપ માટે}other{{COUNT} સાઇટ અથવા ઍપ માટે}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">સાઇટ તમને વધુ સારો બ્રાઉઝિંગ અનુભવ આપવા, ઉદાહરણ તરીકે, તમને સાઇન ઇન કરીને રાખવા અથવા તમારા શૉપિંગ કાર્ટની આઇટમ યાદ રાખવા માટે, કુકીનો ઉપયોગ કરી શકે છે. વિભિન્ન સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિ જોવા માટે, સાઇટ તમારી કુકીનો ઉપયોગ કરી શકતી નથી, ઉદાહરણ તરીકે, મનગમતી જાહેરાતો બનાવવા માટે.</translation> +<translation id="6476253015009698798">આ પેજ માટે કિંમત ટ્રૅક કરવાની સુવિધા ઉપલબ્ધ નથી.</translation> <translation id="6476800141292307438">પેજનો અનુવાદ <ph name="LANGUAGE" />માં કરી રહ્યા છે. વિકલ્પો સ્ક્રીનની નીચેની બાજુએ ઉપલબ્ધ રહે છે.</translation> <translation id="648164694371393720">પ્રમાણીકરણ ભૂલ</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> આઇટમ કાઢી નાખી</translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">પિન કોડ</translation> <translation id="6781260999953472352">સિંક કરવાનું ચાલુ કરીએ?</translation> <translation id="6785453220513215166">ક્રૅશ રિપોર્ટ મોકલી રહ્યું છે...</translation> +<translation id="6790502149545262384">ટૂંક સમયમાં, જ્યારે તમે નવું ટૅબ ખોલશો ત્યારે તમને <ph name="CHANNEL_NAME" /> પરથી સ્ટોરી દેખાશે.</translation> <translation id="6797885426782475225">વૉઇસ શોધ</translation> <translation id="6801927553864092214">ખાનગી રૂપે બ્રાઉઝ કરવા છૂપી ટૅબ ખોલો</translation> <translation id="6807889908376551050">બધું બતાવો...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">શોધ અને અન્ય બાબતોને તમને મનગમતી બનાવવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરવાની રીત નિયંત્રિત કરો</translation> <translation id="7435356471928173109">તમારા વ્યવસ્થાપક દ્વારા આ સુવિધા બંધ કરવામાં આવી છે</translation> <translation id="7438481509621345350">જ્યારે તમે કોઈ નવી ટૅબ ખોલશો, ત્યારે તમને <ph name="CHANNEL_NAME" /> પરથી હવે સ્ટોરી દેખાશે.</translation> +<translation id="7446583256109515732">ટૅબ અનપિન કર્યું</translation> <translation id="7454057999980797137">રાજ્ય / કાઉન્ટી</translation> <translation id="7459628154744868585">વધારેલું સંરક્ષણ ચાલુ છે</translation> <translation id="746684838091935575">3. Chrome પસંદ કરો</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Google સેવાઓ</translation> <translation id="9148126808321036104">ફરીથી સાઇન ઇન કરો </translation> <translation id="9157836665414082580">સંવાદો નાબૂદ કરો</translation> +<translation id="9162432979321511934">ઑટોમૅટિક રીતે પાસવર્ડ ભરવાની સુવિધા ચાલુ કરો</translation> +<translation id="9165320910061267720">કિંમતમાં ઘટાડાના અલર્ટના નોટિફિકેશન મેળવવા માટે, તમારે તમારા iOSના સેટિંગમાં નોટિફિકેશન ચાલુ કરવા પડશે.</translation> <translation id="9177438225260810839">ખુલ્લી ટૅબ શોધો</translation> <translation id="9188680907066685419">મેનેજ થયેલા એકાઉન્ટમાંથી સાઇન આઉટ કરો</translation> <translation id="9193147658040604536">ટૅબ પિન કરવા માટે અહીં ખેંચો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 83cb4ba..835e9fd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Da biste uvijek mogli pristupati svojim podacima za sinkronizaciju, potvrdite da ste to vi</translation> <translation id="1870148520156231997">Otkrijte zaporku</translation> <translation id="1872096359983322073">Svjetlo</translation> +<translation id="1886370402958071554">Brisanje adrese</translation> <translation id="1891796056033961979">Na tom su zaslonu dostupne spremljene oznake, zaporke, postavke i još mnogo toga.</translation> <translation id="1894023287452300670">Prati cijenu ovdje</translation> <translation id="1911619930368729126">Prenesi na Google disk</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Pročišćavanje</translation> <translation id="2273327106802955778">Izbornik Više</translation> <translation id="2286505070150039482">Istaknuti tekst</translation> +<translation id="2287614783861766820">{count,plural, =1{Ta će se adresa izbrisati s ovog uređaja.}one{Te će se adrese izbrisati s ovog uređaja.}few{Te će se adrese izbrisati s ovog uređaja.}other{Te će se adrese izbrisati s ovog uređaja.}}</translation> <translation id="2299218006564889602">Vaše se zaporke šifriraju na uređaju prije spremanja na Google upravitelj zaporki.</translation> <translation id="2302742851632557585">Promijenite zaporku na web-lokaciji</translation> <translation id="2316709634732130529">Upotrijebite predloženu zaporku</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Vaše spremljene oznake, zaporke, postavke i još mnogo toga sada su ovdje</translation> <translation id="4334428914252001502">Jedan nepročitani članak.</translation> <translation id="4338650699862464074">Šalje Googleu URL-ove stranica koje posjećujete.</translation> +<translation id="4342054591427973606">{count,plural, =1{Ta će se adresa izbrisati s ovog i ostalih uređaja na kojima ste prijavljeni.}one{Te će se adrese izbrisati s ovog i ostalih uređaja na kojima ste prijavljeni.}few{Te će se adrese izbrisati s ovog i ostalih uređaja na kojima ste prijavljeni.}other{Te će se adrese izbrisati s ovog i ostalih uređaja na kojima ste prijavljeni.}}</translation> <translation id="4343046787186034850">Dopušten je pristup kameri i mikrofonu</translation> <translation id="4359125752503270327">Stranica će se otvoriti u nekoj drugoj aplikaciji.</translation> <translation id="4375040482473363939">Pretraživanje QR kodova</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Prijavite se upravljanim računom</translation> <translation id="5234764350956374838">Odbaci</translation> <translation id="5245322853195994030">Otkaži sinkronizaciju</translation> +<translation id="5271265092610673171">{count,plural, =1{Obavezno polje je prazno. Ispunite ga prije spremanja.}one{Neka su obavezna polja prazna. Ispunite ih prije spremanja.}few{Neka su obavezna polja prazna. Ispunite ih prije spremanja.}other{Neka su obavezna polja prazna. Ispunite ih prije spremanja.}}</translation> <translation id="5271549068863921519">Spremi zaporku</translation> <translation id="5295239312320826323">Ukloniti račun <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Prikaži</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 7c22907..313182e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -318,6 +318,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3240426699337459095">Tautan disalin</translation> <translation id="3244271242291266297">BB</translation> +<translation id="3245744387817103524">Perubahan Anda tidak dapat disimpan.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> dari <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Tab Terbuka</translation> <translation id="3272527697863656322">Batal</translation> @@ -340,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> menit</translation> <translation id="3448016392200048164">Layar Terpisah</translation> <translation id="345565170154308620">Kelola Sandi...</translation> +<translation id="3464194322481586217">Tidak dapat memantau harga.</translation> <translation id="3469166899695866866">Berhenti Download?</translation> <translation id="3470502288861289375">Menyalin...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{untuk {COUNT} situs atau aplikasi}other{untuk {COUNT} situs dan aplikasi}}</translation> @@ -768,6 +770,7 @@ <translation id="6464397691496239022">Situs dapat menggunakan cookie untuk menyempurnakan pengalaman penjelajahan Anda, misalnya untuk membuat Anda tetap login atau untuk mengingat item di keranjang belanja Anda. Situs tidak dapat menggunakan cookie untuk melihat aktivitas penjelajahan Anda di berbagai situs, misalnya untuk mempersonalisasi iklan.</translation> +<translation id="6476253015009698798">Pemantauan harga tidak tersedia untuk halaman ini.</translation> <translation id="6476800141292307438">Menerjemahkan halaman ke dalam bahasa <ph name="LANGUAGE" />. Opsi tersedia di dekat bagian bawah layar.</translation> <translation id="648164694371393720">Error saat Autentikasi</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> item dihapus</translation> @@ -819,6 +822,7 @@ <translation id="6780034285637185932">Kode Pos</translation> <translation id="6781260999953472352">Aktifkan Sinkronisasi?</translation> <translation id="6785453220513215166">Mengirim laporan kerusakan...</translation> +<translation id="6790502149545262384">Sebentar lagi, Anda akan melihat artikel dari <ph name="CHANNEL_NAME" /> saat membuka tab baru.</translation> <translation id="6797885426782475225">Penelusuran Suara</translation> <translation id="6801927553864092214">Untuk melakukan penjelajahan rahasia, buka tab Samaran</translation> <translation id="6807889908376551050">Tampilkan Semua...</translation> @@ -1129,6 +1133,7 @@ <translation id="9137526406337347448">Layanan Google</translation> <translation id="9148126808321036104">Login sekali lagi</translation> <translation id="9157836665414082580">Sembunyikan Dialog</translation> +<translation id="9162432979321511934">Aktifkan Isi Otomatis Sandi</translation> <translation id="9165320910061267720">Untuk mendapatkan notifikasi diskon, Anda harus mengaktifkan notifikasi di setelan iOS.</translation> <translation id="9177438225260810839">Telusuri Tab yang Terbuka</translation> <translation id="9188680907066685419">Keluar dari akun terkelola</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 366ef77..93b17518 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Festa flipa</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> atriði færð</translation> <translation id="2122754583996902531">Vafranum þínum er stjórnað. <ph name="BEGIN_LINK" />Nánar<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Kveikja á verðtilkynningum?</translation> <translation id="2139867232736819575">Leita að texta sem þú afritaðir</translation> <translation id="214201757571129614">Skrá inn…</translation> <translation id="2149973817440762519">Breyta bókamerki</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Sýna feril</translation> <translation id="2800683595868705743">Fara úr flipavali</translation> <translation id="2815198996063984598">2. Ýttu á „Sjálfgefið vafraforrit“</translation> +<translation id="2822917246944009066">Flipi festur</translation> <translation id="2830972654601096923">Stjórna heimilisföngum ...</translation> <translation id="2834399722155632105">3. Ýttu á „Valkostir fyrir aðgangsorð“</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Hljóðnemi</translation> <translation id="3240426699337459095">Tengill afritaður</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Ekki tókst að vista breytinguna.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> af <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Opna flipa</translation> <translation id="3272527697863656322">Hætta við</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> mín.</translation> <translation id="3448016392200048164">Tvískiptur skjár</translation> <translation id="345565170154308620">Stjórna aðgangsorðum...</translation> +<translation id="3464194322481586217">Ekki tókst að vakta verð.</translation> <translation id="3469166899695866866">Stöðva niðurhal?</translation> <translation id="3470502288861289375">Afritar...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{fyrir {COUNT} vefsvæði eða forrit}one{fyrir {COUNT} vefsvæði eða forrit}other{fyrir {COUNT} vefsvæði eða forrit}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">Vefsvæði geta notað fótspor til að bjóða þér upp á betri vefnotkun, til dæmis að vera áfram skráð(ur) inn eða muna hvað þú setur í innkaupakörfuna. Vefsvæði geta ekki notað fótsporin þín til að sjá vafranotkun þína á vefsvæðum, til dæmis til að sérsníða auglýsingar.</translation> +<translation id="6476253015009698798">Verðvöktun er ekki í boði á þessari síðu.</translation> <translation id="6476800141292307438">Þýðir síðuna á <ph name="LANGUAGE" />. Valkostir eru í boði neðarlega á skjánum.</translation> <translation id="648164694371393720">Auðkenningarvilla</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> atriðum eytt</translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">Póstnúmer</translation> <translation id="6781260999953472352">Kveikja á samstillingu?</translation> <translation id="6785453220513215166">Sendir hrunskýrslu...</translation> +<translation id="6790502149545262384">Fljótlega sérðu fréttir frá <ph name="CHANNEL_NAME" /> þegar þú opnar nýjan flipa.</translation> <translation id="6797885426782475225">Raddleit</translation> <translation id="6801927553864092214">Opnaðu huliðsflipa til að vafra í leyni</translation> <translation id="6807889908376551050">Sýna alla...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">Stjórnaðu því hvernig vefskoðunarferillinn þinn er notaður til að sérsníða leit og fleira</translation> <translation id="7435356471928173109">Kerfisstjórinn slökkti á þessu</translation> <translation id="7438481509621345350">Núna sérðu sögur frá <ph name="CHANNEL_NAME" /> þegar þú opnar nýjan flipa.</translation> +<translation id="7446583256109515732">Flipi losaður</translation> <translation id="7454057999980797137">Ríki/sýsla</translation> <translation id="7459628154744868585">Kveikt er á aukinni vörn</translation> <translation id="746684838091935575">3. Veldu Chrome</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Google þjónustur</translation> <translation id="9148126808321036104">Skrá inn aftur</translation> <translation id="9157836665414082580">Hindra nýja glugga</translation> +<translation id="9162432979321511934">Kveiktu á sjálfvirkri útfyllingu aðgangsorða</translation> +<translation id="9165320910061267720">Til að fá tilkynningar um verðlækkanir þarftu að kveikja á tilkynningum í stillingum iOS.</translation> <translation id="9177438225260810839">Leita í opnum flipum</translation> <translation id="9188680907066685419">Skrá út af stýrðum reikningi</translation> <translation id="9193147658040604536">Dragðu hingað til að festa 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 90a6f69..eafff13 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Per assicurarti di poter accedere ai tuoi dati di sincronizzazione in qualsiasi momento, verifica la tua identità</translation> <translation id="1870148520156231997">Mostra password</translation> <translation id="1872096359983322073">Torcia</translation> +<translation id="1886370402958071554">Elimina indirizzo</translation> <translation id="1891796056033961979">I tuoi preferiti, le password, le impostazioni e altri dati salvati sono disponibili da questa schermata.</translation> <translation id="1894023287452300670">Monitora qui il prezzo</translation> <translation id="1911619930368729126">Carica su Google Drive</translation> @@ -159,6 +160,7 @@ <translation id="21133533946938348">Blocca scheda</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementi spostati</translation> <translation id="2122754583996902531">Il tuo browser è gestito. <ph name="BEGIN_LINK" />Scopri di più<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Vuoi attivare gli avvisi sui prezzi?</translation> <translation id="2139867232736819575">Cerca il testo copiato</translation> <translation id="214201757571129614">Accedi…</translation> <translation id="2149973817440762519">Modifica Preferito</translation> @@ -176,6 +178,7 @@ <translation id="2268044343513325586">Perfeziona</translation> <translation id="2273327106802955778">Menu Altro</translation> <translation id="2286505070150039482">Testo evidenziato</translation> +<translation id="2287614783861766820">{count,plural, =1{Questo indirizzo verrà eliminato da questo dispositivo.}other{Questi indirizzi verranno eliminati da questo dispositivo.}}</translation> <translation id="2299218006564889602">Le tue password vengono criptate sul dispositivo prima di essere salvate in Gestore delle password di Google.</translation> <translation id="2302742851632557585">Cambia password sul sito web</translation> <translation id="2316709634732130529">Utilizza la password suggerita</translation> @@ -251,6 +254,7 @@ <translation id="2797029671965852011">Mostra la cronologia</translation> <translation id="2800683595868705743">Chiudi selettore di schede</translation> <translation id="2815198996063984598">2. Tocca App browser predefinita</translation> +<translation id="2822917246944009066">Scheda bloccata</translation> <translation id="2830972654601096923">Gestisci indirizzi…</translation> <translation id="2834399722155632105">3. Tocca Opzioni password</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +320,7 @@ <translation id="3227137524299004712">Microfono</translation> <translation id="3240426699337459095">Link copiato</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Impossibile salvare la modifica.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> di <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Schede aperte</translation> <translation id="3272527697863656322">Annulla</translation> @@ -338,6 +343,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Visualizzazione divisa</translation> <translation id="345565170154308620">Gestisci password…</translation> +<translation id="3464194322481586217">Impossibile monitorare il prezzo.</translation> <translation id="3469166899695866866">Interrompere il download?</translation> <translation id="3470502288861289375">Copia...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{per {COUNT} sito o app}other{per {COUNT} siti e app}}</translation> @@ -454,6 +460,7 @@ <translation id="4324952538601951430">Ora i tuoi preferiti, le password, le impostazioni e altri dati salvati sono disponibili qui</translation> <translation id="4334428914252001502">1 articolo da leggere.</translation> <translation id="4338650699862464074">Invia a Google gli URL delle pagine che visiti.</translation> +<translation id="4342054591427973606">{count,plural, =1{Questo indirizzo verrà eliminato da questo dispositivo e da altri dispositivi su cui hai eseguito l'accesso.}other{Questi indirizzi verranno eliminati da questo dispositivo e da altri dispositivi su cui hai eseguito l'accesso.}}</translation> <translation id="4343046787186034850">Accesso a fotocamera e microfono consentito</translation> <translation id="4359125752503270327">Questa pagina verrà aperta con un'altra applicazione.</translation> <translation id="4375040482473363939">Ricerca di codici QR</translation> @@ -583,6 +590,7 @@ <translation id="5232485538978018676">Accesso con account gestito</translation> <translation id="5234764350956374838">Ignora</translation> <translation id="5245322853195994030">Annulla sincronizzazione</translation> +<translation id="5271265092610673171">{count,plural, =1{C'è un campo obbligatorio vuoto. Compilalo prima di salvare.}other{Ci sono alcuni campi obbligatori vuoti. Compilali prima di salvare.}}</translation> <translation id="5271549068863921519">Salva password</translation> <translation id="5295239312320826323">Vuoi rimuovere l'account <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Mostra</translation> @@ -766,6 +774,7 @@ <translation id="6464397691496239022">I siti possono utilizzare i cookie per migliorare la tua esperienza di navigazione, ad esempio per mantenere l'accesso o memorizzare gli articoli aggiunti al carrello. I siti non possono utilizzare i cookie per conoscere la tua attività di navigazione su siti diversi, ad esempio per personalizzare gli annunci.</translation> +<translation id="6476253015009698798">Il monitoraggio dei prezzi non è disponibile per questa pagina.</translation> <translation id="6476800141292307438">Traduzione della pagina in <ph name="LANGUAGE" />. Opzioni disponibili nella parte inferiore dello schermo.</translation> <translation id="648164694371393720">Errore di autenticazione</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementi eliminati</translation> @@ -817,6 +826,7 @@ <translation id="6780034285637185932">Codice postale</translation> <translation id="6781260999953472352">Vuoi attivare la sincronizzazione?</translation> <translation id="6785453220513215166">Invio report sugli arresti anomali...</translation> +<translation id="6790502149545262384">A breve vedrai storie di <ph name="CHANNEL_NAME" /> quando aprirai una nuova scheda.</translation> <translation id="6797885426782475225">Ricerca vocale</translation> <translation id="6801927553864092214">Per navigare in privato, apri una scheda di navigazione in incognito</translation> <translation id="6807889908376551050">Mostra tutte...</translation> @@ -896,6 +906,7 @@ <translation id="7431991332293347422">Controlla la modalità di utilizzo della cronologia di navigazione per personalizzare la Ricerca e non solo</translation> <translation id="7435356471928173109">Disattivata dall'amministratore</translation> <translation id="7438481509621345350">Quando aprirai una nuova scheda vedrai le notizie di <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">Scheda sbloccata</translation> <translation id="7454057999980797137">Stato/contea</translation> <translation id="7459628154744868585">La Protezione avanzata è attiva</translation> <translation id="746684838091935575">3. Seleziona Chrome</translation> @@ -1126,6 +1137,8 @@ <translation id="9137526406337347448">Google Services</translation> <translation id="9148126808321036104">Esegui di nuovo l'accesso</translation> <translation id="9157836665414082580">Elimina finestre di dialogo</translation> +<translation id="9162432979321511934">Attiva l'opzione Compila automaticamente le password.</translation> +<translation id="9165320910061267720">Per ricevere notifiche relative agli avvisi sui cali di prezzo, devi attivare le notifiche nelle impostazioni di iOS.</translation> <translation id="9177438225260810839">Cerca nelle schede aperte</translation> <translation id="9188680907066685419">Esci dall'account gestito</translation> <translation id="9193147658040604536">Trascina qui per bloccare 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 0e3b272..5170718 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">כדי לוודא שתמיד תהיה לך גישה לנתונים המסונכרנים שלך, עליך לאמת את זהותך</translation> <translation id="1870148520156231997">הצגת הסיסמה</translation> <translation id="1872096359983322073">פנס</translation> +<translation id="1886370402958071554">מחיקת הכתובת</translation> <translation id="1891796056033961979">הסימניות, הסיסמאות, ההגדרות ונתונים נוספים זמינים במסך הזה.</translation> <translation id="1894023287452300670">כאן ניתן לעקוב אחר המחיר</translation> <translation id="1911619930368729126">העלאה אל Google Drive</translation> @@ -159,6 +160,7 @@ <translation id="21133533946938348">הצמדת כרטיסייה</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> פריטים הועברו</translation> <translation id="2122754583996902531">הדפדפן שלך מנוהל. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">להפעיל התראות על שינוי במחיר?</translation> <translation id="2139867232736819575">חיפוש טקסט שהעתקת</translation> <translation id="214201757571129614">כניסה…</translation> <translation id="2149973817440762519">עריכת סימניות</translation> @@ -176,6 +178,7 @@ <translation id="2268044343513325586">צמצום</translation> <translation id="2273327106802955778">התפריט 'עוד'</translation> <translation id="2286505070150039482">הטקסט המודגש</translation> +<translation id="2287614783861766820">{count,plural, =1{הכתובת הזו תימחק מהמכשיר.}one{הכתובות האלו יימחקו מהמכשיר.}two{הכתובות האלו יימחקו מהמכשיר.}other{הכתובות האלו יימחקו מהמכשיר.}}</translation> <translation id="2299218006564889602">הסיסמאות שלך מוצפנות במכשיר לפני שהן נשמרות במנהל הסיסמאות של Google.</translation> <translation id="2302742851632557585">שינוי הסיסמה באתר</translation> <translation id="2316709634732130529">שימוש בסיסמה המוצעת</translation> @@ -251,6 +254,7 @@ <translation id="2797029671965852011">הצגת ההיסטוריה</translation> <translation id="2800683595868705743">יציאה מ-Tab Switcher</translation> <translation id="2815198996063984598">2. מקישים על אפליקציית הדפדפן שמוגדרת כברירת מחדל</translation> +<translation id="2822917246944009066">הכרטיסייה הוצמדה</translation> <translation id="2830972654601096923">ניהול כתובות...</translation> <translation id="2834399722155632105">3. מקישים על 'אפשרויות של סיסמאות'</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +320,7 @@ <translation id="3227137524299004712">מיקרופון</translation> <translation id="3240426699337459095">הקישור הועתק</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">לא ניתן היה לשמור את השינוי.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> מתוך <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">כרטיסיות פתוחות</translation> <translation id="3272527697863656322">ביטול</translation> @@ -338,6 +343,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> דק'</translation> <translation id="3448016392200048164">תצוגה מפוצלת</translation> <translation id="345565170154308620">ניהול סיסמאות…</translation> +<translation id="3464194322481586217">לא ניתן היה לעקוב אחר המחיר.</translation> <translation id="3469166899695866866">לעצור את ההורדה?</translation> <translation id="3470502288861289375">ההעתקה מתבצעת...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{לאתר אחד או לאפליקציה אחת ({COUNT})}one{ל-{COUNT} אתרים ואפליקציות}two{ל-{COUNT} אתרים ואפליקציות}other{ל-{COUNT} אתרים ואפליקציות}}</translation> @@ -454,6 +460,7 @@ <translation id="4324952538601951430">כאן יופיעו הסימניות, הסיסמאות, ההגדרות ועוד</translation> <translation id="4334428914252001502">מאמר אחד שלא נקרא.</translation> <translation id="4338650699862464074">שליחת כתובות URL של דפים שנכנסת אליהם אל Google.</translation> +<translation id="4342054591427973606">{count,plural, =1{הכתובת הזו תימחק מהמכשיר הזה ומשאר המכשירים שמחוברים לחשבון.}one{הכתובות האלו יימחקו מהמכשיר הזה ומשאר המכשירים שמחוברים לחשבון.}two{הכתובות האלו יימחקו מהמכשיר הזה ומשאר המכשירים שמחוברים לחשבון.}other{הכתובות האלו יימחקו מהמכשיר הזה ומשאר המכשירים שמחוברים לחשבון.}}</translation> <translation id="4343046787186034850">יש הרשאות גישה למצלמה ולמיקרופון</translation> <translation id="4359125752503270327">הדף הזה ייפתח באפליקציה אחרת.</translation> <translation id="4375040482473363939">חיפוש של קוד QR</translation> @@ -583,6 +590,7 @@ <translation id="5232485538978018676">כניסה באמצעות חשבון מנוהל</translation> <translation id="5234764350956374838">סגירה</translation> <translation id="5245322853195994030">ביטול הסנכרון</translation> +<translation id="5271265092610673171">{count,plural, =1{יש שדה חובה ריק. עליך למלא אותו לפני השמירה.}one{יש כמה שדות חובה ריקים. עליך למלא אותם לפני השמירה.}two{יש כמה שדות חובה ריקים. עליך למלא אותם לפני השמירה.}other{יש כמה שדות חובה ריקים. עליך למלא אותם לפני השמירה.}}</translation> <translation id="5271549068863921519">שמירת סיסמה</translation> <translation id="5295239312320826323">האם להסיר את החשבון <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">הצגה</translation> @@ -766,6 +774,7 @@ <translation id="6464397691496239022">אתרים יכולים להשתמש בקובצי cookie כדי לשפר את חוויית הגלישה – למשל כדי למנוע את ניתוקך מהחשבון או כדי לזכור את הפריטים שהוספת לעגלת הקניות. אתרים לא יכולים להשתמש בקובצי cookie כדי לקבל מידע על פעילות הגלישה שלך בין אתרים שונים. למשל לצורך הצגה של מודעות בהתאמה אישית.</translation> +<translation id="6476253015009698798">המעקב אחר מחירים לא זמין בדף הזה.</translation> <translation id="6476800141292307438">מתבצע תרגום של הדף ל<ph name="LANGUAGE" />. האפשרויות מוצגות בחלק התחתון של המסך.</translation> <translation id="648164694371393720">שגיאת אימות</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> פריטים נמחקו</translation> @@ -817,6 +826,7 @@ <translation id="6780034285637185932">מיקוד</translation> <translation id="6781260999953472352">להפעיל את הסנכרון?</translation> <translation id="6785453220513215166">שליחת דוח קריסה מתבצעת...</translation> +<translation id="6790502149545262384">בקרוב יוצגו סטוריז מהאתר <ph name="CHANNEL_NAME" /> בפתיחת כרטיסייה חדשה.</translation> <translation id="6797885426782475225">חיפוש קולי</translation> <translation id="6801927553864092214">כדי לגלוש באופן פרטי יש לפתוח כרטיסיית מצב אנונימי</translation> <translation id="6807889908376551050">הצגת הכול...</translation> @@ -896,6 +906,7 @@ <translation id="7431991332293347422">קביעת אופן השימוש בהיסטוריית הגלישה להתאמה אישית של החיפוש ועוד</translation> <translation id="7435356471928173109">מנהל המערכת כיבה את התכונה הזו</translation> <translation id="7438481509621345350">בפתיחת כרטיסייה חדשה, יוצגו לך סטוריז מהאתר <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">בוטלה ההצמדה של הכרטיסייה</translation> <translation id="7454057999980797137">מדינה / ארץ</translation> <translation id="7459628154744868585">ההגנה המשופרת פועלת</translation> <translation id="746684838091935575">3. בוחרים באפשרות Chrome.</translation> @@ -1126,6 +1137,8 @@ <translation id="9137526406337347448">שירותי Google</translation> <translation id="9148126808321036104">כניסה חוזרת</translation> <translation id="9157836665414082580">הסתרת תיבות דו-שיח</translation> +<translation id="9162432979321511934">מפעילים את האפשרות מילוי אוטומטי של סיסמאות.</translation> +<translation id="9165320910061267720">כדי לקבל התראות על הנחות, צריך להפעיל את ההתראות בהגדרות iOS.</translation> <translation id="9177438225260810839">חיפוש בכרטיסיות הפתוחות</translation> <translation id="9188680907066685419">יציאה מהחשבון המנוהל</translation> <translation id="9193147658040604536">יש לגרור לכאן כדי להצמיד את הכרטיסייה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 7a8aed0..a073e29b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">იმაში დასარწმუნებლად, რომ ყოველთვის შეძლებთ თქვენს სინქრონიზებულ მონაცემებზე წვდომას, დაადასტურეთ, რომ ეს თქვენ ხართ</translation> <translation id="1870148520156231997">პაროლის გამოჩენა</translation> <translation id="1872096359983322073">ჩირაღდანი</translation> +<translation id="1886370402958071554">მისამართის წაშლა</translation> <translation id="1891796056033961979">თქვენი შენახული სანიშნეები, პაროლები, პარამეტრები და სხვა კონტენტი ახლა ხელმისაწვდომია ამ ეკრანიდან.</translation> <translation id="1894023287452300670">აქ შეგიძლიათ თვალი მიადევნოთ ფასს</translation> <translation id="1911619930368729126">ატვირთვა Google Drive-ზე</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">დახვეწა</translation> <translation id="2273327106802955778">ვარიანტების მენიუ</translation> <translation id="2286505070150039482">გამოყოფილი ტექსტი</translation> +<translation id="2287614783861766820">{count,plural, =1{ეს მისამართი წაიშლება ამ მოწყობილობიდან.}other{ეს მისამართები წაიშლება ამ მოწყობილობიდან.}}</translation> <translation id="2299218006564889602">Google-ის პაროლების მმართველში შენახვამდე, თქვენი პაროლები თქვენს მოწყობილობაზე დაიშიფრება.</translation> <translation id="2302742851632557585">პაროლის შეცვლა ვებსაიტზე</translation> <translation id="2316709634732130529">შემოთავაზებული პაროლის გამოყენება</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">თქვენი შენახული სანიშნეები, პაროლები, პარამეტრები და სხვა კონტენტი ახლა აქ არის</translation> <translation id="4334428914252001502">1 წაუკითხავი სტატია.</translation> <translation id="4338650699862464074">Google-ს უგზავნის თქვენ მიერ მონახულებული გვერდების URL-ებს.</translation> +<translation id="4342054591427973606">{count,plural, =1{ეს მისამართი წაიშლება ამ და სხვა მოწყობილობებიდან, რომლებზეც შესული ხართ სისტემაში.}other{ეს მისამართები წაიშლება ამ და სხვა მოწყობილობებიდან, რომლებზეც შესული ხართ სისტემაში.}}</translation> <translation id="4343046787186034850">კამერასა და მიკროფონზე წვდომა დაშვებულია</translation> <translation id="4359125752503270327">ეს გვერდი სხვა აპლიკაციაში გაიხსნება.</translation> <translation id="4375040482473363939">QR კოდების ძიება</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">შედით სისტემაში მართული ანგარიშით</translation> <translation id="5234764350956374838">გაუქმება</translation> <translation id="5245322853195994030">სინქრონიზაციის გაუქმება</translation> +<translation id="5271265092610673171">{count,plural, =1{აუცილებელი ველი ცარიელია. შეავსეთ ის შენახვამდე.}other{ზოგიერთი აუცილებელი ველი ცარიელია. შეავსეთ ისინი შენახვამდე.}}</translation> <translation id="5271549068863921519">პაროლის შენახვა</translation> <translation id="5295239312320826323">გსურთ, ამოშალოთ <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">ჩვენება</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 4e90be6f..a7b97f4e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Қалтаны таңдау</translation> <translation id="1254424942107648268">Алдыңғысын табу</translation> <translation id="1258491128795710625">Жаңалықтар</translation> +<translation id="1264156759663453185">Таңдалған мәтін ішінара аудару үшін тым үлкен.</translation> <translation id="1265739287306757398">Әдісін білу</translation> <translation id="1272079795634619415">Тоқтату</translation> <translation id="1275718070701477396">Таңдалған</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Лақап ат</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> таңдалды</translation> <translation id="1715515772563243997"><ph name="SITE" /> сайты сенімді болса, сақталған құпия сөз арқылы кіре аласыз.</translation> +<translation id="173842016780303328">Ішінара аударма сәтсіз болды.</translation> <translation id="1740468249224277719">Орнату үшін екі рет түртіңіз.</translation> <translation id="1752547299766512813">Құпия сөздерді сақтау</translation> <translation id="1753905327828125965">Ең көп қаралған</translation> @@ -128,6 +130,7 @@ <translation id="1832848789136765277">Синхрондау деректерін әрдайым пайдалана алатыныңызға көз жеткізу үшін, жеке басыңызды растаңыз.</translation> <translation id="1870148520156231997">Құпия сөзді көрсету</translation> <translation id="1872096359983322073">Шам</translation> +<translation id="1886370402958071554">Мекенжайды жою</translation> <translation id="1891796056033961979">Сақталған бетбелгілер, құпия сөздер, параметрлер және басқа да ақпарат осы экранда көрсетіледі.</translation> <translation id="1894023287452300670">Бағаны осы жерден бақылайсыз.</translation> <translation id="1911619930368729126">Google Drive-қа жүктеу</translation> @@ -159,6 +162,7 @@ <translation id="21133533946938348">Қойындыны бекіту</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> элементтің орны ауыстырылды</translation> <translation id="2122754583996902531">Браузеріңіз басқарылады. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Баға туралы хабарландыруларды қосу керек пе?</translation> <translation id="2139867232736819575">Көшірілген мәтінді іздеу</translation> <translation id="214201757571129614">Кіру…</translation> <translation id="2149973817440762519">Бетбелгіні өзгерту</translation> @@ -176,6 +180,7 @@ <translation id="2268044343513325586">Нақтылау</translation> <translation id="2273327106802955778">"Тағы" мәзірі</translation> <translation id="2286505070150039482">Ерекшеленген мәтін</translation> +<translation id="2287614783861766820">{count,plural, =1{Бұл мекенжай осы құрылғыдан жойылады.}other{Бұл мекенжайлар осы құрылғыдан жойылады.}}</translation> <translation id="2299218006564889602">Құрылғыдағы құпия сөздер Google Құпия сөздер реттегішіне сақтамас бұрын шифрланады.</translation> <translation id="2302742851632557585">Құпия сөзді веб-сайтта өзгерту</translation> <translation id="2316709634732130529">Ұсынылған құпия сөзді қолдану</translation> @@ -240,6 +245,7 @@ <translation id="2747003861858887689">Алдыңғы өріс</translation> <translation id="2749231692441336879"><ph name="CHANNEL_NAME" /> арнасына жазылғансыз.</translation> <translation id="2764831210418622012">жаңа ғана</translation> +<translation id="2768727608073497433">Таңдалған мәтін бос.</translation> <translation id="2773292004659987824">Инкогнито режимінде іздеу</translation> <translation id="277771892408211951">Тілді таңдау</translation> <translation id="2780046210906776326">Электрондық пошта аккаунттары жоқ</translation> @@ -251,6 +257,7 @@ <translation id="2797029671965852011">Тарихты көрсету</translation> <translation id="2800683595868705743">Tab Switcher көрінісінен шығу</translation> <translation id="2815198996063984598">2. "Әдепкі браузер қолданбасы" түймесін түртіңіз.</translation> +<translation id="2822917246944009066">Қойынды бекітілген</translation> <translation id="2830972654601096923">Мекенжайларды басқару...</translation> <translation id="2834399722155632105">3. "Құпия сөз опциялары" түймесін түртіңіз.</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +323,7 @@ <translation id="3227137524299004712">Микрофон</translation> <translation id="3240426699337459095">Сілтеме көшірілді</translation> <translation id="3244271242291266297">АА</translation> +<translation id="3245744387817103524">Өзгерісіңіз сақталмады.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="NUM_SUGGESTIONS" /> ішінен <ph name="INDEX" /></translation> <translation id="3268451620468152448">Ашық қойындылар</translation> <translation id="3272527697863656322">Жабу</translation> @@ -338,6 +346,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> минут</translation> <translation id="3448016392200048164">Қатар ашу</translation> <translation id="345565170154308620">Құпия сөздерді басқару...</translation> +<translation id="3464194322481586217">Бағаны бақылау мүмкін болмады.</translation> <translation id="3469166899695866866">Жүктеп алу процесін тоқтату керек пе?</translation> <translation id="3470502288861289375">Көшіруде…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} сайтқа немесе қолданбаға арналған}other{{COUNT} сайтқа немесе қолданбаға арналған}}</translation> @@ -454,6 +463,7 @@ <translation id="4324952538601951430">Сақталған бетбелгілер, құпия сөздер, параметрлер және басқа да ақпарат енді осы жерде көрсетіледі.</translation> <translation id="4334428914252001502">1 мақала оқылмаған.</translation> <translation id="4338650699862464074">Кірген беттердің URL мекенжайларын Google-ға жібереді.</translation> +<translation id="4342054591427973606">{count,plural, =1{Бұл мекенжай осы және аккаунтқа кірген басқа құрылғыларыңыздан жойылады.}other{Бұл мекенжайлар осы және аккаунтқа кірген басқа құрылғыларыңыздан жойылады.}}</translation> <translation id="4343046787186034850">Камера мен микрофонды пайдалану рұқсаты бар.</translation> <translation id="4359125752503270327">Бұл бет басқа қолданбада ашылады.</translation> <translation id="4375040482473363939">QR кодын іздеу</translation> @@ -583,6 +593,7 @@ <translation id="5232485538978018676">Қызметтік аккаунтқа кіру</translation> <translation id="5234764350956374838">Жабу</translation> <translation id="5245322853195994030">Синхрондаудан бас тарту</translation> +<translation id="5271265092610673171">{count,plural, =1{Міндетті өріс бос. Оны сақтау алдында толтырыңыз.}other{Кейбір міндетті өрістер бос. Оларды сақтау алдында толтырыңыз.}}</translation> <translation id="5271549068863921519">Құпия сөзді сақтау</translation> <translation id="5295239312320826323"><ph name="USER_EMAIL" /> аккаунты жойылсын ба?</translation> <translation id="5300589172476337783">Көрсету</translation> @@ -696,6 +707,7 @@ <translation id="6066301408025741299">Болдырмау үшін түртіңіз.</translation> <translation id="6071409777669089905">Қойындыны босату</translation> <translation id="6084848228346514841">Қойындыларды таңдау</translation> +<translation id="6100617279104942061"><ph name="USER_EMAIL" /> аккаунтымен кірдіңіз. Параметрлерді ашады.</translation> <translation id="6103540626693881831">Құрылғыда шифрлау</translation> <translation id="6119050551270742952">Ағымдағы веб-бет инкогнито режимінде</translation> <translation id="6122191549521593678">Онлайн</translation> @@ -766,6 +778,7 @@ <translation id="6464397691496239022">Сайттар шолуды жақсарту (мысалы, аккаунттан шығармау не сатып алу себетіңіздегі нәрселерді есте сақтау) үшін cookie файлдарын пайдалана алады. Сайттар түрлі сайттардағы браузерді қолдану мәліметін көру үшін (мысалы, жарнамаларды жекелендіру мақсатында) cookie файлдарын пайдалана алмайды.</translation> +<translation id="6476253015009698798">Бұл бетте бағаларды бақылау функциясы жоқ.</translation> <translation id="6476800141292307438">Бет <ph name="LANGUAGE" /> тіліне аударылуда. Опцияларды беттің төменгі жағынан таба аласыз.</translation> <translation id="648164694371393720">Аутентификация қатесі</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> элемент жойылды</translation> @@ -817,6 +830,7 @@ <translation id="6780034285637185932">Пошта индексі</translation> <translation id="6781260999953472352">Синхрондауды қосу керек пе?</translation> <translation id="6785453220513215166">Қате туралы хабарландыру…</translation> +<translation id="6790502149545262384">Жаңа қойындыны ашқан кезде, <ph name="CHANNEL_NAME" /> сайтының жаңалықтарын көре аласыз.</translation> <translation id="6797885426782475225">Дауыспен іздеу</translation> <translation id="6801927553864092214">Интернетті құпия пайдалану үшін инкогнито қойындысын ашыңыз.</translation> <translation id="6807889908376551050">Барлығын көрсету…</translation> @@ -896,6 +910,7 @@ <translation id="7431991332293347422">Search және т.б. қызметтерді жекелендіру үшін шолу тарихын қалай пайдалану керектігін көрсетіңіз</translation> <translation id="7435356471928173109">Әкімші өшіріп қойған.</translation> <translation id="7438481509621345350">Жаңа қойындыны ашқан кезде, <ph name="CHANNEL_NAME" /> жаңалықтарын көресіз.</translation> +<translation id="7446583256109515732">Қойынды босатылған</translation> <translation id="7454057999980797137">Мемлекет / округ</translation> <translation id="7459628154744868585">Күшейтілген қорғаныс қосулы</translation> <translation id="746684838091935575">3. Chrome браузерін таңдаңыз.</translation> @@ -1122,10 +1137,13 @@ <translation id="9098541895599151034"><ph name="NUMBER_OF_ACCOUNTS" /> құпия сөзді жою керек пе?</translation> <translation id="9100610230175265781">Құпия фраза қажет</translation> <translation id="9107664647686727385">Құпия сөздер ұрланбағанын тексереді.</translation> +<translation id="9120217828624527905">Толық беттік аудармаға ауысу</translation> <translation id="9124387962554796433">Search және басқа да Google қызметтерін жекелендіру үшін әрекеттер тарихы пайдаланылуы мүмкін.</translation> <translation id="9137526406337347448">Google қызметтері</translation> <translation id="9148126808321036104">Қайта кіру</translation> <translation id="9157836665414082580">Диалогтік терезелерді бөгеу</translation> +<translation id="9162432979321511934">"Құпия сөздерді автотолтыру" функциясын қосу</translation> +<translation id="9165320910061267720">Бағаның төмендеуі туралы хабарландырулар алу үшін iOS параметрлерінде хабарландыруларды қосуыңыз керек.</translation> <translation id="9177438225260810839">Ашық қойындылардан іздеу</translation> <translation id="9188680907066685419">Басқарылатын аккаунттан шығу</translation> <translation id="9193147658040604536">Қойындыны бекіту үшін осы жерге сүйреңіз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 33a1ba1..ea2fabb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">ជ្រើសរើសថតឯកសារ</translation> <translation id="1254424942107648268">ស្វែងរកលទ្ធផលមុន</translation> <translation id="1258491128795710625">អ្វីដែលថ្មី</translation> +<translation id="1264156759663453185">អក្សរដែលបានជ្រើសរើសវែងពេកសម្រាប់ការបកប្រែមួយផ្នែក។</translation> <translation id="1265739287306757398">ស្វែងយល់អំពីរបៀប</translation> <translation id="1272079795634619415">ឈប់</translation> <translation id="1275718070701477396">បានជ្រើសរើស</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">ឈ្មោះហៅក្រៅ</translation> <translation id="1700629756560807968">បានជ្រើសរើស <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1715515772563243997">ប្រសិនបើអ្នកជឿទុកចិត្ត <ph name="SITE" /> អ្នកអាចប្រើពាក្យសម្ងាត់ដែលបានរក្សាទុក ដើម្បីចូល។</translation> +<translation id="173842016780303328">មិនអាចបកប្រែមួយផ្នែកបានទេ។</translation> <translation id="1740468249224277719">ប៉ះពីរដងដើម្បីដំឡើង</translation> <translation id="1752547299766512813">រក្សាទុកពាក្យសម្ងាត់</translation> <translation id="1753905327828125965">ចូលទៅកាន់ច្រើនបំផុត</translation> @@ -241,6 +243,7 @@ <translation id="2747003861858887689">ប្រអប់បំពេញពីមុន</translation> <translation id="2749231692441336879">កំពុងតាមដាន <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">អម្បាញ់មិញ</translation> +<translation id="2768727608073497433">អក្សរដែលបានជ្រើសរើសគឺទទេ។</translation> <translation id="2773292004659987824">ការស្វែងរកលក្ខណៈឯកជន</translation> <translation id="277771892408211951">ជ្រើសរើសភាសា</translation> <translation id="2780046210906776326">គ្មានគណនីអ៊ីម៉ែលទេ</translation> @@ -318,6 +321,7 @@ <translation id="3227137524299004712">ម៉ៃក្រូហ្វូន</translation> <translation id="3240426699337459095">បានចម្លងតំណ</translation> <translation id="3244271242291266297">ខែ</translation> +<translation id="3245744387817103524">មិនអាចរក្សាទុកការផ្លាស់ប្ដូររបស់អ្នកបានទេ។</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> នៃ <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">បើកផ្ទាំង</translation> <translation id="3272527697863656322">បោះបង់</translation> @@ -340,6 +344,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> នាទី</translation> <translation id="3448016392200048164">បំបែកការមើល</translation> <translation id="345565170154308620">គ្រប់គ្រងពាក្យសម្ងាត់...</translation> +<translation id="3464194322481586217">មិនអាចតាមដានតម្លៃនេះបានទេ។</translation> <translation id="3469166899695866866">បញ្ឈប់ការទាញយកមែនទេ?</translation> <translation id="3470502288861289375">កំពុងចម្លង...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{សម្រាប់កម្មវិធី ឬគេហទំព័រ {COUNT}}other{សម្រាប់កម្មវិធី និងគេហទំព័រ {COUNT}}}</translation> @@ -698,6 +703,7 @@ <translation id="6066301408025741299">ប៉ះដើម្បីបោះបង់</translation> <translation id="6071409777669089905">ដកខ្ទាស់ផ្ទាំង</translation> <translation id="6084848228346514841">ជ្រើសរើសផ្ទាំង</translation> +<translation id="6100617279104942061">បានចូលគណនីក្នុងនាមជា <ph name="USER_EMAIL" />។ បើកការកំណត់។</translation> <translation id="6103540626693881831">ការអ៊ីនគ្រីបនៅលើឧបករណ៍</translation> <translation id="6119050551270742952">ទំព័របណ្ដាញបច្ចុប្បន្នស្ថិតនៅក្នុងមុខងារឯកជន</translation> <translation id="6122191549521593678">លើអ៊ីនធឺណិត</translation> @@ -768,6 +774,7 @@ <translation id="6464397691496239022">គេហទំព័រអាចប្រើខូគី ដើម្បីកែលម្អបទពិសោធន៍រុករករបស់អ្នក ឧទាហរណ៍ ដើម្បីឱ្យអ្នកបន្តចូលគណនី ឬចងចាំទំនិញនៅក្នុងរទេះទិញទំនិញរបស់អ្នក។ គេហទំព័រមិនអាចប្រើខូគី ដើម្បីមើលសកម្មភាពរុករកតាមអ៊ីនធឺណិតរបស់អ្នកនៅលើគេហទំព័រផ្សេងៗ ឧទាហរណ៍ ដើម្បីកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របនឹងអ្នកបានទេ។</translation> +<translation id="6476253015009698798">មិនអាចតាមដានតម្លៃសម្រាប់ទំព័រនេះបានទេ។</translation> <translation id="6476800141292307438">កំពុងបកប្រែទំព័រទៅភាសា<ph name="LANGUAGE" />។ ជម្រើសមាននៅជិតផ្នែកខាងក្រោមបំផុតរបស់អេក្រង់។</translation> <translation id="648164694371393720">មានបញ្ហាក្នុងការផ្ទៀងផ្ទាត់</translation> <translation id="6482629121755362506">ធាតុ <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ត្រូវបានលុប</translation> @@ -819,6 +826,7 @@ <translation id="6780034285637185932">លេខកូដតំបន់</translation> <translation id="6781260999953472352">បើកសមកាលកម្មឬ?</translation> <translation id="6785453220513215166">កំពុងផ្ញើរបាយការណ៍ការគាំង...</translation> +<translation id="6790502149545262384">ក្នុងពេលឆាប់ៗនេះ អ្នកនឹងមើលឃើញរឿងពី <ph name="CHANNEL_NAME" /> នៅពេលអ្នកបើកផ្ទាំងថ្មី។</translation> <translation id="6797885426782475225">ស្វែងរកដោយសម្លេង</translation> <translation id="6801927553864092214">សូមបើកផ្ទាំងឯកជន ដើម្បីរុករកជាលក្ខណៈឯកជន</translation> <translation id="6807889908376551050">បង្ហាញទាំងអស់...</translation> @@ -1125,10 +1133,12 @@ <translation id="9098541895599151034">លុបពាក្យសម្ងាត់ <ph name="NUMBER_OF_ACCOUNTS" /> ឬ?</translation> <translation id="9100610230175265781">តម្រូវឲ្យមានឃ្លាសម្ងាត់</translation> <translation id="9107664647686727385">ពិនិត្យរកពាក្យសម្ងាត់ដែលរងការលុកលុយ</translation> +<translation id="9120217828624527905">ប្ដូរទៅការបកប្រែទំព័រពេញលេញ</translation> <translation id="9124387962554796433">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីកំណត់ឱ្យកម្មវិធីស្វែងរក និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក។</translation> <translation id="9137526406337347448">សេវាកម្ម Google</translation> <translation id="9148126808321036104">ចូលម្តងទៀត</translation> <translation id="9157836665414082580">បង្ហាប់ប្រអប់បញ្ចូល</translation> +<translation id="9162432979321511934">បើក "បំពេញពាក្យសម្ងាត់ដោយស្វ័យប្រវត្តិ"</translation> <translation id="9165320910061267720">ដើម្បីទទួលបានការជូនដំណឹងអំពីការធ្លាក់តម្លៃ អ្នកនឹងត្រូវបើកការជូនដំណឹងក្នុងការកំណត់ iOS របស់អ្នក។</translation> <translation id="9177438225260810839">ស្វែងរកផ្ទាំងបើក</translation> <translation id="9188680907066685419">ចេញពីគណនីដែលត្រូវបានគ្រប់គ្រង</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 9d8d7271..4895717 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">ನಿಮ್ಮ ಸಿಂಕ್ ಡೇಟಾವನ್ನು ನೀವು ಯಾವಾಗಲೂ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವ ಹಾಗೆ ನೋಡಿಕೊಳ್ಳಲು, ಅದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸಿ</translation> <translation id="1870148520156231997">ಪಾಸ್ವರ್ಡ್ ತೋರಿಸಿ</translation> <translation id="1872096359983322073">ಟಾರ್ಚ್</translation> +<translation id="1886370402958071554">ವಿಳಾಸವನ್ನು ಅಳಿಸಿ</translation> <translation id="1891796056033961979">ಉಳಿಸಲಾದ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು, ಸೆಟ್ಟಿಂಗ್ಗಳು ಹಾಗೂ ಇತ್ಯಾದಿಗಳು ಈ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಲಭ್ಯವಿರುತ್ತವೆ.</translation> <translation id="1894023287452300670">ಬೆಲೆಯನ್ನು ಇಲ್ಲಿ ಟ್ರ್ಯಾಕ್ ಮಾಡಿ</translation> <translation id="1911619930368729126">Google ಡ್ರೈವ್ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಿ</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">ಪರಿಷ್ಕರಿಸು</translation> <translation id="2273327106802955778">ಹೆಚ್ಚಿನ ಮೆನು</translation> <translation id="2286505070150039482">ಹೈಲೈಟ್ ಮಾಡಿದ ಪಠ್ಯ</translation> +<translation id="2287614783861766820">{count,plural, =1{ಈ ಸಾಧನದಿಂದ ಈ ವಿಳಾಸವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ಈ ಸಾಧನದಿಂದ ಈ ವಿಳಾಸಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ಈ ಸಾಧನದಿಂದ ಈ ವಿಳಾಸಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation> <translation id="2299218006564889602">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು Google ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಉಳಿಸುವ ಮೊದಲು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗುತ್ತದೆ</translation> <translation id="2302742851632557585">ವೆಬ್ಸೈಟ್ನಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಿ</translation> <translation id="2316709634732130529">ಸೂಚಿಸಿರುವ ಪಾಸ್ವರ್ಡ್ ಬಳಸಿ</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">ಉಳಿಸಲಾದ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು, ಸೆಟ್ಟಿಂಗ್ಗಳು ಹಾಗೂ ಇತ್ಯಾದಿಗಳು ಈಗ ಇಲ್ಲಿವೆ</translation> <translation id="4334428914252001502">1 ಓದದಿರುವ ಲೇಖನ.</translation> <translation id="4338650699862464074">ನೀವು ಭೇಟಿ ನೀಡುವ ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸಿ.</translation> +<translation id="4342054591427973606">{count,plural, =1{ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಈ ಸಾಧನ ಮತ್ತು ಇತರ ಸಾಧನಗಳಿಂದ ಈ ವಿಳಾಸವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}one{ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಈ ಸಾಧನ ಮತ್ತು ಇತರ ಸಾಧನಗಳಿಂದ ಈ ವಿಳಾಸಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}other{ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಈ ಸಾಧನ ಮತ್ತು ಇತರ ಸಾಧನಗಳಿಂದ ಈ ವಿಳಾಸಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.}}</translation> <translation id="4343046787186034850">ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="4359125752503270327">ಈ ಪುಟವು ಇನ್ನೊಂದು ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ.</translation> <translation id="4375040482473363939">QR ಕೋಡ್ ಅನ್ನು ಹುಡುಕಿ</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="5234764350956374838">ವಜಾಗೊಳಿಸಿ</translation> <translation id="5245322853195994030">ಸಿಂಕ್ ರದ್ದುಗೊಳಿಸಿ</translation> +<translation id="5271265092610673171">{count,plural, =1{ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರವು ಖಾಲಿ ಇದೆ. ಉಳಿಸುವ ಮೊದಲು ಅದನ್ನು ಭರ್ತಿಮಾಡಿ.}one{ಅಗತ್ಯವಿರುವ ಕೆಲವು ಕ್ಷೇತ್ರಗಳು ಖಾಲಿ ಇವೆ. ಉಳಿಸುವ ಮೊದಲು ಅವುಗಳನ್ನು ಭರ್ತಿ ಮಾಡಿ.}other{ಅಗತ್ಯವಿರುವ ಕೆಲವು ಕ್ಷೇತ್ರಗಳು ಖಾಲಿ ಇವೆ. ಉಳಿಸುವ ಮೊದಲು ಅವುಗಳನ್ನು ಭರ್ತಿ ಮಾಡಿ.}}</translation> <translation id="5271549068863921519">ಪಾಸ್ವರ್ಡ್ ಉಳಿಸಿ</translation> <translation id="5295239312320826323"><ph name="USER_EMAIL" /> ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?</translation> <translation id="5300589172476337783">ತೋರಿಸಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 87fb341..e9c5821 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Pasirinkti aplanką</translation> <translation id="1254424942107648268">Rasti ankstesnius</translation> <translation id="1258491128795710625">Kas naujo</translation> +<translation id="1264156759663453185">Pasirinktas tekstas per didelis daliniam vertimui.</translation> <translation id="1265739287306757398">Sužinoti, kaip tai padaryti</translation> <translation id="1272079795634619415">Sustabdyti</translation> <translation id="1275718070701477396">Pasirinkta</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Slapyvardis</translation> <translation id="1700629756560807968">Pasirinkta: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1715515772563243997">Jei pasitikite <ph name="SITE" />, prisijungdami galite naudoti išsaugotą slaptažodį.</translation> +<translation id="173842016780303328">Nepavyko išversti dalies teksto.</translation> <translation id="1740468249224277719">Dukart palieskite, kad įdiegtumėte.</translation> <translation id="1752547299766512813">Išs. slaptažod.</translation> <translation id="1753905327828125965">Dažniausiai lankomi</translation> @@ -241,6 +243,7 @@ <translation id="2747003861858887689">Ankstesnis laukas</translation> <translation id="2749231692441336879">Stebima: <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">ką tik</translation> +<translation id="2768727608073497433">Pasirinktas tekstas tuščias.</translation> <translation id="2773292004659987824">Paieška inkognito režimu</translation> <translation id="277771892408211951">Kalbos pasirinkimas</translation> <translation id="2780046210906776326">Nėra el. pašto pask.</translation> @@ -318,6 +321,7 @@ <translation id="3227137524299004712">Mikrofonas</translation> <translation id="3240426699337459095">Nuoroda nukopijuota</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Pakeitimo nepavyko išsaugoti.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> iš <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Atidaryti skirtukai</translation> <translation id="3272527697863656322">Atšaukti</translation> @@ -340,6 +344,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min.</translation> <translation id="3448016392200048164">Padalytas rodinys</translation> <translation id="345565170154308620">Tvarkyti slaptažodžius...</translation> +<translation id="3464194322481586217">Nepavyko stebėti kainos.</translation> <translation id="3469166899695866866">Sustabdyti atsisiuntimą?</translation> <translation id="3470502288861289375">Kopijuojama...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} svetainėje ar programoje}one{{COUNT} svetainėje ar programoje}few{{COUNT} svetainėse ar programose}many{{COUNT} svetainės ar programos}other{{COUNT} svetainių ar programų}}</translation> @@ -698,6 +703,7 @@ <translation id="6066301408025741299">Palieskite, jei norite atšaukti.</translation> <translation id="6071409777669089905">Atsegti skirtuką</translation> <translation id="6084848228346514841">Skirtukų pasirinkimas</translation> +<translation id="6100617279104942061">Prisijungta kaip <ph name="USER_EMAIL" />. Atidaromi nustatymai.</translation> <translation id="6103540626693881831">Šifruotė įrenginyje</translation> <translation id="6119050551270742952">Dabartinė svetainė atidaryta inkognito režimu</translation> <translation id="6122191549521593678">Prisijungęs</translation> @@ -768,6 +774,7 @@ <translation id="6464397691496239022">Svetainės gali naudoti slapukus, kad pagerintų naršymo kokybę, pvz., kad liktumėte prisijungę ar būtų įsimintos pirkinių krepšelyje esančios prekės. Svetainės negali naudoti slapukų, kad sužinotų apie naršymo veiklą skirtingose svetainėse, pvz., kad galėtų suasmeninti skelbimus.</translation> +<translation id="6476253015009698798">Šiame puslapyje kainų stebėjimas nepasiekiamas.</translation> <translation id="6476800141292307438">Puslapis verčiamas į <ph name="LANGUAGE" />. Parinktys pasiekiamos netoli ekrano apačios.</translation> <translation id="648164694371393720">Autentifikavimo klaida</translation> <translation id="6482629121755362506">Ištrinta elementų: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> @@ -819,6 +826,7 @@ <translation id="6780034285637185932">Pašto kodas</translation> <translation id="6781260999953472352">Įjungti sinchronizavimą?</translation> <translation id="6785453220513215166">Siunčiama strigties ataskaita...</translation> +<translation id="6790502149545262384">Netrukus atidarę naują skirtuką matysite istorijas iš „<ph name="CHANNEL_NAME" />“.</translation> <translation id="6797885426782475225">Paieška balsu</translation> <translation id="6801927553864092214">Kad galėtumėte naršyti privačiai, atidarykite inkognito skirtuką</translation> <translation id="6807889908376551050">Rodyti viską...</translation> @@ -1125,10 +1133,12 @@ <translation id="9098541895599151034">Ištrinti slaptažodžius (iš viso: <ph name="NUMBER_OF_ACCOUNTS" />)?</translation> <translation id="9100610230175265781">Būtina slaptafrazė</translation> <translation id="9107664647686727385">Patikrinkite, ar nėra pažeistų slaptažodžių</translation> +<translation id="9120217828624527905">Perjungimas į viso puslapio vertimą</translation> <translation id="9124387962554796433">Naudodama naršymo istoriją „Google“ gali suasmeninti Paiešką ir kitas „Google“ paslaugas.</translation> <translation id="9137526406337347448">„Google“ paslaugos</translation> <translation id="9148126808321036104">Prisijungti dar kartą</translation> <translation id="9157836665414082580">Nerod. dialogo langų</translation> +<translation id="9162432979321511934">Įjunkite parinktį „Automatinis slaptažodžių pildymas“</translation> <translation id="9165320910061267720">Jei norite gauti įspėjimų apie sumažintas kainas pranešimus, turite įjungti pranešimus „iOS“ nustatymuose.</translation> <translation id="9177438225260810839">Paieška atidarytuose skirtukuose</translation> <translation id="9188680907066685419">Atsijungimas nuo valdomos paskyros</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 7bb2730..507ce03 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Piespraust cilni</translation> <translation id="2116625576999540962">Pārvietoti vienumi: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="2122754583996902531">Jūsu pārlūks tiek pārvaldīts. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation> +<translation id="2139502497535990641">Vai ieslēgt brīdinājumus par cenu?</translation> <translation id="2139867232736819575">Meklēt kopēto tekstu</translation> <translation id="214201757571129614">Pierakstīties…</translation> <translation id="2149973817440762519">Rediģēt grāmatzīmes</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Rādīt vēsturi</translation> <translation id="2800683595868705743">Aizvērt ciļņu pārslēdzēju</translation> <translation id="2815198996063984598">2. Pieskarieties vienumam Noklusējuma pārlūka lietotne.</translation> +<translation id="2822917246944009066">Cilne ir piesprausta.</translation> <translation id="2830972654601096923">Pārvaldīt adreses...</translation> <translation id="2834399722155632105">3. Pieskarieties pogai Paroles iespējas.</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Mikrofons</translation> <translation id="3240426699337459095">Saite nokopēta</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">Jūsu veiktās izmaiņas nevarēja saglabāt.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" />. no <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Atvērtās cilnes</translation> <translation id="3272527697863656322">Atcelt</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Dalītais skats</translation> <translation id="345565170154308620">Pārvaldīt paroles…</translation> +<translation id="3464194322481586217">Nevarēja izsekot cenai.</translation> <translation id="3469166899695866866">Vai apturēt lejupielādi?</translation> <translation id="3470502288861289375">Notiek kopēšana...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} vietnei vai lietotnei}zero{{COUNT} vietnēm un lietotnēm}one{{COUNT} vietnei un lietotnei}other{{COUNT} vietnēm un lietotnēm}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">Vietnes drīkst izmantot sīkfailus, lai uzlabotu pārlūkošanas pieredzi, piemēram, lai nodrošinātu ilgstošu pierakstīšanos vai saglabātu pirkumu grozā ievietotās preces. Vietnes nedrīkst izmantot sīkfailus, lai skatītu jūsu pārlūkošanas darbības dažādās vietnēs, piemēram, reklāmu personalizēšanai.</translation> +<translation id="6476253015009698798">Cenu izsekošana šai lapai nav pieejama.</translation> <translation id="6476800141292307438">Lapa tiek tulkota <ph name="LANGUAGE" /> valodā. Pieejamās opcijas redzamas ekrāna apakšdaļā.</translation> <translation id="648164694371393720">Autentifikācijas kļūda</translation> <translation id="6482629121755362506">Dzēsti vienumi: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">Pasta indekss</translation> <translation id="6781260999953472352">Vai ieslēgt sinhronizāciju?</translation> <translation id="6785453220513215166">Notiek avārijas ziņojuma sūtīšana...</translation> +<translation id="6790502149545262384">Drīzumā, atverot jaunu cilni, būs redzami raksti no vietnes <ph name="CHANNEL_NAME" />.</translation> <translation id="6797885426782475225">Meklēšana ar balsi</translation> <translation id="6801927553864092214">Lai pārlūkotu privāti, atveriet inkognito cilni.</translation> <translation id="6807889908376551050">Rādīt visus...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas un cita satura personalizēšanai</translation> <translation id="7435356471928173109">Izslēdza jūsu administrators</translation> <translation id="7438481509621345350">Tagad, atverot jaunu cilni, būs redzami raksti no kanāla “<ph name="CHANNEL_NAME" />”.</translation> +<translation id="7446583256109515732">Cilne ir atsprausta.</translation> <translation id="7454057999980797137">Štats/valsts</translation> <translation id="7459628154744868585">Uzlabota aizsardzība ir ieslēgta</translation> <translation id="746684838091935575">3. Atlasiet Chrome.</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Google pakalpojumi</translation> <translation id="9148126808321036104">Pierakstieties vēlreiz</translation> <translation id="9157836665414082580">Nerādīt dialoglodziņus</translation> +<translation id="9162432979321511934">Ieslēdziet paroļu automātisko aizpildi</translation> +<translation id="9165320910061267720">Lai saņemtu paziņojumus par cenu kritumu, jums jāieslēdz paziņojumi iOS iestatījumos.</translation> <translation id="9177438225260810839">Meklēt atvērtajās cilnēs</translation> <translation id="9188680907066685419">Izrakstīšanās no pārvaldīta konta</translation> <translation id="9193147658040604536">Velciet šeit, lai piespraustu 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 283c513c..6987070 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Прикачи картичка</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ставки се преместени</translation> <translation id="2122754583996902531">Прелистувачот е управуван. <ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Дали да се вклучат известувања за цени?</translation> <translation id="2139867232736819575">Пребарувајте го текстот што го копиравте</translation> <translation id="214201757571129614">Најавете се…</translation> <translation id="2149973817440762519">Измени Обележувач</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Прикажи ја историјата</translation> <translation id="2800683595868705743">Излези од менувачот на картички</translation> <translation id="2815198996063984598">2. Допрете „Стандардна апликација за прелистување“</translation> +<translation id="2822917246944009066">Картичката е закачена</translation> <translation id="2830972654601096923">Управувајте со адресите…</translation> <translation id="2834399722155632105">3. Допрете „Опции за лозинки“</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Контролирајте како вашата историја на прелистување се користи за персонализирање на „Пребарувањето“ и друго</translation> <translation id="7435356471928173109">Исклучено од администраторот</translation> <translation id="7438481509621345350">Сега ќе гледате стории од <ph name="CHANNEL_NAME" /> при отворање нова картичка.</translation> +<translation id="7446583256109515732">Картичката е откачена</translation> <translation id="7454057999980797137">Држава/Земја</translation> <translation id="7459628154744868585">Вклучена е „Подобрената заштита“</translation> <translation id="746684838091935575">3. Изберете Chrome</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Најави се повторно</translation> <translation id="9157836665414082580">Отстрани дијалози</translation> <translation id="9162432979321511934">Вклучете автоматско пополнување лозинки</translation> +<translation id="9165320910061267720">За да добивате известувања за намалувања на цените, ќе треба да ги вклучите известувањата во вашите поставки за iOS.</translation> <translation id="9177438225260810839">Пребарајте ги отворените картички</translation> <translation id="9188680907066685419">Одјавете се од управувана сметка</translation> <translation id="9193147658040604536">Повлечете овде за да закачите картичка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 092ba2a..c74dced 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">സമന്വയിപ്പിക്കുന്ന ഡാറ്റ നിങ്ങൾക്ക് എപ്പോഴും ആക്സസ് ചെയ്യാനാകുമെന്ന് ഉറപ്പാക്കാൻ ഇത് നിങ്ങളാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക</translation> <translation id="1870148520156231997">പാസ്വേഡ് വെളിപ്പെടുത്തുക</translation> <translation id="1872096359983322073">ടോർച്ച്</translation> +<translation id="1886370402958071554">വിലാസം ഇല്ലാതാക്കുക</translation> <translation id="1891796056033961979">നിങ്ങളുടെ സംരക്ഷിച്ച പാസ്വേഡുകളും ക്രമീകരണവും മറ്റും ഈ സ്ക്രീനിൽ നിന്ന് ലഭ്യമാണ്.</translation> <translation id="1894023287452300670">ഇവിടെ നിരക്ക് ട്രാക്ക് ചെയ്യുക</translation> <translation id="1911619930368729126">Google ഡ്രൈവിലേക്ക് അപ്ലോഡ് ചെയ്യുക</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">പരിഷ്ക്കരിക്കുക</translation> <translation id="2273327106802955778">കൂടുതൽ ഓപ്ഷൻ മെനു</translation> <translation id="2286505070150039482">ഹൈലൈറ്റ് ചെയ്ത ടെക്സ്റ്റ്</translation> +<translation id="2287614783861766820">{count,plural, =1{ഈ ഉപകരണത്തിൽ നിന്ന് ഈ വിലാസം ഇല്ലാതാക്കും.}other{ഈ ഉപകരണത്തിൽ നിന്ന് ഈ വിലാസങ്ങൾ ഇല്ലാതാക്കും.}}</translation> <translation id="2299218006564889602">Google പാസ്വേഡ് മാനേജറിലേക്ക് സംരക്ഷിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്വേഡുകൾ എൻക്രിപ്റ്റ് ചെയ്യുന്നു.</translation> <translation id="2302742851632557585">വെബ്സൈറ്റിലെ പാസ്വേഡ് മാറ്റുക</translation> <translation id="2316709634732130529">നിർദ്ദേശിച്ച പാസ്വേഡ് ഉപയോഗിക്കുക</translation> @@ -318,6 +320,7 @@ <translation id="3227137524299004712">മൈക്രോഫോൺ</translation> <translation id="3240426699337459095">ലിങ്ക് പകർത്തി</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">നിങ്ങൾ വരുത്തിയ മാറ്റം സംരക്ഷിക്കാനായില്ല.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> / <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">ഓപ്പൺ ടാബുകൾ</translation> <translation id="3272527697863656322">റദ്ദാക്കുക</translation> @@ -340,6 +343,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> മി.</translation> <translation id="3448016392200048164">വിഭജിത കാഴ്ച</translation> <translation id="345565170154308620">പാസ്വേഡുകൾ മാനേജ് ചെയ്യുക...</translation> +<translation id="3464194322481586217">നിരക്ക് ട്രാക്ക് ചെയ്യാനായില്ല.</translation> <translation id="3469166899695866866">ഡൗൺലോഡ് നിർത്തണോ?</translation> <translation id="3470502288861289375">പകർത്തുന്നു...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} സൈറ്റിന് അല്ലെങ്കിൽ ആപ്പിന്}other{{COUNT} സൈറ്റുകൾക്കും ആപ്പുകൾക്കും}}</translation> @@ -456,6 +460,7 @@ <translation id="4324952538601951430">നിങ്ങളുടെ സംരക്ഷിച്ച ബുക്ക്മാർക്കുകൾ, പാസ്വേഡുകൾ, ക്രമീകരണം എന്നിവയും മറ്റും ഇപ്പോൾ ഇവിടെ കാണാം</translation> <translation id="4334428914252001502">വായിക്കാത്ത ഒരു ലേഖനം.</translation> <translation id="4338650699862464074">നിങ്ങൾ സന്ദർശിക്കുന്ന പേജുകളുടെ URL-കൾ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation> +<translation id="4342054591427973606">{count,plural, =1{ഇതിൽ നിന്നും നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന മറ്റ് ഉപകരണങ്ങളിൽ നിന്നും ഈ വിലാസം ഇല്ലാതാക്കും.}other{ഇതിൽ നിന്നും നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന മറ്റ് ഉപകരണങ്ങളിൽ നിന്നും ഈ വിലാസങ്ങൾ ഇല്ലാതാക്കും.}}</translation> <translation id="4343046787186034850">ക്യാമറ, മൈക്രോഫോൺ ആക്സസ് അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="4359125752503270327">ഈ പേജ് മറ്റൊരു ആപ്പിൽ തുറക്കും.</translation> <translation id="4375040482473363939">QR കോഡ് തിരയൽ</translation> @@ -585,6 +590,7 @@ <translation id="5232485538978018676">മാനേജ് ചെയ്യപ്പെടുന്ന അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="5234764350956374838">ഡിസ്മിസ്സ് ചെയ്യുക</translation> <translation id="5245322853195994030">സമന്വയം റദ്ദാക്കുക</translation> +<translation id="5271265092610673171">{count,plural, =1{നിർബന്ധമായും നൽകേണ്ട ഭാഗം പൂരിപ്പിച്ചിട്ടില്ല. സംരക്ഷിക്കുന്നതിന് മുമ്പ് അത് പൂരിപ്പിക്കുക.}other{നിർബന്ധമായും നൽകേണ്ട ഭാഗം പൂരിപ്പിച്ചിട്ടില്ല. സംരക്ഷിക്കുന്നതിന് മുമ്പ് അവ പൂരിപ്പിക്കുക.}}</translation> <translation id="5271549068863921519">പാസ്വേഡ് സംരക്ഷിക്കുക</translation> <translation id="5295239312320826323"><ph name="USER_EMAIL" /> എന്ന അക്കൗണ്ട് നീക്കം ചെയ്യണോ?</translation> <translation id="5300589172476337783">കാണിക്കുക</translation> @@ -768,6 +774,7 @@ <translation id="6464397691496239022">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാവുന്നതാണ്, ഉദാഹരണത്തിന്, സൈൻ ഇൻ ചെയ്ത നിലയിൽ തുടരാനോ ഷോപ്പിംഗ് കാർട്ടിലെ ഇനങ്ങൾ ഓർമ്മിക്കാനോ. വ്യത്യസ്ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി കാണാൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാനാവില്ല, ഉദാഹരണത്തിന്, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ.</translation> +<translation id="6476253015009698798">ഈ പേജിന് നിരക്ക് ട്രാക്ക് ചെയ്യൽ ലഭ്യമല്ല.</translation> <translation id="6476800141292307438">പേജ് <ph name="LANGUAGE" /> എന്ന ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യുന്നു. സ്ക്രീനിൻ്റെ ചുവടെ ഓപ്ഷനുകൾ ലഭ്യമാണ്.</translation> <translation id="648164694371393720">പരിശോധിച്ചുറപ്പിക്കൽ പിശക്</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ഇനങ്ങൾ ഇല്ലാതാക്കി</translation> @@ -819,6 +826,7 @@ <translation id="6780034285637185932">തപാൽ കോഡ്</translation> <translation id="6781260999953472352">സമന്വയം ഓണാക്കണോ?</translation> <translation id="6785453220513215166">ക്രാഷ് റിപ്പോർട്ട് അയയ്ക്കുന്നു...</translation> +<translation id="6790502149545262384">ഉടൻ തന്നെ, പുതിയൊരു ടാബ് തുറക്കുമ്പോൾ <ph name="CHANNEL_NAME" /> എന്നതിൽ നിന്നുള്ള സ്റ്റോറികൾ നിങ്ങൾക്ക് കാണാനാകും.</translation> <translation id="6797885426782475225">ശബ്ദ തിരയൽ</translation> <translation id="6801927553864092214">സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ, അദൃശ്യ ടാബ് തുറക്കുക</translation> <translation id="6807889908376551050">എല്ലാം കാണിക്കുക...</translation> @@ -1129,6 +1137,7 @@ <translation id="9137526406337347448">Google സേവനങ്ങൾ</translation> <translation id="9148126808321036104">വീണ്ടും പ്രവേശിക്കുക</translation> <translation id="9157836665414082580">ഡയലോഗുകൾ നിയന്ത്രിക്കുക</translation> +<translation id="9162432979321511934">'പാസ്വേഡുകൾ സ്വയമേവ പൂരിപ്പിക്കുക' ഓണാക്കുക</translation> <translation id="9165320910061267720">വിലക്കുറവിനെക്കുറിച്ചുള്ള അറിയിപ്പുകൾ ലഭിക്കാൻ, നിങ്ങളുടെ iOS ക്രമീകരണത്തിൽ അറിയിപ്പുകൾ ഓണാക്കേണ്ടതുണ്ട്.</translation> <translation id="9177438225260810839">തുറന്നിരിക്കുന്ന ടാബുകളിൽ തിരയുക</translation> <translation id="9188680907066685419">മാനേജ് ചെയ്ത അക്കൗണ്ടിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 9349eee..8496879 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -226,7 +226,6 @@ <translation id="2648803196158606475">Slett leste</translation> <translation id="2653659639078652383">Send inn</translation> <translation id="2664621323652615289">Stopp</translation> -<translation id="2667896873740639878">Denne adressen er lagret i Google-kontoen din (<ph name="USER_EMAIL" />). Du kan bruke adressen på alle Google-produkter på hvilken som helst enhet.</translation> <translation id="2671426118752779020">Du kan bruke passordene du har lagret i Google Passordlagring, i andre apper på iPhonen din.</translation> <translation id="2690858294534178585">Kameraet er i bruk</translation> <translation id="26915454213703967">Søk i bildet med Google</translation> @@ -672,7 +671,6 @@ <translation id="5860033963881614850">Av</translation> <translation id="5869029295770560994">Greit</translation> <translation id="5871497086027727873">1 element er flyttet</translation> -<translation id="5881445640183527870">{count,plural, =1{Denne adressen slettes fra Google-kontoen din (<ph name="USER_EMAIL" />) og denne enheten.}other{Disse adressene slettes fra Google-kontoen din (<ph name="USER_EMAIL" />) og denne enheten.}}</translation> <translation id="5896576662943111387">Bygget for iOS</translation> <translation id="5897956970858271241">Besøk den kopierte linken</translation> <translation id="5899314093904173337">For å dele med personer i nærheten, la dem skanne denne QR-koden med kameraet sitt eller en QR-skanningsapp</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 5069345..d645fa04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">ଟାବ୍ ପିନ୍ କରନ୍ତୁ</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" />ଟିି ଆଇଟମ୍ ସ୍ଥାନାନ୍ତରିତ ହୋଇଗଲା</translation> <translation id="2122754583996902531">ଆପଣଙ୍କ ବ୍ରାଉଜର ପରିଚାଳିତ ହେଉଛି। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">ମୂଲ୍ୟ ହ୍ରାସ ଆଲର୍ଟଗୁଡ଼ିକୁ ଚାଲୁ କରିବେ?</translation> <translation id="2139867232736819575">ଆପଣ କପି କରିଥିବା ଟେକ୍ସଟ୍ ଖୋଜନ୍ତୁ</translation> <translation id="214201757571129614">ସାଇନ୍ ଇନ୍ କରନ୍ତୁ…</translation> <translation id="2149973817440762519">ବୁକମାର୍କ୍ ସମ୍ପାଦନ କରନ୍ତୁ</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">ଇତିହାସ ଦେଖାନ୍ତୁ</translation> <translation id="2800683595868705743">ଟାବ୍ ସ୍ଵିଚର୍ ଛାଡ଼ି ଦିଅନ୍ତୁ</translation> <translation id="2815198996063984598">2. ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଆପକୁ ଟାପ୍ କରନ୍ତୁ</translation> +<translation id="2822917246944009066">ଟାବ ପିନ କରାଯାଇଛି</translation> <translation id="2830972654601096923">ଠିକଣାଗୁଡ଼ିକ ପରିଚାଳନା କରନ୍ତୁ...</translation> <translation id="2834399722155632105">3. ପାସୱାର୍ଡ ବିକଳ୍ପଗୁଡ଼ିକରେ ଟାପ କରନ୍ତୁ</translation> <translation id="2834956026595107950"><ph name="TITLE" />:<ph name="STATE" />:<ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">ମାଇକ୍ରୋଫୋନ୍</translation> <translation id="3240426699337459095">ଲିଙ୍କ୍ କପି ହୋଇଛି</translation> <translation id="3244271242291266297">ମାସ</translation> +<translation id="3245744387817103524">ଆପଣଙ୍କ ପରିବର୍ତ୍ତଗୁଡ଼ିକ ସେଭ କରାଯାଇପାରିଲା ନାହିଁ</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="NUM_SUGGESTIONS" />ର <ph name="INDEX" /></translation> <translation id="3268451620468152448">ଖୋଲାଥିବା ଟାବ୍ଗୁଡ଼ିକ</translation> <translation id="3272527697863656322">ବାତିଲ୍ କରନ୍ତୁ</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> ମିନିଟ୍</translation> <translation id="3448016392200048164">ବିଭାଜିତ ଦୃଶ୍ୟ</translation> <translation id="345565170154308620">ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ...</translation> +<translation id="3464194322481586217">ମୂଲ୍ୟକୁ ଟ୍ରାକ କରାଯାଇପାରିଲା ନାହିଁ।</translation> <translation id="3469166899695866866">ଡାଉନ୍ଲୋଡ୍ ବନ୍ଦ କରିବେ?</translation> <translation id="3470502288861289375">କପି କରାଯାଉଛି…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT}ଟି ସାଇଟ କିମ୍ବା ଆପ ପାଇଁ}other{{COUNT}ଟି ସାଇଟ କିମ୍ବା ଆପ୍ସ ପାଇଁ}}</translation> @@ -764,6 +768,7 @@ <translation id="6464397691496239022">ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ ରଖିବା କିମ୍ବା ଆପଣଙ୍କ ସପିଂ କାର୍ଟରେ ଥିବା ଆଇଟମଗୁଡ଼ିକୁ ମନେରଖିବା ପରି, ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଅନୁଭୂତିକୁ ଉନ୍ନତ କରିବା ନିମନ୍ତେ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ। ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପରି ବିଭିନ୍ନ ସାଇଟରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପକୁ ଦେଖିବା ନିମନ୍ତେ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ।</translation> +<translation id="6476253015009698798">ଏହି ସାଇଟ ପାଇଁ ମୂଲ୍ୟ ଟ୍ରାକିଂ ଉପଲବ୍ଧ ନାହିଁ।</translation> <translation id="6476800141292307438"><ph name="LANGUAGE" />କୁ ପୃଷ୍ଠା ଅନୁବାଦ କରୁଛି। ସ୍କ୍ରିନ୍ର ତଳପାର୍ଶ୍ୱରେ ବିକଳ୍ପଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି।</translation> <translation id="648164694371393720">ପ୍ରାମାଣିକତାରେ ତ୍ରୁଟି</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" />ଟି ଆଇଟମ୍ ଡିଲିଟ୍ ହୋଇଛି</translation> @@ -815,6 +820,7 @@ <translation id="6780034285637185932">ZIP କୋଡ୍</translation> <translation id="6781260999953472352">ସିଙ୍କ ଚାଲୁ କରିବେ?</translation> <translation id="6785453220513215166">କ୍ରାସ୍ ରିପୋର୍ଟ୍ ପଠାହେଉଛି…</translation> +<translation id="6790502149545262384">ଶୀଘ୍ର, ଆପଣ ଏକ ନୂଆ ଟାବ ଖୋଲିଲେ <ph name="CHANNEL_NAME" />ରୁ ଷ୍ଟୋରୀଗୁଡ଼ିକୁ ଦେଖିବେ।</translation> <translation id="6797885426782475225">ଭଏସ୍ ସନ୍ଧାନ କରନ୍ତୁ</translation> <translation id="6801927553864092214">ବ୍ୟକ୍ତିଗତ ଭାବେ ବ୍ରାଉଜ୍ କରିବା ପାଇଁ ଏକ ଇନକଗ୍ନିଟୋ ଟାବ୍ ଖୋଲନ୍ତୁ</translation> <translation id="6807889908376551050">ସବୁ ଦେଖାନ୍ତୁ...</translation> @@ -894,6 +900,7 @@ <translation id="7431991332293347422">Search ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେଉଛି ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="7435356471928173109">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="7438481509621345350">ବର୍ତ୍ତମାନ, ଆପଣ ଏକ ନୂଆ ଟାବ ଖୋଲିଲେ <ph name="CHANNEL_NAME" />ରୁ ଷ୍ଟୋରୀଗୁଡ଼ିକୁ ଦେଖିବେ।</translation> +<translation id="7446583256109515732">ଟାବ ଅନପିନ କରାଯାଇଛି</translation> <translation id="7454057999980797137">ରାଜ୍ୟ / ଦେଶ</translation> <translation id="7459628154744868585">ଉନ୍ନତ ସୁରକ୍ଷା ଚାଲୁ ଅଛି</translation> <translation id="746684838091935575">3. Chrome ଚୟନ କରନ୍ତୁ</translation> @@ -1124,6 +1131,8 @@ <translation id="9137526406337347448">Google ସେବାଗୁଡ଼ିକ</translation> <translation id="9148126808321036104">ପୁଣି ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="9157836665414082580">ଡାୟଲଗ୍ ଦବେଇ ରଖନ୍ତୁ</translation> +<translation id="9162432979321511934">ଅଟୋଫିଲ ପାସୱାର୍ଡ ଚାଲୁ କରନ୍ତୁ</translation> +<translation id="9165320910061267720">ମୂଲ୍ୟ ହ୍ରାସ ଆଲର୍ଟର ବିଜ୍ଞପ୍ତି ପାଇବା ପାଇଁ, ଆପଣଙ୍କୁ ଆପଣଙ୍କ iOS ସେଟିଂସରେ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଚାଲୁ କରିବାକୁ ହେବ।</translation> <translation id="9177438225260810839">ଖୋଲା ଥିବା ଟାବଗୁଡ଼ିକରେ ସନ୍ଧାନ କରନ୍ତୁ</translation> <translation id="9188680907066685419">ସମସ୍ତ ପରିଚାଳିତ ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ</translation> <translation id="9193147658040604536">ଟାବକୁ ପିନ କରିବା ପାଇଁ ଏଠାକୁ ଡ୍ରାଗ କରନ୍ତୁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index fcc74e4..84094e0f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Wybierz folder</translation> <translation id="1254424942107648268">Znajdź poprzedni</translation> <translation id="1258491128795710625">Nowe funkcje</translation> +<translation id="1264156759663453185">Wybrany tekst jest za duży do częściowego tłumaczenia.</translation> <translation id="1265739287306757398">Instrukcje</translation> <translation id="1272079795634619415">Zatrzymaj</translation> <translation id="1275718070701477396">Zaznaczony</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Pseudonim</translation> <translation id="1700629756560807968">Wybrane: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1715515772563243997">Jeśli ufasz stronie <ph name="SITE" />, możesz użyć zapisanego hasła, aby się zalogować.</translation> +<translation id="173842016780303328">Nie udało się przetłumaczyć części tekstu.</translation> <translation id="1740468249224277719">Kliknij dwukrotnie, by zainstalować.</translation> <translation id="1752547299766512813">Zapisuj hasła</translation> <translation id="1753905327828125965">Najczęstsze</translation> @@ -128,6 +130,7 @@ <translation id="1832848789136765277">Aby zapewnić sobie stały dostęp do zsynchronizowanych danych, potwierdź swoją tożsamość</translation> <translation id="1870148520156231997">Pokaż hasło</translation> <translation id="1872096359983322073">Latarka</translation> +<translation id="1886370402958071554">Usuń adres</translation> <translation id="1891796056033961979">Zapisane zakładki, hasła, ustawienia i inne dane są dostępne na tym ekranie.</translation> <translation id="1894023287452300670">Tutaj możesz monitorować cenę</translation> <translation id="1911619930368729126">Prześlij na Dysk Google</translation> @@ -177,6 +180,7 @@ <translation id="2268044343513325586">Zawęź</translation> <translation id="2273327106802955778">Menu Więcej</translation> <translation id="2286505070150039482">Zaznaczony tekst</translation> +<translation id="2287614783861766820">{count,plural, =1{Ten adres zostanie usunięty z tego urządzenia.}few{Te adresy zostaną usunięte z tego urządzenia.}many{Te adresy zostaną usunięte z tego urządzenia.}other{Te adresy zostaną usunięte z tego urządzenia.}}</translation> <translation id="2299218006564889602">Przed zapisaniem w menedżerze haseł Google hasła są szyfrowane na urządzeniu.</translation> <translation id="2302742851632557585">Zmień hasło na stronie</translation> <translation id="2316709634732130529">Użyj proponowanego hasła</translation> @@ -241,6 +245,7 @@ <translation id="2747003861858887689">Poprzednie pole</translation> <translation id="2749231692441336879">Obserwujesz: <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">przed chwilą</translation> +<translation id="2768727608073497433">Zaznaczony tekst jest pusty.</translation> <translation id="2773292004659987824">Wyszukiwanie incognito</translation> <translation id="277771892408211951">Wybierz język</translation> <translation id="2780046210906776326">Brak kont e-mail</translation> @@ -458,6 +463,7 @@ <translation id="4324952538601951430">Zapisane zakładki, hasła, ustawienia i inne dane są teraz tutaj</translation> <translation id="4334428914252001502">Jeden nieprzeczytany artykuł.</translation> <translation id="4338650699862464074">Adresy URL odwiedzanych stron będą wysyłane do Google.</translation> +<translation id="4342054591427973606">{count,plural, =1{Ten adres zostanie usunięty z tego urządzenia i innych urządzeń, na których się logujesz.}few{Ter adresy zostaną usunięte z tego urządzenia i innych urządzeń, na których się logujesz.}many{Ter adresy zostaną usunięte z tego urządzenia i innych urządzeń, na których się logujesz.}other{Ter adresy zostaną usunięte z tego urządzenia i innych urządzeń, na których się logujesz.}}</translation> <translation id="4343046787186034850">Przyznano dostęp do aparatu i mikrofonu</translation> <translation id="4359125752503270327">Strona zostanie otwarta w innej aplikacji.</translation> <translation id="4375040482473363939">Wyszukiwanie z użyciem kodu QR</translation> @@ -587,6 +593,7 @@ <translation id="5232485538978018676">Zaloguj się na konto zarządzane</translation> <translation id="5234764350956374838">Zamknij</translation> <translation id="5245322853195994030">Anuluj synchronizację</translation> +<translation id="5271265092610673171">{count,plural, =1{Wymagane pole jest puste. Wypełnij je przed zapisaniem.}few{Niektóre wymagane pola są puste. Wypełnij je przed zapisaniem.}many{Niektóre wymagane pola są puste. Wypełnij je przed zapisaniem.}other{Niektóre wymagane pola są puste. Wypełnij je przed zapisaniem.}}</translation> <translation id="5271549068863921519">Zapisz hasło</translation> <translation id="5295239312320826323">Usunąć konto <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Pokaż</translation> @@ -700,6 +707,7 @@ <translation id="6066301408025741299">Kliknij, by anulować.</translation> <translation id="6071409777669089905">Odepnij kartę</translation> <translation id="6084848228346514841">Wybierz karty</translation> +<translation id="6100617279104942061">Zalogowano jako <ph name="USER_EMAIL" />. Otwiera ustawienia.</translation> <translation id="6103540626693881831">Szyfrowanie na urządzeniu</translation> <translation id="6119050551270742952">Bieżąca strona jest w trybie incognito</translation> <translation id="6122191549521593678">Online</translation> @@ -1129,6 +1137,7 @@ <translation id="9098541895599151034">Usunąć hasła (<ph name="NUMBER_OF_ACCOUNTS" />)?</translation> <translation id="9100610230175265781">Wymagane jest hasło</translation> <translation id="9107664647686727385">Sprawdź, czy nie przejęto haseł</translation> +<translation id="9120217828624527905">Przełącz na tłumaczenie całej strony</translation> <translation id="9124387962554796433">Google może korzystać z Twojej historii, żeby personalizować wyniki wyszukiwania i działanie innych usług Google.</translation> <translation id="9137526406337347448">Usługi Google</translation> <translation id="9148126808321036104">Zaloguj się ponownie</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 9ee0cbe..fb54b8bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Para se certificar de que pode sempre aceder aos seus dados de sincronização, valide a sua identidade</translation> <translation id="1870148520156231997">Mostrar palavra-passe</translation> <translation id="1872096359983322073">Lanterna</translation> +<translation id="1886370402958071554">Eliminar morada</translation> <translation id="1891796056033961979">Os seus marcadores, palavras-passe, definições e outros conteúdos guardados estão disponíveis neste ecrã.</translation> <translation id="1894023287452300670">Monitorize o preço aqui</translation> <translation id="1911619930368729126">Carregar p/ Google Drive</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Refinar</translation> <translation id="2273327106802955778">Menu Mais</translation> <translation id="2286505070150039482">Texto realçado</translation> +<translation id="2287614783861766820">{count,plural, =1{Esta morada vai ser eliminada deste dispositivo.}other{Estas moradas vão ser eliminadas deste dispositivo.}}</translation> <translation id="2299218006564889602">As palavras-passe são encriptadas no seu dispositivo antes de serem guardadas no Gestor de palavras-passe da Google.</translation> <translation id="2302742851632557585">Alterar palavra-passe no Website</translation> <translation id="2316709634732130529">Utilizar palavra-passe sugerida</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Agora, os seus marcadores, palavras-passe e definições guardados, e muito mais, estão aqui</translation> <translation id="4334428914252001502">1 artigo não lido.</translation> <translation id="4338650699862464074">Envia para a Google os URLs das páginas que visita.</translation> +<translation id="4342054591427973606">{count,plural, =1{Esta morada vai ser eliminada deste e de outros dispositivos com sessão iniciada}other{Estas moradas vão ser eliminadas deste e de outros dispositivos com sessão iniciada}}</translation> <translation id="4343046787186034850">Acesso à câmara e ao microfone permitido</translation> <translation id="4359125752503270327">Esta página abre noutra aplicação.</translation> <translation id="4375040482473363939">Pesquisa de códigos QR</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Inicie sessão com uma conta gerida</translation> <translation id="5234764350956374838">Ignorar</translation> <translation id="5245322853195994030">Cancelar sincronização</translation> +<translation id="5271265092610673171">{count,plural, =1{Um campo obrigatório está vazio. Preencha-o antes de guardar.}other{Alguns campos obrigatórios estão vazios. Preencha-os antes de guardar.}}</translation> <translation id="5271549068863921519">Guardar palavra-passe</translation> <translation id="5295239312320826323">Pretende remover a conta <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Mostrar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 0a92ea5..d1da61c7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Confirmă-ți identitatea ca să te asiguri că ai în permanență acces la datele sincronizate</translation> <translation id="1870148520156231997">Afișează parola</translation> <translation id="1872096359983322073">Lanternă</translation> +<translation id="1886370402958071554">Șterge adresa</translation> <translation id="1891796056033961979">Marcajele salvate, parolele, setările și multe altele sunt disponibile de pe acest ecran.</translation> <translation id="1894023287452300670">Urmărește prețul aici</translation> <translation id="1911619930368729126">Încarcă în Google Drive</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Rafinează</translation> <translation id="2273327106802955778">Meniul Mai multe</translation> <translation id="2286505070150039482">Text evidențiat</translation> +<translation id="2287614783861766820">{count,plural, =1{Adresa se va șterge de pe acest dispozitiv.}few{Adresele se vor șterge de pe dispozitiv.}other{Adresele se vor șterge de pe dispozitiv.}}</translation> <translation id="2299218006564889602">Parolele tale sunt criptate pe dispozitiv înainte să se salveze în Managerul de parole Google.</translation> <translation id="2302742851632557585">Schimbă parola pentru site</translation> <translation id="2316709634732130529">Folosește parola sugerată</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Marcajele, parolele, setările salvate și multe altele se găsesc acum aici</translation> <translation id="4334428914252001502">Un articol necitit.</translation> <translation id="4338650699862464074">Trimite la Google adresele URL ale paginilor pe care le accesezi.</translation> +<translation id="4342054591427973606">{count,plural, =1{Adresa se va șterge de pe acest dispozitiv și de pe celelalte dispozitive conectate}few{Adresele se vor șterge de pe acest dispozitiv și de pe celelalte dispozitive conectate.}other{Adresele se vor șterge de pe acest dispozitiv și de pe celelalte dispozitive conectate.}}</translation> <translation id="4343046787186034850">Se acordă acces la camera foto și microfon</translation> <translation id="4359125752503270327">Această pagină se va deschide în altă aplicație.</translation> <translation id="4375040482473363939">Căutare coduri QR</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Conectează-te cu un cont gestionat</translation> <translation id="5234764350956374838">Închide</translation> <translation id="5245322853195994030">Anulează sincronizarea</translation> +<translation id="5271265092610673171">{count,plural, =1{Un câmp obligatoriu este necompletat. Completează-l înainte de a salva.}few{Unele câmpuri obligatorii sunt necompletate. Completează-le înainte de a salva.}other{Unele câmpuri obligatorii sunt necompletate. Completează-le înainte de a salva.}}</translation> <translation id="5271549068863921519">Salvează parola</translation> <translation id="5295239312320826323">Elimini contul <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Afișează</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 9a388ba6..c2edcfc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Чтобы никогда не терять доступ к синхронизированным данным, подтвердите свою личность.</translation> <translation id="1870148520156231997">Показать пароль</translation> <translation id="1872096359983322073">Вспышка</translation> +<translation id="1886370402958071554">Удалить адрес</translation> <translation id="1891796056033961979">Здесь теперь хранятся ваши закладки, пароли, настройки и многое другое.</translation> <translation id="1894023287452300670">Отслеживайте цены здесь</translation> <translation id="1911619930368729126">Загрузить на Google Диск</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Уточнить</translation> <translation id="2273327106802955778">Меню "Ещё"</translation> <translation id="2286505070150039482">Выделенный текст</translation> +<translation id="2287614783861766820">{count,plural, =1{Адрес будет удален с устройства.}one{Адреса будут удалены с устройства.}few{Адреса будут удалены с устройства.}many{Адреса будут удалены с устройства.}other{Адреса будут удалены с устройства.}}</translation> <translation id="2299218006564889602">Ваши пароли шифруются на устройстве и только потом сохраняются в Google Менеджере паролей.</translation> <translation id="2302742851632557585">Сменить пароль на сайте</translation> <translation id="2316709634732130529">Использовать предложенный пароль</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Теперь здесь хранятся ваши закладки, пароли, настройки и многое другое</translation> <translation id="4334428914252001502">1 непрочитанная статья.</translation> <translation id="4338650699862464074">Отправлять URL страниц, которые вы посещаете, в Google.</translation> +<translation id="4342054591427973606">{count,plural, =1{Адрес будет удален с этого и других устройств, на которых выполнен вход в аккаунт.}one{Адреса будут удалены с этого и других устройств, на которых выполнен вход в аккаунт.}few{Адреса будут удалены с этого и других устройств, на которых выполнен вход в аккаунт.}many{Адреса будут удалены с этого и других устройств, на которых выполнен вход в аккаунт.}other{Адреса будут удалены с этого и других устройств, на которых выполнен вход в аккаунт.}}</translation> <translation id="4343046787186034850">Доступ к камере и микрофону разрешен</translation> <translation id="4359125752503270327">Страница откроется в другом приложении.</translation> <translation id="4375040482473363939">Поиск по QR-коду</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Вход в управляемый аккаунт</translation> <translation id="5234764350956374838">Закрыть</translation> <translation id="5245322853195994030">Отключить</translation> +<translation id="5271265092610673171">{count,plural, =1{Пропущено обязательное поле. Заполните его.}one{Пропущены обязательные поля. Заполните их.}few{Пропущены обязательные поля. Заполните их.}many{Пропущены обязательные поля. Заполните их.}other{Пропущены обязательные поля. Заполните их.}}</translation> <translation id="5271549068863921519">Сохранить пароль</translation> <translation id="5295239312320826323">Удалить аккаунт <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Показать</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 8d078fe6..c1703ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -318,6 +318,7 @@ <translation id="3227137524299004712">මයික්රෆෝනය:</translation> <translation id="3240426699337459095">සබැඳිය පිටපත් කරන ලදි</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">ඔබේ වෙනස සුරැකිය නොහැකි විය.</translation> <translation id="3252394070589632019"><ph name="NUM_SUGGESTIONS" />කින් <ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /></translation> <translation id="3268451620468152448">ටැබ විවෘත කරන්න</translation> <translation id="3272527697863656322">අවලංගු කරන්න</translation> @@ -340,6 +341,7 @@ <translation id="3445288400492335833">මිනි <ph name="MINUTES" /></translation> <translation id="3448016392200048164">විභෙදුම් දසුන</translation> <translation id="345565170154308620">මුරපද කළමනා කරන්න...</translation> +<translation id="3464194322481586217">මිල හඹා යාමට නොහැකි විය.</translation> <translation id="3469166899695866866">බාගැනීම නවතන්න</translation> <translation id="3470502288861289375">පිටපත් කෙරෙමින්...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} අඩවියක් හෝ යෙදුමක් සඳහා}one{අඩවි සහ යෙදුම් {COUNT}ක් සඳහා}other{අඩවි සහ යෙදුම් {COUNT}ක් සඳහා}}</translation> @@ -768,6 +770,7 @@ <translation id="6464397691496239022">ඔබේ බ්රවුස් කිරීමේ අත්දැකීම වැඩිදියුණු කිරීමට, උදාහරණයක් වශයෙන්, ඔබව පුරා තබා ගැනීමට හෝ ඔබේ සාප්පු සවාරි කරත්තයේ අයිතම මතක තබා ගැනීමට වෙබ් අඩවිවලට කුකි භාවිත කළ හැකිය. විවිධ වෙබ් අඩවි හරහා ඔබේ බ්රවුස් කිරීමේ ක්රියාකාරකම් බැලීමට, උදාහරණයක් වශයෙන්, වෙළඳ දැන්වීම් පෞද්ගලීකරණය කිරීමට වෙබ් අඩවිවලට කුකි භාවිත කළ නොහැකිය.</translation> +<translation id="6476253015009698798">මෙම පිටුව සඳහා මිල හඹා යෑමක් නොමැත.</translation> <translation id="6476800141292307438">පිටුව <ph name="LANGUAGE" />ට පරිවර්තන කෙරේ. තිරයේ පහළ කොටස ළඟ විකල්ප ලැබේ.</translation> <translation id="648164694371393720">සත්යාපන දෝෂයකි</translation> <translation id="6482629121755362506">අයිතම <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ක් මකන ලදි</translation> @@ -819,6 +822,7 @@ <translation id="6780034285637185932">ZIP කේතය</translation> <translation id="6781260999953472352">සමමුහුර්ත කිරීම ක්රියාත්මක කරන්නද?</translation> <translation id="6785453220513215166">බිඳ වැටීම් වාර්තාව යවමින්...</translation> +<translation id="6790502149545262384">ළඟදීම, ඔබ නව පටිත්තක් විවෘත කරන විට <ph name="CHANNEL_NAME" /> වෙතින් නව කතන්දර දකිනු ඇත.</translation> <translation id="6797885426782475225">හඬ සෙවීම</translation> <translation id="6801927553864092214">පෞද්ගලිකව බ්රවුස් කිරීමට, අප්රකට ටැබයක් විවෘත කරන්න</translation> <translation id="6807889908376551050">සියල්ල පෙන්වන්න...</translation> @@ -1129,6 +1133,7 @@ <translation id="9137526406337347448">Google සේවා</translation> <translation id="9148126808321036104">නැවත පිවිසෙන්න</translation> <translation id="9157836665414082580">සංවාද යටපත් කරන්න</translation> +<translation id="9162432979321511934">මුරපද ස්වයං පිරවුම ක්රියාත්මක කරන්න</translation> <translation id="9165320910061267720">මිල පහත වැටීමේ ඇඟවීම් පිළිබඳ දැනුම්දීම් ලබා ගැනීම සඳහා, ඔබට ඔබේ iOS සැකසීම් තුළ දැනුම්දීම් ක්රියාත්මක කිරීමට අවශ්ය වනු ඇත.</translation> <translation id="9177438225260810839">විවෘත ටැබ සොයන්න</translation> <translation id="9188680907066685419">කළමනාකරණය කළ ගිණුමෙන් වරන්න</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 28315ba8..8c5a835 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Če želite poskrbeti, da boste vedno lahko dostopali do sinhroniziranih podatkov, potrdite, da ste to vi.</translation> <translation id="1870148520156231997">Razkrijte geslo</translation> <translation id="1872096359983322073">Svetilka</translation> +<translation id="1886370402958071554">Izbriši naslov</translation> <translation id="1891796056033961979">Vaši shranjeni zaznamki, gesla, nastavitve in drugo so na voljo na tem zaslonu.</translation> <translation id="1894023287452300670">Spremljajte ceno tukaj.</translation> <translation id="1911619930368729126">Prenos v Google Drive</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Izboljšaj iskanje</translation> <translation id="2273327106802955778">More menu</translation> <translation id="2286505070150039482">Označeno besedilo</translation> +<translation id="2287614783861766820">{count,plural, =1{Ta naslov bo izbrisan iz te naprave.}one{Ti naslovi bodo izbrisani iz te naprave.}two{Ti naslovi bodo izbrisani iz te naprave.}few{Ti naslovi bodo izbrisani iz te naprave.}other{Ti naslovi bodo izbrisani iz te naprave.}}</translation> <translation id="2299218006564889602">Gesla se šifrirajo v napravi, preden se shranijo v Google Upravitelju gesel.</translation> <translation id="2302742851632557585">Spremeni geslo na spletnem mestu</translation> <translation id="2316709634732130529">Uporabi predlagano geslo</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Vaši shranjeni zaznamki, gesla, nastavitve in drugo so zdaj tukaj.</translation> <translation id="4334428914252001502">1 neprebran članek.</translation> <translation id="4338650699862464074">Googlu pošlje URL-je strani, ki jih obiščete.</translation> +<translation id="4342054591427973606">{count,plural, =1{Ta naslov bo izbrisan iz te in drugih naprav, v katerih ste prijavljeni.}one{Ti naslovi bodo izbrisani iz te naprave in drugih naprav, v katerih ste prijavljeni.}two{Ti naslovi bodo izbrisani iz te naprave in drugih naprav, v katerih ste prijavljeni.}few{Ti naslovi bodo izbrisani iz te naprave in drugih naprav, v katerih ste prijavljeni.}other{Ti naslovi bodo izbrisani iz te naprave in drugih naprav, v katerih ste prijavljeni.}}</translation> <translation id="4343046787186034850">Dostop do kamere in mikrofona je odobren</translation> <translation id="4359125752503270327">This page will open in another application.</translation> <translation id="4375040482473363939">Iskanje kod QR</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Prijava z upravljanim računom</translation> <translation id="5234764350956374838">Opusti</translation> <translation id="5245322853195994030">Prekliči sinhronizacijo</translation> +<translation id="5271265092610673171">{count,plural, =1{Obvezno polje je prazno. Pred shranjevanjem ga izpolnite.}one{Nekatera obvezna polja so prazna. Pred shranjevanjem jih izpolnite.}two{Nekatera obvezna polja so prazna. Pred shranjevanjem jih izpolnite.}few{Nekatera obvezna polja so prazna. Pred shranjevanjem jih izpolnite.}other{Nekatera obvezna polja so prazna. Pred shranjevanjem jih izpolnite.}}</translation> <translation id="5271549068863921519">Shrani geslo</translation> <translation id="5295239312320826323">Želite odstraniti račun <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">Pokaži</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index da1d184d..43a5cb2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Gozhdimi i skedës</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementë u lëvizën</translation> <translation id="2122754583996902531">Shfletuesi yt është i menaxhuar. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Të aktivizohen sinjalizimet për çmimet?</translation> <translation id="2139867232736819575">Kërko për tekstin që kopjove</translation> <translation id="214201757571129614">Identifikohu…</translation> <translation id="2149973817440762519">Redakto faqeshënuesin</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Shfaq historikun</translation> <translation id="2800683595868705743">Largohu nga "Ndërruesi i skedave"</translation> <translation id="2815198996063984598">2. Trokit tek "Aplikacioni i parazgjedhur i shfletuesit"</translation> +<translation id="2822917246944009066">Skeda u gozhdua</translation> <translation id="2830972654601096923">Menaxho adresat...</translation> <translation id="2834399722155632105">3. Trokit tek "Opsionet e fjalëkalimeve"</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin" dhe shumë të tjera</translation> <translation id="7435356471928173109">Çaktivizuar nga administratori yt</translation> <translation id="7438481509621345350">Tani do të shikosh histori nga <ph name="CHANNEL_NAME" /> kur të hapësh një skedë të re.</translation> +<translation id="7446583256109515732">Skeda u zhgozhdua</translation> <translation id="7454057999980797137">Shteti / Qarku</translation> <translation id="7459628154744868585">Mbrojtja e përmirësuar është aktive</translation> <translation id="746684838091935575">3. Zgjidh Chrome</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Identifikohu sërish</translation> <translation id="9157836665414082580">Fshih dialogjet</translation> <translation id="9162432979321511934">Aktivizo "Plotëso automatikisht fjalëkalimet"</translation> +<translation id="9165320910061267720">Për të marrë njoftime me sinjalizime për ulje çmimi, do të duhet të aktivizosh njoftimet në cilësimet e iOS.</translation> <translation id="9177438225260810839">Kërko skedat e hapura</translation> <translation id="9188680907066685419">Dil nga llogaria e menaxhuar</translation> <translation id="9193147658040604536">Zvarrite skedën këtu për ta gozhduar</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 ec2aaead..92263592 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Izbor direktorijuma</translation> <translation id="1254424942107648268">Pronalazi prethodno</translation> <translation id="1258491128795710625">Šta je novo</translation> +<translation id="1264156759663453185">Izabrani tekst je preveliki za delimični prevod.</translation> <translation id="1265739287306757398">Saznajte kako</translation> <translation id="1272079795634619415">Zaustavi</translation> <translation id="1275718070701477396">Izabrano je</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Nadimak</translation> <translation id="1700629756560807968">Broj izabranih stavki je <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1715515772563243997">Ako veb-sajt <ph name="SITE" /> smatrate pouzdanim, možete da koristite sačuvanu lozinku za prijavljivanje.</translation> +<translation id="173842016780303328">Delimično prevođenje nije uspelo.</translation> <translation id="1740468249224277719">Dodirnite dvaput da biste instalirali.</translation> <translation id="1752547299766512813">Sačuvane lozinke</translation> <translation id="1753905327828125965">Najposećenije</translation> @@ -241,6 +243,7 @@ <translation id="2747003861858887689">Prethodno polje</translation> <translation id="2749231692441336879">Pratite kanal <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">malopre</translation> +<translation id="2768727608073497433">Izabrani tekst je prazan.</translation> <translation id="2773292004659987824">Pretraga bez arhiviranja</translation> <translation id="277771892408211951">Izaberite jezik</translation> <translation id="2780046210906776326">Nema naloga e-pošte</translation> @@ -700,6 +703,7 @@ <translation id="6066301408025741299">Dodirnite da biste otkazali.</translation> <translation id="6071409777669089905">Otkači karticu</translation> <translation id="6084848228346514841">Izaberite kartice</translation> +<translation id="6100617279104942061">Prijavljeni ste kao <ph name="USER_EMAIL" />. Otvara podešavanja.</translation> <translation id="6103540626693881831">Šifrovanje na uređaju</translation> <translation id="6119050551270742952">Aktuelna veb-stranica je u režimu bez arhiviranja</translation> <translation id="6122191549521593678">Onlajn</translation> @@ -1129,6 +1133,7 @@ <translation id="9098541895599151034">Želite li da izbrišete lozinke za <ph name="NUMBER_OF_ACCOUNTS" /> naloga?</translation> <translation id="9100610230175265781">Potrebna je pristupna fraza</translation> <translation id="9107664647686727385">Traže ugrožene lozinke</translation> +<translation id="9120217828624527905">Pređite na prevod cele stranice</translation> <translation id="9124387962554796433">Google može da koristi istoriju za personalizaciju Pretrage i drugih Google usluga.</translation> <translation id="9137526406337347448">Google usluge</translation> <translation id="9148126808321036104">Prijavi me ponovo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 8e98382..2a649476 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">Избор директоријума</translation> <translation id="1254424942107648268">Проналази претходно</translation> <translation id="1258491128795710625">Шта је ново</translation> +<translation id="1264156759663453185">Изабрани текст је превелики за делимични превод.</translation> <translation id="1265739287306757398">Сазнајте како</translation> <translation id="1272079795634619415">Заустави</translation> <translation id="1275718070701477396">Изабрано је</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">Надимак</translation> <translation id="1700629756560807968">Број изабраних ставки је <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1715515772563243997">Ако веб-сајт <ph name="SITE" /> сматрате поузданим, можете да користите сачувану лозинку за пријављивање.</translation> +<translation id="173842016780303328">Делимично превођење није успело.</translation> <translation id="1740468249224277719">Додирните двапут да бисте инсталирали.</translation> <translation id="1752547299766512813">Сачуване лозинке</translation> <translation id="1753905327828125965">Најпосећеније</translation> @@ -241,6 +243,7 @@ <translation id="2747003861858887689">Претходно поље</translation> <translation id="2749231692441336879">Пратите канал <ph name="CHANNEL_NAME" /></translation> <translation id="2764831210418622012">малопре</translation> +<translation id="2768727608073497433">Изабрани текст је празан.</translation> <translation id="2773292004659987824">Претрага без архивирања</translation> <translation id="277771892408211951">Изаберите језик</translation> <translation id="2780046210906776326">Нема налога е-поште</translation> @@ -700,6 +703,7 @@ <translation id="6066301408025741299">Додирните да бисте отказали.</translation> <translation id="6071409777669089905">Откачи картицу</translation> <translation id="6084848228346514841">Изаберите картице</translation> +<translation id="6100617279104942061">Пријављени сте као <ph name="USER_EMAIL" />. Отвара подешавања.</translation> <translation id="6103540626693881831">Шифровање на уређају</translation> <translation id="6119050551270742952">Актуелна веб-страница је у режиму без архивирања</translation> <translation id="6122191549521593678">Онлајн</translation> @@ -1129,6 +1133,7 @@ <translation id="9098541895599151034">Желите ли да избришете лозинке за <ph name="NUMBER_OF_ACCOUNTS" /> налога?</translation> <translation id="9100610230175265781">Потребна је приступна фраза</translation> <translation id="9107664647686727385">Траже угрожене лозинке</translation> +<translation id="9120217828624527905">Пређите на превод целе странице</translation> <translation id="9124387962554796433">Google може да користи историју за персонализацију Претраге и других Google услуга.</translation> <translation id="9137526406337347448">Google услуге</translation> <translation id="9148126808321036104">Пријави ме поново</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index 5910b6c..8a3cb133 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Fäst flik</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> objekt flyttades</translation> <translation id="2122754583996902531">Din webbläsare hanteras. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Vill du aktivera prisaviseringar?</translation> <translation id="2139867232736819575">Sök efter kopierad text</translation> <translation id="214201757571129614">Logga in …</translation> <translation id="2149973817440762519">Redigera bokmärke</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Visa historik</translation> <translation id="2800683595868705743">Stäng funktionen för flikbyte</translation> <translation id="2815198996063984598">2. Tryck på Standardwebbläsarapp</translation> +<translation id="2822917246944009066">Fliken har fästs</translation> <translation id="2830972654601096923">Hantera adresser …</translation> <translation id="2834399722155632105">3. Tryck på Lösenordsalternativ</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Styr hur webbhistoriken får användas för att anpassa Sök med mera</translation> <translation id="7435356471928173109">Inaktiverat av administratören</translation> <translation id="7438481509621345350">Nu visas artiklar från <ph name="CHANNEL_NAME" /> när du öppnar en ny flik.</translation> +<translation id="7446583256109515732">Fliken har lossats</translation> <translation id="7454057999980797137">Delstat/county</translation> <translation id="7459628154744868585">Utökat skydd är aktiverat</translation> <translation id="746684838091935575">3. Välj Chrome</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Logga in igen</translation> <translation id="9157836665414082580">Visa inte dialogrutor</translation> <translation id="9162432979321511934">Aktivera Autofyll lösenord</translation> +<translation id="9165320910061267720">Om du vill få aviseringar om sänkta priser måste du aktivera aviseringar i iOS-inställningarna.</translation> <translation id="9177438225260810839">Sök på öppna flikar</translation> <translation id="9188680907066685419">Logga ut från hanterat konto</translation> <translation id="9193147658040604536">Dra hit för att fästa 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 029c9c2..7a6c953b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Bandikiza Kichupo</translation> <translation id="2116625576999540962">Vipengee <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> vimesogezwa</translation> <translation id="2122754583996902531">Kivinjari chako kinadhibitiwa. <ph name="BEGIN_LINK" />Pata Maelezo Zaidi<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Je, ungependa Kuwasha Arifa kuhusu Bei?</translation> <translation id="2139867232736819575">Tafuta Maandishi Uliyonakili</translation> <translation id="214201757571129614">Ingia Katika Akaunti…</translation> <translation id="2149973817440762519">Badilisha Alamisho</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Onyesha Historia</translation> <translation id="2800683595868705743">Ondoka kwenye Kibadilishaji cha Kichupo</translation> <translation id="2815198996063984598">2. Gusa Programu ya Kivinjari Chaguomsingi</translation> +<translation id="2822917246944009066">Kichupo Kimebandikwa</translation> <translation id="2830972654601096923">Dhibiti Anwani...</translation> <translation id="2834399722155632105">3. Teua Chaguo za Nenosiri</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">Maikrofoni</translation> <translation id="3240426699337459095">Kiungo kimenakiliwa</translation> <translation id="3244271242291266297">MW</translation> +<translation id="3245744387817103524">Imeshindwa kuhifadhi mabadiliko uliyofanya.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> kati ya <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">Fungua Vichupo</translation> <translation id="3272527697863656322">Ghairi</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833">Dakika <ph name="MINUTES" /></translation> <translation id="3448016392200048164">Mwonekano wa Madirisha Mawili</translation> <translation id="345565170154308620">Dhibiti Manenosiri...</translation> +<translation id="3464194322481586217">Imeshindwa kufuatilia bei.</translation> <translation id="3469166899695866866">Ungependa Kuacha Kupakua?</translation> <translation id="3470502288861289375">Inanakili...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{katika tovuti au programu {COUNT}}other{katika tovuti au programu {COUNT}}}</translation> @@ -563,6 +567,7 @@ <translation id="5118713593561876160">Mambo yanayokuvutia</translation> <translation id="5118764316110575523">Imezimwa</translation> <translation id="5119391094379141756">Chagua Chrome</translation> +<translation id="5121618895923301719">Tayari unafuatilia bidhaa hii. Ukurasa huu umehifadhiwa kwenye <ph name="BEGIN_LINK" />Alamisho za Kifaa cha Mkononi<ph name="END_LINK" />.</translation> <translation id="5132942445612118989">Sawazisha historia, manenosiri na mambo yako mengine kwenye vifaa vyote</translation> <translation id="5142890110117755815">{COUNT,plural, =1{Nenosiri {COUNT} Dhaifu}other{Manenosiri {COUNT} Dhaifu}}</translation> <translation id="5149188072385105201">Weka Nenosiri...</translation> @@ -593,6 +598,7 @@ <translation id="5386314158584363703">Utaona tovuti zako unazofuatilia hapa</translation> <translation id="5388358297987318779">Fungua Picha</translation> <translation id="5407969256130905701">Futa Mabadiliko</translation> +<translation id="5414763847370083940">Utapata arifa iwapo bei itapungua kwenye tovuti yoyote.</translation> <translation id="5416022985862681400">Siku 7 Zilizopita</translation> <translation id="5423269318075950257">Fuatilia Bei</translation> <translation id="543338862236136125">Badilisha nenosiri</translation> @@ -764,6 +770,7 @@ <translation id="6464397691496239022">Tovuti zinaweza kutumia vidakuzi ili kuboresha hali yako ya kuvinjari, kwa mfano, ili kufanya ubaki ukiwa umeingia katika akaunti au kukumbuka bidhaa zilizo kwenye kikapu chako cha ununuzi. Tovuti haziwezi kutumia vidakuzi kuona shughuli zako za kuvinjari kwenye tovuti mbalimbali, kwa mfano, kukuonyesha matangazo yanayokufaa zaidi.</translation> +<translation id="6476253015009698798">Ufuatiliaji bei haupatikani katika ukurasa huu.</translation> <translation id="6476800141292307438">Inatafsiri ukurasa katika <ph name="LANGUAGE" />. Chaguo zinapatikana karibu na sehemu ya chini ya skrini.</translation> <translation id="648164694371393720">Hitilafu ya Uthibitishaji</translation> <translation id="6482629121755362506">Vifaa <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> vimefutwa</translation> @@ -815,6 +822,7 @@ <translation id="6780034285637185932">Msimbo wa Eneo</translation> <translation id="6781260999953472352">Ungependa Kuwasha Kipengele cha Kusawazisha?</translation> <translation id="6785453220513215166">Inatuma ripoti ya kuacha kufanya kazi...</translation> +<translation id="6790502149545262384">Hivi karibuni, utaona hadithi kutoka <ph name="CHANNEL_NAME" /> unapofungua kichupo kipya.</translation> <translation id="6797885426782475225">Kutafuta kwa Kutamka</translation> <translation id="6801927553864092214">Ili uvinjari kwa faragha, fungua kichupo fiche</translation> <translation id="6807889908376551050">Onyesha Zote...</translation> @@ -894,6 +902,7 @@ <translation id="7431991332293347422">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo kwenye huduma ya Tafuta na Google na zaidi</translation> <translation id="7435356471928173109">Kimezimwa na msimamizi wako</translation> <translation id="7438481509621345350">Sasa utaona habari kutoka <ph name="CHANNEL_NAME" /> unapofungua kichupo kipya.</translation> +<translation id="7446583256109515732">Kichupo Kimebanduliwa</translation> <translation id="7454057999980797137">Jimbo / Mkoa</translation> <translation id="7459628154744868585">Kipengele cha Ulinzi Ulioboreshwa kimewashwa</translation> <translation id="746684838091935575">3. Chagua Chrome</translation> @@ -1124,6 +1133,8 @@ <translation id="9137526406337347448">Huduma za Google</translation> <translation id="9148126808321036104">Ingia tena</translation> <translation id="9157836665414082580">Zima Vidirisha</translation> +<translation id="9162432979321511934">Washa Kipengele cha Kujaza Manenosiri Kiotomatiki</translation> +<translation id="9165320910061267720">Ili upate arifa za kushuka kwa bei, utahitaji kuwasha arifa kwenye mipangilio yako ya iOS.</translation> <translation id="9177438225260810839">Tafuta kwenye Vichupo Wazi</translation> <translation id="9188680907066685419">Ondoka kwenye akaunti inayodhibitiwa</translation> <translation id="9193147658040604536">Buruta hapa ili Ubandike Kichupo</translation> @@ -1136,6 +1147,7 @@ <translation id="952704832371081537">Ghairi</translation> <translation id="953008885340860025">Umeondoka katika akaunti kwenye Chrome</translation> <translation id="959066944189734975">Unafuatilia <ph name="CHANNEL_NAME" /></translation> +<translation id="973493300226275298">Fuatilia bei ya bidhaa kwenye maduka ya mtandaoni. Utapata arifa iwapo bei itapungua</translation> <translation id="980712131080209571">N</translation> <translation id="981498610235328462">Shirika lako hukuruhusu kuingia kwa kutumia baadhi ya akaunti tu. Akaunti zisizoruhusiwa zimefichwa.</translation> <translation id="984509647832111802">Kipengele cha Kusawazisha Hakifanyi Kazi.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 252099d0..ef127db 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">தாவலைப் பொருத்து</translation> <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> உருப்படிகள் நகர்த்தப்பட்டன</translation> <translation id="2122754583996902531">உங்கள் உலாவி நிர்வகிக்கப்படுகிறது. <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">விலை குறித்த அறிவிப்புகளை இயக்கவா?</translation> <translation id="2139867232736819575">நீங்கள் நகலெடுத்த உரையைத் தேடவும்</translation> <translation id="214201757571129614">உள்நுழைக…</translation> <translation id="2149973817440762519">புக்மார்க்கை மாற்றுக</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">பதிவுகளைக் காட்டு</translation> <translation id="2800683595868705743">தாவல் மாற்றியிலிருந்து வெளியேறு</translation> <translation id="2815198996063984598">2. இயல்பு உலாவி ஆப்ஸ் என்பதைத் தட்டவும்</translation> +<translation id="2822917246944009066">பக்கம் பின் செய்யப்பட்டது</translation> <translation id="2830972654601096923">முகவரிகளை நிர்வகி...</translation> <translation id="2834399722155632105">3. கடவுச்சொல் விருப்பங்கள் என்பதைத் தட்டவும்</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -316,6 +318,7 @@ <translation id="3227137524299004712">மைக்ரோஃபோன்</translation> <translation id="3240426699337459095">இணைப்பு நகலெடுக்கப்பட்டது</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">நீங்கள் செய்த மாற்றத்தைச் சேமிக்க முடியவில்லை.</translation> <translation id="3252394070589632019"><ph name="VALUE" />, <ph name="ADDITIONAL_INFO" />, <ph name="INDEX" /> / <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">திறந்த தத்தல்கள்</translation> <translation id="3272527697863656322">ரத்துசெய்</translation> @@ -338,6 +341,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> நி.</translation> <translation id="3448016392200048164">காட்சிப் பிரிப்பு</translation> <translation id="345565170154308620">கடவுச்சொற்களை நிர்வகி...</translation> +<translation id="3464194322481586217">விலையைக் கண்காணிக்க முடியவில்லை.</translation> <translation id="3469166899695866866">பதிவிறக்கத்தை நிறுத்தவா?</translation> <translation id="3470502288861289375">நகலெடுக்கிறது...</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} தளம் அல்லது ஆப்ஸுக்கு}other{{COUNT} தளங்கள் அல்லது ஆப்ஸுக்கு}}</translation> @@ -766,6 +770,7 @@ <translation id="6464397691496239022">உங்கள் உலாவல் அனுபவத்தை மேம்படுத்துவதற்காக (எ.கா., உங்களை உள்நுழைந்தபடியே வைத்திருப்பது, உங்கள் ஷாப்பிங் கார்ட்டில் உள்ளவற்றை நினைவில் கொள்வது போன்றவை) குக்கீகளைத் தளங்கள் பயன்படுத்த முடியும். விளம்பரங்களைப் பிரத்தியேகமாக்குவது போன்ற செயல்களைச் செய்வதற்காக வெவ்வேறு தளங்களில் உங்களின் உலாவல் செயல்பாட்டைப் பார்க்க, தளங்களால் குக்கீகளைப் பயன்படுத்த முடியாது.</translation> +<translation id="6476253015009698798">இந்தப் பக்கத்தில் உள்ளவற்றின் விலையைக் கண்காணிக்க முடியாது.</translation> <translation id="6476800141292307438">பக்கத்தை <ph name="LANGUAGE" /> மொழியில் மொழிபெயர்க்கிறது. திரையின் கீழ்ப்பகுதிக்கு அருகில் விருப்பத்தேர்வுகள் உள்ளன.</translation> <translation id="648164694371393720">அங்கீகாரப் பிழை</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> உருப்படிகள் நீக்கப்பட்டன</translation> @@ -817,6 +822,7 @@ <translation id="6780034285637185932">அஞ்சல் குறியீடு</translation> <translation id="6781260999953472352">ஒத்திசைவை இயக்கவா?</translation> <translation id="6785453220513215166">சிதைவு அறிக்கையை அனுப்புகிறது...</translation> +<translation id="6790502149545262384">விரைவில், புதிய பக்கத்தைத் திறக்கும்போது <ph name="CHANNEL_NAME" /> சேனலில் உள்ள கதைகள் காட்டப்படும்.</translation> <translation id="6797885426782475225">குரல் தேடல்</translation> <translation id="6801927553864092214">தனிப்பட்ட முறையில் உலாவ, மறைநிலைத் தாவலைத் திறக்கவும்</translation> <translation id="6807889908376551050">எல்லாவற்றையும் காட்டு...</translation> @@ -896,6 +902,7 @@ <translation id="7431991332293347422">தேடல் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation> <translation id="7435356471928173109">உங்கள் நிர்வாகி முடக்கியுள்ளார்</translation> <translation id="7438481509621345350">புதிய உலாவிப் பக்கத்தைத் திறக்கும்போது, <ph name="CHANNEL_NAME" /> வழங்கும் கதைகள் காட்டப்படும்.</translation> +<translation id="7446583256109515732">பக்கம் பிரித்தெடுக்கப்பட்டது</translation> <translation id="7454057999980797137">மாநிலம் / மாகாணம்</translation> <translation id="7459628154744868585">மேம்பட்ட பாதுகாப்பு இயக்கப்பட்டுள்ளது</translation> <translation id="746684838091935575">3. Chromeமைத் தேர்ந்தெடுக்கவும்</translation> @@ -1126,6 +1133,8 @@ <translation id="9137526406337347448">Google சேவைகள்</translation> <translation id="9148126808321036104">மீண்டும் உள்நுழைக</translation> <translation id="9157836665414082580">உரையாடல்களை மறை</translation> +<translation id="9162432979321511934">தன்னிரப்பிக் கடவுச்சொற்களை இயக்கு</translation> +<translation id="9165320910061267720">விலை குறைவு தொடர்பான அறிவிப்புகளைப் பெற, உங்கள் iOS அமைப்புகளில் அறிவிப்புகளை இயக்க வேண்டும்.</translation> <translation id="9177438225260810839">திறந்துள்ள உலாவிப் பக்கங்களைத் தேடுதல்</translation> <translation id="9188680907066685419">நிர்வகிக்கப்படும் கணக்கிலிருந்து வெளியேறு</translation> <translation id="9193147658040604536">பக்கத்தைப் பின் செய்ய இங்கே இழுக்கவும்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 3b01a99..f61cf839 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -226,7 +226,6 @@ <translation id="2648803196158606475">ลบรายการที่อ่านแล้ว</translation> <translation id="2653659639078652383">ส่ง</translation> <translation id="2664621323652615289">หยุด</translation> -<translation id="2667896873740639878">บันทึกที่อยู่นี้ไว้ในบัญชี Google ของคุณ (<ph name="USER_EMAIL" />) แล้ว คุณสามารถใช้ที่อยู่นี้กับผลิตภัณฑ์ต่างๆ ของ Google ในอุปกรณ์ใดก็ได้</translation> <translation id="2671426118752779020">คุณใช้รหัสผ่านที่บันทึกอยู่ในเครื่องมือจัดการรหัสผ่านบน Google ในแอปอื่นๆ บน iPhone ได้</translation> <translation id="2690858294534178585">ใช้กล้องถ่ายรูปอยู่</translation> <translation id="26915454213703967">ค้นหาในรูปภาพด้วย Google</translation> @@ -672,7 +671,6 @@ <translation id="5860033963881614850">ปิด</translation> <translation id="5869029295770560994">รับทราบ</translation> <translation id="5871497086027727873">ย้ายแล้ว 1 รายการ</translation> -<translation id="5881445640183527870">{count,plural, =1{ระบบจะลบที่อยู่นี้ออกจากบัญชี Google ของคุณ (<ph name="USER_EMAIL" />) และอุปกรณ์เครื่องนี้}other{ระบบจะลบที่อยู่เหล่านี้ออกจากบัญชี Google ของคุณ (<ph name="USER_EMAIL" />) และอุปกรณ์เครื่องนี้}}</translation> <translation id="5896576662943111387">สร้างขึ้นเพื่อ iOS</translation> <translation id="5897956970858271241">ไปที่ลิงก์ที่คัดลอก</translation> <translation id="5899314093904173337">ให้คนที่อยู่ใกล้ๆ สแกนคิวอาร์โค้ดนี้โดยใช้กล้องหรือแอปสแกนคิวอาร์โค้ดเพื่อแชร์</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index b99926f..c344a04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -159,6 +159,7 @@ <translation id="21133533946938348">Закріпити вкладку</translation> <translation id="2116625576999540962">Переміщено елементів: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="2122754583996902531">Вашим веб-переглядачем керує адміністратор. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> +<translation id="2139502497535990641">Увімкнути сповіщення про змінення цін?</translation> <translation id="2139867232736819575">Шукати скопійований текст</translation> <translation id="214201757571129614">Увійти…</translation> <translation id="2149973817440762519">Редагувати закладку</translation> @@ -251,6 +252,7 @@ <translation id="2797029671965852011">Показати історію</translation> <translation id="2800683595868705743">Закрити перемикач вкладок</translation> <translation id="2815198996063984598">2. Натисніть "Веб-переглядач за умовчанням"</translation> +<translation id="2822917246944009066">Вкладку закріплено</translation> <translation id="2830972654601096923">Керувати адресами…</translation> <translation id="2834399722155632105">3. Натисніть "Параметри паролів"</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> @@ -900,6 +902,7 @@ <translation id="7431991332293347422">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку тощо</translation> <translation id="7435356471928173109">Вимкнено адміністратором</translation> <translation id="7438481509621345350">Тепер, відкривши нову вкладку, ви будете бачити історії із сайту <ph name="CHANNEL_NAME" />.</translation> +<translation id="7446583256109515732">Вкладку відкріплено</translation> <translation id="7454057999980797137">Область</translation> <translation id="7459628154744868585">Покращений захист увімкнено</translation> <translation id="746684838091935575">3. Виберіть Chrome</translation> @@ -1131,6 +1134,7 @@ <translation id="9148126808321036104">Увійти знову</translation> <translation id="9157836665414082580">Заблокувати діалогові вікна</translation> <translation id="9162432979321511934">Увімкніть автозаповнення паролів</translation> +<translation id="9165320910061267720">Щоб отримувати сповіщення про зниження цін, увімкніть їх у налаштуваннях iOS.</translation> <translation id="9177438225260810839">Шукати у відкритих вкладках</translation> <translation id="9188680907066685419">Вийти з керованого облікового запису</translation> <translation id="9193147658040604536">Щоб закріпити вкладку, перетягніть її сюди</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 5a50894c..75690d8a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -47,6 +47,7 @@ <translation id="1254117744268754948">فولڈر کا انتخاب کریں</translation> <translation id="1254424942107648268">پچھلا تلاش کریں</translation> <translation id="1258491128795710625">نیا کیا ہے</translation> +<translation id="1264156759663453185">منتخب کردہ ٹیکسٹ جزوی ترجمہ کے لیے بہت بڑا ہے۔</translation> <translation id="1265739287306757398">طریقہ جانیں</translation> <translation id="1272079795634619415">روکیں</translation> <translation id="1275718070701477396">منتخب</translation> @@ -116,6 +117,7 @@ <translation id="1689333818294560261">عرفی نام</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> کو منتخب کیا گیا</translation> <translation id="1715515772563243997">اگر آپ کو <ph name="SITE" /> پر اعتماد ہے تو آپ سائن ان کرنے کے لیے محفوظ کردہ پاس ورڈ استعمال کر سکتے ہیں۔</translation> +<translation id="173842016780303328">جزوی ترجمہ ناکام ہو گیا۔</translation> <translation id="1740468249224277719">انسٹال کرنے کیلئے دو بار تھپتھپائیں۔</translation> <translation id="1752547299766512813">پاس ورڈز محفوظ کریں</translation> <translation id="1753905327828125965">سب سے زیادہ ملاحظہ کردہ</translation> @@ -128,6 +130,7 @@ <translation id="1832848789136765277">یقینی بنانے کیلئے کہ آپ اپنے مطابقت پذیر ڈیٹا تک ہمیشہ رسائی حاصل کر سکتے ہیں، توثیق کریں کہ یہ آپ ہیں</translation> <translation id="1870148520156231997">پاس ورڈ ظاہر کریں</translation> <translation id="1872096359983322073">ٹارچ</translation> +<translation id="1886370402958071554">پتہ حذف کریں</translation> <translation id="1891796056033961979">آپ کے محفوظ کردہ بُک مارکس، پاس ورڈز، ترتیبات وغیرہ اب اس اسکرین سے قابل رسائی ہیں۔</translation> <translation id="1894023287452300670">قیمت کو یہاں ٹریک کریں</translation> <translation id="1911619930368729126">Google Drive میں اپ لوڈ کریں</translation> @@ -177,6 +180,7 @@ <translation id="2268044343513325586">بہتر بنائیں</translation> <translation id="2273327106802955778">مزید مینو</translation> <translation id="2286505070150039482">نمایاں کردہ ٹیکسٹ</translation> +<translation id="2287614783861766820">{count,plural, =1{یہ پتہ اس آلے سے حذف ہو جائے گا۔}other{یہ پتے اس آلے سے حذف ہو جائیں گے۔}}</translation> <translation id="2299218006564889602">آپ کے پاس ورڈز Google پاس ورڈ مینیجر میں محفوظ ہونے سے پہلے آپ کے آلے پر مرموز ہو ہوتا ہے۔</translation> <translation id="2302742851632557585">ویب سائٹ پر پاس ورڈ تبدیل کریں</translation> <translation id="2316709634732130529">تجویز کردہ پاس ورڈ استعمال کریں</translation> @@ -241,6 +245,7 @@ <translation id="2747003861858887689">پچھلا فیلڈ</translation> <translation id="2749231692441336879"><ph name="CHANNEL_NAME" /> کی پیروی کی جا رہی ہے</translation> <translation id="2764831210418622012">ابھی ابھی</translation> +<translation id="2768727608073497433">منتخب کردہ ٹیکسٹ خالی ہے۔</translation> <translation id="2773292004659987824">پوشیدگی وضع میں تلاش کریں</translation> <translation id="277771892408211951">زبان منتخب کریں</translation> <translation id="2780046210906776326">کوئی ای میل اکاؤنٹس نہیں ہیں</translation> @@ -318,6 +323,7 @@ <translation id="3227137524299004712">مائیکروفون</translation> <translation id="3240426699337459095">لنک کاپی ہوگیا</translation> <translation id="3244271242291266297">MM</translation> +<translation id="3245744387817103524">آپ کی تبدیلی محفوظ نہیں ہو سکی۔</translation> <translation id="3252394070589632019"><ph name="VALUE" />، <ph name="ADDITIONAL_INFO" />، <ph name="INDEX" /> از <ph name="NUM_SUGGESTIONS" /></translation> <translation id="3268451620468152448">کھلے ٹیبز</translation> <translation id="3272527697863656322">منسوخ کریں</translation> @@ -340,6 +346,7 @@ <translation id="3445288400492335833"><ph name="MINUTES" /> منٹ</translation> <translation id="3448016392200048164">تقسیم کا منظر</translation> <translation id="345565170154308620">پاس ورڈز کا نظم کریں...</translation> +<translation id="3464194322481586217">قیمت ٹریک نہیں کی جا سکی۔</translation> <translation id="3469166899695866866">ڈاؤن لوڈ روکیں؟</translation> <translation id="3470502288861289375">کاپی کیے جا رہے ہیں…</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} سائٹ یا ایپ کے لیے}other{{COUNT} سائٹس یا ایپس کے لیے}}</translation> @@ -456,6 +463,7 @@ <translation id="4324952538601951430">آپ کے محفوظ کردہ بُک مارکس، پاس ورڈز، ترتیبات اور مزید اب یہاں موجود ہیں</translation> <translation id="4334428914252001502">1 نہ پڑھا ہوا مضمون۔</translation> <translation id="4338650699862464074">Google کو آپ کے ملاحظہ کردہ صفحات کے URLs بھیجتا ہے۔</translation> +<translation id="4342054591427973606">{count,plural, =1{یہ پتہ اس اور آپ کے دیگر سائن ان کردہ آلات سے حذف ہو جائے گا۔}other{یہ پتے اس اور آپ کے دیگر سائن ان کردہ آلات سے حذف ہو جائیں گے۔}}</translation> <translation id="4343046787186034850">کیمرے اور مائیکروفون تک رسائی کی اجازت ہے</translation> <translation id="4359125752503270327">یہ صفحہ کسی دوسری ایپلیکیشن میں کھلے گا۔</translation> <translation id="4375040482473363939">QR کوڈ کی تلاش</translation> @@ -585,6 +593,7 @@ <translation id="5232485538978018676">نظم کردہ اکاؤنٹ کے ساتھ سائن ان کریں</translation> <translation id="5234764350956374838">برخاست کریں</translation> <translation id="5245322853195994030">مطابقت پذیری منسوخ کریں</translation> +<translation id="5271265092610673171">{count,plural, =1{مطلوبہ فیلڈ خالی ہے۔ محفوظ کرنے سے پہلے اسے پُر کریں۔}other{کچھ مطلوبہ فیلڈز خالی ہیں۔ محفوظ کرنے سے پہلے انہیں پُر کریں۔}}</translation> <translation id="5271549068863921519">پاس ورڈ محفوظ کریں</translation> <translation id="5295239312320826323"><ph name="USER_EMAIL" /> اکاؤنٹ ہٹائیں؟</translation> <translation id="5300589172476337783">دکھائیں</translation> @@ -698,6 +707,7 @@ <translation id="6066301408025741299">منسوخ کرنے کیلئے تھپتھپائیں۔</translation> <translation id="6071409777669089905">ٹیب کی پن ہٹائیں</translation> <translation id="6084848228346514841">ٹیبز منتخب کریں</translation> +<translation id="6100617279104942061"><ph name="USER_EMAIL" /> کے بطور سائن ان کردہ۔ اس سے ترتیبات کھلتی ہیں۔</translation> <translation id="6103540626693881831">آلے پر مرموزکاری</translation> <translation id="6119050551270742952">موجودہ ویب صفحہ پوشیدگی پر ہے</translation> <translation id="6122191549521593678">آن لائن</translation> @@ -768,6 +778,7 @@ <translation id="6464397691496239022">سائٹس آپ کے براؤزنگ کے تجربہ کو بہتر بنانے کے لیے کوکیز کا استعمال کر سکتی ہیں، مثال کے طور پر آپ کو سائن ان رکھنا یا آپ کی شاپنگ کارٹ میں آئٹمز کو یاد رکھنا۔ سائٹس مختلف سائٹس پر آپ کی براؤزنگ کی سرگرمی دیکھنے کیلئے کوکیز کا استعمال نہیں کر سکتی ہیں، مثال کے طور پر اشتہارات کو ذاتی نوعیت کا بنانا۔</translation> +<translation id="6476253015009698798">اس صفحے کے لیے قیمت کو ٹریک کرنے کی سہولت دستیاب نہیں ہے۔</translation> <translation id="6476800141292307438">صفحہ کا <ph name="LANGUAGE" /> میں ترجمہ کیا جا رہا ہے۔ اسکرین کے نچلے حصے کے قریب اختیارات دستیاب ہیں۔</translation> <translation id="648164694371393720">توثیق کی خرابی</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> آئٹم کو حذف کر دیا گیا</translation> @@ -819,6 +830,7 @@ <translation id="6780034285637185932">زپ کوڈ</translation> <translation id="6781260999953472352">مطابقت پذیری آن کریں؟</translation> <translation id="6785453220513215166">کریش رپورٹ بھیج رہا ہے…</translation> +<translation id="6790502149545262384">جلد ہی، نیا ٹیب کھولنے پر آپ کو <ph name="CHANNEL_NAME" /> سے کہانیاں دکھائی دیں گی۔</translation> <translation id="6797885426782475225">صوتی تلاش</translation> <translation id="6801927553864092214">نجی طور پر براؤز کرنے کے لیے ایک پوشیدگی ٹیب کھولیں</translation> <translation id="6807889908376551050">سبھی دکھائیں…</translation> @@ -1125,10 +1137,12 @@ <translation id="9098541895599151034"><ph name="NUMBER_OF_ACCOUNTS" /> پاسورڈز حذف کریں؟</translation> <translation id="9100610230175265781">پاس فریز درکار ہے</translation> <translation id="9107664647686727385">متاثرہ پاس ورڈز کیلئے چیک کریں</translation> +<translation id="9120217828624527905">مکمل صفحے کے ترجمہ پر سوئچ کریں</translation> <translation id="9124387962554796433">تلاش اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کیلئے Google آپ کی سرگزشت کا استعمال کر سکتا ہے۔</translation> <translation id="9137526406337347448">Google سروسز</translation> <translation id="9148126808321036104">دوبارہ سائن ان کریں</translation> <translation id="9157836665414082580">ڈائیلاگز کو دبائیں</translation> +<translation id="9162432979321511934">آٹو فل پاس ورڈز آن کریں</translation> <translation id="9165320910061267720">قیمت میں کمی کے الرٹس کی اطلاعات حاصل کرنے کے لیے، آپ کو اپنے iOS کی ترتیبات میں اطلاعات کو آن کرنا ہوگا۔</translation> <translation id="9177438225260810839">کھلے ٹیبز تلاش کریں</translation> <translation id="9188680907066685419">نظم کردہ اکاؤنٹ سے سائن آؤٹ کریں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 7db1097..830b9e4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">Maʼlumotlaringizni doim sinxronlash uchun shaxsingizni tasdiqlang</translation> <translation id="1870148520156231997">Parolni ochish</translation> <translation id="1872096359983322073">Fonar</translation> +<translation id="1886370402958071554">Manzilni oʻchirish</translation> <translation id="1891796056033961979">Saqlangan bukmarklar, parollar, sozlamalar va boshqalar shu ekranda chiqadi.</translation> <translation id="1894023287452300670">Narxni shu yerdan kuzating</translation> <translation id="1911619930368729126">Google Drive’ga yuklash</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">Aniqlashtirish</translation> <translation id="2273327106802955778">Batafsil menyusi</translation> <translation id="2286505070150039482">Belgilangan matn</translation> +<translation id="2287614783861766820">{count,plural, =1{Bu qurilmadan quyidagi manzil oʻchirib tashlanadi.}other{Bu qurilmadan quyidagi manzillar oʻchirib tashlanadi.}}</translation> <translation id="2299218006564889602">Parollaringiz Google Parollar menejeriga saqlanishidan oldin qurilmangizda shifrlangan</translation> <translation id="2302742851632557585">Saytdagi parolni yangilash</translation> <translation id="2316709634732130529">Taklif qilingan parolni ishlatish</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">Saqlangan xatchoʻplaringiz, parollaringiz va sozlamalaringiz endi shu yerda</translation> <translation id="4334428914252001502">1 ta maqola ochilmagan.</translation> <translation id="4338650699862464074">Siz tashrif buyurgan URL manzillarni Google serverlariga yuboradi.</translation> +<translation id="4342054591427973606">{count,plural, =1{Bu va hisobdan kirilgan boshqa qurilmalarda quyidagi manzil oʻchirib tashalandi.}other{Bu va hisobdan kirilgan boshqa qurilmalarda quyidagi manzillar oʻchirib tashalandi.}}</translation> <translation id="4343046787186034850">Kamera va mikrofondan foydalanishga ruxsat berildi</translation> <translation id="4359125752503270327">Bu sahifa boshqa ilovada ochiladi.</translation> <translation id="4375040482473363939">QR kod asosida qidirish</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">Boshqariladigan hisobga kirish</translation> <translation id="5234764350956374838">Yopish</translation> <translation id="5245322853195994030">Sinxronizatsiyani bekor qilish</translation> +<translation id="5271265092610673171">{count,plural, =1{Majburiy maydoncha boʻsh. Saqlashdan oldin uni toʻldiring.}other{Ayrim majburiy maydonchalar boʻsh. Saqlashdan oldin ularni toʻldiring.}}</translation> <translation id="5271549068863921519">Parolni saqlash</translation> <translation id="5295239312320826323"><ph name="USER_EMAIL" /> hisobi olib tashlansinmi?</translation> <translation id="5300589172476337783">Ko‘rsatish</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 e4e64db..e8105bba 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">若要确保您能随时访问自己的同步数据,请验证是您本人在操作</translation> <translation id="1870148520156231997">显示密码</translation> <translation id="1872096359983322073">闪光灯</translation> +<translation id="1886370402958071554">删除此地址</translation> <translation id="1891796056033961979">此屏幕中会显示您已保存的书签、密码、设置等信息。</translation> <translation id="1894023287452300670">在此处跟踪价格</translation> <translation id="1911619930368729126">上传到Google云端硬盘</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">优化</translation> <translation id="2273327106802955778">“更多”菜单</translation> <translation id="2286505070150039482">突出显示的文字</translation> +<translation id="2287614783861766820">{count,plural, =1{这个地址将被从此设备中删除。}other{这些地址将被从此设备中删除。}}</translation> <translation id="2299218006564889602">系统会先在设备上对您的密码进行加密,然后再将其保存到 Google 密码管理器中。</translation> <translation id="2302742851632557585">在网站上更改密码</translation> <translation id="2316709634732130529">使用建议的密码</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">现在,您已保存的书签、密码、设置等信息都会显示在此处</translation> <translation id="4334428914252001502">有 1 篇未读文章。</translation> <translation id="4338650699862464074">将您所访问的网页的网址发送给 Google。</translation> +<translation id="4342054591427973606">{count,plural, =1{这个地址将被从此设备以及您已登录的其他设备中删除。}other{这些地址将被从此设备以及您已登录的其他设备中删除。}}</translation> <translation id="4343046787186034850">已启用摄像头和麦克风使用权限</translation> <translation id="4359125752503270327">此页面将在其他应用中打开。</translation> <translation id="4375040482473363939">QR 码搜索</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">使用受管理的帐号登录</translation> <translation id="5234764350956374838">关闭</translation> <translation id="5245322853195994030">取消同步</translation> +<translation id="5271265092610673171">{count,plural, =1{有一个必填字段是空的。请先填写这个字段,然后再保存。}other{有一些必填字段是空的。请先填写这些字段,然后再保存。}}</translation> <translation id="5271549068863921519">保存密码</translation> <translation id="5295239312320826323">移除帐号 <ph name="USER_EMAIL" />?</translation> <translation id="5300589172476337783">显示</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 3ffb4e8..295af27 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">為確保您可隨時存取同步資料,請驗證您的身分</translation> <translation id="1870148520156231997">顯示密碼</translation> <translation id="1872096359983322073">閃光燈</translation> +<translation id="1886370402958071554">刪除地址</translation> <translation id="1891796056033961979">您儲存嘅書籤、密碼、設定同其他內容會喺呢度顯示。</translation> <translation id="1894023287452300670">在此處追蹤價格</translation> <translation id="1911619930368729126">上載至「Google 雲端硬碟」</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">修正搜尋</translation> <translation id="2273327106802955778">[更多] 選單</translation> <translation id="2286505070150039482">突顯的文字</translation> +<translation id="2287614783861766820">{count,plural, =1{這個地址將從這部裝置中刪除。}other{這些地址將從這部裝置中刪除。}}</translation> <translation id="2299218006564889602">您的密碼會先在裝置上加密,然後才儲存至 Google 密碼管理工具。</translation> <translation id="2302742851632557585">變更網站上的密碼</translation> <translation id="2316709634732130529">使用建議的密碼</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">您儲存的書籤、密碼、設定和其他內容現在會在此處顯示</translation> <translation id="4334428914252001502">1 篇未讀嘅文章。</translation> <translation id="4338650699862464074">將您瀏覽的網頁網址傳送給 Google。</translation> +<translation id="4342054591427973606">{count,plural, =1{這個地址將從這部裝置和其他已登入帳戶的裝置中刪除。}other{這些地址將從這部裝置和其他已登入帳戶的裝置中刪除。}}</translation> <translation id="4343046787186034850">已允許存取攝錄機和麥克風</translation> <translation id="4359125752503270327">此網頁將會在其他應用程式中開啟。</translation> <translation id="4375040482473363939">二維條碼搜尋</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">使用受管理的帳戶登入</translation> <translation id="5234764350956374838">關閉</translation> <translation id="5245322853195994030">取消同步處理</translation> +<translation id="5271265092610673171">{count,plural, =1{必填欄位沒有內容,請先填寫再儲存。}other{部分必填欄位沒有內容,請先填寫再儲存。}}</translation> <translation id="5271549068863921519">儲存密碼</translation> <translation id="5295239312320826323">要移除帳戶 <ph name="USER_EMAIL" /> 嗎?</translation> <translation id="5300589172476337783">顯示</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 4e47028..f0bb561f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -128,6 +128,7 @@ <translation id="1832848789136765277">為確保你可以隨時存取同步處理的資料,請驗證你的身分</translation> <translation id="1870148520156231997">顯示密碼</translation> <translation id="1872096359983322073">閃光燈</translation> +<translation id="1886370402958071554">刪除地址</translation> <translation id="1891796056033961979">你可以在這個畫面查看已儲存的書籤、密碼、設定和其他內容。</translation> <translation id="1894023287452300670">追蹤這個地區的價格</translation> <translation id="1911619930368729126">上傳至 Google 雲端硬碟</translation> @@ -177,6 +178,7 @@ <translation id="2268044343513325586">修正搜尋</translation> <translation id="2273327106802955778">[更多] 選單</translation> <translation id="2286505070150039482">醒目顯示的文字</translation> +<translation id="2287614783861766820">{count,plural, =1{這個地址將從這部裝置中刪除。}other{這些地址將從這部裝置中刪除。}}</translation> <translation id="2299218006564889602">系統會先在裝置上將密碼加密,再儲存至 Google 密碼管理員。</translation> <translation id="2302742851632557585">變更網站上的密碼</translation> <translation id="2316709634732130529">使用建議的密碼</translation> @@ -458,6 +460,7 @@ <translation id="4324952538601951430">你儲存的書籤、密碼、設定和其他內容現在會顯示在這裡</translation> <translation id="4334428914252001502">1 篇未讀文章。</translation> <translation id="4338650699862464074">將你造訪的網頁網址傳送給 Google。</translation> +<translation id="4342054591427973606">{count,plural, =1{這個地址將從這部裝置和其他已登入帳戶的裝置中刪除。}other{這些地址將從這部裝置和其他已登入帳戶的裝置中刪除。}}</translation> <translation id="4343046787186034850">已允許存取相機和麥克風</translation> <translation id="4359125752503270327">這個網頁會在其他應用程式中開啟。</translation> <translation id="4375040482473363939">QR 圖碼搜尋</translation> @@ -587,6 +590,7 @@ <translation id="5232485538978018676">使用受管理的帳戶登入</translation> <translation id="5234764350956374838">關閉</translation> <translation id="5245322853195994030">取消同步處理</translation> +<translation id="5271265092610673171">{count,plural, =1{必填欄位沒有內容,請先填寫再儲存。}other{部分必填欄位沒有內容,請先填寫再儲存。}}</translation> <translation id="5271549068863921519">儲存密碼</translation> <translation id="5295239312320826323">要移除 <ph name="USER_EMAIL" /> 帳戶嗎?</translation> <translation id="5300589172476337783">顯示</translation>
diff --git a/ios/chrome/browser/link_to_text/link_to_text_response.mm b/ios/chrome/browser/link_to_text/link_to_text_response.mm index c2dd4c5..1fcf840 100644 --- a/ios/chrome/browser/link_to_text/link_to_text_response.mm +++ b/ios/chrome/browser/link_to_text/link_to_text_response.mm
@@ -100,8 +100,9 @@ latency:latency]; } + const base::Value::Dict& dict = value->GetDict(); absl::optional<LinkGenerationOutcome> outcome = - link_to_text::ParseStatus(value->FindDoubleKey("status")); + link_to_text::ParseStatus(dict.FindDouble("status")); if (!outcome.has_value()) { return [self linkToTextResponseWithUnknownErrorAndSourceID:sourceID latency:latency]; @@ -118,10 +119,10 @@ // Attempts to parse a payload from the response. NSString* title = tab_util::GetTabTitle(webState); absl::optional<TextFragment> fragment = - TextFragment::FromValue(value->FindKey("fragment")); - const std::string* selectedText = value->FindStringKey("selectedText"); + TextFragment::FromValue(dict.Find("fragment")); + const std::string* selectedText = dict.FindString("selectedText"); absl::optional<CGRect> sourceRect = - shared_highlighting::ParseRect(value->FindKey("selectionRect")); + shared_highlighting::ParseRect(dict.Find("selectionRect")); // All values must be present to have a valid payload. if (!title || !fragment || !selectedText || !sourceRect) { @@ -132,7 +133,7 @@ GURL baseURL = webState->GetLastCommittedURL(); absl::optional<GURL> canonicalURL = - shared_highlighting::ParseURL(value->FindStringKey("canonicalUrl")); + shared_highlighting::ParseURL(dict.FindString("canonicalUrl")); // Use the canonical URL as base when it exists, and only on HTTPS pages. if (baseURL.SchemeIsCryptographic() && canonicalURL) {
diff --git a/ios/chrome/browser/ui/authentication/cells/BUILD.gn b/ios/chrome/browser/ui/authentication/cells/BUILD.gn index 69fa8a4..45bc4b0 100644 --- a/ios/chrome/browser/ui/authentication/cells/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/cells/BUILD.gn
@@ -32,6 +32,7 @@ "//ios/chrome/browser/ui/authentication/views", "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/settings/cells:public", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm index 2a208c91..1c6a8f3 100644 --- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm +++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -42,6 +42,8 @@ // Margins for the close button. const CGFloat kCloseButtonTrailingMargin; const CGFloat kCloseButtonTopMargin; + const CGFloat kMainPromoSubViewSpacing; + const CGFloat kButtonStackViewSubViewSpacing; } PromoStyleValues; const PromoStyleValues kStandardPromoStyle = { @@ -55,21 +57,25 @@ 8.0, // kButtonCornerRadius 5.0, // kCloseButtonTrailingMargin 0.0, // kCloseButtonTopMargin + 13.0, // kMainPromoSubViewSpacing + 13.0, // kButtonStackViewSubViewSpacing }; // TODO(crbug.com/1331010): We may remove these styles if we don't launch them // with the feed promo. const PromoStyleValues kTitledPromoStyle = { - 14.0, // kStackViewTopPadding - 27.0, // kStackViewBottomPadding - 16.0, // kStackViewTrailingMargin - 13.0, // kContentStackViewSubViewSpacing - 13.0, // kTextStackViewSubViewSpacing - 30.0, // kButtonTitleHorizontalContentInset - 8.0, // kButtonTitleVerticalContentInset + 16.0, // kStackViewTopPadding + 16.0, // kStackViewBottomPadding + 19.0, // kStackViewTrailingMargin + 0.0, // kContentStackViewSubViewSpacing + 5.0, // kTextStackViewSubViewSpacing + 24.0, // kButtonTitleHorizontalContentInset + 9.0, // kButtonTitleVerticalContentInset 8.0, // kButtonCornerRadius - -9.0, // kCloseButtonTrailingMargin - 9.0, // kCloseButtonTopMargin + -8.0, // kCloseButtonTrailingMargin + 8.0, // kCloseButtonTopMargin + 19.0, // kMainPromoSubViewSpacing + 5.0, // kButtonStackViewSubViewSpacing }; const PromoStyleValues kTitledCompactPromoStyle = { @@ -83,6 +89,8 @@ 0.0, // kButtonCornerRadius -9.0, // kCloseButtonTrailingMargin 9.0, // kCloseButtonTopMargin + 4.0, // kMainPromoSubViewSpacing + 4.0, // kButtonStackViewSubViewSpacing }; // Horizontal padding for label and buttons. @@ -96,6 +104,8 @@ // Size of the signin promo image. constexpr CGFloat kProfileImageHeightWidth = 32.0; constexpr CGFloat kNonProfileImageHeightWidth = 56.0; +// Size of the font for the headline. +constexpr CGFloat kSignInPromoHeadlineFontSize = 17.0; } @interface SigninPromoView () @@ -108,8 +118,14 @@ @property(nonatomic, strong, readwrite) UIButton* closeButton; // Contains the two main sections of the promo (image and Text). @property(nonatomic, strong) UIStackView* contentStackView; -// Contains all the text elements of the promo (title,body and buttons). +// Contains all the text elements of the promo (title,body). @property(nonatomic, strong) UIStackView* textVerticalStackView; +// Contains all the button elements of the promo. +@property(nonatomic, strong) UIStackView* buttonVerticalStackView; +// Parent Stack view that contains the `textVerticalStackView` and +// `buttonVerticalStackView` (Text, Buttons). +@property(nonatomic, strong) UIStackView* mainPromoStackView; + // Constraints for the different layout styles. @property(nonatomic, weak) NSArray<NSLayoutConstraint*>* currentLayoutConstraints; @@ -188,14 +204,29 @@ _secondaryButton.pointerInteractionEnabled = YES; _textVerticalStackView = [[UIStackView alloc] initWithArrangedSubviews:@[ - _titleLabel, _textLabel, _primaryButton, _secondaryButton + _titleLabel, + _textLabel, ]]; _textVerticalStackView.axis = UILayoutConstraintAxisVertical; _textVerticalStackView.translatesAutoresizingMaskIntoConstraints = NO; + // Separate the buttons from the text to custom-set the spacing between text + // and buttons. + _buttonVerticalStackView = [[UIStackView alloc] + initWithArrangedSubviews:@[ _primaryButton, _secondaryButton ]]; + _buttonVerticalStackView.axis = UILayoutConstraintAxisVertical; + _buttonVerticalStackView.translatesAutoresizingMaskIntoConstraints = NO; + + _mainPromoStackView = [[UIStackView alloc] initWithArrangedSubviews:@[ + _textVerticalStackView, _buttonVerticalStackView + ]]; + _mainPromoStackView.alignment = UIStackViewAlignmentCenter; + _mainPromoStackView.axis = UILayoutConstraintAxisVertical; + _mainPromoStackView.translatesAutoresizingMaskIntoConstraints = NO; + _contentStackView = [[UIStackView alloc] - initWithArrangedSubviews:@[ _imageView, _textVerticalStackView ]]; + initWithArrangedSubviews:@[ _imageView, _mainPromoStackView ]]; _contentStackView.alignment = UIStackViewAlignmentCenter; _contentStackView.translatesAutoresizingMaskIntoConstraints = NO; @@ -441,6 +472,11 @@ switch (self.promoViewStyle) { case SigninPromoViewStyleStandard: { // Lays out content vertically for standard view. + self.buttonVerticalStackView.axis = UILayoutConstraintAxisVertical; + self.buttonVerticalStackView.spacing = + kTitledPromoStyle.kButtonStackViewSubViewSpacing; + self.mainPromoStackView.spacing = + kTitledPromoStyle.kMainPromoSubViewSpacing; self.contentStackView.axis = UILayoutConstraintAxisVertical; self.contentStackView.spacing = kStandardPromoStyle.kContentStackViewSubViewSpacing; @@ -495,23 +531,33 @@ self.textVerticalStackView.alignment = UIStackViewAlignmentCenter; self.textVerticalStackView.spacing = kTitledPromoStyle.kTextStackViewSubViewSpacing; + self.buttonVerticalStackView.spacing = + kTitledPromoStyle.kButtonStackViewSubViewSpacing; + self.mainPromoStackView.spacing = + kTitledPromoStyle.kMainPromoSubViewSpacing; self.textLabel.textAlignment = NSTextAlignmentCenter; self.secondaryButton.hidden = YES; + self.imageView.hidden = YES; // Configures fonts for titled layout. // TODO(crbug.com/1331010): Make this font size dynamic. - self.titleLabel.font = [[UIFont - preferredFontForTextStyle:UIFontTextStyleHeadline] fontWithSize:20]; + self.titleLabel.font = + [[UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] + fontWithSize:kSignInPromoHeadlineFontSize]; + self.titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor]; - self.textLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.textLabel.font = [[UIFont + preferredFontForTextStyle:UIFontTextStyleBody] fontWithSize:15]; self.textLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; // In the standard layout, the button has a background. - [self.primaryButton - setTitleColor:[UIColor colorNamed:kSolidButtonTextColor] - forState:UIControlStateNormal]; - self.primaryButton.backgroundColor = [UIColor colorNamed:kBlueColor]; + [self.primaryButton setTitleColor:[UIColor colorNamed:kBlueColor] + forState:UIControlStateNormal]; + self.primaryButton.titleLabel.font = + [[UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] + fontWithSize:kSignInPromoHeadlineFontSize]; + self.primaryButton.backgroundColor = + [UIColor colorNamed:kBackgroundColor]; self.primaryButton.layer.cornerRadius = kTitledPromoStyle.kButtonCornerRadius; self.primaryButton.clipsToBounds = YES; @@ -538,6 +584,12 @@ } case SigninPromoViewStyleTitledCompact: { // Lays out content for titled compact view. + self.buttonVerticalStackView.alignment = UIStackViewAlignmentLeading; + self.buttonVerticalStackView.spacing = + kTitledCompactPromoStyle.kButtonStackViewSubViewSpacing; + self.mainPromoStackView.alignment = UIStackViewAlignmentLeading; + self.mainPromoStackView.spacing = + kTitledCompactPromoStyle.kMainPromoSubViewSpacing; self.contentStackView.axis = UILayoutConstraintAxisHorizontal; self.contentStackView.spacing = kTitledCompactPromoStyle.kContentStackViewSubViewSpacing;
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm index bb17be4..19913e44 100644 --- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm +++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/signin/signin_util.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h" +#import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/common/ui/util/image_util.h" #import "ios/chrome/grit/ios_chromium_strings.h" #import "ios/chrome/grit/ios_strings.h" @@ -79,11 +80,13 @@ break; } case SigninPromoViewStyleTitled: { - [self configureTitledPromoView:signinPromoView]; + [self configureTitledPromoView:signinPromoView + withStyle:SigninPromoViewStyleTitled]; break; } case SigninPromoViewStyleTitledCompact: { - [self configureTitledPromoView:signinPromoView]; + [self configureTitledPromoView:signinPromoView + withStyle:SigninPromoViewStyleTitledCompact]; break; } } @@ -128,12 +131,17 @@ // Configures the view elements of the `signinPromoView` to conform to // `SigninPromoViewStyleTitled` or `SigninPromoViewStyleTitledCompact` style. -- (void)configureTitledPromoView:(SigninPromoView*)signinPromoView { +- (void)configureTitledPromoView:(SigninPromoView*)signinPromoView + withStyle:(SigninPromoViewStyle)promoStyle { // In the titled Promo views (both compact and non compact the primary button // text will use "continue" regardless of the promo mode. signinPromoView.titleLabel.hidden = NO; - // signinPromoView.secondaryButton.hidden = YES; - NSString* signInString = GetNSString(IDS_IOS_NTP_FEED_SIGNIN_PROMO_CONTINUE); + // TODO(crbug.com/1331010): Change promoStyle to + // `IsDiscoverFeedTopSyncPromoCompact()` + NSString* signInString = + (promoStyle == SigninPromoViewStyleTitledCompact) + ? GetNSString(IDS_IOS_NTP_FEED_SIGNIN_PROMO_CONTINUE) + : GetNSString(IDS_IOS_SYNC_PROMO_TURN_ON_SYNC); [signinPromoView.primaryButton setTitle:signInString forState:UIControlStateNormal]; }
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm index 0ac8d3c..4a04c1b 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator_unittest.mm
@@ -183,7 +183,7 @@ void ExpectNoAccountsConfiguration(SigninPromoViewStyle style) { OCMExpect([signin_promo_view_ setMode:SigninPromoViewModeNoAccounts]); NSString* title = nil; - if (style != SigninPromoViewStyleStandard) { + if (style == SigninPromoViewStyleTitledCompact) { title = GetNSString(IDS_IOS_NTP_FEED_SIGNIN_PROMO_CONTINUE); } else { title = GetNSString(IDS_IOS_SYNC_PROMO_TURN_ON_SYNC); @@ -229,7 +229,12 @@ forState:UIControlStateNormal]); break; } - case SigninPromoViewStyleTitled: + case SigninPromoViewStyleTitled: { + OCMExpect([primary_button_ + setTitle:GetNSString(IDS_IOS_SYNC_PROMO_TURN_ON_SYNC) + forState:UIControlStateNormal]); + break; + } case SigninPromoViewStyleTitledCompact: { OCMExpect([primary_button_ setTitle:GetNSString(IDS_IOS_NTP_FEED_SIGNIN_PROMO_CONTINUE)
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm index e22cdad5..5a26306 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
@@ -15,6 +15,7 @@ #import "base/check.h" #import "base/hash/hash.h" #import "base/i18n/string_compare.h" +#import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "base/notreached.h" #import "base/ranges/algorithm.h" @@ -142,11 +143,14 @@ // the user presses the undo button, and the UndoManagerWrapper allows the undo // to go through. MDCSnackbarMessage* CreateUndoToastWithWrapper(UndoManagerWrapper* wrapper, - NSString* text) { + NSString* text, + std::string user_action) { + DCHECK(!user_action.empty()); // Create the block that will be executed if the user taps the undo button. MDCSnackbarMessageAction* action = [[MDCSnackbarMessageAction alloc] init]; action.handler = ^{ if (![wrapper hasUndoManagerChanged]) { + base::RecordAction(base::UserMetricsAction(user_action.c_str())); [wrapper undo]; } }; @@ -211,7 +215,10 @@ NSString* text = l10n_util::GetNSString((node) ? IDS_IOS_BOOKMARK_NEW_BOOKMARK_UPDATED : IDS_IOS_BOOKMARK_NEW_BOOKMARK_CREATED); - return CreateUndoToastWithWrapper(wrapper, text); + const char* user_action = (node) + ? "MobileBookmarkManagerUpdatedBookmarkUndone" + : "MobileBookmarkManagerAddedBookmarkUndone"; + return CreateUndoToastWithWrapper(wrapper, text, user_action); } MDCSnackbarMessage* CreateBookmarkAtPositionWithUndoToast( @@ -238,7 +245,8 @@ NSString* text = l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BOOKMARK_CREATED); - return CreateUndoToastWithWrapper(wrapper, text); + return CreateUndoToastWithWrapper(wrapper, text, + "MobileBookmarkManagerBookmarkAddedUndone"); } MDCSnackbarMessage* UpdateBookmarkPositionWithUndoToast( @@ -270,7 +278,8 @@ NSString* text = l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BOOKMARK_UPDATED); - return CreateUndoToastWithWrapper(wrapper, text); + return CreateUndoToastWithWrapper(wrapper, text, + "MobileBookmarkManagerMoveToFolderUndone"); } void DeleteBookmarks(const std::set<const BookmarkNode*>& bookmarks, @@ -296,7 +305,6 @@ [wrapper resetUndoManagerChanged]; NSString* text = nil; - if (node_count == 1) { text = l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_SINGLE_BOOKMARK_DELETE); } else { @@ -304,8 +312,8 @@ l10n_util::GetNSStringF(IDS_IOS_BOOKMARK_NEW_MULTIPLE_BOOKMARK_DELETE, base::NumberToString16(node_count)); } - - return CreateUndoToastWithWrapper(wrapper, text); + return CreateUndoToastWithWrapper(wrapper, text, + "MobileBookmarkManagerDeletedEntryUndone"); } bool MoveBookmarks(std::set<const BookmarkNode*> bookmarks, @@ -356,8 +364,8 @@ text = l10n_util::GetNSStringF(IDS_IOS_BOOKMARK_NEW_MULTIPLE_BOOKMARK_MOVE, base::NumberToString16(node_count)); } - - return CreateUndoToastWithWrapper(wrapper, text); + return CreateUndoToastWithWrapper(wrapper, text, + "MobileBookmarkManagerMoveToFolderUndone"); } #pragma mark - Useful bookmark manipulation.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm index 9e238b1c6..f9d76e3 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -222,6 +222,8 @@ // Copy of `URL` to be captured in block. GURL bookmarkedURL(URL); void (^editAction)() = ^{ + base::RecordAction(base::UserMetricsAction( + "MobileBookmarkManagerOpenedBookmarkEditorFromSnackbar")); [weakSelf presentBookmarkEditorForURL:bookmarkedURL]; }; @@ -600,9 +602,7 @@ // `self.bookmarkNavigationController` to the UINavigationController subclass // used. If `replacementViewControllers` is not nil, those controllers are // swapped in to the UINavigationController instead of `viewController`. -- (void)presentTableViewController: - (ChromeTableViewController< - UIAdaptivePresentationControllerDelegate>*)viewController +- (void)presentTableViewController:(ChromeTableViewController*)viewController withReplacementViewControllers: (NSArray<ChromeTableViewController*>*)replacementViewControllers { TableViewNavigationController* navController = @@ -677,6 +677,15 @@ #pragma mark - UIAdaptivePresentationControllerDelegate +- (void)presentationControllerWillDismiss: + (UIPresentationController*)presentationController { + DCHECK_EQ(PresentedState::BOOKMARK_BROWSER, self.currentPresentedState); + DCHECK(self.bookmarkNavigationController); + DCHECK_EQ(self.bookmarkBrowser, + self.bookmarkNavigationController.topViewController); + [self.bookmarkBrowser willDismissBySwipeDown]; +} + - (BOOL)presentationControllerShouldDismiss: (UIPresentationController*)presentationController { return [self canDismiss];
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm index 157ac38..4245c76 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/main/browser.h" @@ -213,6 +215,8 @@ - (void)presentationControllerDidDismiss: (UIPresentationController*)presentationController { + base::RecordAction( + base::UserMetricsAction("IOSBookmarksEditorClosedWithSwipeDown")); [_viewController dismissBookmarkEditorView]; }
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller.mm index 8a6e03bc..0994fc8 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller.mm
@@ -345,6 +345,8 @@ #pragma mark - Actions - (void)deleteBookmark { + base::RecordAction( + base::UserMetricsAction("MobileBookmarksEditorDeletedBookmark")); if ([self.mutator bookmark] && [self.mutator bookmarkModel]->loaded()) { // To stop getting recursive events from committed bookmark editing changes // ignore bookmark model updates notifications. @@ -368,14 +370,18 @@ } - (void)moveBookmark { + base::RecordAction( + base::UserMetricsAction("MobileBookmarksEditorOpenedFolderChooser")); [self.delegate moveBookmark]; } - (void)cancel { + base::RecordAction(base::UserMetricsAction("MobileBookmarksEditorCanceled")); [self dismissBookmarkEditorView]; } - (void)save { + base::RecordAction(base::UserMetricsAction("MobileBookmarksEditorSaved")); [self commitBookmarkChanges]; [self dismissBookmarkEditorView]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm index 12eb38e..5024efc 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm
@@ -9,6 +9,8 @@ #import "base/check.h" #import "base/check_op.h" #import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "components/bookmarks/browser/bookmark_model.h" #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/main/browser.h" @@ -206,6 +208,8 @@ - (void)presentationControllerDidDismiss: (UIPresentationController*)presentationController { + base::RecordAction( + base::UserMetricsAction("IOSBookmarksFolderChooserClosedWithSwipeDown")); DCHECK(_navigationController); _navigationController = nil; [_delegate bookmarksFolderChooserCoordinatorDidCancel:self];
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_view_controller.mm index 5c37296..07eb4ec 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_view_controller.mm
@@ -9,6 +9,8 @@ #import "base/check.h" #import "base/containers/contains.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" #import "components/bookmarks/browser/bookmark_model.h" @@ -321,11 +323,15 @@ #pragma mark - Actions - (void)done:(id)sender { + base::RecordAction( + base::UserMetricsAction("MobileBookmarksFolderChooserDone")); [self.delegate bookmarksFolderChooserViewController:self didFinishWithFolder:self.selectedFolder]; } - (void)cancel:(id)sender { + base::RecordAction( + base::UserMetricsAction("MobileBookmarksFolderChooserCanceled")); [self.delegate bookmarksFolderChooserViewControllerDidCancel:self]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm index a1e8ee7..6693f38b 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm
@@ -7,6 +7,8 @@ #import "base/check.h" #import "base/check_op.h" #import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "components/bookmarks/browser/bookmark_model.h" #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/main/browser.h" @@ -212,6 +214,8 @@ - (void)presentationControllerDidAttemptToDismiss: (UIPresentationController*)presentationController { + base::RecordAction( + base::UserMetricsAction("IOSBookmarksFolderEditorClosedWithSwipeDown")); [_viewController presentationControllerDidAttemptToDismiss]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm index f4408dc..8d248f09 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -10,8 +10,9 @@ #import "base/check_op.h" #import "base/i18n/rtl.h" #import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "base/notreached.h" - #import "base/strings/sys_string_conversions.h" #import "components/bookmarks/browser/bookmark_model.h" #import "components/bookmarks/browser/bookmark_node.h" @@ -268,6 +269,8 @@ #pragma mark - Actions - (void)dismiss { + base::RecordAction( + base::UserMetricsAction("MobileBookmarksFolderEditorCanceled")); [self.view endEditing:YES]; [self.delegate bookmarksFolderEditorDidCancel:self]; } @@ -275,6 +278,8 @@ - (void)deleteFolder { DCHECK(self.editingExistingFolder); DCHECK(self.folder); + base::RecordAction( + base::UserMetricsAction("MobileBookmarksFolderEditorDeletedFolder")); std::set<const BookmarkNode*> editedNodes; editedNodes.insert(self.folder); [self.snackbarCommandsHandler @@ -286,7 +291,8 @@ - (void)saveFolder { DCHECK(self.parentFolder); - + base::RecordAction( + base::UserMetricsAction("MobileBookmarksFolderEditorSaved")); NSString* folderString = self.titleItem.text; DCHECK(folderString.length > 0); std::u16string folderTitle = base::SysNSStringToUTF16(folderString); @@ -318,6 +324,8 @@ } - (void)changeParentFolder { + base::RecordAction(base::UserMetricsAction( + "MobileBookmarksFolderEditorOpenedFolderChooser")); std::set<const BookmarkNode*> hiddenNodes; if (self.folder) { hiddenNodes.insert(self.folder);
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.h index 10a35e8..2a95475 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.h
@@ -41,8 +41,7 @@ // Class to navigate the bookmark hierarchy. @interface BookmarksHomeViewController - : ChromeTableViewController <KeyCommandActions, - UIAdaptivePresentationControllerDelegate> + : ChromeTableViewController <KeyCommandActions> // Delegate for presenters. Note that this delegate is currently being set only // in case of handset, and not tablet. In the future it will be used by both @@ -78,6 +77,10 @@ // Whether the browser can be dismissed. - (BOOL)canDismiss; +// Called when the user is swiping down the view, and +// `BookmarksHomeViewController` is on the top of the navigation view. +- (void)willDismissBySwipeDown; + @end #endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm index fb87e31..daa0f2e3 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm
@@ -224,8 +224,6 @@ const bookmarks::BookmarkNode* _externalBookmark; } -#pragma mark - Initializer - - (instancetype)initWithBrowser:(Browser*)browser { DCHECK(browser); @@ -343,6 +341,14 @@ return stack; } +- (void)willDismissBySwipeDown { + if (self.searchController.active) { + // Dismiss the keyboard if trying to dismiss the VC so the keyboard doesn't + // linger until the VC dismissal has completed. + [self.searchController.searchBar endEditing:YES]; + } +} + #pragma mark - UIViewController - (void)viewDidLoad { @@ -687,12 +693,16 @@ - (void)editNodeURL:(const BookmarkNode*)node { DCHECK(node); DCHECK_EQ(node->type(), BookmarkNode::URL); + base::RecordAction( + base::UserMetricsAction("MobileBookmarkManagerEditBookmark")); [self ensureBookmarksCoordinator]; [self.bookmarksCoordinator presentEditorForURLNode:node]; } // Opens the editor on the given Folder node. - (void)editNodeFolder:(const BookmarkNode*)node { + base::RecordAction( + base::UserMetricsAction("MobileBookmarkManagerEditFolder")); DCHECK(node); DCHECK_EQ(node->type(), BookmarkNode::FOLDER); [self ensureBookmarksCoordinator]; @@ -1837,6 +1847,8 @@ bookmark_utils_ios::FindNodesByIds(strongSelf.bookmarks, nodeIds); if (nodesFromIds) { + base::RecordAction(base::UserMetricsAction( + "MobileBookmarkManagerMoveToFolderBulk")); [strongSelf moveNodes:*nodesFromIds]; } } @@ -1972,6 +1984,8 @@ bookmark_utils_ios::FindNodeById( strongSelf.bookmarks, nodeId); if (nodeFromId) { + base::RecordAction(base::UserMetricsAction( + "MobileBookmarkManagerMoveToFolder")); std::set<const BookmarkNode*> nodes{nodeFromId}; [strongSelf moveNodes:nodes]; } @@ -2004,6 +2018,8 @@ nodesFromIds = bookmark_utils_ios::FindNodesByIds( strongSelf.bookmarks, nodeIds); if (nodesFromIds) { + base::RecordAction(base::UserMetricsAction( + "MobileBookmarkManagerMoveToFolderBulk")); [strongSelf moveNodes:*nodesFromIds]; } } @@ -2308,6 +2324,8 @@ } [self.sharedState.editingFolderCell stopEdit]; if (node->is_folder()) { + base::RecordAction( + base::UserMetricsAction("MobileBookmarkManagerOpenFolder")); [self handleSelectFolderForNavigation:node]; } else { if (self.sharedState.currentlyShowingSearchResults) { @@ -2499,6 +2517,8 @@ const bookmarks::BookmarkNode* nodeFromId = bookmark_utils_ios::FindNodeById(innerStrongSelf.bookmarks, nodeId); if (nodeFromId) { + base::RecordAction( + base::UserMetricsAction("MobileBookmarkManagerMoveToFolder")); std::set<const BookmarkNode*> nodes{nodeFromId}; [innerStrongSelf moveNodes:nodes]; } @@ -2522,25 +2542,6 @@ actionProvider:actionProvider]; } -#pragma mark UIAdaptivePresentationControllerDelegate - -- (void)presentationControllerWillDismiss: - (UIPresentationController*)presentationController { - if (self.searchController.active) { - // Dismiss the keyboard if trying to dismiss the VC so the keyboard doesn't - // linger until the VC dismissal has completed. - [self.searchController.searchBar endEditing:YES]; - } -} - -- (void)presentationControllerDidDismiss: - (UIPresentationController*)presentationController { - base::RecordAction( - base::UserMetricsAction("IOSBookmarkManagerCloseWithSwipe")); - // Cleanup once the dismissal is complete. - [self dismissWithURL:GURL()]; -} - #pragma mark - TableViewURLDragDataSource - (URLInfo*)tableView:(UITableView*)tableView
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index 974b4d5e..0b2518b0 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -15,41 +15,27 @@ #import "base/metrics/user_metrics_action.h" #import "base/strings/sys_string_conversions.h" #import "base/task/sequenced_task_runner.h" -#import "components/bookmarks/browser/bookmark_model.h" -#import "components/feature_engagement/public/event_constants.h" -#import "components/feature_engagement/public/tracker.h" #import "components/reading_list/core/reading_list_model.h" #import "components/strings/grit/components_strings.h" #import "components/ukm/ios/ukm_url_recorder.h" #import "ios/chrome/app/application_delegate/app_state.h" -#import "ios/chrome/browser/application_context/application_context.h" -#import "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/crash_report/crash_keys_helper.h" #import "ios/chrome/browser/discover_feed/feed_constants.h" #import "ios/chrome/browser/feature_engagement/tracker_util.h" -#import "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/metrics/new_tab_page_uma.h" #import "ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.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/passwords/password_controller.h" -#import "ios/chrome/browser/prerender/preload_controller_delegate.h" #import "ios/chrome/browser/prerender/prerender_service.h" -#import "ios/chrome/browser/prerender/prerender_service_factory.h" -#import "ios/chrome/browser/reading_list/offline_page_tab_helper.h" #import "ios/chrome/browser/reading_list/reading_list_model_factory.h" #import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" -#import "ios/chrome/browser/signin/authentication_service.h" -#import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h" -#import "ios/chrome/browser/tabs/tab_title_util.h" #import "ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h" #import "ios/chrome/browser/ui/bookmarks/bookmarks_coordinator.h" #import "ios/chrome/browser/ui/browser_container/browser_container_view_controller.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter.h" -#import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h" #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h" #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" @@ -57,18 +43,15 @@ #import "ios/chrome/browser/ui/commands/reading_list_add_command.h" #import "ios/chrome/browser/ui/commands/snackbar_commands.h" #import "ios/chrome/browser/ui/commands/text_zoom_commands.h" -#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" #import "ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_scheduler.h" #import "ios/chrome/browser/ui/default_promo/default_promo_non_modal_presentation_delegate.h" -#import "ios/chrome/browser/ui/download/download_manager_coordinator.h" #import "ios/chrome/browser/ui/first_run/first_run_util.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_animator.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_element.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_updater.h" #import "ios/chrome/browser/ui/fullscreen/scoped_fullscreen_disabler.h" #import "ios/chrome/browser/ui/gestures/view_revealing_vertical_pan_handler.h" -#import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_commands.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_view.h" #import "ios/chrome/browser/ui/lens/lens_coordinator.h" @@ -84,7 +67,6 @@ #import "ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.h" #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h" #import "ios/chrome/browser/ui/side_swipe/swipe_view.h" -#import "ios/chrome/browser/ui/start_surface/start_surface_features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_strip/tab_strip_coordinator.h" #import "ios/chrome/browser/ui/tabs/background_tab_animation_view.h" #import "ios/chrome/browser/ui/tabs/foreground_tab_animation_view.h" @@ -100,7 +82,6 @@ #import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h" #import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h" -#import "ios/chrome/browser/ui/toolbar/public/toolbar_coordinating.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h" #import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h" #import "ios/chrome/browser/ui/toolbar_container/toolbar_container_coordinator.h" @@ -110,7 +91,6 @@ #import "ios/chrome/browser/ui/util/named_guide_util.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/ui/util/url_with_title.h" -#import "ios/chrome/browser/upgrade/upgrade_center.h" #import "ios/chrome/browser/url/chrome_url_constants.h" #import "ios/chrome/browser/url_loading/new_tab_animation_tab_helper.h" #import "ios/chrome/browser/url_loading/url_loading_browser_agent.h" @@ -119,11 +99,8 @@ #import "ios/chrome/browser/url_loading/url_loading_params.h" #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" -#import "ios/chrome/browser/web/sad_tab_tab_helper.h" #import "ios/chrome/browser/web/web_navigation_browser_agent.h" #import "ios/chrome/browser/web/web_navigation_util.h" -#import "ios/chrome/browser/web_state_list/all_web_state_observation_forwarder.h" -#import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h" #import "ios/chrome/browser/web_state_list/web_usage_enabler/web_usage_enabler_browser_agent.h" @@ -133,7 +110,6 @@ #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/common/ui/util/ui_util.h" #import "ios/chrome/grit/ios_strings.h" -#import "ios/components/webui/web_ui_url_constants.h" #import "ios/public/provider/chrome/browser/find_in_page/find_in_page_api.h" #import "ios/public/provider/chrome/browser/fullscreen/fullscreen_api.h" #import "ios/public/provider/chrome/browser/voice_search/voice_search_api.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index ced387a..eaa4102 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -1054,6 +1054,44 @@ assertWithMatcher:grey_sufficientlyVisible()]; } +// Test that signing in and signing out results in the NTP scrolled to the top +// and not in some unexpected layout state. +- (void)testSignInSignOutScrolledToTop { + [[EarlGrey selectElementWithMatcher:chrome_test_util::NTPLogo()] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; + + FakeSystemIdentity* identity = [FakeSystemIdentity fakeIdentity1]; + [SigninEarlGrey addFakeIdentity:identity]; + [SigninEarlGreyUI signinWithFakeIdentity:identity]; + GREYWaitForAppToIdle(@"App failed to idle"); + + // Verify Identity Disc is visible since it is the top-most element and should + // be showing now. + [[EarlGrey + selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSStringF( + IDS_IOS_IDENTITY_DISC_WITH_NAME_AND_EMAIL, + base::SysNSStringToUTF16( + identity.userFullName), + base::SysNSStringToUTF16( + identity.userEmail)))] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::NTPLogo()] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Sign out + [SigninEarlGreyUI + signOutWithConfirmationChoice:SignOutConfirmationChoiceClearData]; + + [[EarlGrey selectElementWithMatcher:chrome_test_util::NTPLogo()] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + #pragma mark - New Tab menu tests // Tests the "new search" menu item from the new tab menu.
diff --git a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn index 0b4abff..e5ae4c1 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn +++ b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn
@@ -53,6 +53,7 @@ "//ios/chrome/browser/ui/credential_provider_promo/resources:animation_files", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/confirmation_alert", + "//ios/public/provider/chrome/browser/lottie:lottie_animation_api", # TODO(crbug.com/1412808): uncomment once Lottie framework is added. # "//ios/third_party/lottie",
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_consumer.h b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_consumer.h index 94ddec4..bbe382e4 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_consumer.h +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_consumer.h
@@ -23,9 +23,9 @@ tertiaryActionString:(NSString*)tertiaryActionString image:(UIImage*)image; -// Passes the animation path to the consumer. Must be called before -viewDidLoad -// is called. -- (void)setAnimation:(NSString*)animationResourcePath; +// Passes the animation resource name to the consumer. Must be called before +// -viewDidLoad is called. +- (void)setAnimation:(NSString*)animationResourceName; @end
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 b0d1032..fa9080f 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
@@ -138,7 +138,7 @@ // Sets the animation to the consumer that corresponds to the value of // promoContext. Depending on the value of promoContext, either the 'first step' -// or 'learn more' animation path is set. +// or 'learn more' animation name is set. - (void)setAnimation { DCHECK(self.consumer); NSString* animationName; @@ -147,9 +147,7 @@ } else { animationName = kLearnMoreAnimation; } - NSString* path = [[NSBundle mainBundle] pathForResource:animationName - ofType:@"json"]; - [self.consumer setAnimation:path]; + [self.consumer setAnimation:animationName]; } // Sets the text and image to the consumer. The text set depends on the value of
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_view_controller.mm b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_view_controller.mm index 4195bd4..af22faa 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_view_controller.mm +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_view_controller.mm
@@ -4,12 +4,11 @@ #import "ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_view_controller.h" -// TODO(crbug.com/1412808): uncomment once Lottie framework is added. -// #import <Lottie/Lottie.h> - #import "base/values.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/public/provider/chrome/browser/lottie/lottie_animation_api.h" +#import "ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -25,23 +24,14 @@ @interface CredentialProviderPromoViewController () // Custom animation view used in the full-screen promo. -// TODO(crbug.com/1412808): replace with comment once Lottie framework is added. -// @property(nonatomic, strong) LOTAnimationView* animationView; -@property(nonatomic, strong) UIView* animationView; +@property(nonatomic, strong) id<LottieAnimation> animationViewWrapper; // Child view controller used to display the alert screen for the half-screen // and full-screen promos. @property(nonatomic, strong) ConfirmationAlertViewController* alertScreen; -// Vertical constraint for `alertScreen` when the device is in portrait -// orientation. `alertScreen` is half the height of the screen. -@property(nonatomic, strong) - NSLayoutConstraint* alertScreenPortraitModeVerticalConstraint; - -// Vertical constraint for `alertScreen` when the device is in landscape -// orientation. `alertScreen` is the full height of the screen. -@property(nonatomic, strong) - NSLayoutConstraint* alertScreenLandscapeModeVerticalConstraint; +// TopAnchor constraint for `alertScreen`. +@property(nonatomic, strong) NSLayoutConstraint* alertScreenTopAnchorConstraint; // Returns true if the animationView should be displayed. @property(nonatomic, assign, readonly) BOOL shouldShowAnimation; @@ -55,28 +45,18 @@ - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; - if (self.animationView) { + if (self.animationViewWrapper) { [self configureAndLayoutAnimationView]; } [self configureAlertScreen]; [self layoutAlertScreen]; } -// Called when the device is rotated. In landscape orientation, `animationView` -// is hidden and `alertScreenPortraitModeVerticalConstraint` is activated. In -// portrait orientation, both `alertScreen` and `animationView` are displayed, -// and `alertScreenLandscapeModeVerticalConstraint` is activated. +// Called when the device is rotated. (Un)Hide the animation accordingly. - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { [super traitCollectionDidChange:previousTraitCollection]; - if ([self shouldShowAnimation]) { - self.alertScreenPortraitModeVerticalConstraint.active = NO; - self.alertScreenLandscapeModeVerticalConstraint.active = YES; - self.animationView.hidden = NO; - } else { - self.alertScreenLandscapeModeVerticalConstraint.active = NO; - self.alertScreenPortraitModeVerticalConstraint.active = YES; - self.animationView.hidden = YES; - } + self.animationViewWrapper.animationView.hidden = ![self shouldShowAnimation]; + [self updateAlertScreenTopAnchorConstraint]; } #pragma mark - CredentialProviderPromoConsumer @@ -100,13 +80,14 @@ self.alertScreen = alertScreen; } -- (void)setAnimation:(NSString*)animationAssetPath { +- (void)setAnimation:(NSString*)animationAssetName { DCHECK(!self.isViewLoaded); - // TODO(crbug.com/1412808): replace line with comment once Lottie framework is - // added. - //_animationView = [LOTAnimationView - // animationWithFilePath:animationAssetPath]; - _animationView = [[UIView alloc] init]; + + LottieAnimationConfiguration* config = + [[LottieAnimationConfiguration alloc] init]; + config.animationName = animationAssetName; + config.loopAnimationCount = 1000; + _animationViewWrapper = ios::provider::GenerateLottieAnimation(config); } #pragma mark - Private @@ -132,7 +113,7 @@ // Sets the layout of the alertScreen view. - (void)layoutAlertScreen { - if (self.animationView) { + if (self.animationViewWrapper.animationView) { [self layoutAlertScreenForPromoWithAnimation]; } else { [self layoutAlertScreenForPromoWithoutAnimation]; @@ -143,12 +124,6 @@ // shown with the animation view (full-screen promo). - (void)layoutAlertScreenForPromoWithAnimation { self.alertScreen.view.translatesAutoresizingMaskIntoConstraints = NO; - self.alertScreenPortraitModeVerticalConstraint = - [self.alertScreen.view.topAnchor - constraintEqualToAnchor:self.view.topAnchor]; - self.alertScreenLandscapeModeVerticalConstraint = - [self.alertScreen.view.topAnchor - constraintEqualToAnchor:self.view.centerYAnchor]; [NSLayoutConstraint activateConstraints:@[ [self.alertScreen.view.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], @@ -157,11 +132,21 @@ [self.alertScreen.view.widthAnchor constraintEqualToAnchor:self.view.widthAnchor], ]]; + [self updateAlertScreenTopAnchorConstraint]; +} + +// Updates the top anchor of the alertScreen. +// Called when the screen rotates, or in the initial layout. +- (void)updateAlertScreenTopAnchorConstraint { + self.alertScreenTopAnchorConstraint.active = NO; if ([self shouldShowAnimation]) { - self.alertScreenLandscapeModeVerticalConstraint.active = YES; + self.alertScreenTopAnchorConstraint = [self.alertScreen.view.topAnchor + constraintEqualToAnchor:self.view.centerYAnchor]; } else { - self.alertScreenPortraitModeVerticalConstraint.active = YES; + self.alertScreenTopAnchorConstraint = [self.alertScreen.view.topAnchor + constraintEqualToAnchor:self.view.topAnchor]; } + self.alertScreenTopAnchorConstraint.active = YES; } // Sets the layout of the alertScreen view when the promo will be @@ -184,27 +169,34 @@ // Configures the animation view and its constraints. - (void)configureAndLayoutAnimationView { - [self.view addSubview:self.animationView]; - self.animationView.translatesAutoresizingMaskIntoConstraints = NO; - self.animationView.contentMode = UIViewContentModeScaleAspectFit; - // TODO(crbug.com/1412808): uncomment once Lottie framework is added. - // self.animationView.loopAnimation = YES; - //[self.animationView play]; + [self.view addSubview:self.animationViewWrapper.animationView]; + + self.animationViewWrapper.animationView + .translatesAutoresizingMaskIntoConstraints = NO; + self.animationViewWrapper.animationView.contentMode = + UIViewContentModeScaleAspectFit; + [NSLayoutConstraint activateConstraints:@[ - [self.animationView.centerXAnchor - constraintEqualToAnchor:self.view.centerXAnchor], - [self.animationView.topAnchor constraintEqualToAnchor:self.view.topAnchor], - [self.animationView.bottomAnchor + [self.animationViewWrapper.animationView.leftAnchor + constraintEqualToAnchor:self.view.leftAnchor], + [self.animationViewWrapper.animationView.rightAnchor + constraintEqualToAnchor:self.view.rightAnchor], + [self.animationViewWrapper.animationView.topAnchor + constraintEqualToAnchor:self.view.topAnchor], + [self.animationViewWrapper.animationView.bottomAnchor constraintEqualToAnchor:self.view.centerYAnchor], ]]; + + [self.animationViewWrapper play]; } // Returns YES if the view should display the animation view. // The animation view should be displayed if `animationView` is not null and the // device is in portrait orientation. - (BOOL)shouldShowAnimation { - return self.animationView && self.traitCollection.verticalSizeClass != - UIUserInterfaceSizeClassCompact; + return self.animationViewWrapper.animationView && + self.traitCollection.verticalSizeClass != + UIUserInterfaceSizeClassCompact; } @end
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_consumer.h b/ios/chrome/browser/ui/infobars/banners/infobar_banner_consumer.h index 30ecafc..7f017b5f 100644 --- a/ios/chrome/browser/ui/infobars/banners/infobar_banner_consumer.h +++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_consumer.h
@@ -44,11 +44,6 @@ // The subtitle displayed by this InfobarBanner. - (void)setSubtitleText:(NSString*)subtitleText; -// Applies a custom style (e.g. bold, italic) to a range of the subtitle -// displayed by the InfobarBanner. -- (void)addCustomStyle:(UIFontDescriptorSymbolicTraits)symbolicTraits - toSubtitleRange:(NSRange)range; - // If YES, restricts the number of lines in subtitle to 1. - (void)setRestrictSubtitleTextToSingleLine: (BOOL)restrictSubtitleTextToSingleLine;
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm index 1fece01..c11fe8fc 100644 --- a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
@@ -58,21 +58,6 @@ constexpr base::TimeDelta kLongPressTimeDuration = base::Milliseconds(400); } // namespace -#pragma mark - StyledRange - -// Used to track ranges of a string that should receive custom styling. -@interface StyledRange : NSObject - -@property(nonatomic) UIFontDescriptorSymbolicTraits symbolicTraits; -@property(nonatomic) NSRange range; - -@end - -@implementation StyledRange -@end - -#pragma mark - InfobarBannerViewController - @interface InfobarBannerViewController () // Properties backing the InfobarBannerConsumer protocol. @@ -82,7 +67,6 @@ @property(nonatomic, assign) BOOL presentsModal; @property(nonatomic, copy) NSString* titleText; @property(nonatomic, copy) NSString* subtitleText; -@property(nonatomic, copy) NSMutableArray<StyledRange*>* subtitleStyledRanges; @property(nonatomic, assign) BOOL useIconBackgroundTint; @property(nonatomic, assign) BOOL ignoreIconColorWithTint; @property(nonatomic, strong) UIColor* iconImageTintColor; @@ -135,7 +119,6 @@ _useIconBackgroundTint = YES; _ignoreIconColorWithTint = YES; _restrictSubtitleTextToSingleLine = NO; - _subtitleStyledRanges = [[NSMutableArray alloc] init]; } return self; } @@ -222,8 +205,11 @@ forAxis:UILayoutConstraintAxisVertical]; self.subTitleLabel = [[UILabel alloc] init]; - self.subTitleLabel.attributedText = [self subtitleAttributedText]; + self.subTitleLabel.text = self.subtitleText; + self.subTitleLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; self.subTitleLabel.adjustsFontForContentSizeCategory = YES; + self.subTitleLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; if (_restrictSubtitleTextToSingleLine) { self.subTitleLabel.numberOfLines = 1; } else { @@ -422,7 +408,7 @@ - (void)setSubtitleText:(NSString*)subtitleText { _subtitleText = subtitleText; - self.subTitleLabel.attributedText = [self subtitleAttributedText]; + self.subTitleLabel.text = _subtitleText; self.subTitleLabel.hidden = !self.subtitleText.length; } @@ -456,14 +442,6 @@ _iconBackgroundColor = iconBackgroundColor; } -- (void)addCustomStyle:(UIFontDescriptorSymbolicTraits)symbolicTraits - toSubtitleRange:(NSRange)range { - StyledRange* styledRange = [[StyledRange alloc] init]; - styledRange.symbolicTraits = symbolicTraits; - styledRange.range = range; - [_subtitleStyledRanges addObject:styledRange]; -} - - (void)setRestrictSubtitleTextToSingleLine: (BOOL)restrictSubtitleTextToSingleLine { _restrictSubtitleTextToSingleLine = restrictSubtitleTextToSingleLine; @@ -672,33 +650,4 @@ return self.titleText; } -- (NSMutableAttributedString*)subtitleAttributedText { - if (!self.self.subtitleText) { - return nil; - } - - UIFontDescriptor* defaultDescriptor = [UIFontDescriptor - preferredFontDescriptorWithTextStyle:UIFontTextStyleFootnote]; - // Passing 0 defers the size responsibility to the descriptor. - UIFont* defaultFont = [UIFont fontWithDescriptor:defaultDescriptor size:0.0]; - NSMutableAttributedString* attributedText = [[NSMutableAttributedString alloc] - initWithString:self.subtitleText - attributes:@{ - NSFontAttributeName : defaultFont, - NSForegroundColorAttributeName : - [UIColor colorNamed:kTextSecondaryColor] - }]; - - for (StyledRange* styledRange in self.subtitleStyledRanges) { - UIFontDescriptor* customDescriptor = [defaultDescriptor - fontDescriptorWithSymbolicTraits:styledRange.symbolicTraits]; - // Passing 0 defers the size responsibility to the descriptor. - UIFont* customFont = [UIFont fontWithDescriptor:customDescriptor size:0.0]; - [attributedText addAttribute:NSFontAttributeName - value:customFont - range:styledRange.range]; - } - return attributedText; -} - @end
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller_unittest.mm b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller_unittest.mm index 1ef169ef..d00b2d3e 100644 --- a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller_unittest.mm
@@ -56,9 +56,9 @@ // Add view_controller_ to the UI Hierarchy to make sure views are created and // retained correctly. [scoped_key_window_.Get() setRootViewController:view_controller_]; - ASSERT_NSEQ(view_controller_.titleLabel.text, kTitle); - ASSERT_NSEQ(view_controller_.subTitleLabel.text, kSubtitleText); - ASSERT_NSEQ(view_controller_.infobarButton.titleLabel.text, kButtonText); + ASSERT_EQ(view_controller_.titleLabel.text, kTitle); + ASSERT_EQ(view_controller_.subTitleLabel.text, kSubtitleText); + ASSERT_EQ(view_controller_.infobarButton.titleLabel.text, kButtonText); } TEST_F(InfobarBannerViewControllerTest, TestSubtitleLabelHidden) { @@ -66,43 +66,6 @@ // Add view_controller_ to the UI Hierarchy to make sure views are created and // retained correctly. [scoped_key_window_.Get() setRootViewController:view_controller_]; - ASSERT_NSEQ(view_controller_.titleLabel.text, @"title"); + ASSERT_EQ(view_controller_.titleLabel.text, @"title"); ASSERT_TRUE(view_controller_.subTitleLabel.hidden); } - -TEST_F(InfobarBannerViewControllerTest, TestAddCustomStyleToSubtitleRange) { - NSString* const kSubtitleText = @"BoldItalic"; - NSRange expectedBoldRange = [kSubtitleText rangeOfString:@"Bold"]; - NSRange expectedItalicRange = [kSubtitleText rangeOfString:@"Italic"]; - [view_controller_ setSubtitleText:kSubtitleText]; - - [view_controller_ addCustomStyle:UIFontDescriptorTraitBold - toSubtitleRange:expectedBoldRange]; - [view_controller_ addCustomStyle:UIFontDescriptorTraitItalic - toSubtitleRange:expectedItalicRange]; - [scoped_key_window_.Get() setRootViewController:view_controller_]; - - NSRange maxSearchRange = NSMakeRange(0, [kSubtitleText length]); - NSRange range1; - UIFont* font1 = [view_controller_.subTitleLabel.attributedText - attribute:NSFontAttributeName - atIndex:0 - longestEffectiveRange:&range1 - inRange:maxSearchRange]; - UIFontDescriptorSymbolicTraits traits1 = - [[font1 fontDescriptor] symbolicTraits]; - EXPECT_TRUE(NSEqualRanges(range1, expectedBoldRange)); - EXPECT_TRUE(traits1 & UIFontDescriptorTraitBold); - EXPECT_FALSE(traits1 & UIFontDescriptorTraitItalic); - NSRange range2; - UIFont* font2 = [view_controller_.subTitleLabel.attributedText - attribute:NSFontAttributeName - atIndex:expectedItalicRange.location - longestEffectiveRange:&range2 - inRange:maxSearchRange]; - UIFontDescriptorSymbolicTraits traits2 = - [[font2 fontDescriptor] symbolicTraits]; - EXPECT_TRUE(NSEqualRanges(range2, expectedItalicRange)); - EXPECT_FALSE(traits2 & UIFontDescriptorTraitBold); - EXPECT_TRUE(traits2 & UIFontDescriptorTraitItalic); -}
diff --git a/ios/chrome/browser/ui/infobars/banners/test/fake_infobar_banner_consumer.mm b/ios/chrome/browser/ui/infobars/banners/test/fake_infobar_banner_consumer.mm index f9480c6..5bb7469 100644 --- a/ios/chrome/browser/ui/infobars/banners/test/fake_infobar_banner_consumer.mm +++ b/ios/chrome/browser/ui/infobars/banners/test/fake_infobar_banner_consumer.mm
@@ -9,9 +9,4 @@ #endif @implementation FakeInfobarBannerConsumer - -- (void)addCustomStyle:(UIFontDescriptorSymbolicTraits)symbolicTraits - toSubtitleRange:(NSRange)range { -} - @end
diff --git a/ios/chrome/browser/ui/list_model/list_model_unittest.mm b/ios/chrome/browser/ui/list_model/list_model_unittest.mm index f45a36b..7efacc6 100644 --- a/ios/chrome/browser/ui/list_model/list_model_unittest.mm +++ b/ios/chrome/browser/ui/list_model/list_model_unittest.mm
@@ -60,13 +60,6 @@ ItemTypeWeasleyFooter, }; -void LogSink(const char* file, - int line, - const base::StringPiece message, - const base::StringPiece stack_trace) { - // No-op. -} - using ListModelTest = PlatformTest; // Test generic model boxing (check done at compilation time). @@ -320,24 +313,6 @@ EXPECT_NSEQ(gouda, cheeseItems[2]); } -TEST_F(ListModelTest, InvalidIndexPath) { - ListModel* model = [[ListModel alloc] init]; - [model addSectionWithIdentifier:SectionIdentifierCheese]; - - logging::ScopedLogAssertHandler scoped_assert_handler( - base::BindRepeating(LogSink)); - bool out_of_bounds_exception_thrown = false; - @try { - [model indexInItemTypeForIndexPath:[NSIndexPath indexPathForItem:0 - inSection:0]]; - } @catch (NSException* exception) { - if ([[exception name] isEqualToString:NSRangeException]) { - out_of_bounds_exception_thrown = true; - } - } - EXPECT_TRUE(out_of_bounds_exception_thrown); -} - TEST_F(ListModelTest, RemoveItems) { ListModel* model = [[ListModel alloc] init];
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm index f01a45f..cdcaaace 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm
@@ -107,8 +107,13 @@ DCHECK(!self.promoView); self.promoViewContainer = [[UIView alloc] init]; self.promoViewContainer.translatesAutoresizingMaskIntoConstraints = NO; - self.promoViewContainer.backgroundColor = - [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + if (IsDiscoverFeedTopSyncPromoCompact()) { + self.promoViewContainer.backgroundColor = + [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + } else { + self.promoViewContainer.backgroundColor = + [UIColor colorNamed:kGrey100Color]; + } self.promoViewContainer.layer.cornerRadius = kPromoViewContainerBorderRadius; @@ -188,9 +193,7 @@ promoView.titleLabel.text = l10n_util::GetNSString(IDS_IOS_NTP_FEED_SIGNIN_PROMO_TITLE); promoView.textLabel.text = - IsDiscoverFeedTopSyncPromoCompact() - ? l10n_util::GetNSString(IDS_IOS_NTP_FEED_SIGNIN_COMPACT_PROMO_BODY) - : l10n_util::GetNSString(IDS_IOS_NTP_FEED_SIGNIN_FULL_PROMO_BODY); + l10n_util::GetNSString(IDS_IOS_NTP_FEED_SIGNIN_COMPACT_PROMO_BODY); // TODO(crbug.com/1331010): Update the Promo icon. [promoView setNonProfileImage:[UIImage imageNamed:kPromoViewImageName]]; return promoView;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 8824a80c..faf6fba 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -1233,8 +1233,8 @@ if (IsWebChannelsEnabled()) { [self.feedHeaderViewController updateForFollowingFeedVisibilityChanged]; [self updateFeedLayout]; - [self.NTPViewController setContentOffsetToTop]; } + [self.NTPViewController setContentOffsetToTop]; } }
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h index 8b4d44b..c0fe8d3f 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h
@@ -129,10 +129,6 @@ // Signals that the feed has completed its updates (i.e. loading cards). - (void)feedLayoutDidEndUpdates; -// Forces the elements that stick to the top when scrolling (eg. omnibox, feed -// header) to update for the current scroll position. -- (void)updateStickyElements; - @end #endif // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm index 0078f5c..b237fdac 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -540,11 +540,6 @@ if (self.hasSavedOffsetFromPreviousScrollState) { [self setContentOffset:self.savedScrollOffset]; } - [self updateStickyElements]; -} - -- (void)updateStickyElements { - [self handleStickyElementsForScrollPosition:[self scrollPosition] force:YES]; } #pragma mark - NewTabPageConsumer
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn index 57cb1b2..8d1bd7e 100644 --- a/ios/chrome/browser/ui/settings/password/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -307,6 +307,7 @@ "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", "//ios/chrome/browser/ui/settings:settings_root_constants", "//ios/chrome/browser/ui/settings/google_services:constants", + "//ios/chrome/browser/ui/settings/password/password_details:password_details_table_view_constants", "//ios/chrome/browser/ui/settings/password/password_settings:password_settings_constants", "//ios/chrome/browser/ui/settings/password/passwords_in_other_apps:eg_test_support+eg2", "//ios/chrome/browser/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 49a25bc3..e958c4e 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -102,6 +102,15 @@ ] } +source_set("password_details_table_view_constants") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "password_details_table_view_constants.h", + "password_details_table_view_constants.mm", + ] + deps = [ "//ios/chrome/browser/ui/list_model" ] +} + source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm index 9ee9e413..9889b9d 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm
@@ -55,7 +55,8 @@ SectionIdentifierSite, SectionIdentifierDuplicate, SectionIdentifierFooter, - SectionIdentifierTLDFooter + SectionIdentifierTLDFooter, + SectionIdentifierNoteFooter }; typedef NS_ENUM(NSInteger, ItemType) { @@ -70,6 +71,10 @@ // Size of the symbols. const CGFloat kSymbolSize = 15; +// Minimal amount of characters in password note to display the warning. +const int kMinNoteCharAmountForWarning = 901; +// Maximal amount of characters that a password note can contain. +const int kMaxNoteCharAmount = 1000; } // namespace @@ -107,6 +112,12 @@ // Yes, when the message for top-level domain missing is shown. @property(nonatomic, assign) BOOL isTLDMissingMessageShown; +// Yes, when the footer informing about the max note length is shown. +@property(nonatomic, assign) BOOL isNoteFooterShown; + +// Yes, when the note's length is less or equal than `kMaxNoteCharAmount`. +@property(nonatomic, assign) BOOL isNoteValid; + // If YES, the password details are shown without requiring any authentication. @property(nonatomic, assign) BOOL showPasswordWithoutAuth; @@ -129,6 +140,8 @@ _shouldEnableSave = NO; _showPasswordWithoutAuth = NO; _isTLDMissingMessageShown = NO; + _isNoteFooterShown = NO; + _isNoteValid = YES; _syncingUserEmail = syncingUserEmail; } return self; @@ -207,6 +220,7 @@ self.noteTextItem = [self noteItem]; [model addItem:self.noteTextItem toSectionWithIdentifier:SectionIdentifierPassword]; + [model addSectionWithIdentifier:SectionIdentifierNoteFooter]; } [model addSectionWithIdentifier:SectionIdentifierFooter]; @@ -290,7 +304,6 @@ return item; } -// TODO(crbug.com/1414897): Adjust item specs to the defined mocks. - (TableViewMultiLineTextEditItem*)noteItem { TableViewMultiLineTextEditItem* item = [[TableViewMultiLineTextEditItem alloc] initWithType:ItemTypeNote]; @@ -356,6 +369,14 @@ return item; } +- (TableViewLinkHeaderFooterItem*)tooLongNoteMessageFooterItem { + TableViewLinkHeaderFooterItem* item = + [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeFooter]; + item.text = l10n_util::GetNSString( + IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION); + return item; +} + - (NSString*)footerText { if (self.syncingUserEmail) { return l10n_util::GetNSStringF( @@ -573,7 +594,7 @@ BOOL siteValid = [self checkIfValidSite]; BOOL passwordValid = [self checkIfValidPassword]; - self.shouldEnableSave = (siteValid && passwordValid); + self.shouldEnableSave = (siteValid && passwordValid && self.isNoteValid); [self toggleNavigationBarRightButtonItem]; [self.delegate checkForDuplicates:self.usernameTextItem.textFieldValue]; @@ -601,6 +622,42 @@ #pragma mark - TableViewMultiLineTextEditItemDelegate - (void)textViewItemDidChange:(TableViewMultiLineTextEditItem*)tableViewItem { + DCHECK(tableViewItem == self.noteTextItem); + + // Update save button state based on the note's length and validity of other + // input fields. + BOOL noteValid = tableViewItem.text.length <= kMaxNoteCharAmount; + if (self.isNoteValid != noteValid) { + self.isNoteValid = noteValid; + tableViewItem.validText = noteValid; + + self.shouldEnableSave = + noteValid && [self checkIfValidSite] && [self checkIfValidPassword]; + [self toggleNavigationBarRightButtonItem]; + } + + // Update note footer based on the note's length. + BOOL shouldDisplayNoteFooter = + tableViewItem.text.length >= kMinNoteCharAmountForWarning; + if (self.isNoteFooterShown != shouldDisplayNoteFooter) { + self.isNoteFooterShown = shouldDisplayNoteFooter; + [self + performBatchTableViewUpdates:^{ + [self.tableViewModel + setFooter:shouldDisplayNoteFooter + ? [self tooLongNoteMessageFooterItem] + : nil + forSectionWithIdentifier:SectionIdentifierNoteFooter]; + NSUInteger index = [self.tableViewModel + sectionForSectionIdentifier:SectionIdentifierNoteFooter]; + [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:index] + withRowAnimation:UITableViewRowAnimationNone]; + } + completion:nil]; + } + + [self reconfigureCellsForItems:@[ tableViewItem ]]; + // Refresh the cells' height. [self.tableView beginUpdates]; [self.tableView endUpdates];
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm index ed93700..e7db8ca 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller_unittest.mm
@@ -221,7 +221,7 @@ static_cast<AddPasswordViewController*>(controller()); [passwords_controller loadModel]; - EXPECT_EQ(4, NumberOfSections()); + EXPECT_EQ(5, NumberOfSections()); EXPECT_EQ(1, NumberOfItemsInSection(0)); EXPECT_EQ(0, NumberOfItemsInSection(1)); EXPECT_EQ(3, NumberOfItemsInSection(2)); @@ -232,7 +232,7 @@ IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION), l10n_util::GetNSString( IDS_IOS_SAVE_PASSWORD_FOOTER_NOT_SYNCING)], - 3); + 4); } // Tests the layout of the view controller when adding a new credential with
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 2c57a2f..a7515da 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -19,6 +19,7 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h" +#import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_constants.h" #import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_constants.h" #import "ios/chrome/browser/ui/settings/password/password_settings_app_interface.h" #import "ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface.h" @@ -366,6 +367,13 @@ return grey_accessibilityID(kSettingsToolbarSettingsButtonId); } +// Returns matcher for the password details / add password view footer displayed +// when the note length is approaching max limit. +id<GREYMatcher> TooLongNoteFooter() { + return grey_text(l10n_util::GetNSString( + IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION)); +} + // Saves an example form in the store. void SaveExamplePasswordForm() { GREYAssert( @@ -551,7 +559,10 @@ if ([self isRunningTest:@selector(testLayoutWithNotesDisabled)]) { config.features_disabled.push_back(syncer::kPasswordNotesWithBackup); } - if ([self isRunningTest:@selector(testLayoutWithNotesEnabled)]) { + if ([self isRunningTest:@selector(testLayoutWithNotesEnabled)] || + [self isRunningTest:@selector(testAddPasswordLayoutWithLongNotes)] || + [self isRunningTest:@selector + (testAddPasswordSaveButtonStateOnFieldChanges)]) { config.features_enabled.push_back(syncer::kPasswordNotesWithBackup); } @@ -2302,6 +2313,57 @@ assertWithMatcher:grey_textFieldValue(@"new password")]; } +// Checks that entering too long note while adding passwords blocks the save +// button and displays a footer explanation. +- (void)testAddPasswordLayoutWithLongNotes { + OpenPasswordManager(); + + [[EarlGrey selectElementWithMatcher:AddPasswordToolbarButton()] + performAction:grey_tap()]; + + // Fill form. + [[EarlGrey selectElementWithMatcher:AddPasswordWebsite()] + performAction:grey_replaceText(@"https://example.com/")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailUsername()] + performAction:grey_replaceText(@"new username")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + performAction:grey_replaceText(@"new password")]; + + // Entering too long note results in "Add" password being disabled and footer + // displayed. + NSString* note = [@"" stringByPaddingToLength:1001 + withString:@"a" + startingAtIndex:0]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kPasswordDetailsViewControllerId)] + performAction:grey_scrollToContentEdge(kGREYContentEdgeBottom)]; + [[EarlGrey selectElementWithMatcher:TooLongNoteFooter()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Entering note with length close to the limit should result in displaying + // footer only ("add" button should be enabled). + note = [@"" stringByPaddingToLength:1000 withString:@"a" startingAtIndex:0]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_enabled()]; + [[EarlGrey selectElementWithMatcher:TooLongNoteFooter()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // For shorter notes there should be no footer and "add" button enabled. + note = [@"" stringByPaddingToLength:100 withString:@"a" startingAtIndex:0]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_enabled()]; + [[EarlGrey selectElementWithMatcher:TooLongNoteFooter()] + assertWithMatcher:grey_nil()]; +} + // Tests that when a new credential is saved or an existing one is updated via // the add credential flow, the VC auto scrolls to the newly created or the // updated entry. @@ -2409,6 +2471,70 @@ performAction:grey_tap()]; } +// Tests that save button in add password view remains disabled when we switch +// from invalid to valid input in any of the fields (website, password, note), +// when there are still other fields with invalid input. +- (void)testAddPasswordSaveButtonStateOnFieldChanges { + OpenPasswordManager(); + [[EarlGrey selectElementWithMatcher:AddPasswordToolbarButton()] + performAction:grey_tap()]; + + NSString* long_note = [@"" stringByPaddingToLength:1001 + withString:@"a" + startingAtIndex:0]; + [[EarlGrey selectElementWithMatcher:PasswordDetailUsername()] + performAction:grey_replaceText(@"username")]; + + // Make sure that switching from invalid to valid note doesn't enable the save + // button when website is invalid. + [[EarlGrey selectElementWithMatcher:AddPasswordWebsite()] + performAction:grey_replaceText(@"example")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + performAction:grey_replaceText(@"password")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(long_note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(@"note")]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + + // Make sure that switching from invalid to valid note doesn't enable the save + // button when password is invalid. + [[EarlGrey selectElementWithMatcher:AddPasswordWebsite()] + performAction:grey_replaceText(@"https://example.com/")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + performAction:grey_replaceText(@"")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(long_note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(@"note")]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + + // Make sure that from invalid to valid website and password doesn't enable + // the save button when note is too long. + [[EarlGrey selectElementWithMatcher:AddPasswordWebsite()] + performAction:grey_replaceText(@"example")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + performAction:grey_replaceText(@"")]; + [[EarlGrey selectElementWithMatcher:PasswordDetailNote()] + performAction:grey_replaceText(long_note)]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + [[EarlGrey selectElementWithMatcher:AddPasswordWebsite()] + performAction:grey_replaceText(@"https://example.com/")]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; + [[EarlGrey selectElementWithMatcher:PasswordDetailPassword()] + performAction:grey_replaceText(@"password")]; + [[EarlGrey selectElementWithMatcher:AddPasswordSaveButton()] + assertWithMatcher:grey_not(grey_enabled())]; +} + // Tests that the duplicate credential section alert is shown when the user adds // a credential that has the same website as that of an existing credential // (does not contain username).
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index 5d5fffa..bf8de3cc 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -1168,11 +1168,15 @@ if (currentlyBookmarked) { [self editBookmarkWithURL:URL]; } else { + base::RecordAction(base::UserMetricsAction( + "MobileTabGridOpenedBookmarkEditorForNewBookmark")); [self.bookmarksCoordinator bookmarkURL:URL title:title]; } } - (void)editBookmarkWithURL:(const GURL&)URL { + base::RecordAction(base::UserMetricsAction( + "MobileTabGridOpenedBookmarkEditorForExistingBookmark")); [self.bookmarksCoordinator presentBookmarkEditorForURL:URL]; }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm index f90837b1..1d44da2 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -1110,7 +1110,8 @@ return; } [self.delegate dismissPopovers]; - + base::RecordAction( + base::UserMetricsAction("MobileTabGridAddedMultipleNewBookmarks")); base::UmaHistogramCounts100("IOS.TabGrid.Selection.AddToBookmarks", items.count);
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h index b91aac7..6e63585 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h
@@ -24,6 +24,9 @@ // Whether the text field is enabled for editing. @property(nonatomic, assign) BOOL editingEnabled; +// Whether the text typed in `textView` is valid. +@property(nonatomic, assign) BOOL validText; + @end // Implements a TableViewCell that displays a label in the first line and a @@ -36,6 +39,10 @@ // Text field below the label. @property(nonatomic, readonly, strong) UITextView* textView; +// Displays error icon when the typed text view is not valid, it is nil +// otherwise. Placed at the trailing edge of the cell, next to the label. +@property(nonatomic, strong) UIImageView* iconView; + @end #endif // IOS_CHROME_BROWSER_UI_TABLE_VIEW_CELLS_TABLE_VIEW_MULTI_LINE_TEXT_EDIT_ITEM_H_
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm index a843581..9400ec5 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.mm
@@ -4,7 +4,9 @@ #import "ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item.h" +#import "ios/chrome/browser/ui/icons/symbols.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_multi_line_text_edit_item_delegate.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/common/ui/util/constraints_ui_util.h" @@ -12,6 +14,15 @@ #error "This file requires ARC support." #endif +namespace { + +// Height / width of the error icon. +const CGFloat kErrorIconLength = 20; +// Size of the symbols. +const CGFloat kSymbolSize = 15; + +} // namespace + @interface TableViewMultiLineTextEditItem () <UITextViewDelegate> @end @@ -21,6 +32,7 @@ self = [super initWithType:type]; if (self) { self.cellClass = [TableViewMultiLineTextEditCell class]; + _validText = YES; } return self; } @@ -39,6 +51,17 @@ cell.textView.accessibilityIdentifier = [NSString stringWithFormat:@"%@_textField", self.label]; } + + if (self.validText) { + cell.textView.textColor = [UIColor colorNamed:kTextPrimaryColor]; + cell.iconView.hidden = YES; + [cell.iconView setImage:nil]; + } else { + cell.textView.textColor = [UIColor colorNamed:kRedColor]; + cell.iconView.hidden = NO; + [cell.iconView setImage:[self errorImage]]; + cell.iconView.tintColor = [UIColor colorNamed:kRedColor]; + } } #pragma mark - UITextViewDelegate @@ -48,6 +71,18 @@ [self.delegate textViewItemDidChange:self]; } +#pragma mark - Private + +// Returns the error icon image. +- (UIImage*)errorImage { + if (UseSymbols()) { + return DefaultSymbolWithPointSize(kErrorCircleFillSymbol, kSymbolSize); + } else { + return [[UIImage imageNamed:@"table_view_cell_error_icon"] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } +} + @end @implementation TableViewMultiLineTextEditCell @@ -63,33 +98,58 @@ UIView* contentView = self.contentView; _textLabel = [[UILabel alloc] init]; - _textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; _textLabel.adjustsFontForContentSizeCategory = YES; + _textLabel.translatesAutoresizingMaskIntoConstraints = NO; + _textLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + [contentView addSubview:_textLabel]; _textView = [[UITextView alloc] init]; - _textView.scrollEnabled = NO; - _textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; _textView.adjustsFontForContentSizeCategory = YES; + _textView.translatesAutoresizingMaskIntoConstraints = NO; + _textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + _textView.scrollEnabled = NO; + _textView.textContainer.lineFragmentPadding = 0; + _textView.textContainerInset = UIEdgeInsetsZero; + [contentView addSubview:_textView]; - UIStackView* stackView = [[UIStackView alloc] - initWithArrangedSubviews:@[ _textLabel, _textView ]]; - stackView.translatesAutoresizingMaskIntoConstraints = NO; - stackView.axis = UILayoutConstraintAxisVertical; - stackView.spacing = kTableViewOneLabelCellVerticalSpacing; - [contentView addSubview:stackView]; + _iconView = [[UIImageView alloc] initWithImage:nil]; + _iconView.translatesAutoresizingMaskIntoConstraints = NO; + [contentView addSubview:_iconView]; [NSLayoutConstraint activateConstraints:@[ - [stackView.leadingAnchor + // Label constraints. + [_textLabel.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor constant:kTableViewHorizontalSpacing], - [stackView.trailingAnchor + [_textLabel.topAnchor + constraintEqualToAnchor:contentView.topAnchor + constant:kTableViewOneLabelCellVerticalSpacing], + // Text constraints. + [_textView.leadingAnchor + constraintEqualToAnchor:contentView.leadingAnchor + constant:kTableViewHorizontalSpacing], + [_textView.trailingAnchor constraintEqualToAnchor:contentView.trailingAnchor constant:-kTableViewHorizontalSpacing], - [stackView.topAnchor constraintEqualToAnchor:contentView.topAnchor - constant:kTableViewVerticalSpacing], - [stackView.bottomAnchor + [_textView.topAnchor + constraintEqualToAnchor:_textLabel.bottomAnchor + constant:kTableViewOneLabelCellVerticalSpacing], + [_textView.bottomAnchor constraintEqualToAnchor:contentView.bottomAnchor - constant:-kTableViewVerticalSpacing], + constant:-kTableViewOneLabelCellVerticalSpacing], + // Icon constraints. + [_iconView.leadingAnchor + constraintEqualToAnchor:_textLabel.trailingAnchor + constant:kTableViewHorizontalSpacing], + [_iconView.trailingAnchor + constraintEqualToAnchor:contentView.trailingAnchor + constant:-kTableViewHorizontalSpacing], + [_iconView.heightAnchor constraintEqualToConstant:kErrorIconLength], + [_iconView.widthAnchor constraintEqualToAnchor:_iconView.heightAnchor], + [_iconView.centerYAnchor + constraintEqualToAnchor:_textLabel.centerYAnchor], + ]]; } return self;
diff --git a/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page.mm b/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page.mm index 51c6282c..4445c3df 100644 --- a/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page.mm +++ b/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page.mm
@@ -67,7 +67,9 @@ } PopulateHttpsOnlyModeStringsForSharedHTML(load_time_data); - PopulateHttpsOnlyModeStringsForBlockingPage(load_time_data, request_url()); + PopulateHttpsOnlyModeStringsForBlockingPage( + load_time_data, request_url(), + /*is_under_advanced_protection=*/false); } bool HttpsOnlyModeBlockingPage::ShouldDisplayURL() const {
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index 518997c3..76a027f7 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -f7a569a81566b26ceda86ad27835517be05e7d02 \ No newline at end of file +65fc230ac92ea3c1456fe820380ac049f802923b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index 2e735353..40dd2d5 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -96ea5e010539e0fa65491070acbc686e9c61868c \ No newline at end of file +149520f0148dfa04764ab5d26a49dc3bc16cc60e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 7b13fa5..d302e45 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -6b1cdd4f7232d4dc810dab4821a616d56d1ca400 \ No newline at end of file +06723ca4ffb8afa0a69eec9f800a813278209167 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 557b4ed5..5ae4065 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -37693bb6c417f1f544eea8ff72355be8eaddc529 \ No newline at end of file +7c751de1235adac2da52085f562694a80a1ef7cd \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index c588af7..78e95a4 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -510cc79cf4738135b4040d62cd2bc0829f31144f \ No newline at end of file +f3b6958999c9d00c1fdfbc43c896e1cac7db278b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index a5c221e..e3c4e247 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -8832dc80888aed85dce6e5d38132c1ad8969876f \ No newline at end of file +c1c7282ec241a495d5144bcc2a4ce5c9b4f3b42d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index 27e85d36..f10ec24c 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -4e55bfffd7d2ccf964219083385361e18fcd061d \ No newline at end of file +8bb219006e062f88350e9b6d82c6daf02293f6ae \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index c2a070f..03faa8aa 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -74e7b3b1ad84a1437f690d2116785366dbe3420f \ No newline at end of file +c61d98bc8aff7b01c76a2b46532a45c02083ebd2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index 9220758..39595db 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -0ef23944e598f3e85f5a51164b4c61b44a8b9a72 \ No newline at end of file +d755b1d24c3c8ba3d75b90940b4398ec48bf16ae \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index b15b3a1..cd280ac3 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -1a6e902c9bae23c3a60dc4254eb4cd7d9ced18f1 \ No newline at end of file +74a16cd13955aff9b327a9b108672dfdb1bb22d3 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 5554435f..f878eb3 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -d2b4445e078f099e145c68b9ab4a94d29a86edb0 \ No newline at end of file +be2a6aafca41a03de40471e2ee1c7aef2cc86d3e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index b9ee92df..b3f451c 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -2c9ea8eef100670d1c8a3702adf457f9143e1166 \ No newline at end of file +238b780d5c5c39e3aadf1b85827d9a78966fae45 \ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h b/ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h index 656bb694..83d35c5 100644 --- a/ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h +++ b/ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h
@@ -16,8 +16,6 @@ @property(nonatomic, copy) NSString* animationName; // Subdirectory to the json animation file. @property(nonatomic, copy) NSString* subdirectory; -// Configuration parameters for LottieAnimation. -@property(nonatomic, strong) UIView* view; // The bundle in which the animation is located. @property(nonatomic, strong) NSBundle* bundle; // The loop behavior of the animation.
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index f74567db..ce3f11f8 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -1227,7 +1227,23 @@ // Use SequencedTaskRunner for MojoVideoEncodeAcceleratorProvider. BASE_FEATURE(kUseSequencedTaskRunnerForMojoVEAProvider, "UseSequencedTaskRunnerForMojoVEAProvider", - base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(IS_APPLE) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); + +// Use SequencedTaskRunner for each MojoVideoEncodeAcceleratorService. Replaces +// per-accelerator encoding task runner. +BASE_FEATURE(kUseSequencedTaskRunnerForMojoVEAService, + "UseSequencedTaskRunnerForMojoVEAService", +#if BUILDFLAG(IS_APPLE) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); std::string GetEffectiveAutoplayPolicy(const base::CommandLine& command_line) { // Return the autoplay policy set in the command line, if any.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index a5dae38..d24dc84 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -407,6 +407,7 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseMojoVideoDecoderForPepper); MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseSequencedTaskRunnerForMediaService); MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseSequencedTaskRunnerForMojoVEAProvider); +MEDIA_EXPORT BASE_DECLARE_FEATURE(kUseSequencedTaskRunnerForMojoVEAService); #if BUILDFLAG(IS_FUCHSIA) MEDIA_EXPORT BASE_DECLARE_FEATURE(kFuchsiaMediacodecVideoEncoder);
diff --git a/media/cast/net/cast_transport_impl.cc b/media/cast/net/cast_transport_impl.cc index d7c26b25..dd308f9 100644 --- a/media/cast/net/cast_transport_impl.cc +++ b/media/cast/net/cast_transport_impl.cc
@@ -94,12 +94,12 @@ // Packetizer for audio and video frames. std::unique_ptr<RtpSender> rtp_sender; + // RTCP observer for SenderRtcpSession. Must outlive SenderRtcpSession. + std::unique_ptr<RtcpObserver> rtcp_observer; + // Maintains RTCP session for audio and video. std::unique_ptr<SenderRtcpSession> rtcp_session; - // RTCP observer for SenderRtcpSession. - std::unique_ptr<RtcpObserver> rtcp_observer; - // Encrypts data in EncodedFrames before they are sent. Note that it's // important for the encryption to happen here, in code that would execute in // the main browser process, for security reasons. This helps to mitigate
diff --git a/media/cast/test/receiver/video_decoder.cc b/media/cast/test/receiver/video_decoder.cc index 3ac8cf3..ddb86e4 100644 --- a/media/cast/test/receiver/video_decoder.cc +++ b/media/cast/test/receiver/video_decoder.cc
@@ -196,12 +196,12 @@ // Make sure this is a JSON string. if (!len || data[0] != '{') return nullptr; - std::unique_ptr<base::Value> values(base::JSONReader::ReadDeprecated( - base::StringPiece(reinterpret_cast<char*>(data), len))); + absl::optional<base::Value> values = base::JSONReader::Read( + base::StringPiece(reinterpret_cast<char*>(data), len)); if (!values || !values->is_dict()) return nullptr; - int id = values->FindIntKey("id").value_or(0); + int id = values->GetDict().FindInt("id").value_or(0); DCHECK(id == last_decoded_id_ + 1); last_decoded_id_ = id; return media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2));
diff --git a/media/gpu/chromeos/BUILD.gn b/media/gpu/chromeos/BUILD.gn index 83bc7d1c..165d6ea 100644 --- a/media/gpu/chromeos/BUILD.gn +++ b/media/gpu/chromeos/BUILD.gn
@@ -162,6 +162,7 @@ "//media/gpu:command_buffer_helper", "//media/gpu:common", "//media/gpu:video_frame_mapper_common", + "//third_party/libyuv", ] }
diff --git a/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc index 76ae9fd..6cd8ab9 100644 --- a/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc +++ b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc
@@ -11,20 +11,83 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" +#include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" #include "media/gpu/macros.h" +#include "third_party/libyuv/include/libyuv.h" namespace media { namespace { +// The format coming in is P010, but it's tagged as P016LE. The +// difference being that P010 uses the MSB while P016LE uses the LSB. +// The conversion is done to YUV420P10 aka I010 which is a tri-planar +// format that will be used for md5 sum computations and writing out to +// disk. +scoped_refptr<VideoFrame> ConvertYUV420P10Frame( + scoped_refptr<const VideoFrame> src_video_frame, + uint8_t* plane_addrs[VideoFrame::kMaxPlanes]) { + const size_t kNumPlanesYUV420P10 = + VideoFrame::NumPlanes(PIXEL_FORMAT_YUV420P10); + std::vector<std::unique_ptr<uint16_t[]>> yuv420p10_buffers( + kNumPlanesYUV420P10); + + const auto& visible_rect = src_video_frame->visible_rect(); + const int32_t src_stride = src_video_frame->stride(VideoFrame::kYPlane); + std::vector<int32_t> dst_strides = {src_stride, src_stride >> 1, + src_stride >> 1}; + const auto layout = VideoFrameLayout::CreateWithStrides( + PIXEL_FORMAT_YUV420P10, src_video_frame->natural_size(), dst_strides); + + const uint16_t* src_plane_y = + reinterpret_cast<const uint16_t*>(plane_addrs[0]); + const uint16_t* src_plane_uv = + reinterpret_cast<const uint16_t*>(plane_addrs[1]); + + for (size_t i = 0; i < kNumPlanesYUV420P10; i++) { + const size_t plane_height = + VideoFrame::Rows(i, PIXEL_FORMAT_YUV420P10, visible_rect.height()); + const size_t plane_size_16bit_words = + (layout->planes()[i].stride * plane_height) >> 1; + + yuv420p10_buffers[i] = std::make_unique<uint16_t[]>(plane_size_16bit_words); + plane_addrs[i] = reinterpret_cast<uint8_t*>(yuv420p10_buffers[i].get()); + } + + // VideoFrame stores strides in bytes per line. libyuv expects strides + // in samples per line. Dividing bytes per line by two gives samples per line + libyuv::P010ToI010( + src_plane_y, src_video_frame->stride(VideoFrame::kYPlane) >> 1, + src_plane_uv, src_video_frame->stride(VideoFrame::kUVPlane) >> 1, + yuv420p10_buffers[0].get(), + layout->planes()[VideoFrame::kYPlane].stride >> 1, + yuv420p10_buffers[1].get(), + layout->planes()[VideoFrame::kUPlane].stride >> 1, + yuv420p10_buffers[2].get(), + layout->planes()[VideoFrame::kVPlane].stride >> 1, visible_rect.width(), + visible_rect.height()); + + scoped_refptr<VideoFrame> video_frame = + VideoFrame::WrapExternalYuvDataWithLayout( + layout.value(), visible_rect, visible_rect.size(), plane_addrs[0], + plane_addrs[1], plane_addrs[2], src_video_frame->timestamp()); + + for (auto&& buffer : yuv420p10_buffers) { + video_frame->AddDestructionObserver( + base::DoNothingWithBoundArgs(std::move(buffer))); + } + + return video_frame; +} + uint8_t* Mmap(const size_t length, const int fd, int permissions) { void* addr = mmap(nullptr, length, permissions, MAP_SHARED, fd, 0u); if (addr == MAP_FAILED) { - VLOGF(1) << "Failed to mmap."; return nullptr; } + return static_cast<uint8_t*>(addr); } @@ -48,10 +111,15 @@ const auto& layout = src_video_frame->layout(); const auto& visible_rect = src_video_frame->visible_rect(); + if (IsYuvPlanar(layout.format())) { - video_frame = VideoFrame::WrapExternalYuvDataWithLayout( - layout, visible_rect, visible_rect.size(), plane_addrs[0], - plane_addrs[1], plane_addrs[2], src_video_frame->timestamp()); + if (src_video_frame->format() == PIXEL_FORMAT_P016LE) { + video_frame = ConvertYUV420P10Frame(src_video_frame, plane_addrs); + } else { + video_frame = VideoFrame::WrapExternalYuvDataWithLayout( + layout, visible_rect, visible_rect.size(), plane_addrs[0], + plane_addrs[1], plane_addrs[2], src_video_frame->timestamp()); + } } else if (VideoFrame::NumPlanes(layout.format()) == 1) { video_frame = VideoFrame::WrapExternalDataWithLayout( layout, visible_rect, visible_rect.size(), plane_addrs[0], @@ -65,6 +133,7 @@ // Pass org_video_frame so that it outlives video_frame. video_frame->AddDestructionObserver( base::BindOnce(MunmapBuffers, chunks, std::move(src_video_frame))); + return video_frame; } @@ -79,6 +148,7 @@ PIXEL_FORMAT_I420, PIXEL_FORMAT_NV12, PIXEL_FORMAT_YV12, + PIXEL_FORMAT_P016LE, // Compressed format. PIXEL_FORMAT_MJPEG, @@ -156,6 +226,12 @@ } uint8_t* mapped_addr = Mmap(mapped_size, dmabuf_fds[i].get(), permissions); + if (!mapped_addr) { + VLOGF(1) << "nullptr returned by Mmap"; + MunmapBuffers(chunks, /*video_frame=*/nullptr); + return nullptr; + } + chunks.emplace_back(mapped_addr, mapped_size); for (size_t j = i; j < next_buf; ++j) plane_addrs[j] = mapped_addr + planes[j].offset;
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/media/gpu/mac/vt_video_encode_accelerator_mac.cc index d4b0161..b8d5448 100644 --- a/media/gpu/mac/vt_video_encode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_encode_accelerator_mac.cc
@@ -12,11 +12,9 @@ #include "base/mac/mac_logging.h" #include "base/memory/shared_memory_mapping.h" #include "base/memory/unsafe_shared_memory_region.h" -#include "base/no_destructor.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" #include "base/task/sequenced_task_runner.h" -#include "base/task/thread_pool.h" #include "base/time/time.h" #include "build/build_config.h" #include "media/base/bitrate.h" @@ -246,17 +244,13 @@ // of time. VTVideoEncodeAccelerator::VTVideoEncodeAccelerator() : bitrate_adjuster_(.5, .95), - client_task_runner_(base::SequencedTaskRunner::GetCurrentDefault()), - encoder_thread_task_runner_( - base::ThreadPool::CreateSingleThreadTaskRunner({})), - encoder_task_weak_factory_(this) { - encoder_weak_ptr_ = encoder_task_weak_factory_.GetWeakPtr(); + task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) { + encoder_weak_ptr_ = encoder_weak_factory_.GetWeakPtr(); } VTVideoEncodeAccelerator::~VTVideoEncodeAccelerator() { DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); - DCHECK(!encoder_task_weak_factory_.HasWeakPtrs()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } VideoEncodeAccelerator::SupportedProfiles @@ -349,7 +343,7 @@ VideoEncodeAccelerator::SupportedProfiles VTVideoEncodeAccelerator::GetSupportedProfiles() { DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); SupportedProfiles profiles; for (const auto& supported_profile : GetSupportedH264Profiles()) @@ -365,7 +359,7 @@ Client* client, std::unique_ptr<MediaLog> media_log) { DVLOG(3) << __func__ << ": " << config.AsHumanReadableString(); - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(client); // Clients are expected to call Flush() before reinitializing the encoder. @@ -385,8 +379,7 @@ } profile_ = config.output_profile; codec_ = VideoCodecProfileToVideoCodec(config.output_profile); - client_ptr_factory_ = std::make_unique<base::WeakPtrFactory<Client>>(client); - client_ = client_ptr_factory_->GetWeakPtr(); + client_ = client; input_visible_size_ = config.input_visible_size; if (config.initial_framerate.has_value()) frame_rate_ = config.initial_framerate.value(); @@ -424,32 +417,60 @@ << "VideoToolbox selected a software encoder."; } - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&Client::NotifyEncoderInfoChange, client_, encoder_info)); - - client_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&Client::RequireBitstreamBuffers, client_, - kNumInputBuffers, input_visible_size_, - bitstream_buffer_size_)); + client_->NotifyEncoderInfoChange(encoder_info); + client_->RequireBitstreamBuffers(kNumInputBuffers, input_visible_size_, + bitstream_buffer_size_); return true; } void VTVideoEncodeAccelerator::Encode(scoped_refptr<VideoFrame> frame, bool force_keyframe) { - DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(compression_session_); + DCHECK(frame); - encoder_thread_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&VTVideoEncodeAccelerator::EncodeTask, encoder_weak_ptr_, - std::move(frame), force_keyframe)); + auto pixel_buffer = WrapVideoFrameInCVPixelBuffer(frame); + if (!pixel_buffer) { + DLOG(ERROR) << "WrapVideoFrameInCVPixelBuffer failed."; + client_->NotifyError(kPlatformFailureError); + return; + } + base::ScopedCFTypeRef<CFDictionaryRef> frame_props = + video_toolbox::DictionaryWithKeyValue( + kVTEncodeFrameOptionKey_ForceKeyFrame, + force_keyframe ? kCFBooleanTrue : kCFBooleanFalse); + + // Wrap information we'll need after the frame is encoded in a heap object. + // We'll get the pointer back from the VideoToolbox completion callback. + auto request = std::make_unique<InProgressFrameEncode>(frame->timestamp()); + + if (bitrate_.mode() == Bitrate::Mode::kConstant) { + // In CBR mode, we adjust bitrate before every encode based on past history + // of bitrate adherence. + SetAdjustedConstantBitrate(bitrate_adjuster_.GetAdjustedBitrateBps()); + } + + auto timestamp_cm = + CMTimeMake(frame->timestamp().InMicroseconds(), USEC_PER_SEC); + + // We can pass the ownership of |request| to the encode callback if + // successful. Otherwise let it fall out of scope. + OSStatus status = VTCompressionSessionEncodeFrame( + compression_session_, pixel_buffer, timestamp_cm, kCMTimeInvalid, + frame_props, reinterpret_cast<void*>(request.get()), nullptr); + if (status != noErr) { + DLOG(ERROR) << " VTCompressionSessionEncodeFrame failed: " << status; + client_->NotifyError(kPlatformFailureError); + } else { + ++pending_encodes_; + CHECK(request.release()); + } } void VTVideoEncodeAccelerator::UseOutputBitstreamBuffer( BitstreamBuffer buffer) { DVLOG(3) << __func__ << ": buffer size=" << buffer.size(); - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (buffer.size() < bitstream_buffer_size_) { DLOG(ERROR) << "Output BitstreamBuffer isn't big enough: " << buffer.size() @@ -465,110 +486,12 @@ return; } - std::unique_ptr<BitstreamBufferRef> buffer_ref( - new BitstreamBufferRef(buffer.id(), std::move(mapping), buffer.size())); - - encoder_thread_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&VTVideoEncodeAccelerator::UseOutputBitstreamBufferTask, - encoder_weak_ptr_, std::move(buffer_ref))); -} - -void VTVideoEncodeAccelerator::RequestEncodingParametersChange( - const Bitrate& bitrate, - uint32_t framerate) { - DVLOG(3) << __func__ << ": bitrate=" << bitrate.ToString() - << ": framerate=" << framerate; - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); - - encoder_thread_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &VTVideoEncodeAccelerator::RequestEncodingParametersChangeTask, - encoder_weak_ptr_, bitrate, framerate)); -} - -void VTVideoEncodeAccelerator::Destroy() { - DVLOG(3) << __func__; - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); - - // Cancel all callbacks. - client_ptr_factory_.reset(); - - // VT resources need to be cleaned up on |encoder_thread_task_runner_|, - // but the object itself is supposed to be deleted on this runner, so when - // DestroyTask() is done we schedule deletion of |this| - auto delete_self = [](VTVideoEncodeAccelerator* self) { delete self; }; - encoder_thread_task_runner_->PostTaskAndReply( - FROM_HERE, - base::BindOnce(&VTVideoEncodeAccelerator::DestroyTask, encoder_weak_ptr_), - base::BindOnce(delete_self, base::Unretained(this))); -} - -void VTVideoEncodeAccelerator::Flush(FlushCallback flush_callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); - - encoder_thread_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&VTVideoEncodeAccelerator::FlushTask, - encoder_weak_ptr_, std::move(flush_callback))); -} - -bool VTVideoEncodeAccelerator::IsFlushSupported() { - return true; -} - -void VTVideoEncodeAccelerator::EncodeTask(scoped_refptr<VideoFrame> frame, - bool force_keyframe) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - DCHECK(compression_session_); - DCHECK(frame); - - auto pixel_buffer = WrapVideoFrameInCVPixelBuffer(frame); - if (!pixel_buffer) { - DLOG(ERROR) << "WrapVideoFrameInCVPixelBuffer failed."; - NotifyError(kPlatformFailureError); - return; - } - base::ScopedCFTypeRef<CFDictionaryRef> frame_props = - video_toolbox::DictionaryWithKeyValue( - kVTEncodeFrameOptionKey_ForceKeyFrame, - force_keyframe ? kCFBooleanTrue : kCFBooleanFalse); - - auto timestamp_cm = - CMTimeMake(frame->timestamp().InMicroseconds(), USEC_PER_SEC); - // Wrap information we'll need after the frame is encoded in a heap object. - // We'll get the pointer back from the VideoToolbox completion callback. - std::unique_ptr<InProgressFrameEncode> request( - new InProgressFrameEncode(frame->timestamp())); - - if (bitrate_.mode() == Bitrate::Mode::kConstant) { - // In CBR mode, we adjust bitrate before every encode based on past history - // of bitrate adherence. - SetAdjustedConstantBitrate(bitrate_adjuster_.GetAdjustedBitrateBps()); - } - - // We can pass the ownership of |request| to the encode callback if - // successful. Otherwise let it fall out of scope. - OSStatus status = VTCompressionSessionEncodeFrame( - compression_session_, pixel_buffer, timestamp_cm, kCMTimeInvalid, - frame_props, reinterpret_cast<void*>(request.get()), nullptr); - if (status != noErr) { - DLOG(ERROR) << " VTCompressionSessionEncodeFrame failed: " << status; - NotifyError(kPlatformFailureError); - } else { - ++pending_encodes_; - CHECK(request.release()); - } -} - -void VTVideoEncodeAccelerator::UseOutputBitstreamBufferTask( - std::unique_ptr<BitstreamBufferRef> buffer_ref) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + auto buffer_ref = std::make_unique<BitstreamBufferRef>( + buffer.id(), std::move(mapping), buffer.size()); // If there is already EncodeOutput waiting, copy its output first. if (!encoder_output_queue_.empty()) { - std::unique_ptr<VTVideoEncodeAccelerator::EncodeOutput> encode_output = - std::move(encoder_output_queue_.front()); + auto encode_output = std::move(encoder_output_queue_.front()); encoder_output_queue_.pop_front(); ReturnBitstreamBuffer(std::move(encode_output), std::move(buffer_ref)); return; @@ -577,13 +500,15 @@ bitstream_buffer_queue_.push_back(std::move(buffer_ref)); } -void VTVideoEncodeAccelerator::RequestEncodingParametersChangeTask( +void VTVideoEncodeAccelerator::RequestEncodingParametersChange( const Bitrate& bitrate, uint32_t framerate) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DVLOG(3) << __func__ << ": bitrate=" << bitrate.ToString() + << ": framerate=" << framerate; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!compression_session_) { - NotifyError(kPlatformFailureError); + client_->NotifyError(kPlatformFailureError); return; } @@ -610,8 +535,46 @@ bitrate_ = bitrate; } +void VTVideoEncodeAccelerator::Destroy() { + DVLOG(3) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DestroyCompressionSession(); + delete this; +} + +void VTVideoEncodeAccelerator::Flush(FlushCallback flush_callback) { + DVLOG(3) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(flush_callback); + + if (!compression_session_) { + std::move(flush_callback).Run(/*success=*/false); + return; + } + + // Even though this will block until all frames are returned, the frames will + // be posted to the current task runner, so we can't run the flush callback + // at this time. + OSStatus status = + VTCompressionSessionCompleteFrames(compression_session_, kCMTimeInvalid); + + if (status != noErr) { + OSSTATUS_DLOG(ERROR, status) + << " VTCompressionSessionCompleteFrames failed: " << status; + std::move(flush_callback).Run(/*success=*/false); + return; + } + + pending_flush_cb_ = std::move(flush_callback); + MaybeRunFlushCallback(); +} + +bool VTVideoEncodeAccelerator::IsFlushSupported() { + return true; +} + void VTVideoEncodeAccelerator::SetAdjustedConstantBitrate(uint32_t bitrate) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (bitrate == encoder_set_bitrate_) return; @@ -630,7 +593,7 @@ } void VTVideoEncodeAccelerator::SetVariableBitrate(const Bitrate& bitrate) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(bitrate.mode() == Bitrate::Mode::kVariable); video_toolbox::SessionPropertySetter session_property_setter( @@ -644,21 +607,6 @@ << "Couldn't change bitrate parameters of encode session."; } -void VTVideoEncodeAccelerator::DestroyTask() { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - - // Cancel all encoder thread callbacks. - encoder_task_weak_factory_.InvalidateWeakPtrs(); - DestroyCompressionSession(); -} - -void VTVideoEncodeAccelerator::NotifyError( - VideoEncodeAccelerator::Error error) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - client_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&Client::NotifyError, client_, error)); -} - // static void VTVideoEncodeAccelerator::CompressionCallback(void* encoder_opaque, void* request_opaque, @@ -678,12 +626,12 @@ // EncodeOutput holds onto CMSampleBufferRef when posting task between // threads. - std::unique_ptr<EncodeOutput> encode_output( - new EncodeOutput(info, sbuf, frame_info->timestamp)); + auto encode_output = + std::make_unique<EncodeOutput>(info, sbuf, frame_info->timestamp); - // This method is NOT called on |encoder_thread_|, so we still need to + // This method is NOT called on |task_runner_|, so we still need to // post a task back to it to do work. - encoder->encoder_thread_task_runner_->PostTask( + encoder->task_runner_->PostTask( FROM_HERE, base::BindOnce(&VTVideoEncodeAccelerator::CompressionCallbackTask, encoder->encoder_weak_ptr_, status, @@ -693,14 +641,14 @@ void VTVideoEncodeAccelerator::CompressionCallbackTask( OSStatus status, std::unique_ptr<EncodeOutput> encode_output) { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); --pending_encodes_; DCHECK_GE(pending_encodes_, 0); if (status != noErr) { DLOG(ERROR) << " encode failed: " << status; - NotifyError(kPlatformFailureError); + client_->NotifyError(kPlatformFailureError); return; } @@ -711,8 +659,7 @@ return; } - std::unique_ptr<VTVideoEncodeAccelerator::BitstreamBufferRef> buffer_ref = - std::move(bitstream_buffer_queue_.front()); + auto buffer_ref = std::move(bitstream_buffer_queue_.front()); bitstream_buffer_queue_.pop_front(); ReturnBitstreamBuffer(std::move(encode_output), std::move(buffer_ref)); } @@ -721,15 +668,13 @@ std::unique_ptr<EncodeOutput> encode_output, std::unique_ptr<VTVideoEncodeAccelerator::BitstreamBufferRef> buffer_ref) { DVLOG(3) << __func__; - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (encode_output->info & kVTEncodeInfo_FrameDropped) { DVLOG(2) << " frame dropped"; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&Client::BitstreamBufferReady, client_, buffer_ref->id, - BitstreamBufferMetadata( - 0, false, encode_output->capture_timestamp))); + client_->BitstreamBufferReady( + buffer_ref->id, + BitstreamBufferMetadata(0, false, encode_output->capture_timestamp)); MaybeRunFlushCallback(); return; } @@ -776,14 +721,12 @@ break; } - client_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&Client::BitstreamBufferReady, client_, - buffer_ref->id, std::move(md))); + client_->BitstreamBufferReady(buffer_ref->id, std::move(md)); MaybeRunFlushCallback(); } bool VTVideoEncodeAccelerator::ResetCompressionSession(VideoCodec codec) { - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DestroyCompressionSession(); @@ -800,7 +743,7 @@ bool VTVideoEncodeAccelerator::CreateCompressionSession( VideoCodec codec, const gfx::Size& input_size) { - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::vector<CFTypeRef> encoder_keys{ kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder}; @@ -858,7 +801,7 @@ } bool VTVideoEncodeAccelerator::ConfigureCompressionSession(VideoCodec codec) { - DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(compression_session_); video_toolbox::SessionPropertySetter session_property_setter( @@ -916,38 +859,8 @@ } } -void VTVideoEncodeAccelerator::FlushTask(FlushCallback flush_callback) { - DVLOG(3) << __func__; - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); - DCHECK(flush_callback); - - if (!compression_session_) { - client_task_runner_->PostTask( - FROM_HERE, base::BindOnce(std::move(flush_callback), false)); - return; - } - - // Even though this will block until all frames are returned, the frames will - // be posted to the current task runner, so we can't run the flush callback - // at this time. - OSStatus status = - VTCompressionSessionCompleteFrames(compression_session_, kCMTimeInvalid); - - if (status != noErr) { - OSSTATUS_DLOG(ERROR, status) - << " VTCompressionSessionCompleteFrames failed: " << status; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(std::move(flush_callback), /*success=*/false)); - return; - } - - pending_flush_cb_ = std::move(flush_callback); - MaybeRunFlushCallback(); -} - void VTVideoEncodeAccelerator::MaybeRunFlushCallback() { - DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!pending_flush_cb_) return; @@ -955,9 +868,7 @@ if (pending_encodes_ || !encoder_output_queue_.empty()) return; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(std::move(pending_flush_cb_), /*success=*/true)); + std::move(pending_flush_cb_).Run(/*success=*/true); } } // namespace media
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.h b/media/gpu/mac/vt_video_encode_accelerator_mac.h index eee2063..66bb283 100644 --- a/media/gpu/mac/vt_video_encode_accelerator_mac.h +++ b/media/gpu/mac/vt_video_encode_accelerator_mac.h
@@ -11,10 +11,8 @@ #include "base/functional/bind.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/weak_ptr.h" +#include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" -#include "base/task/single_thread_task_runner.h" -#include "base/threading/thread.h" -#include "base/threading/thread_checker.h" #include "media/base/bitrate.h" #include "media/base/mac/videotoolbox_helpers.h" #include "media/base/video_codecs.h" @@ -63,21 +61,10 @@ ~VTVideoEncodeAccelerator() override; - // Encoding tasks to be run on |encoder_thread_|. - void EncodeTask(scoped_refptr<VideoFrame> frame, bool force_keyframe); - void UseOutputBitstreamBufferTask( - std::unique_ptr<BitstreamBufferRef> buffer_ref); - void RequestEncodingParametersChangeTask(const Bitrate& bitrate, - uint32_t framerate); - void DestroyTask(); - // Helper functions to set bitrate. void SetAdjustedConstantBitrate(uint32_t bitrate); void SetVariableBitrate(const Bitrate& bitrate); - // Helper function to notify the client of an error on |client_task_runner_|. - void NotifyError(VideoEncodeAccelerator::Error error); - // Compression session callback function to handle compressed frames. static void CompressionCallback(void* encoder_opaque, void* request_opaque, @@ -117,7 +104,6 @@ // Flushes the encoder. The flush callback won't be run until all pending // encodes have been completed. - void FlushTask(FlushCallback flush_callback); void MaybeRunFlushCallback(); base::ScopedCFTypeRef<VTCompressionSessionRef> compression_session_; @@ -156,18 +142,11 @@ base::circular_deque<std::unique_ptr<EncodeOutput>> encoder_output_queue_; // Our original calling task runner for the child thread. - const scoped_refptr<base::SequencedTaskRunner> client_task_runner_; - SEQUENCE_CHECKER(client_sequence_checker_); + const scoped_refptr<base::SequencedTaskRunner> task_runner_; + SEQUENCE_CHECKER(sequence_checker_); // To expose client callbacks from VideoEncodeAccelerator. - // NOTE: all calls to this object *MUST* be executed on - // |client_task_runner_|. - base::WeakPtr<Client> client_; - std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_; - - // This thread services tasks posted from the VEA API entry points by the - // GPU child thread and CompressionCallback() posted from device thread. - scoped_refptr<base::SingleThreadTaskRunner> encoder_thread_task_runner_; + Client* client_ = nullptr; // Tracking information for ensuring flushes aren't completed until all // pending encodes have been returned. @@ -177,7 +156,7 @@ // Declared last to ensure that all weak pointers are invalidated before // other destructors run. base::WeakPtr<VTVideoEncodeAccelerator> encoder_weak_ptr_; - base::WeakPtrFactory<VTVideoEncodeAccelerator> encoder_task_weak_factory_; + base::WeakPtrFactory<VTVideoEncodeAccelerator> encoder_weak_factory_{this}; }; } // namespace media
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc index 78cc605..27804833 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -51,7 +51,6 @@ #include "ui/gl/gl_context.h" #include "ui/gl/gl_display.h" #include "ui/gl/gl_surface_egl.h" -#include "ui/gl/scoped_binders.h" #define NOTIFY_ERROR(x) \ do { \ @@ -1453,8 +1452,6 @@ NOTIFY_ERROR(PLATFORM_FAILURE); return; } - gl::ScopedTextureBinder bind_restore(gl_device->GetTextureTarget(), - texture_id); bool ret = bind_image_cb_.Run(client_texture_id, gl_device->GetTextureTarget(), gl_image); if (!ret) {
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc index 626dda63..e961501 100644 --- a/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc +++ b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc
@@ -16,7 +16,6 @@ #include "ui/gfx/linux/native_pixmap_dmabuf.h" #include "ui/gfx/native_pixmap.h" #include "ui/gl/gl_bindings.h" -#include "ui/gl/scoped_binders.h" #include "ui/ozone/public/ozone_platform.h" #include "ui/ozone/public/surface_factory_ozone.h" @@ -82,8 +81,6 @@ if (make_context_current_cb_ && !make_context_current_cb_.Run()) return VaapiStatus::Codes::kBadContext; - gl::ScopedTextureBinder texture_binder(texture_target_, texture_id_); - const gfx::BufferFormat format = pixmap->GetBufferFormat(); // TODO(b/220336463): plumb the right color space.
diff --git a/media/gpu/windows/d3d11_h264_accelerator.cc b/media/gpu/windows/d3d11_h264_accelerator.cc index 4f3f9014..2d217da 100644 --- a/media/gpu/windows/d3d11_h264_accelerator.cc +++ b/media/gpu/windows/d3d11_h264_accelerator.cc
@@ -6,6 +6,8 @@ #include <windows.h> +#include <type_traits> + #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" @@ -381,27 +383,31 @@ DXVA_Qmatrix_H264 iq_matrix_buf = {}; - if (pps->pic_scaling_matrix_present_flag) { - for (int i = 0; i < 6; ++i) { - for (int j = 0; j < 16; ++j) - iq_matrix_buf.bScalingLists4x4[i][j] = pps->scaling_list4x4[i][j]; - } + const auto& scaling_list4x4_source = pps->pic_scaling_matrix_present_flag + ? pps->scaling_list4x4 + : sps_.scaling_list4x4; + static_assert( + std::is_same< + std::remove_reference_t<decltype(iq_matrix_buf.bScalingLists4x4)>, + std::remove_const_t<std::remove_reference_t< + decltype(scaling_list4x4_source)>>>::value); + memcpy(iq_matrix_buf.bScalingLists4x4, scaling_list4x4_source, + sizeof(iq_matrix_buf.bScalingLists4x4)); - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 64; ++j) - iq_matrix_buf.bScalingLists8x8[i][j] = pps->scaling_list8x8[i][j]; - } - } else { - for (int i = 0; i < 6; ++i) { - for (int j = 0; j < 16; ++j) - iq_matrix_buf.bScalingLists4x4[i][j] = sps_.scaling_list4x4[i][j]; - } + const auto& scaling_list8x8_source = pps->pic_scaling_matrix_present_flag + ? pps->scaling_list8x8 + : sps_.scaling_list8x8; + static_assert( + std::is_same< + std::remove_reference_t<decltype(iq_matrix_buf.bScalingLists8x8[0])>, + std::remove_const_t<std::remove_reference_t< + decltype(scaling_list8x8_source[0])>>>::value); + static_assert( + std::extent<decltype(iq_matrix_buf.bScalingLists8x8)>() <= + std::extent<std::remove_reference_t<decltype(scaling_list8x8_source)>>()); + memcpy(iq_matrix_buf.bScalingLists8x8, scaling_list8x8_source, + sizeof(iq_matrix_buf.bScalingLists8x8)); - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 64; ++j) - iq_matrix_buf.bScalingLists8x8[i][j] = sps_.scaling_list8x8[i][j]; - } - } hr = video_context_->GetDecoderBuffer( video_decoder_.Get(), D3D11_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX, &buffer_size,
diff --git a/media/mojo/services/mojo_video_encode_accelerator_provider.cc b/media/mojo/services/mojo_video_encode_accelerator_provider.cc index ac58c74..925bf05 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_provider.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_provider.cc
@@ -7,10 +7,14 @@ #include <memory> #include <utility> +#include "base/feature_list.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" #include "media/base/bind_to_current_loop.h" #include "media/base/limits.h" +#include "media/base/media_switches.h" #include "media/gpu/gpu_video_encode_accelerator_factory.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -64,9 +68,16 @@ void MojoVideoEncodeAcceleratorProvider::CreateVideoEncodeAccelerator( mojo::PendingReceiver<mojom::VideoEncodeAccelerator> receiver) { - MojoVideoEncodeAcceleratorService::Create( - std::move(receiver), create_vea_callback_, gpu_preferences_, - gpu_workarounds_, gpu_device_); + auto create_service_cb = base::BindOnce( + &MojoVideoEncodeAcceleratorService::Create, std::move(receiver), + create_vea_callback_, gpu_preferences_, gpu_workarounds_, gpu_device_); + + if (base::FeatureList::IsEnabled(kUseSequencedTaskRunnerForMojoVEAService)) { + base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}) + ->PostTask(FROM_HERE, std::move(create_service_cb)); + } else { + std::move(create_service_cb).Run(); + } } void MojoVideoEncodeAcceleratorProvider::
diff --git a/media/mojo/services/mojo_video_encode_accelerator_provider.h b/media/mojo/services/mojo_video_encode_accelerator_provider.h index c57c453..79fb339 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_provider.h +++ b/media/mojo/services/mojo_video_encode_accelerator_provider.h
@@ -19,11 +19,6 @@ class SequencedTaskRunner; } -namespace gpu { -struct GpuPreferences; -class GpuDriverBugWorkarounds; -} // namespace gpu - namespace media { // This class implements the interface mojom::VideoEncodeAcceleratorProvider,
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index 651470b2..e15117c 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -123,8 +123,8 @@ } encoder_ = std::move(create_vea_callback_) - .Run(config, this, *gpu_preferences_, gpu_workarounds_, - *gpu_device_, media_log_->Clone()); + .Run(config, this, gpu_preferences_, gpu_workarounds_, + gpu_device_, media_log_->Clone()); if (!encoder_) { MEDIA_LOG(ERROR, media_log_.get()) << __func__ << " Error creating or initializing VEA";
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.h b/media/mojo/services/mojo_video_encode_accelerator_service.h index 6066bd76..03e9902 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.h +++ b/media/mojo/services/mojo_video_encode_accelerator_service.h
@@ -13,13 +13,13 @@ #include "base/compiler_specific.h" #include "base/containers/lru_cache.h" -#include "base/memory/raw_ref.h" #include "base/memory/unsafe_shared_memory_region.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/time/time.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/config/gpu_info.h" +#include "gpu/config/gpu_preferences.h" #include "media/mojo/mojom/video_encode_accelerator.mojom.h" #include "media/mojo/services/media_mojo_export.h" #include "media/video/video_encode_accelerator.h" @@ -28,10 +28,6 @@ #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/remote.h" -namespace gpu { -struct GpuPreferences; -} // namespace gpu - namespace media { class MojoMediaLog; @@ -106,9 +102,9 @@ void NotifyEncoderInfoChange(const ::media::VideoEncoderInfo& info) override; CreateAndInitializeVideoEncodeAcceleratorCallback create_vea_callback_; - const raw_ref<const gpu::GpuPreferences> gpu_preferences_; + const gpu::GpuPreferences gpu_preferences_; const gpu::GpuDriverBugWorkarounds gpu_workarounds_; - const raw_ref<const gpu::GPUInfo::GPUDevice> gpu_device_; + const gpu::GPUInfo::GPUDevice gpu_device_; // Owned pointer to the underlying VideoEncodeAccelerator. std::unique_ptr<::media::VideoEncodeAccelerator> encoder_;
diff --git a/media/renderers/video_frame_yuv_mailboxes_holder.cc b/media/renderers/video_frame_yuv_mailboxes_holder.cc index 63cd1217..42728f6 100644 --- a/media/renderers/video_frame_yuv_mailboxes_holder.cc +++ b/media/renderers/video_frame_yuv_mailboxes_holder.cc
@@ -42,11 +42,10 @@ return viz::SinglePlaneFormat::kRGBA_8888; } -GLenum PlaneGLFormat(int num_channels, - bool for_surface, - const gpu::Capabilities& capabilities) { +GLenum PlaneGLFormat(int num_channels, const gpu::Capabilities& capabilities) { return viz::TextureStorageFormat( - PlaneSharedImageFormat(num_channels, for_surface).resource_format(), + PlaneSharedImageFormat(num_channels, capabilities.texture_rg) + .resource_format(), capabilities.angle_rgbx_internal_format); } @@ -272,8 +271,8 @@ int num_channels = yuva_info_.numChannelsInPlane(plane); textures_[plane].texture.fTarget = holders_[plane].texture_target; - textures_[plane].texture.fFormat = PlaneGLFormat( - num_channels, for_surface, provider_->ContextCapabilities()); + textures_[plane].texture.fFormat = + PlaneGLFormat(num_channels, provider_->ContextCapabilities()); } imported_textures_ = true;
diff --git a/media/video/h264_parser.cc b/media/video/h264_parser.cc index cab530496..39156e029 100644 --- a/media/video/h264_parser.cc +++ b/media/video/h264_parser.cc
@@ -745,22 +745,22 @@ } // Default scaling lists (per spec). -static const int kDefault4x4Intra[kH264ScalingList4x4Length] = { +static const uint8_t kDefault4x4Intra[kH264ScalingList4x4Length] = { 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42, }; -static const int kDefault4x4Inter[kH264ScalingList4x4Length] = { +static const uint8_t kDefault4x4Inter[kH264ScalingList4x4Length] = { 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34, }; -static const int kDefault8x8Intra[kH264ScalingList8x8Length] = { +static const uint8_t kDefault8x8Intra[kH264ScalingList8x8Length] = { 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42, }; -static const int kDefault8x8Inter[kH264ScalingList8x8Length] = { +static const uint8_t kDefault8x8Inter[kH264ScalingList8x8Length] = { 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, @@ -769,7 +769,7 @@ static inline void DefaultScalingList4x4( int i, - int scaling_list4x4[][kH264ScalingList4x4Length]) { + uint8_t scaling_list4x4[][kH264ScalingList4x4Length]) { DCHECK_LT(i, 6); if (i < 3) @@ -780,7 +780,7 @@ static inline void DefaultScalingList8x8( int i, - int scaling_list8x8[][kH264ScalingList8x8Length]) { + uint8_t scaling_list8x8[][kH264ScalingList8x8Length]) { DCHECK_LT(i, 6); if (i % 2 == 0) @@ -791,9 +791,9 @@ static void FallbackScalingList4x4( int i, - const int default_scaling_list_intra[], - const int default_scaling_list_inter[], - int scaling_list4x4[][kH264ScalingList4x4Length]) { + const uint8_t default_scaling_list_intra[], + const uint8_t default_scaling_list_inter[], + uint8_t scaling_list4x4[][kH264ScalingList4x4Length]) { static const int kScalingList4x4ByteSize = sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length; @@ -832,9 +832,9 @@ static void FallbackScalingList8x8( int i, - const int default_scaling_list_intra[], - const int default_scaling_list_inter[], - int scaling_list8x8[][kH264ScalingList8x8Length]) { + const uint8_t default_scaling_list_intra[], + const uint8_t default_scaling_list_inter[], + uint8_t scaling_list8x8[][kH264ScalingList8x8Length]) { static const int kScalingList8x8ByteSize = sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length; @@ -872,7 +872,7 @@ } H264Parser::Result H264Parser::ParseScalingList(int size, - int* scaling_list, + uint8_t* scaling_list, bool* use_default) { // See chapter 7.3.2.1.1.1. int last_scale = 8; @@ -1116,13 +1116,10 @@ } static void FillDefaultSeqScalingLists(H264SPS* sps) { - for (int i = 0; i < 6; ++i) - for (int j = 0; j < kH264ScalingList4x4Length; ++j) - sps->scaling_list4x4[i][j] = 16; - - for (int i = 0; i < 6; ++i) - for (int j = 0; j < kH264ScalingList8x8Length; ++j) - sps->scaling_list8x8[i][j] = 16; + static_assert(sizeof(sps->scaling_list4x4[0][0]) == sizeof(uint8_t)); + memset(sps->scaling_list4x4, 16, sizeof(sps->scaling_list4x4)); + static_assert(sizeof(sps->scaling_list8x8[0][0]) == sizeof(uint8_t)); + memset(sps->scaling_list8x8, 16, sizeof(sps->scaling_list8x8)); } H264Parser::Result H264Parser::ParseSPS(int* sps_id) {
diff --git a/media/video/h264_parser.h b/media/video/h264_parser.h index a0b95ab1..8a75f213 100644 --- a/media/video/h264_parser.h +++ b/media/video/h264_parser.h
@@ -147,8 +147,8 @@ bool qpprime_y_zero_transform_bypass_flag; bool seq_scaling_matrix_present_flag; - int scaling_list4x4[6][kH264ScalingList4x4Length]; - int scaling_list8x8[6][kH264ScalingList8x8Length]; + uint8_t scaling_list4x4[6][kH264ScalingList4x4Length]; + uint8_t scaling_list8x8[6][kH264ScalingList8x8Length]; int log2_max_frame_num_minus4; int pic_order_cnt_type; @@ -254,8 +254,8 @@ bool transform_8x8_mode_flag; bool pic_scaling_matrix_present_flag; - int scaling_list4x4[6][kH264ScalingList4x4Length]; - int scaling_list8x8[6][kH264ScalingList8x8Length]; + uint8_t scaling_list4x4[6][kH264ScalingList4x4Length]; + uint8_t scaling_list8x8[6][kH264ScalingList8x8Length]; int second_chroma_qp_index_offset; }; @@ -562,7 +562,7 @@ Result ReadSE(int* val, int* num_bits_read); // Parse scaling lists (see spec). - Result ParseScalingList(int size, int* scaling_list, bool* use_default); + Result ParseScalingList(int size, uint8_t* scaling_list, bool* use_default); Result ParseSPSScalingLists(H264SPS* sps); Result ParsePPSScalingLists(const H264SPS& sps, H264PPS* pps);
diff --git a/mojo/public/cpp/bindings/lib/proxy_to_responder.h b/mojo/public/cpp/bindings/lib/proxy_to_responder.h index 2271182..6622530 100644 --- a/mojo/public/cpp/bindings/lib/proxy_to_responder.h +++ b/mojo/public/cpp/bindings/lib/proxy_to_responder.h
@@ -5,6 +5,7 @@ #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_PROXY_TO_RESPONDER_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_PROXY_TO_RESPONDER_H_ +#include <cstdint> #include <memory> #include "base/component_export.h"
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni index 23f5bc02..6084867 100644 --- a/mojo/public/tools/bindings/mojom.gni +++ b/mojo/public/tools/bindings/mojom.gni
@@ -1555,6 +1555,7 @@ testonly = invoker.testonly } defines = export_defines + configs += [ "//build/config/compiler:wexit_time_destructors" ] configs += extra_configs if (output_file_base_paths != []) { sources = []
diff --git a/net/BUILD.gn b/net/BUILD.gn index d7ee4190..7bd4f6f 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -36,7 +36,7 @@ # Writable mmap isn't supported on Fuchsia, so it should be bypassed. posix_bypass_mmap = (is_android && current_cpu != "x86") || is_fuchsia -enable_built_in_dns = !is_ios +enable_built_in_dns = use_blink # Unix sockets are not supported on iOS. enable_unix_sockets = is_posix && !is_ios
diff --git a/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java b/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java index 8c9ff5e..4d7ce59 100644 --- a/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java +++ b/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java
@@ -127,7 +127,7 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Mockito.verify(mAppContext) - .registerReceiver(Mockito.anyObject(), + .registerReceiver(Mockito.any(), Mockito.argThat( (IntentFilter filter) -> !filter.matchAction(Proxy.PROXY_CHANGE_ACTION)), @@ -135,7 +135,7 @@ ArgumentMatchers.eq(ContextUtils.RECEIVER_NOT_EXPORTED)); } else { Mockito.verify(mAppContext) - .registerReceiver(Mockito.anyObject(), + .registerReceiver(Mockito.any(), Mockito.argThat( (IntentFilter filter) -> !filter.matchAction(Proxy.PROXY_CHANGE_ACTION)), @@ -145,7 +145,7 @@ // These are looking for the main call to register*Protected*BroadcastReceiver. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Mockito.verify(mAppContext) - .registerReceiver(Mockito.anyObject(), + .registerReceiver(Mockito.any(), Mockito.argThat( (IntentFilter filter) -> filter.matchAction(Proxy.PROXY_CHANGE_ACTION)), @@ -153,7 +153,7 @@ ArgumentMatchers.eq(0)); } else { Mockito.verify(mAppContext) - .registerReceiver(Mockito.anyObject(), + .registerReceiver(Mockito.any(), Mockito.argThat( (IntentFilter filter) -> filter.matchAction(Proxy.PROXY_CHANGE_ACTION)),
diff --git a/net/dns/BUILD.gn b/net/dns/BUILD.gn index 14673340..a8193d4 100644 --- a/net/dns/BUILD.gn +++ b/net/dns/BUILD.gn
@@ -6,7 +6,7 @@ import("//testing/libfuzzer/fuzzer_test.gni") import("//third_party/protobuf/proto_library.gni") -enable_built_in_dns = !is_ios +enable_built_in_dns = use_blink source_set("dns") { # Due to circular dependencies, should only be depended on through //net.
diff --git a/net/dns/address_sorter_posix.cc b/net/dns/address_sorter_posix.cc index 38251ba6..f156db2 100644 --- a/net/dns/address_sorter_posix.cc +++ b/net/dns/address_sorter_posix.cc
@@ -17,14 +17,19 @@ #include <sys/socket.h> // Must be included before ifaddrs.h. #include <ifaddrs.h> #include <net/if.h> -#include <netinet/in_var.h> #include <string.h> #include <sys/ioctl.h> +#if BUILDFLAG(IS_IOS) +// The code in the following header file is copied from [1]. This file has the +// minimum definitions needed to retrieve the IP attributes, since iOS SDK +// doesn't include a necessary header <netinet/in_var.h>. +// [1] https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/mac_ifaddrs_converter.cc +#include "net/dns/netinet_in_var_ios.h" +#else +#include <netinet/in_var.h> +#endif // BUILDFLAG(IS_IOS) #endif -#include <algorithm> -#include <vector> - #include "base/containers/cxx20_erase_vector.h" #include "base/containers/unique_ptr_adapters.h" #include "base/logging.h"
diff --git a/net/dns/netinet_in_var_ios.h b/net/dns/netinet_in_var_ios.h new file mode 100644 index 0000000..ca6e4e9 --- /dev/null +++ b/net/dns/netinet_in_var_ios.h
@@ -0,0 +1,144 @@ +// 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. + +#define SCOPE6_ID_MAX 16 + +struct in6_addrlifetime { + time_t ia6t_expire; /* valid lifetime expiration time */ + time_t ia6t_preferred; /* preferred lifetime expiration time */ + u_int32_t ia6t_vltime; /* valid lifetime */ + u_int32_t ia6t_pltime; /* prefix lifetime */ +}; + +struct in6_ifstat { + u_quad_t ifs6_in_receive; /* # of total input datagram */ + u_quad_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */ + u_quad_t ifs6_in_toobig; /* # of datagrams exceeded MTU */ + u_quad_t ifs6_in_noroute; /* # of datagrams with no route */ + u_quad_t ifs6_in_addrerr; /* # of datagrams with invalid dst */ + u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */ + /* NOTE: increment on final dst if */ + u_quad_t ifs6_in_truncated; /* # of truncated datagrams */ + u_quad_t ifs6_in_discard; /* # of discarded datagrams */ + /* NOTE: fragment timeout is not here */ + u_quad_t ifs6_in_deliver; /* # of datagrams delivered to ULP */ + /* NOTE: increment on final dst if */ + u_quad_t ifs6_out_forward; /* # of datagrams forwarded */ + /* NOTE: increment on outgoing if */ + u_quad_t ifs6_out_request; /* # of outgoing datagrams from ULP */ + /* NOTE: does not include forwrads */ + u_quad_t ifs6_out_discard; /* # of discarded datagrams */ + u_quad_t ifs6_out_fragok; /* # of datagrams fragmented */ + u_quad_t ifs6_out_fragfail; /* # of datagrams failed on fragment */ + u_quad_t ifs6_out_fragcreat; /* # of fragment datagrams */ + /* NOTE: this is # after fragment */ + u_quad_t ifs6_reass_reqd; /* # of incoming fragmented packets */ + /* NOTE: increment on final dst if */ + u_quad_t ifs6_reass_ok; /* # of reassembled packets */ + /* NOTE: this is # after reass */ + /* NOTE: increment on final dst if */ + u_quad_t ifs6_reass_fail; /* # of reass failures */ + /* NOTE: may not be packet count */ + /* NOTE: increment on final dst if */ + u_quad_t ifs6_in_mcast; /* # of inbound multicast datagrams */ + u_quad_t ifs6_out_mcast; /* # of outbound multicast datagrams */ +}; + +struct icmp6_ifstat { + /* + * Input statistics + */ + /* ipv6IfIcmpInMsgs, total # of input messages */ + u_quad_t ifs6_in_msg; + /* ipv6IfIcmpInErrors, # of input error messages */ + u_quad_t ifs6_in_error; + /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */ + u_quad_t ifs6_in_dstunreach; + /* ipv6IfIcmpInAdminProhibs, # of input admin. prohibited errs */ + u_quad_t ifs6_in_adminprohib; + /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */ + u_quad_t ifs6_in_timeexceed; + /* ipv6IfIcmpInParamProblems, # of input parameter problem errors */ + u_quad_t ifs6_in_paramprob; + /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */ + u_quad_t ifs6_in_pkttoobig; + /* ipv6IfIcmpInEchos, # of input echo requests */ + u_quad_t ifs6_in_echo; + /* ipv6IfIcmpInEchoReplies, # of input echo replies */ + u_quad_t ifs6_in_echoreply; + /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */ + u_quad_t ifs6_in_routersolicit; + /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */ + u_quad_t ifs6_in_routeradvert; + /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */ + u_quad_t ifs6_in_neighborsolicit; + /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advs. */ + u_quad_t ifs6_in_neighboradvert; + /* ipv6IfIcmpInRedirects, # of input redirects */ + u_quad_t ifs6_in_redirect; + /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */ + u_quad_t ifs6_in_mldquery; + /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */ + u_quad_t ifs6_in_mldreport; + /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */ + u_quad_t ifs6_in_mlddone; + /* + * Output statistics. We should solve unresolved routing problem... + */ + /* ipv6IfIcmpOutMsgs, total # of output messages */ + u_quad_t ifs6_out_msg; + /* ipv6IfIcmpOutErrors, # of output error messages */ + u_quad_t ifs6_out_error; + /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */ + u_quad_t ifs6_out_dstunreach; + /* ipv6IfIcmpOutAdminProhibs, # of output admin. prohibited errs */ + u_quad_t ifs6_out_adminprohib; + /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */ + u_quad_t ifs6_out_timeexceed; + /* ipv6IfIcmpOutParamProblems, # of output parameter problem errors */ + u_quad_t ifs6_out_paramprob; + /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */ + u_quad_t ifs6_out_pkttoobig; + /* ipv6IfIcmpOutEchos, # of output echo requests */ + u_quad_t ifs6_out_echo; + /* ipv6IfIcmpOutEchoReplies, # of output echo replies */ + u_quad_t ifs6_out_echoreply; + /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */ + u_quad_t ifs6_out_routersolicit; + /* ipv6IfIcmpOutRouterAdvertisements, # of output router advs. */ + u_quad_t ifs6_out_routeradvert; + /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */ + u_quad_t ifs6_out_neighborsolicit; + /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advs. */ + u_quad_t ifs6_out_neighboradvert; + /* ipv6IfIcmpOutRedirects, # of output redirects */ + u_quad_t ifs6_out_redirect; + /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */ + u_quad_t ifs6_out_mldquery; + /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */ + u_quad_t ifs6_out_mldreport; + /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */ + u_quad_t ifs6_out_mlddone; +}; + +struct in6_ifreq { + char ifr_name[IFNAMSIZ]; + union { + struct sockaddr_in6 ifru_addr; + struct sockaddr_in6 ifru_dstaddr; + int ifru_flags; + int ifru_flags6; + int ifru_metric; + int ifru_intval; + caddr_t ifru_data; + struct in6_addrlifetime ifru_lifetime; + struct in6_ifstat ifru_stat; + struct icmp6_ifstat ifru_icmp6stat; + u_int32_t ifru_scope_id[SCOPE6_ID_MAX]; + } ifr_ifru; +}; + +#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq) + +#define IN6_IFF_DEPRECATED 0x0010 /* deprecated address */
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index 9c2aa21..b1b4f61 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc
@@ -1862,10 +1862,6 @@ DCHECK(mode_ & WRITE || mode_ == NONE); DCHECK(!network_trans_.get()); - // We do not expect to send a request if the cache entry was used. - // TODO(https://crbug.com/1409150): If this CHECK fails investigate how we got - // here. Remove the CHECK. - CHECK_NE(cache_entry_status_, CacheEntryStatus::ENTRY_USED); send_request_since_ = TimeTicks::Now(); // Create a network transaction. @@ -3859,12 +3855,6 @@ return; DCHECK(cache_entry_status_ == CacheEntryStatus::ENTRY_UNDEFINED || new_cache_entry_status == CacheEntryStatus::ENTRY_OTHER); - // If we are using the entry then we should not have sent a request. - // TODO(https://crbug.com/1409150): If this CHECK fires then trace when the - // request was sent. Remove this CHECK. - if (new_cache_entry_status == CacheEntryStatus::ENTRY_USED) { - CHECK(send_request_since_.is_null()); - } cache_entry_status_ = new_cache_entry_status; SyncCacheEntryStatusToResponse(); } @@ -3985,14 +3975,14 @@ bool did_send_request = !send_request_since_.is_null(); - // TODO(ricea): Understand why this CHECK is failing in the wild, fix it, and + // TODO(ricea): Understand why this DCHECK is failing in the wild, fix it, and // remove it. See https://crbug.com/1409150. if (did_send_request) { - CHECK_NE(cache_entry_status_, CacheEntryStatus::ENTRY_USED); + DCHECK_NE(cache_entry_status_, CacheEntryStatus::ENTRY_USED); } - // This CHECK() should not fire, because the one above should catch all the + // This DCHECK() should not fire, because the one above should catch all the // erroneous cases. - CHECK( + DCHECK( (did_send_request && (cache_entry_status_ == CacheEntryStatus::ENTRY_NOT_IN_CACHE || cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED ||
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h index 7776281c4..418fc314 100644 --- a/net/url_request/url_request.h +++ b/net/url_request/url_request.h
@@ -846,6 +846,13 @@ expected_response_checksum_ = std::string(checksum); } + void set_has_storage_access(bool has_storage_access) { + DCHECK(!is_pending_); + DCHECK(!has_notified_completion_); + has_storage_access_ = has_storage_access; + } + bool has_storage_access() const { return has_storage_access_; } + static bool DefaultCanUseCookies(); base::WeakPtr<URLRequest> GetWeakPtr(); @@ -974,10 +981,7 @@ bool force_ignore_site_for_cookies_ = false; bool force_ignore_top_frame_party_for_cookies_ = false; bool force_main_frame_for_same_site_cookies_ = false; - // TODO(https://crbug.com/1401089): this request ought to be ineligible for - // Storage Access API grants unless the requestor has opted in. - CookieSettingOverrides cookie_setting_overrides_ = CookieSettingOverrides( - CookieSettingOverride::kStorageAccessGrantEligible); + CookieSettingOverrides cookie_setting_overrides_; absl::optional<url::Origin> initiator_; GURL delegate_redirect_url_; @@ -994,6 +998,10 @@ // Whether the request is allowed to send credentials in general. Set by // caller. bool allow_credentials_ = true; + // Whether the request is eligible for using storage access permission grant + // if one exists. Only set by caller when constructed and will not change + // during redirects. + bool has_storage_access_ = false; SecureDnsPolicy secure_dns_policy_ = SecureDnsPolicy::kAllow; CookieAccessResultList maybe_sent_cookies_;
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc index 31b8af5..48d7ae0 100644 --- a/net/url_request/url_request_http_job.cc +++ b/net/url_request/url_request_http_job.cc
@@ -278,6 +278,15 @@ request_info_.reporting_upload_depth = request_->reporting_upload_depth(); #endif + // Add/remove the Storage Access override enum based on whether the request's + // url and initiator are same-site, to prevent cross-site sibling iframes + // benefit from each other's storage access API grants. + request()->cookie_setting_overrides().PutOrRemove( + net::CookieSettingOverride::kStorageAccessGrantEligible, + request()->has_storage_access() && request_initiator_site().has_value() && + request_initiator_site().value() == + net::SchemefulSite(request()->url())); + bool should_add_cookie_header = ShouldAddCookieHeader(); UMA_HISTOGRAM_BOOLEAN("Net.HttpJob.CanIncludeCookies", should_add_cookie_header);
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc index 51eb3aec..5f4e34f 100644 --- a/net/url_request/url_request_job.cc +++ b/net/url_request/url_request_job.cc
@@ -23,6 +23,7 @@ #include "net/base/net_errors.h" #include "net/base/network_delegate.h" #include "net/base/proxy_server.h" +#include "net/base/schemeful_site.h" #include "net/cert/x509_certificate.h" #include "net/cookies/cookie_setting_override.h" #include "net/log/net_log.h" @@ -84,7 +85,12 @@ const raw_ptr<URLRequestJob> job_; }; -URLRequestJob::URLRequestJob(URLRequest* request) : request_(request) {} +URLRequestJob::URLRequestJob(URLRequest* request) + : request_(request), + request_initiator_site_(request->initiator().has_value() + ? absl::make_optional(net::SchemefulSite( + request->initiator().value())) + : absl::nullopt) {} URLRequestJob::~URLRequestJob() = default;
diff --git a/net/url_request/url_request_job.h b/net/url_request/url_request_job.h index 22e78a4..6d72962 100644 --- a/net/url_request/url_request_job.h +++ b/net/url_request/url_request_job.h
@@ -353,6 +353,10 @@ // On return, |this| may be deleted. void ReadRawDataComplete(int bytes_read); + const absl::optional<net::SchemefulSite>& request_initiator_site() const { + return request_initiator_site_; + } + // The request that initiated this job. This value will never be nullptr. const raw_ptr<URLRequest> request_; @@ -439,6 +443,11 @@ // checks are performed, so this field must not be modified. absl::optional<RedirectInfo> deferred_redirect_info_; + // The request's initiator never changes, so we store it in format of + // SchemefulSite so that we don't recompute (including looking up the + // registrable domain) it during every redirect. + absl::optional<net::SchemefulSite> request_initiator_site_; + // Non-null if ReadRawData() returned ERR_IO_PENDING, and the read has not // completed. CompletionOnceCallback read_raw_callback_;
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index c32a178e..f605ed4 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -476,7 +476,9 @@ "util", ] - deps += [ "//ui/events/platform/wayland:wayland_event_watcher" ] + if (ozone_platform_wayland) { + deps += [ "//ui/events/platform/wayland:wayland_event_watcher" ] + } } if (is_linux) { @@ -1048,12 +1050,14 @@ defines += [ "REMOTING_USE_X11" ] deps += [ "//remoting/host/linux:wayland", - "//ui/events/platform/wayland:wayland_event_watcher", "//ui/events/platform/x11:x11", ] if (is_linux) { deps += [ "//ui/gtk:gtk_config" ] } + if (ozone_platform_wayland) { + deps += [ "//ui/events/platform/wayland:wayland_event_watcher" ] + } } if (is_posix) {
diff --git a/sandbox/linux/bpf_dsl/trap_registry.h b/sandbox/linux/bpf_dsl/trap_registry.h index 99bd439..ff18931 100644 --- a/sandbox/linux/bpf_dsl/trap_registry.h +++ b/sandbox/linux/bpf_dsl/trap_registry.h
@@ -7,6 +7,8 @@ #include <stdint.h> +#include <tuple> + #include "base/check.h" #include "sandbox/linux/system_headers/linux_seccomp.h" #include "sandbox/sandbox_export.h"
diff --git a/sandbox/linux/syscall_broker/broker_command.h b/sandbox/linux/syscall_broker/broker_command.h index f3a30a03..d44c42f 100644 --- a/sandbox/linux/syscall_broker/broker_command.h +++ b/sandbox/linux/syscall_broker/broker_command.h
@@ -11,6 +11,7 @@ #include <bitset> #include <initializer_list> +#include <utility> namespace sandbox { namespace syscall_broker {
diff --git a/sandbox/policy/mac/gpu.sb b/sandbox/policy/mac/gpu.sb index 7e851b6..74187e3 100644 --- a/sandbox/policy/mac/gpu.sb +++ b/sandbox/policy/mac/gpu.sb
@@ -49,6 +49,16 @@ (allow mach-lookup (xpc-service-name "com.apple.MTLCompilerService")) ) +; Allow access to the Apple Neural Engine for the Shape Detection API. +; https://crbug.com/1382442 +(if (>= os-version 1300) + (begin + (allow mach-lookup (global-name "com.apple.appleneuralengine")) + (allow iokit-open + (iokit-user-client-class "H11ANEInDirectPathClient")) + ) +) + ; Needed for VideoToolbox H.264 SW and VP9 decoding - https://crbug.com/1113936 (if (>= os-version 1016) (begin
diff --git a/services/accessibility/COMMON_METADATA b/services/accessibility/COMMON_METADATA index 763d4e7..fbb3781 100644 --- a/services/accessibility/COMMON_METADATA +++ b/services/accessibility/COMMON_METADATA
@@ -5,3 +5,6 @@ buganizer_public { component_id: 1272898 } +monorail { + component: "OS>Accessibility" +}
diff --git a/services/network/brokered_client_socket_factory.cc b/services/network/brokered_client_socket_factory.cc index 2c368cf..7023ad5 100644 --- a/services/network/brokered_client_socket_factory.cc +++ b/services/network/brokered_client_socket_factory.cc
@@ -78,6 +78,12 @@ socket_broker_->CreateTcpSocket(address_family, std::move(callback)); } +void BrokeredClientSocketFactory::BrokerCreateUdpSocket( + net::AddressFamily address_family, + mojom::SocketBroker::CreateUdpSocketCallback callback) { + socket_broker_->CreateUdpSocket(address_family, std::move(callback)); +} + bool BrokeredClientSocketFactory::ShouldBroker( const net::AddressList& addresses) const { #if BUILDFLAG(IS_WIN)
diff --git a/services/network/brokered_client_socket_factory.h b/services/network/brokered_client_socket_factory.h index 77aa3ce..1575db22 100644 --- a/services/network/brokered_client_socket_factory.h +++ b/services/network/brokered_client_socket_factory.h
@@ -69,6 +69,11 @@ net::AddressFamily address_family, mojom::SocketBroker::CreateTcpSocketCallback callback); + // Sends an IPC to the SocketBroker to create a new UDP socket. + void BrokerCreateUdpSocket( + net::AddressFamily address_family, + mojom::SocketBroker::CreateUdpSocketCallback callback); + private: // Whether or not a socket for `addresses` should be brokered or not. bool ShouldBroker(const net::AddressList& addresses) const;
diff --git a/services/network/private_network_access_checker.cc b/services/network/private_network_access_checker.cc index 852349a..89510108 100644 --- a/services/network/private_network_access_checker.cc +++ b/services/network/private_network_access_checker.cc
@@ -52,6 +52,19 @@ return request_client_security_state; } +absl::optional<net::IPAddress> ParsePrivateIpFromUrl(const GURL& url) { + net::IPAddress address; + if (!address.AssignFromIPLiteral(url.HostNoBracketsPiece())) { + return absl::nullopt; + } + + if (IPAddressToIPAddressSpace(address) != mojom::IPAddressSpace::kPrivate) { + return absl::nullopt; + } + + return address; +} + } // namespace PrivateNetworkAccessChecker::PrivateNetworkAccessChecker( @@ -87,7 +100,7 @@ const net::TransportInfo& transport_info) { // If the request URL host was a private IP, record whether we ended up // connecting to that IP address. See https://crbug.com/1381471#c2. - if (request_url_private_ip_) { + if (request_url_private_ip_.has_value()) { base::UmaHistogramBoolean( "Security.PrivateNetworkAccess.PrivateIpResolveMatch", *request_url_private_ip_ == transport_info.endpoint.address()); @@ -113,7 +126,7 @@ is_request_url_scheme_http_ && result == Result::kBlockedByPolicyBlock) { base::UmaHistogramBoolean( "Security.PrivateNetworkAccess.PrivateIpInferrable", - request_url_private_ip_ != nullptr); + request_url_private_ip_.has_value()); } response_address_space_ = resource_address_space; @@ -257,17 +270,7 @@ void PrivateNetworkAccessChecker::SetRequestUrl(const GURL& url) { is_request_url_scheme_http_ = url.scheme_piece() == url::kHttpScheme; - - net::IPAddress address; - if (!address.AssignFromIPLiteral(url.HostNoBracketsPiece())) { - return; - } - - if (IPAddressToIPAddressSpace(address) != mojom::IPAddressSpace::kPrivate) { - return; - } - - request_url_private_ip_ = std::make_unique<net::IPAddress>(address); + request_url_private_ip_ = ParsePrivateIpFromUrl(url); } } // namespace network
diff --git a/services/network/private_network_access_checker.h b/services/network/private_network_access_checker.h index 1c352947..c3e13590 100644 --- a/services/network/private_network_access_checker.h +++ b/services/network/private_network_access_checker.h
@@ -6,7 +6,6 @@ #define SERVICES_NETWORK_PRIVATE_NETWORK_ACCESS_CHECKER_H_ #include <stdint.h> -#include <memory> #include "base/component_export.h" #include "base/memory/raw_ptr.h" @@ -146,7 +145,7 @@ bool is_request_url_scheme_http_ = false; // If the request URL's host is a private IP literal, then this stores the - // IP. Nullptr otherwise. + // IP. Nullopt otherwise. // // For example: // @@ -156,7 +155,7 @@ // - request url = `http://localhost` -> nullptr // // Used to compute metrics for https://crbug.com/1381471. - std::unique_ptr<net::IPAddress> request_url_private_ip_; + absl::optional<net::IPAddress> request_url_private_ip_; // The target IP address space set on the request. Ignored if `kUnknown`. //
diff --git a/services/network/public/mojom/socket_broker.mojom b/services/network/public/mojom/socket_broker.mojom index 3c6b7efc..e96e8a2 100644 --- a/services/network/public/mojom/socket_broker.mojom +++ b/services/network/public/mojom/socket_broker.mojom
@@ -15,4 +15,10 @@ // SocketDescriptor and the net::Error. CreateTcpSocket(AddressFamily address_family) => (TransferableSocket created_socket, int32 rv); + + // Creates a UDP socket. Returns the + // SocketDescriptor and the net::Error. + CreateUdpSocket(AddressFamily address_family) + => (TransferableSocket created_socket, int32 rv); + };
diff --git a/services/network/restricted_cookie_manager.cc b/services/network/restricted_cookie_manager.cc index a311fc3..edc1405b 100644 --- a/services/network/restricted_cookie_manager.cc +++ b/services/network/restricted_cookie_manager.cc
@@ -877,10 +877,11 @@ net::CookieSettingOverrides RestrictedCookieManager::GetCookieSettingOverrides( bool has_storage_access) const { - // TODO(https://crbug.com/1401089): the overrides ought to exclude Storage - // Access API grants unless the frame has opted in. - return net::CookieSettingOverrides( - net::CookieSettingOverride::kStorageAccessGrantEligible); + net::CookieSettingOverrides overrides; + if (has_storage_access) { + overrides.Put(net::CookieSettingOverride::kStorageAccessGrantEligible); + } + return overrides; } } // namespace network
diff --git a/services/network/restricted_cookie_manager_unittest.cc b/services/network/restricted_cookie_manager_unittest.cc index f3f18e9c..de3a70d 100644 --- a/services/network/restricted_cookie_manager_unittest.cc +++ b/services/network/restricted_cookie_manager_unittest.cc
@@ -664,13 +664,10 @@ auto options = mojom::CookieManagerGetOptions::New(); options->name = "cookie-name"; options->match_type = mojom::CookieMatchType::EQUALS; - // TODO(https://crbug.com/1401089): third-party cookies should be inaccessible - // when `has_storage_access` is false. Fix this to expect an empty vector. - EXPECT_THAT( - sync_service_->GetAllForUrl(kDefaultUrlWithPath, net::SiteForCookies(), - kOtherOrigin, /*has_storage_access=*/false, - options.Clone()), - ElementsAre(net::MatchesCookieNameValue("cookie-name", "cookie-value"))); + EXPECT_THAT(sync_service_->GetAllForUrl( + kDefaultUrlWithPath, net::SiteForCookies(), kOtherOrigin, + /*has_storage_access=*/false, options.Clone()), + IsEmpty()); // When `has_storage_access` is true, Storage Access grants may be used to // access cookies. @@ -1214,9 +1211,7 @@ base::Value(ContentSetting::CONTENT_SETTING_ALLOW), /*source=*/"", /*incognito=*/false)}); - // TODO(https://crbug.com/1401089): this write should fail, since - // `has_storage_access` is false. - EXPECT_TRUE(sync_service_->SetCanonicalCookie( + EXPECT_FALSE(sync_service_->SetCanonicalCookie( *net::CanonicalCookie::CreateUnsafeCookieForTesting( "new-name", "new-value", "example.com", "/", base::Time(), base::Time(), base::Time(), base::Time(), /*secure=*/true, @@ -1610,12 +1605,10 @@ /*incognito=*/false)}); bool result; - // TODO(https://crbug.com/1401089): access should not be allowed when - // `has_storage_access` is false. EXPECT_TRUE(backend()->CookiesEnabledFor( kDefaultUrl, net::SiteForCookies(), kOtherOrigin, /*has_storage_access=*/false, &result)); - EXPECT_TRUE(result); + EXPECT_FALSE(result); // When `has_storage_access` is true, access is allowed since there's a // matching permission grant.
diff --git a/services/network/test/test_socket_broker_impl.cc b/services/network/test/test_socket_broker_impl.cc index b52500cc..406cd05 100644 --- a/services/network/test/test_socket_broker_impl.cc +++ b/services/network/test/test_socket_broker_impl.cc
@@ -85,4 +85,31 @@ #endif } +void TestSocketBrokerImpl::CreateUdpSocket(net::AddressFamily address_family, + CreateUdpSocketCallback callback) { + if (is_mock_socket_test_) { + std::move(callback).Run(network::TransferableSocket(), + net::ERR_CONNECTION_FAILED); + return; + } + + ScopedSocketDescriptor socket(net::CreatePlatformSocket( + net::ConvertAddressFamily(address_family), SOCK_DGRAM, + address_family == AF_UNIX ? 0 : IPPROTO_UDP)); + int rv = net::OK; + if (!socket.is_valid()) { + rv = GetSystemError(); + } else if (!base::SetNonBlocking(socket.get())) { + rv = GetSystemError(); + socket.reset(); + } +#if BUILDFLAG(IS_WIN) + std::move(callback).Run( + network::TransferableSocket(socket.release(), base::Process::Current()), + rv); +#else + std::move(callback).Run(network::TransferableSocket(socket.release()), rv); +#endif +} + } // namespace network
diff --git a/services/network/test/test_socket_broker_impl.h b/services/network/test/test_socket_broker_impl.h index 6c39e75..5db6d06e 100644 --- a/services/network/test/test_socket_broker_impl.h +++ b/services/network/test/test_socket_broker_impl.h
@@ -25,6 +25,9 @@ void CreateTcpSocket(net::AddressFamily address_family, CreateTcpSocketCallback callback) override; + void CreateUdpSocket(net::AddressFamily address_family, + CreateUdpSocketCallback callback) override; + void SetMockSocketTest(bool is_mock_socket_test) { is_mock_socket_test_ = is_mock_socket_test; }
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index d8e7106..7cf2c3a4 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -732,6 +732,8 @@ request.net_log_reference_info.value()); } + url_request_->set_has_storage_access(request.has_storage_access); + url_request_->cookie_setting_overrides().PutAll(cookie_setting_overrides); if (request.is_outermost_main_frame && network::cors::IsCorsEnabledRequestMode(request_mode_)) {
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 2ecf9d5e9..ac6ec34e 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -4763,7 +4763,7 @@ class URLLoaderCookieSettingOverridesTest : public URLLoaderTest, - public ::testing::WithParamInterface<std::tuple<bool, bool>> { + public ::testing::WithParamInterface<std::tuple<bool, bool, bool, bool>> { public: ~URLLoaderCookieSettingOverridesTest() override = default; @@ -4775,24 +4775,40 @@ EXPECT_EQ(request.mode, network::mojom::RequestMode::kNoCors); } request.is_outermost_main_frame = IsOuterMostFrame(); + request.has_storage_access = HasStorageAccess(); + if (!InitiatorIsOtherOrigin()) { + request.request_initiator = + url::Origin::Create(GURL("http://other-origin.test/")); + } } - net::CookieSettingOverrides GetCookieSettingOverrides() const { + net::CookieSettingOverrides ExpectedCookieSettingOverrides() const { + net::CookieSettingOverrides overrides; if (IsCors() && IsOuterMostFrame()) { - return net::CookieSettingOverrides( - net::CookieSettingOverride::kStorageAccessGrantEligible, + overrides.Put( net::CookieSettingOverride::kTopLevelStorageAccessGrantEligible); } - return net::CookieSettingOverrides( - net::CookieSettingOverride::kStorageAccessGrantEligible); + if (HasStorageAccess() && InitiatorIsOtherOrigin()) { + overrides.Put(net::CookieSettingOverride::kStorageAccessGrantEligible); + } + return overrides; + } + + net::CookieSettingOverrides + ExpectedCookieSettingOverridesForCrossSiteRedirect() const { + net::CookieSettingOverrides overrides = ExpectedCookieSettingOverrides(); + overrides.Remove(net::CookieSettingOverride::kStorageAccessGrantEligible); + return overrides; } private: bool IsCors() const { return std::get<0>(GetParam()); } bool IsOuterMostFrame() const { return std::get<1>(GetParam()); } + bool HasStorageAccess() const { return std::get<2>(GetParam()); } + bool InitiatorIsOtherOrigin() const { return std::get<3>(GetParam()); } }; -TEST_P(URLLoaderCookieSettingOverridesTest, TopLevelStorageAccessOverride) { +TEST_P(URLLoaderCookieSettingOverridesTest, CookieSettingOverrides) { GURL url("http://www.example.com.test/"); base::RunLoop delete_run_loop; ResourceRequest request = CreateResourceRequest("GET", url); @@ -4811,12 +4827,42 @@ const std::vector<net::CookieSettingOverrides> records = test_network_delegate()->cookie_setting_overrides_records(); - EXPECT_THAT(records, ElementsAre(GetCookieSettingOverrides(), - GetCookieSettingOverrides())); + EXPECT_THAT(records, ElementsAre(ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverrides())); } TEST_P(URLLoaderCookieSettingOverridesTest, - TopLevelStorageAccessOverride_UnchangedOnRedirects) { + CookieSettingOverrides_OnSameSiteRedirects) { + GURL redirecting_url = test_server()->GetURL( + "/server-redirect?" + test_server()->GetURL("/simple_page.html").spec()); + + base::RunLoop delete_run_loop; + ResourceRequest request = CreateResourceRequest("GET", redirecting_url); + SetUpRequest(request); + + mojo::Remote<mojom::URLLoader> loader; + std::unique_ptr<URLLoader> url_loader; + context().mutable_factory_params().process_id = mojom::kBrowserProcessId; + url_loader = URLLoaderOptions().MakeURLLoader( + context(), DeleteLoaderCallback(&delete_run_loop, &url_loader), + loader.BindNewPipeAndPassReceiver(), request, client()->CreateRemote()); + + client()->RunUntilRedirectReceived(); + loader->FollowRedirect({}, {}, {}, absl::nullopt); + client()->RunUntilComplete(); + delete_run_loop.Run(); + + const std::vector<net::CookieSettingOverrides> records = + test_network_delegate()->cookie_setting_overrides_records(); + + EXPECT_THAT(records, ElementsAre(ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverrides())); +} + +TEST_P(URLLoaderCookieSettingOverridesTest, + CookieSettingOverrides_OnCrossSiteRedirects) { GURL dest_url("http://www.example.com.test/"); GURL redirecting_url = test_server()->GetURL("/server-redirect?" + dest_url.spec()); @@ -4839,16 +4885,25 @@ const std::vector<net::CookieSettingOverrides> records = test_network_delegate()->cookie_setting_overrides_records(); - EXPECT_EQ(records.size(), 4u); - for (size_t i = 0; i < records.size(); i++) { - EXPECT_EQ(records[i], GetCookieSettingOverrides()) - << "element at index " << i << " mismatched."; - } + + EXPECT_THAT( + records, + ElementsAre(ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverrides(), + ExpectedCookieSettingOverridesForCrossSiteRedirect(), + ExpectedCookieSettingOverridesForCrossSiteRedirect())); } +// TODO(crbug.com/1401089): Add test case for two-time redirects with the first +// redirect cross-site and the second redirect same-site, to verify the enum +// gets removed for the first redirect and added for the second. + INSTANTIATE_TEST_SUITE_P(All, URLLoaderCookieSettingOverridesTest, - testing::Combine(testing::Bool(), testing::Bool())); + testing::Combine(testing::Bool(), + testing::Bool(), + testing::Bool(), + testing::Bool())); namespace {
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc index 066f8c5..79622721 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -641,8 +641,10 @@ } if (!frame_details.module_id.empty()) { + // TODO(b/270470700): Remove this on all platforms once tools/tracing is + // fixed. frame_details.module_id = - base::TransformModuleIDToBreakpadFormat(frame_details.module_id); + base::TransformModuleIDToSymbolServerFormat(frame_details.module_id); } // Allow uploading function names passed from unwinder, which would be
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc index 7b86c3341..3d7ec6e 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc
@@ -572,11 +572,11 @@ } #if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -TEST_F(TracingProfileBuilderTest, TransformELFModuleIDToBreakpadFormat) { +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) +TEST_F(TracingProfileBuilderTest, TransformELFModuleIDToSymbolServerFormat) { base::TestModule module; // See explanation for the module_id mangling in - // base::TransformModuleIDToBreakpadFormat implementation. + // base::TransformModuleIDToSymbolServerFormat implementation. module.set_id("7F0715C286F8B16C10E4AD349CDA3B9B56C7A773"); TracingSamplerProfiler::TracingProfileBuilder profile_builder(
diff --git a/storage/browser/quota/quota_internals.mojom b/storage/browser/quota/quota_internals.mojom index 75d62203..6362fbf 100644 --- a/storage/browser/quota/quota_internals.mojom +++ b/storage/browser/quota/quota_internals.mojom
@@ -51,4 +51,7 @@ // Returns the global usage and unlimited usage for a given storage type. GetGlobalUsageForInternals(StorageType storage_type) => (int64 usage, int64 unlimited_usage); + + // Returns whether simulate storage pressure is available. + IsSimulateStoragePressureAvailable() => (bool available); };
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc index cee9fbfb..82d56ea4 100644 --- a/storage/browser/quota/quota_manager_impl.cc +++ b/storage/browser/quota/quota_manager_impl.cc
@@ -16,6 +16,7 @@ #include "base/barrier_callback.h" #include "base/barrier_closure.h" +#include "base/check_op.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/files/file_util.h" @@ -2169,9 +2170,25 @@ void QuotaManagerImpl::SimulateStoragePressure(const url::Origin& origin_url) { const StorageKey key = StorageKey::CreateFirstParty(origin_url); + // In Incognito, since no data is stored on disk, storage pressure should be + // ignored. + DCHECK_EQ(is_incognito_, storage_pressure_callback_.is_null()); + + if (storage_pressure_callback_.is_null()) { + return; + } + storage_pressure_callback_.Run(key); } +void QuotaManagerImpl::IsSimulateStoragePressureAvailable( + IsSimulateStoragePressureAvailableCallback callback) { + // We assume this is only the case in incognito. If it changes, update this. + DCHECK_EQ(is_incognito_, storage_pressure_callback_.is_null()); + + std::move(callback).Run(!storage_pressure_callback_.is_null()); +} + void QuotaManagerImpl::DetermineStoragePressure(int64_t total_space, int64_t free_space) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/storage/browser/quota/quota_manager_impl.h b/storage/browser/quota/quota_manager_impl.h index 1ee76a1..7271685 100644 --- a/storage/browser/quota/quota_manager_impl.h +++ b/storage/browser/quota/quota_manager_impl.h
@@ -382,6 +382,11 @@ void GetGlobalUsageForInternals( storage::mojom::StorageType storage_type, GetGlobalUsageForInternalsCallback callback) override; + // Used from quota-internals page to test behavior of the storage pressure + // callback. + void SimulateStoragePressure(const url::Origin& origin_url) override; + void IsSimulateStoragePressureAvailable( + IsSimulateStoragePressureAvailableCallback callback) override; // QuotaEvictionHandler. void EvictExpiredBuckets(StatusCallback done) override; @@ -700,9 +705,6 @@ void MaybeRunStoragePressureCallback(const blink::StorageKey& storage_key, int64_t total_space, int64_t available_space); - // Used from quota-internals page to test behavior of the storage pressure - // callback. - void SimulateStoragePressure(const url::Origin& origin_url) override; // Evaluates disk statistics to identify storage pressure // (low disk space availability) and starts the storage
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc index bcd5165..647a6671 100644 --- a/storage/browser/quota/quota_manager_unittest.cc +++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -3504,4 +3504,22 @@ EXPECT_EQ(QuotaStatusCode::kOk, delete_host_data_result); } +TEST_F(QuotaManagerImplTest, SimulateStoragePressure_Incognito) { + bool callback_ran = false; + + auto cb = base::BindLambdaForTesting( + [&callback_ran](StorageKey storage_key) { callback_ran = true; }); + + SetStoragePressureCallback(std::move(cb)); + + ResetQuotaManagerImpl(/*is_incognito=*/true); + + // This command should return and never execute the callback since it was + // setup to be in Incognito. + quota_manager_impl_->SimulateStoragePressure( + url::Origin::Create(GURL("https://example.com"))); + + EXPECT_FALSE(callback_ran); +} + } // namespace storage
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 50e8245..98c93b78 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1830,6 +1830,31 @@ "symupload", "strip_lacros_files" ], + "isolated_scripts": [ + { + "isolate_name": "chrome_sizes", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "chrome_sizes", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Ubuntu-18.04", + "pool": "chrome.tests" + } + ], + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:chrome_sizes/" + } + ], "skylab_tests": [ { "args": [], @@ -2037,6 +2062,31 @@ "symupload", "strip_lacros_files" ], + "isolated_scripts": [ + { + "isolate_name": "chrome_sizes", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "chrome_sizes", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Ubuntu-18.04", + "pool": "chrome.tests" + } + ], + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:chrome_sizes/" + } + ], "skylab_tests": [ { "args": [], @@ -2142,6 +2192,31 @@ "symupload", "strip_lacros_files" ], + "isolated_scripts": [ + { + "isolate_name": "chrome_sizes", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "chrome_sizes", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Ubuntu-18.04", + "pool": "chrome.tests" + } + ], + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:chrome_sizes/" + } + ], "skylab_tests": [ { "args": [],
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 0fd62e9..323e3f5 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -31407,7 +31407,7 @@ ], "quickrun_shards": 6, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 + "shards": 4 }, "test": "android_browsertests", "test_id_prefix": "ninja://chrome/test:android_browsertests/"
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 902ae31..5747abfc 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5818,9 +5818,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -5832,8 +5832,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -5989,9 +5989,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -6003,8 +6003,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -6141,9 +6141,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -6155,8 +6155,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 24ab698..e8ada6c 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -9186,24 +9186,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -10663,26 +10645,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04", - "pool": "chromium.tests.lifo" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json index d784e8f..e6b71d8 100644 --- a/testing/buildbot/chromium.coverage.json +++ b/testing/buildbot/chromium.coverage.json
@@ -4736,27 +4736,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "args": [ - "--code-coverage-dir=${ISOLATED_OUTDIR}" - ], - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -20507,9 +20486,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20521,8 +20500,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -20678,9 +20657,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20692,8 +20671,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -20830,9 +20809,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -20844,8 +20823,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fuchsia.fyi.json b/testing/buildbot/chromium.fuchsia.fyi.json index e35533c..f7dca2ba 100644 --- a/testing/buildbot/chromium.fuchsia.fyi.json +++ b/testing/buildbot/chromium.fuchsia.fyi.json
@@ -1184,26 +1184,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04", - "pool": "chromium.tests.lifo" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -2469,24 +2449,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -3735,24 +3697,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.fuchsia.json b/testing/buildbot/chromium.fuchsia.json index 7b742318..0729d049 100644 --- a/testing/buildbot/chromium.fuchsia.json +++ b/testing/buildbot/chromium.fuchsia.json
@@ -1127,26 +1127,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04", - "pool": "chromium.tests.lifo" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -2369,26 +2349,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "arm64", - "inside_docker": "1", - "os": "Ubuntu-20.04", - "pool": "chromium.tests.lifo" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -3692,24 +3652,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -5208,24 +5150,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "web_runner_integration_tests", - "test_id_prefix": "ninja://fuchsia_web/runners:web_runner_integration_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index bbd01a7..247954a4 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -18463,7 +18463,7 @@ { "args": [ "--log-wptreport", - "--use-upstream-wpt", + "--no-wpt-internal", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18515,8624 +18515,6 @@ "ios15-beta-simulator": { "additional_compile_targets": [ "all" - ], - "isolated_scripts": [ - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "absl_hardening_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "absl_hardening_tests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "absl_hardening_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "absl_hardening_tests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "boringssl_crypto_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_crypto_tests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "boringssl_crypto_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_crypto_tests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "boringssl_ssl_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_ssl_tests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "boringssl_ssl_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_ssl_tests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "crashpad_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crashpad_tests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "crashpad_tests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crashpad_tests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "crypto_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crypto_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "crypto_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crypto_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "google_apis_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "google_apis_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "google_apis_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "google_apis_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_bookmarks_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_settings_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_settings_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_smoke_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_web_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_web_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_components_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_components_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_components_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_net_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_net_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_net_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_net_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_remoting_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_remoting_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_remoting_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_remoting_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_showcase_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_showcase_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_swift_interop_xcuitests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_swift_interop_xcuitests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_swift_interop_xcuitests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_swift_interop_xcuitests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_testing_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_testing_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_testing_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_testing_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPhone 7 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 7 14.5" - }, - { - "args": [ - "--platform", - "iPhone 7", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPhone 7 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 7 15.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPhone X 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone X 14.5" - }, - { - "args": [ - "--platform", - "iPhone X", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPhone X 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone X 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "net_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "net_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "net_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "net_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "services_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "services_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "services_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "services_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "skia_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "sql_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "sql_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "sql_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "sql_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPad Air 2 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air 2 14.5" - }, - { - "args": [ - "--platform", - "iPad Air 2", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPad Air 2 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air 2 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s Plus 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s Plus 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s Plus 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s Plus 15.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone SE (1st generation) 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (1st generation) 14.5" - }, - { - "args": [ - "--platform", - "iPhone SE (1st generation)", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone SE (1st generation) 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "14.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "url_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "url_unittests iPhone 6s 14.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_14_5", - "path": "Runtime-ios-14.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 6s 14.5" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.5", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "url_unittests", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "url_unittests iPhone 6s 15.5", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_5", - "path": "Runtime-ios-15.5" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 6s 15.5" - } ] }, "ios15-sdk-simulator": { @@ -39183,6 +30565,112 @@ { "args": [ "--platform", + "iPad Pro (12.9-inch) (3rd generation)", + "--version", + "16.2", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_swift_interop_xcuitests_module", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_swift_interop_xcuitests_module iPad Pro (12.9-inch) (3rd generation) 16.2", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_2", + "path": "Runtime-ios-16.2" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPad Pro (12.9-inch) (3rd generation) 16.2" + }, + { + "args": [ + "--platform", + "iPhone 8", + "--version", + "16.2", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_swift_interop_xcuitests_module", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_swift_interop_xcuitests_module iPhone 8 16.2", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_2", + "path": "Runtime-ios-16.2" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPhone 8 16.2" + }, + { + "args": [ + "--platform", "iPhone X", "--version", "16.2", @@ -48838,6 +40326,118 @@ { "args": [ "--platform", + "iPad Air (3rd generation)", + "--version", + "16.2", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--readline-timeout", + "600", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_swift_interop_xcuitests_module", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_swift_interop_xcuitests_module iPad Air (3rd generation) 16.2", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "mac_model": "Macmini8,1", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_2", + "path": "Runtime-ios-16.2" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPad Air (3rd generation) 16.2" + }, + { + "args": [ + "--platform", + "iPhone 8", + "--version", + "16.2", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--readline-timeout", + "600", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_swift_interop_xcuitests_module", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_swift_interop_xcuitests_module iPhone 8 16.2", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "mac_model": "Macmini8,1", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_2", + "path": "Runtime-ios-16.2" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPhone 8 16.2" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "14.4", @@ -57176,9 +48776,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57189,8 +48789,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -57347,9 +48947,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57360,8 +48960,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -57499,9 +49099,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -57512,8 +49112,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -59037,9 +50637,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59050,8 +50650,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -59208,9 +50808,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59221,8 +50821,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -59360,9 +50960,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59373,8 +50973,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -60146,9 +51746,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -60159,8 +51759,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -67367,6 +58967,80 @@ } ] }, + "mac13-arm64-wpt-content-shell-fyi-rel": { + "isolated_scripts": [ + { + "args": [ + "--log-wptreport", + "--xvfb" + ], + "experiment_percentage": 100, + "isolate_name": "wpt_tests_isolate_content_shell", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "wpt_tests_suite", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-13" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 15 + }, + "test_id_prefix": "ninja://:wpt_tests_isolate_content_shell/" + } + ] + }, + "mac13-wpt-content-shell-fyi-rel": { + "isolated_scripts": [ + { + "args": [ + "--log-wptreport", + "--xvfb" + ], + "experiment_percentage": 100, + "isolate_name": "wpt_tests_isolate_content_shell", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "wpt_tests_suite", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-13" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 15 + }, + "test_id_prefix": "ninja://:wpt_tests_isolate_content_shell/" + } + ] + }, "win-annotator-rel": { "scripts": [ {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 7d2f8c4..cf9e0b6b 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -18533,12 +18533,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18550,8 +18550,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -18724,12 +18724,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18741,8 +18741,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [ @@ -18891,12 +18891,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 112.0.5613.0", + "description": "Run with ash-chrome version 112.0.5614.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18908,8 +18908,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v112.0.5613.0", - "revision": "version:112.0.5613.0" + "location": "lacros_version_skew_tests_v112.0.5614.0", + "revision": "version:112.0.5614.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index 82e413ec..a2f3329 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -184,7 +184,6 @@ "additional_compile_targets": [ "web_engine_shell_pkg", "cast_runner_pkg", - "web_runner_pkg", "chromium_builder_perf", "base_perftests" ]
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 0263cb8..fa31eb85 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1968,14 +1968,6 @@ "label": "//fuchsia_web/webengine:web_engine_unittests", "type": "console_test_launcher", }, - "web_runner_integration_tests": { - "label": "//fuchsia_web/runners:web_runner_integration_tests", - "type": "console_test_launcher", - }, - "web_runner_pkg": { - "label": "//fuchsia_web/runners:web_runner_pkg", - "type": "additional_compile_target", - }, "webapk_client_junit_tests": { "label": "//chrome/android/webapk/libs/client:webapk_client_junit_tests", "type": "generated_script",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 6400f0a7..839a6a0 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -71,7 +71,7 @@ 'device_type': 'sailfish', }, ], - 'shards': 3, + 'shards': 4, 'quickrun_shards': 6, }, }, @@ -1546,6 +1546,16 @@ ], }, }, + 'lacros-amd64-generic-chrome-skylab': { + 'swarming': { + 'dimension_sets': [ + { + 'cpu': 'x86-64', + 'os': 'Ubuntu-18.04', + }, + ], + }, + }, 'lacros-arm-generic-chrome': { 'swarming': { 'dimension_sets': [ @@ -1556,6 +1566,26 @@ ], }, }, + 'lacros-arm-generic-chrome-skylab': { + 'swarming': { + 'dimension_sets': [ + { + 'cpu': 'x86-64', + 'os': 'Ubuntu-18.04', + }, + ], + }, + }, + 'lacros-arm64-generic-chrome-skylab': { + 'swarming': { + 'dimension_sets': [ + { + 'cpu': 'x86-64', + 'os': 'Ubuntu-18.04', + }, + ], + }, + }, }, }, 'chromedriver_py_tests': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 98b082d..02b06d5 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -5172,7 +5172,6 @@ ], }, 'web_engine_unittests': {}, - 'web_runner_integration_tests': {}, }, 'webengine_android_gtests': { @@ -5507,7 +5506,7 @@ 'wpt_tests_ios': { 'args': [ '--log-wptreport', - '--use-upstream-wpt', + '--no-wpt-internal', ], 'merge': { 'args': [ @@ -6736,55 +6735,6 @@ }, }, - 'ios15_beta_simulator_tests': { - 'ios_common_tests': { - 'variants': [ - 'SIM_IPHONE_6S_15_5', - 'SIM_IPHONE_6S_14_5', - ], - }, - 'ios_eg2_tests': { - 'mixins': ['xcode_parallelization'], - 'variants': [ - 'SIM_IPHONE_7_15_5', - 'SIM_IPAD_AIR_2_15_5', - 'SIM_IPHONE_X_15_5', - 'SIM_IPHONE_7_14_5', - 'SIM_IPAD_AIR_2_14_5', - 'SIM_IPHONE_X_14_5', - ] - }, - 'ios_eg2_cq_tests': { - 'mixins': ['xcode_parallelization'], - 'variants': [ - 'SIM_IPHONE_7_15_5', - 'SIM_IPAD_AIR_2_15_5', - 'SIM_IPHONE_X_15_5', - 'SIM_IPHONE_7_14_5', - 'SIM_IPAD_AIR_2_14_5', - 'SIM_IPHONE_X_14_5', - ] - }, - 'ios_screen_size_dependent_tests': { - 'variants': [ - 'SIM_IPHONE_6S_PLUS_14_5', - 'SIM_IPHONE_6S_14_5', - 'SIM_IPHONE_SE_1ST_GEN_14_5', - 'SIM_IPAD_AIR_2_14_5', - 'SIM_IPHONE_6S_PLUS_15_5', - 'SIM_IPHONE_6S_15_5', - 'SIM_IPHONE_SE_1ST_GEN_15_5', - 'SIM_IPAD_AIR_2_15_5', - ], - }, - 'ios_swift_interop_xcuitests': { - 'mixins': ['xcode_parallelization'], - 'variants': [ - 'SIM_IPHONE_X_15_5', - 'SIM_IPHONE_X_14_5', - ], - }, - }, 'ios15_sdk_simulator_tests': { 'ios_common_tests': { 'variants': [ @@ -6867,6 +6817,13 @@ 'SIM_IPHONE_X_16_2', ] }, + 'ios_swift_interop_xcuitests': { + 'mixins': ['xcode_parallelization'], + 'variants': [ + 'SIM_IPHONE_8_16_2', + 'SIM_IPAD_PRO_3RD_GEN_16_2', + ], + }, }, 'ios16_sdk_simulator_tests': { @@ -6926,6 +6883,13 @@ 'SIM_IPAD_PRO_3RD_GEN_16_2', ], }, + 'ios_swift_interop_xcuitests': { + 'mixins': ['xcode_parallelization'], + 'variants': [ + 'SIM_IPHONE_8_16_2', + 'SIM_IPAD_AIR_3RD_GEN_16_2', + ], + }, }, 'ios_asan_tests': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 48ebf59c..9123a2712 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5613.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v112.0.5614.0/test_ash_chrome', ], - 'description': 'Run with ash-chrome version 112.0.5613.0', + 'description': 'Run with ash-chrome version 112.0.5614.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_v112.0.5613.0', - 'revision': 'version:112.0.5613.0', + 'location': 'lacros_version_skew_tests_v112.0.5614.0', + 'revision': 'version:112.0.5614.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 7069b55..5092634 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -233,6 +233,7 @@ ], 'test_suites': { 'skylab_tests': 'lacros_skylab_tests_amd64_generic', + 'isolated_scripts': 'chrome_sizes', }, 'os_type': 'chromeos', }, @@ -266,6 +267,7 @@ ], 'test_suites': { 'skylab_tests': 'lacros_skylab_arm', + 'isolated_scripts': 'chrome_sizes', }, 'os_type': 'chromeos', }, @@ -296,6 +298,7 @@ ], 'test_suites': { 'skylab_tests': 'lacros_skylab_arm64', + 'isolated_scripts': 'chrome_sizes', }, 'os_type': 'chromeos', }, @@ -1005,7 +1008,6 @@ 'gtest_tests': 'android_pie_gtests', } }, - # To be kept in sync with android-pie-arm64-rel-rts 'android-pie-arm64-rel': { 'mixins': [ 'has_native_resultdb_integration', @@ -3339,9 +3341,6 @@ 'xcode_14_main', 'xctest', ], - 'test_suites': { - 'isolated_scripts': 'ios15_beta_simulator_tests' - }, }, 'ios15-sdk-simulator': { 'additional_compile_targets': [ @@ -3746,6 +3745,28 @@ }, 'os_type': 'mac', }, + 'mac13-arm64-wpt-content-shell-fyi-rel': { + 'mixins': [ + 'has_native_resultdb_integration', + 'isolate_profile_data', + 'mac_beta_x64', + ], + 'test_suites': { + 'isolated_scripts': 'wpt_web_tests_content_shell', + }, + 'os_type': 'mac', + }, + 'mac13-wpt-content-shell-fyi-rel': { + 'mixins': [ + 'has_native_resultdb_integration', + 'isolate_profile_data', + 'mac_beta_arm64', + ], + 'test_suites': { + 'isolated_scripts': 'wpt_web_tests_content_shell', + }, + 'os_type': 'mac', + }, 'win-annotator-rel': { 'test_suites': { 'scripts': 'test_traffic_annotation_auditor_script',
diff --git a/testing/libfuzzer/fuzzers/BUILD.gn b/testing/libfuzzer/fuzzers/BUILD.gn index 4cc2fe0..840f4fa1 100644 --- a/testing/libfuzzer/fuzzers/BUILD.gn +++ b/testing/libfuzzer/fuzzers/BUILD.gn
@@ -389,10 +389,7 @@ action("gen_javascript_parser_proto") { # Only targets in this file and the top-level visibility target can # depend on this. - visibility = [ - ":*", - "//:gn_visibility", - ] + visibility = [ ":*" ] script = "generate_javascript_parser_proto.py"
diff --git a/testing/merge_scripts/code_coverage/merge_js_lib.py b/testing/merge_scripts/code_coverage/merge_js_lib.py index eb3a709..04c8615 100644 --- a/testing/merge_scripts/code_coverage/merge_js_lib.py +++ b/testing/merge_scripts/code_coverage/merge_js_lib.py
@@ -21,6 +21,8 @@ logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s', level=logging.DEBUG) +_PREFIXES_TO_CHECK = ['//', 'import ', '/*', '*'] + def _parse_json_file(path): """Opens file and parses data into JSON @@ -144,6 +146,19 @@ return output_dir +def should_exclude(line_contents): + """Whether we exclude the line from coverage map.""" + line_contents = line_contents.strip() + # Exclude empty lines. + if line_contents == '': + return True + + # Exclude comments and imports. + for prefix in _PREFIXES_TO_CHECK: + if line_contents.startswith(prefix): + return True + + return False def exclude_uninteresting_lines(coverage_file_path): """Removes lines from Istanbul coverage reports that correspond to lines in @@ -179,21 +194,7 @@ assert statement_map['start']['line'] == statement_map['end'][ 'line'] - line_contents = lines[line_num - 1].strip() - - # Exclude empty lines - if line_contents == '': - exclude_line(istanbul_coverage, key) - continue - - # Exclude lines that start with a full line comment. - # e.g. // comment. - if line_contents.startswith('//'): - exclude_line(istanbul_coverage, key) - continue - - # Exclude any lines that start with an import statement. - if line_contents.startswith('import '): + if should_exclude(lines[line_num - 1]): exclude_line(istanbul_coverage, key) continue
diff --git a/testing/merge_scripts/code_coverage/merge_js_lib_test.py b/testing/merge_scripts/code_coverage/merge_js_lib_test.py index 2611bf9..453c1e6 100755 --- a/testing/merge_scripts/code_coverage/merge_js_lib_test.py +++ b/testing/merge_scripts/code_coverage/merge_js_lib_test.py
@@ -5,13 +5,13 @@ import base64 import json -import mock import os import shutil import tempfile import unittest import merge_js_lib as merger +from parameterized import parameterized class MergeJSLibTest(unittest.TestCase): @@ -164,7 +164,14 @@ // found in the LICENSE file. import './iframe.js'; -export const add = (a, b) => a + b; + +/* + * function comment should be excluded. + */ +export const add = (a, b) => a + b; // should not be excluded + +/* should be excluded */ + """ test_istanbul_file = """{ @@ -177,7 +184,14 @@ "3":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}}, "4":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}}, "5":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}}, - "6":{"start":{"line":6,"column":0},"end":{"line":6,"column":35}} + "6":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}}, + "7":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}}, + "8":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}}, + "9":{"start":{"line":9,"column":0},"end":{"line":9,"column":3}}, + "10":{"start":{"line":10,"column":0},"end":{"line":10,"column":61}}, + "11":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}}, + "12":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}}, + "13":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}} }, "s":{ "1": 1, @@ -185,7 +199,14 @@ "3": 1, "4": 1, "5": 1, - "6": 1 + "6": 1, + "7": 1, + "8": 1, + "9": 1, + "10": 1, + "11": 1, + "12": 1, + "13": 1 } } }""" @@ -195,19 +216,19 @@ "path": "%s", "all": false, "statementMap": { - "6": { + "10": { "start": { - "line": 6, + "line": 10, "column": 0 }, "end": { - "line": 6, - "column": 35 + "line": 10, + "column": 61 } } }, "s": { - "6": 1 + "10": 1 } } }""" @@ -281,6 +302,18 @@ finally: shutil.rmtree(test_dir) + @parameterized.expand([ + ('// test', True), + ('/* test', True), + ('*/ test', True), + (' * test', True), + ('import test', True), + (' x = 5 /* comment */', False), + ('x = 5', False), + ]) + def test_should_exclude(self, line, exclude): + self.assertEqual(merger.should_exclude(line), exclude) + if __name__ == '__main__': unittest.main()
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index d4163bb..9f8518e 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2740,6 +2740,24 @@ ] } ], + "ChromeOSQsRevampExperiments": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled_Dogfood", + "params": { + "launch_stage": "dogfood" + }, + "enable_features": [ + "QsRevamp" + ] + } + ] + } + ], "ChromeOSRawPSIMetrics": [ { "platforms": [ @@ -3283,6 +3301,13 @@ "enable_features": [ "EnableEventSequenceLogging" ] + }, + { + "name": "AppDiscoveryLogging", + "enable_features": [ + "AppDiscoveryLogging", + "EnableEventSequenceLogging" + ] } ] } @@ -3497,6 +3522,29 @@ ] } ], + "CssPaintingForSpellingGrammarErrors": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "fuchsia", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Disabled_EmergencyKillSwitch", + "disable_features": [ + "CssPaintingForSpellingGrammarErrors" + ] + } + ] + } + ], "CursiveStylusPreinstall": [ { "platforms": [ @@ -3527,7 +3575,7 @@ ] } ], - "DIPSPersistedDatabase": [ + "DIPSTriggeringAction": [ { "platforms": [ "android", @@ -3538,9 +3586,40 @@ ], "experiments": [ { - "name": "Enabled", + "name": "StorageTrigger", "params": { - "persist_database": "true" + "persist_database": "true", + "triggering_action": "storage" + }, + "enable_features": [ + "DIPS" + ] + }, + { + "name": "BounceTrigger", + "params": { + "persist_database": "true", + "triggering_action": "bounce" + }, + "enable_features": [ + "DIPS" + ] + }, + { + "name": "StatefulBounceTrigger", + "params": { + "persist_database": "true", + "triggering_action": "storage" + }, + "enable_features": [ + "DIPS" + ] + }, + { + "name": "PersistenceOnly", + "params": { + "persist_database": "true", + "triggering_action": "none" }, "enable_features": [ "DIPS" @@ -4932,6 +5011,21 @@ ] } ], + "FeedBottomSyncBanner": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_BottomSyncBanner_20230223", + "enable_features": [ + "FeedBottomSyncBanner" + ] + } + ] + } + ], "FeedLoadingPlaceholderStudy": [ { "platforms": [ @@ -5702,6 +5796,27 @@ ] } ], + "HatsBluetoothRevamp": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "prob": "0.01", + "survey_cycle_length": "90", + "survey_start_date_ms": "1642608000000", + "trigger_id": "FvkCS2uJU0jBnuKU19R0UrXtnAdP" + }, + "enable_features": [ + "HappinessTrackingSystemBluetoothRevamp" + ] + } + ] + } + ], "HatsOnboardingExperience": [ { "platforms": [ @@ -9234,6 +9349,25 @@ ] } ], + "PreloadingDesktopSettingsSubPage": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PreloadingDesktopSettingsSubPage" + ] + } + ] + } + ], "Prerender2DesktopOmniboxTriggers": [ { "platforms": [
diff --git a/third_party/Python-Markdown/DIR_METADATA b/third_party/Python-Markdown/DIR_METADATA deleted file mode 100644 index 983ea014..0000000 --- a/third_party/Python-Markdown/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail { - component: "Tools" -}
diff --git a/third_party/Python-Markdown/LICENSE.md b/third_party/Python-Markdown/LICENSE.md deleted file mode 100644 index 2652d97..0000000 --- a/third_party/Python-Markdown/LICENSE.md +++ /dev/null
@@ -1,29 +0,0 @@ -Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of the Python Markdown Project nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/Python-Markdown/OWNERS b/third_party/Python-Markdown/OWNERS deleted file mode 100644 index 68cf5bf..0000000 --- a/third_party/Python-Markdown/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -dpranke@google.com
diff --git a/third_party/Python-Markdown/README.chromium b/third_party/Python-Markdown/README.chromium deleted file mode 100644 index f78fac4c..0000000 --- a/third_party/Python-Markdown/README.chromium +++ /dev/null
@@ -1,34 +0,0 @@ -Name: Python-Markdown -URL: https://files.pythonhosted.org/packages/85/7e/133e943e97a943d2f1d8bae0c5060f8ac50e6691754eb9dbe036b047a9bb/Markdown-3.4.1.tar.gz -Version: 3.4.1 -Revision: None -Security Critical: no -License: BSD -License File: NOT_SHIPPED - -Description: - -Python-Markdown is a pure Python parser for Markdown. - -//tools/md_browser uses it to provide a local previewer for our -Markdown-based documentation. - -This code is not considered security critical since it is only used by -developer utilities. This should never be linked into chrome or any production -code. - -To update this, do something roughly along the lines of: - - cd .. - wget $URL # A newer version of the above URL - tar xvzf Markdown-$VERSION.tar.gz - cd Markdown-$VERSION - rm -fr setup.py setup.cfg makefile MANIFEST.in PKG-INFO Markdown.egg-info \ - pyproject.toml tests doc-requirements.txt docs mkdocs.yml INSTALL.md - cp ../README.chromium ./ - - # update the version numbers in README.chromium - - cd ../ - rm -fr markdown/ - mv Markdown-$VERSION/* ./
diff --git a/third_party/Python-Markdown/README.md b/third_party/Python-Markdown/README.md deleted file mode 100644 index c2c573e..0000000 --- a/third_party/Python-Markdown/README.md +++ /dev/null
@@ -1,64 +0,0 @@ -[Python-Markdown][] -=================== - -[![Build Status][build-button]][build] -[![Coverage Status][codecov-button]][codecov] -[![Latest Version][mdversion-button]][md-pypi] -[![Python Versions][pyversion-button]][md-pypi] -[![BSD License][bsdlicense-button]][bsdlicense] -[![Code of Conduct][codeofconduct-button]][Code of Conduct] - -[build-button]: https://github.com/Python-Markdown/markdown/workflows/CI/badge.svg?event=push -[build]: https://github.com/Python-Markdown/markdown/actions?query=workflow%3ACI+event%3Apush -[codecov-button]: https://codecov.io/gh/Python-Markdown/markdown/branch/master/graph/badge.svg -[codecov]: https://codecov.io/gh/Python-Markdown/markdown -[mdversion-button]: https://img.shields.io/pypi/v/Markdown.svg -[md-pypi]: https://pypi.org/project/Markdown/ -[pyversion-button]: https://img.shields.io/pypi/pyversions/Markdown.svg -[bsdlicense-button]: https://img.shields.io/badge/license-BSD-yellow.svg -[bsdlicense]: https://opensource.org/licenses/BSD-3-Clause -[codeofconduct-button]: https://img.shields.io/badge/code%20of%20conduct-contributor%20covenant-green.svg?style=flat-square -[Code of Conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md - -This is a Python implementation of John Gruber's [Markdown][]. -It is almost completely compliant with the reference implementation, -though there are a few known issues. See [Features][] for information -on what exactly is supported and what is not. Additional features are -supported by the [Available Extensions][]. - -[Python-Markdown]: https://Python-Markdown.github.io/ -[Markdown]: https://daringfireball.net/projects/markdown/ -[Features]: https://Python-Markdown.github.io#Features -[Available Extensions]: https://Python-Markdown.github.io/extensions - -Documentation -------------- - -```bash -pip install markdown -``` -```python -import markdown -html = markdown.markdown(your_text_string) -``` - -For more advanced [installation] and [usage] documentation, see the `docs/` directory -of the distribution or the project website at <https://Python-Markdown.github.io/>. - -[installation]: https://python-markdown.github.io/install/ -[usage]: https://python-markdown.github.io/reference/ - -See the change log at <https://Python-Markdown.github.io/change_log>. - -Support -------- - -You may report bugs, ask for help, and discuss various other issues on the [bug tracker][]. - -[bug tracker]: https://github.com/Python-Markdown/markdown/issues - -Code of Conduct ---------------- - -Everyone interacting in the Python-Markdown project's code bases, issue trackers, -and mailing lists is expected to follow the [Code of Conduct].
diff --git a/third_party/Python-Markdown/markdown/__init__.py b/third_party/Python-Markdown/markdown/__init__.py deleted file mode 100644 index d88b1e97..0000000 --- a/third_party/Python-Markdown/markdown/__init__.py +++ /dev/null
@@ -1,28 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -from .core import Markdown, markdown, markdownFromFile -from .__meta__ import __version__, __version_info__ # noqa - -# For backward compatibility as some extensions expect it... -from .extensions import Extension # noqa - -__all__ = ['Markdown', 'markdown', 'markdownFromFile']
diff --git a/third_party/Python-Markdown/markdown/__main__.py b/third_party/Python-Markdown/markdown/__main__.py deleted file mode 100644 index 01840082..0000000 --- a/third_party/Python-Markdown/markdown/__main__.py +++ /dev/null
@@ -1,151 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import sys -import optparse -import codecs -import warnings -import markdown -try: - # We use `unsafe_load` because users may need to pass in actual Python - # objects. As this is only available from the CLI, the user has much - # worse problems if an attacker can use this as an attach vector. - from yaml import unsafe_load as yaml_load -except ImportError: # pragma: no cover - try: - # Fall back to PyYAML <5.1 - from yaml import load as yaml_load - except ImportError: - # Fall back to JSON - from json import load as yaml_load - -import logging -from logging import DEBUG, WARNING, CRITICAL - -logger = logging.getLogger('MARKDOWN') - - -def parse_options(args=None, values=None): - """ - Define and parse `optparse` options for command-line usage. - """ - usage = """%prog [options] [INPUTFILE] - (STDIN is assumed if no INPUTFILE is given)""" - desc = "A Python implementation of John Gruber's Markdown. " \ - "https://Python-Markdown.github.io/" - ver = "%%prog %s" % markdown.__version__ - - parser = optparse.OptionParser(usage=usage, description=desc, version=ver) - parser.add_option("-f", "--file", dest="filename", default=None, - help="Write output to OUTPUT_FILE. Defaults to STDOUT.", - metavar="OUTPUT_FILE") - parser.add_option("-e", "--encoding", dest="encoding", - help="Encoding for input and output files.",) - parser.add_option("-o", "--output_format", dest="output_format", - default='xhtml', metavar="OUTPUT_FORMAT", - help="Use output format 'xhtml' (default) or 'html'.") - parser.add_option("-n", "--no_lazy_ol", dest="lazy_ol", - action='store_false', default=True, - help="Observe number of first item of ordered lists.") - parser.add_option("-x", "--extension", action="append", dest="extensions", - help="Load extension EXTENSION.", metavar="EXTENSION") - parser.add_option("-c", "--extension_configs", - dest="configfile", default=None, - help="Read extension configurations from CONFIG_FILE. " - "CONFIG_FILE must be of JSON or YAML format. YAML " - "format requires that a python YAML library be " - "installed. The parsed JSON or YAML must result in a " - "python dictionary which would be accepted by the " - "'extension_configs' keyword on the markdown.Markdown " - "class. The extensions must also be loaded with the " - "`--extension` option.", - metavar="CONFIG_FILE") - parser.add_option("-q", "--quiet", default=CRITICAL, - action="store_const", const=CRITICAL+10, dest="verbose", - help="Suppress all warnings.") - parser.add_option("-v", "--verbose", - action="store_const", const=WARNING, dest="verbose", - help="Print all warnings.") - parser.add_option("--noisy", - action="store_const", const=DEBUG, dest="verbose", - help="Print debug messages.") - - (options, args) = parser.parse_args(args, values) - - if len(args) == 0: - input_file = None - else: - input_file = args[0] - - if not options.extensions: - options.extensions = [] - - extension_configs = {} - if options.configfile: - with codecs.open( - options.configfile, mode="r", encoding=options.encoding - ) as fp: - try: - extension_configs = yaml_load(fp) - except Exception as e: - message = "Failed parsing extension config file: %s" % \ - options.configfile - e.args = (message,) + e.args[1:] - raise - - opts = { - 'input': input_file, - 'output': options.filename, - 'extensions': options.extensions, - 'extension_configs': extension_configs, - 'encoding': options.encoding, - 'output_format': options.output_format, - 'lazy_ol': options.lazy_ol - } - - return opts, options.verbose - - -def run(): # pragma: no cover - """Run Markdown from the command line.""" - - # Parse options and adjust logging level if necessary - options, logging_level = parse_options() - if not options: - sys.exit(2) - logger.setLevel(logging_level) - console_handler = logging.StreamHandler() - logger.addHandler(console_handler) - if logging_level <= WARNING: - # Ensure deprecation warnings get displayed - warnings.filterwarnings('default') - logging.captureWarnings(True) - warn_logger = logging.getLogger('py.warnings') - warn_logger.addHandler(console_handler) - - # Run - markdown.markdownFromFile(**options) - - -if __name__ == '__main__': # pragma: no cover - # Support running module as a commandline command. - # `python -m markdown [options] [args]`. - run()
diff --git a/third_party/Python-Markdown/markdown/__meta__.py b/third_party/Python-Markdown/markdown/__meta__.py deleted file mode 100644 index ccabee52..0000000 --- a/third_party/Python-Markdown/markdown/__meta__.py +++ /dev/null
@@ -1,49 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -# __version_info__ format: -# (major, minor, patch, dev/alpha/beta/rc/final, #) -# (1, 1, 2, 'dev', 0) => "1.1.2.dev0" -# (1, 1, 2, 'alpha', 1) => "1.1.2a1" -# (1, 2, 0, 'beta', 2) => "1.2b2" -# (1, 2, 0, 'rc', 4) => "1.2rc4" -# (1, 2, 0, 'final', 0) => "1.2" -__version_info__ = (3, 4, 1, 'final', 0) - - -def _get_version(version_info): - " Returns a PEP 440-compliant version number from version_info. " - assert len(version_info) == 5 - assert version_info[3] in ('dev', 'alpha', 'beta', 'rc', 'final') - - parts = 2 if version_info[2] == 0 else 3 - v = '.'.join(map(str, version_info[:parts])) - - if version_info[3] == 'dev': - v += '.dev' + str(version_info[4]) - elif version_info[3] != 'final': - mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'rc'} - v += mapping[version_info[3]] + str(version_info[4]) - - return v - - -__version__ = _get_version(__version_info__)
diff --git a/third_party/Python-Markdown/markdown/blockparser.py b/third_party/Python-Markdown/markdown/blockparser.py deleted file mode 100644 index b0ca4b1b..0000000 --- a/third_party/Python-Markdown/markdown/blockparser.py +++ /dev/null
@@ -1,119 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import xml.etree.ElementTree as etree -from . import util - - -class State(list): - """ Track the current and nested state of the parser. - - This utility class is used to track the state of the BlockParser and - support multiple levels if nesting. It's just a simple API wrapped around - a list. Each time a state is set, that state is appended to the end of the - list. Each time a state is reset, that state is removed from the end of - the list. - - Therefore, each time a state is set for a nested block, that state must be - reset when we back out of that level of nesting or the state could be - corrupted. - - While all the methods of a list object are available, only the three - defined below need be used. - - """ - - def set(self, state): - """ Set a new state. """ - self.append(state) - - def reset(self): - """ Step back one step in nested state. """ - self.pop() - - def isstate(self, state): - """ Test that top (current) level is of given state. """ - if len(self): - return self[-1] == state - else: - return False - - -class BlockParser: - """ Parse Markdown blocks into an ElementTree object. - - A wrapper class that stitches the various BlockProcessors together, - looping through them and creating an ElementTree object. - """ - - def __init__(self, md): - self.blockprocessors = util.Registry() - self.state = State() - self.md = md - - def parseDocument(self, lines): - """ Parse a markdown document into an ElementTree. - - Given a list of lines, an ElementTree object (not just a parent - Element) is created and the root element is passed to the parser - as the parent. The ElementTree object is returned. - - This should only be called on an entire document, not pieces. - - """ - # Create a ElementTree from the lines - self.root = etree.Element(self.md.doc_tag) - self.parseChunk(self.root, '\n'.join(lines)) - return etree.ElementTree(self.root) - - def parseChunk(self, parent, text): - """ Parse a chunk of markdown text and attach to given etree node. - - While the ``text`` argument is generally assumed to contain multiple - blocks which will be split on blank lines, it could contain only one - block. Generally, this method would be called by extensions when - block parsing is required. - - The ``parent`` etree Element passed in is altered in place. - Nothing is returned. - - """ - self.parseBlocks(parent, text.split('\n\n')) - - def parseBlocks(self, parent, blocks): - """ Process blocks of markdown text and attach to given etree node. - - Given a list of ``blocks``, each blockprocessor is stepped through - until there are no blocks left. While an extension could potentially - call this method directly, it's generally expected to be used - internally. - - This is a public method as an extension may need to add/alter - additional BlockProcessors which call this method to recursively - parse a nested block. - - """ - while blocks: - for processor in self.blockprocessors: - if processor.test(parent, blocks[0]): - if processor.run(parent, blocks) is not False: - # run returns True or None - break
diff --git a/third_party/Python-Markdown/markdown/blockprocessors.py b/third_party/Python-Markdown/markdown/blockprocessors.py deleted file mode 100644 index 3d0ff86..0000000 --- a/third_party/Python-Markdown/markdown/blockprocessors.py +++ /dev/null
@@ -1,623 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). - -CORE MARKDOWN BLOCKPARSER -=========================================================================== - -This parser handles basic parsing of Markdown blocks. It doesn't concern -itself with inline elements such as **bold** or *italics*, but rather just -catches blocks, lists, quotes, etc. - -The BlockParser is made up of a bunch of BlockProcessors, each handling a -different type of block. Extensions may add/replace/remove BlockProcessors -as they need to alter how markdown blocks are parsed. -""" - -import logging -import re -import xml.etree.ElementTree as etree -from . import util -from .blockparser import BlockParser - -logger = logging.getLogger('MARKDOWN') - - -def build_block_parser(md, **kwargs): - """ Build the default block parser used by Markdown. """ - parser = BlockParser(md) - parser.blockprocessors.register(EmptyBlockProcessor(parser), 'empty', 100) - parser.blockprocessors.register(ListIndentProcessor(parser), 'indent', 90) - parser.blockprocessors.register(CodeBlockProcessor(parser), 'code', 80) - parser.blockprocessors.register(HashHeaderProcessor(parser), 'hashheader', 70) - parser.blockprocessors.register(SetextHeaderProcessor(parser), 'setextheader', 60) - parser.blockprocessors.register(HRProcessor(parser), 'hr', 50) - parser.blockprocessors.register(OListProcessor(parser), 'olist', 40) - parser.blockprocessors.register(UListProcessor(parser), 'ulist', 30) - parser.blockprocessors.register(BlockQuoteProcessor(parser), 'quote', 20) - parser.blockprocessors.register(ReferenceProcessor(parser), 'reference', 15) - parser.blockprocessors.register(ParagraphProcessor(parser), 'paragraph', 10) - return parser - - -class BlockProcessor: - """ Base class for block processors. - - Each subclass will provide the methods below to work with the source and - tree. Each processor will need to define it's own ``test`` and ``run`` - methods. The ``test`` method should return True or False, to indicate - whether the current block should be processed by this processor. If the - test passes, the parser will call the processors ``run`` method. - - """ - - def __init__(self, parser): - self.parser = parser - self.tab_length = parser.md.tab_length - - def lastChild(self, parent): - """ Return the last child of an etree element. """ - if len(parent): - return parent[-1] - else: - return None - - def detab(self, text, length=None): - """ Remove a tab from the front of each line of the given text. """ - if length is None: - length = self.tab_length - newtext = [] - lines = text.split('\n') - for line in lines: - if line.startswith(' ' * length): - newtext.append(line[length:]) - elif not line.strip(): - newtext.append('') - else: - break - return '\n'.join(newtext), '\n'.join(lines[len(newtext):]) - - def looseDetab(self, text, level=1): - """ Remove a tab from front of lines but allowing dedented lines. """ - lines = text.split('\n') - for i in range(len(lines)): - if lines[i].startswith(' '*self.tab_length*level): - lines[i] = lines[i][self.tab_length*level:] - return '\n'.join(lines) - - def test(self, parent, block): - """ Test for block type. Must be overridden by subclasses. - - As the parser loops through processors, it will call the ``test`` - method on each to determine if the given block of text is of that - type. This method must return a boolean ``True`` or ``False``. The - actual method of testing is left to the needs of that particular - block type. It could be as simple as ``block.startswith(some_string)`` - or a complex regular expression. As the block type may be different - depending on the parent of the block (i.e. inside a list), the parent - etree element is also provided and may be used as part of the test. - - Keywords: - - * ``parent``: A etree element which will be the parent of the block. - * ``block``: A block of text from the source which has been split at - blank lines. - """ - pass # pragma: no cover - - def run(self, parent, blocks): - """ Run processor. Must be overridden by subclasses. - - When the parser determines the appropriate type of a block, the parser - will call the corresponding processor's ``run`` method. This method - should parse the individual lines of the block and append them to - the etree. - - Note that both the ``parent`` and ``etree`` keywords are pointers - to instances of the objects which should be edited in place. Each - processor must make changes to the existing objects as there is no - mechanism to return new/different objects to replace them. - - This means that this method should be adding SubElements or adding text - to the parent, and should remove (``pop``) or add (``insert``) items to - the list of blocks. - - Keywords: - - * ``parent``: A etree element which is the parent of the current block. - * ``blocks``: A list of all remaining blocks of the document. - """ - pass # pragma: no cover - - -class ListIndentProcessor(BlockProcessor): - """ Process children of list items. - - Example: - * a list item - process this part - - or this part - - """ - - ITEM_TYPES = ['li'] - LIST_TYPES = ['ul', 'ol'] - - def __init__(self, *args): - super().__init__(*args) - self.INDENT_RE = re.compile(r'^(([ ]{%s})+)' % self.tab_length) - - def test(self, parent, block): - return block.startswith(' '*self.tab_length) and \ - not self.parser.state.isstate('detabbed') and \ - (parent.tag in self.ITEM_TYPES or - (len(parent) and parent[-1] is not None and - (parent[-1].tag in self.LIST_TYPES))) - - def run(self, parent, blocks): - block = blocks.pop(0) - level, sibling = self.get_level(parent, block) - block = self.looseDetab(block, level) - - self.parser.state.set('detabbed') - if parent.tag in self.ITEM_TYPES: - # It's possible that this parent has a 'ul' or 'ol' child list - # with a member. If that is the case, then that should be the - # parent. This is intended to catch the edge case of an indented - # list whose first member was parsed previous to this point - # see OListProcessor - if len(parent) and parent[-1].tag in self.LIST_TYPES: - self.parser.parseBlocks(parent[-1], [block]) - else: - # The parent is already a li. Just parse the child block. - self.parser.parseBlocks(parent, [block]) - elif sibling.tag in self.ITEM_TYPES: - # The sibling is a li. Use it as parent. - self.parser.parseBlocks(sibling, [block]) - elif len(sibling) and sibling[-1].tag in self.ITEM_TYPES: - # The parent is a list (``ol`` or ``ul``) which has children. - # Assume the last child li is the parent of this block. - if sibling[-1].text: - # If the parent li has text, that text needs to be moved to a p - # The p must be 'inserted' at beginning of list in the event - # that other children already exist i.e.; a nested sublist. - p = etree.Element('p') - p.text = sibling[-1].text - sibling[-1].text = '' - sibling[-1].insert(0, p) - self.parser.parseChunk(sibling[-1], block) - else: - self.create_item(sibling, block) - self.parser.state.reset() - - def create_item(self, parent, block): - """ Create a new li and parse the block with it as the parent. """ - li = etree.SubElement(parent, 'li') - self.parser.parseBlocks(li, [block]) - - def get_level(self, parent, block): - """ Get level of indent based on list level. """ - # Get indent level - m = self.INDENT_RE.match(block) - if m: - indent_level = len(m.group(1))/self.tab_length - else: - indent_level = 0 - if self.parser.state.isstate('list'): - # We're in a tightlist - so we already are at correct parent. - level = 1 - else: - # We're in a looselist - so we need to find parent. - level = 0 - # Step through children of tree to find matching indent level. - while indent_level > level: - child = self.lastChild(parent) - if (child is not None and - (child.tag in self.LIST_TYPES or child.tag in self.ITEM_TYPES)): - if child.tag in self.LIST_TYPES: - level += 1 - parent = child - else: - # No more child levels. If we're short of indent_level, - # we have a code block. So we stop here. - break - return level, parent - - -class CodeBlockProcessor(BlockProcessor): - """ Process code blocks. """ - - def test(self, parent, block): - return block.startswith(' '*self.tab_length) - - def run(self, parent, blocks): - sibling = self.lastChild(parent) - block = blocks.pop(0) - theRest = '' - if (sibling is not None and sibling.tag == "pre" and - len(sibling) and sibling[0].tag == "code"): - # The previous block was a code block. As blank lines do not start - # new code blocks, append this block to the previous, adding back - # linebreaks removed from the split into a list. - code = sibling[0] - block, theRest = self.detab(block) - code.text = util.AtomicString( - '{}\n{}\n'.format(code.text, util.code_escape(block.rstrip())) - ) - else: - # This is a new codeblock. Create the elements and insert text. - pre = etree.SubElement(parent, 'pre') - code = etree.SubElement(pre, 'code') - block, theRest = self.detab(block) - code.text = util.AtomicString('%s\n' % util.code_escape(block.rstrip())) - if theRest: - # This block contained unindented line(s) after the first indented - # line. Insert these lines as the first block of the master blocks - # list for future processing. - blocks.insert(0, theRest) - - -class BlockQuoteProcessor(BlockProcessor): - - RE = re.compile(r'(^|\n)[ ]{0,3}>[ ]?(.*)') - - def test(self, parent, block): - return bool(self.RE.search(block)) and not util.nearing_recursion_limit() - - def run(self, parent, blocks): - block = blocks.pop(0) - m = self.RE.search(block) - if m: - before = block[:m.start()] # Lines before blockquote - # Pass lines before blockquote in recursively for parsing first. - self.parser.parseBlocks(parent, [before]) - # Remove ``> `` from beginning of each line. - block = '\n'.join( - [self.clean(line) for line in block[m.start():].split('\n')] - ) - sibling = self.lastChild(parent) - if sibling is not None and sibling.tag == "blockquote": - # Previous block was a blockquote so set that as this blocks parent - quote = sibling - else: - # This is a new blockquote. Create a new parent element. - quote = etree.SubElement(parent, 'blockquote') - # Recursively parse block with blockquote as parent. - # change parser state so blockquotes embedded in lists use p tags - self.parser.state.set('blockquote') - self.parser.parseChunk(quote, block) - self.parser.state.reset() - - def clean(self, line): - """ Remove ``>`` from beginning of a line. """ - m = self.RE.match(line) - if line.strip() == ">": - return "" - elif m: - return m.group(2) - else: - return line - - -class OListProcessor(BlockProcessor): - """ Process ordered list blocks. """ - - TAG = 'ol' - # The integer (python string) with which the lists starts (default=1) - # Eg: If list is initialized as) - # 3. Item - # The ol tag will get starts="3" attribute - STARTSWITH = '1' - # Lazy ol - ignore startswith - LAZY_OL = True - # List of allowed sibling tags. - SIBLING_TAGS = ['ol', 'ul'] - - def __init__(self, parser): - super().__init__(parser) - # Detect an item (``1. item``). ``group(1)`` contains contents of item. - self.RE = re.compile(r'^[ ]{0,%d}\d+\.[ ]+(.*)' % (self.tab_length - 1)) - # Detect items on secondary lines. they can be of either list type. - self.CHILD_RE = re.compile(r'^[ ]{0,%d}((\d+\.)|[*+-])[ ]+(.*)' % - (self.tab_length - 1)) - # Detect indented (nested) items of either type - self.INDENT_RE = re.compile(r'^[ ]{%d,%d}((\d+\.)|[*+-])[ ]+.*' % - (self.tab_length, self.tab_length * 2 - 1)) - - def test(self, parent, block): - return bool(self.RE.match(block)) - - def run(self, parent, blocks): - # Check fr multiple items in one block. - items = self.get_items(blocks.pop(0)) - sibling = self.lastChild(parent) - - if sibling is not None and sibling.tag in self.SIBLING_TAGS: - # Previous block was a list item, so set that as parent - lst = sibling - # make sure previous item is in a p- if the item has text, - # then it isn't in a p - if lst[-1].text: - # since it's possible there are other children for this - # sibling, we can't just SubElement the p, we need to - # insert it as the first item. - p = etree.Element('p') - p.text = lst[-1].text - lst[-1].text = '' - lst[-1].insert(0, p) - # if the last item has a tail, then the tail needs to be put in a p - # likely only when a header is not followed by a blank line - lch = self.lastChild(lst[-1]) - if lch is not None and lch.tail: - p = etree.SubElement(lst[-1], 'p') - p.text = lch.tail.lstrip() - lch.tail = '' - - # parse first block differently as it gets wrapped in a p. - li = etree.SubElement(lst, 'li') - self.parser.state.set('looselist') - firstitem = items.pop(0) - self.parser.parseBlocks(li, [firstitem]) - self.parser.state.reset() - elif parent.tag in ['ol', 'ul']: - # this catches the edge case of a multi-item indented list whose - # first item is in a blank parent-list item: - # * * subitem1 - # * subitem2 - # see also ListIndentProcessor - lst = parent - else: - # This is a new list so create parent with appropriate tag. - lst = etree.SubElement(parent, self.TAG) - # Check if a custom start integer is set - if not self.LAZY_OL and self.STARTSWITH != '1': - lst.attrib['start'] = self.STARTSWITH - - self.parser.state.set('list') - # Loop through items in block, recursively parsing each with the - # appropriate parent. - for item in items: - if item.startswith(' '*self.tab_length): - # Item is indented. Parse with last item as parent - self.parser.parseBlocks(lst[-1], [item]) - else: - # New item. Create li and parse with it as parent - li = etree.SubElement(lst, 'li') - self.parser.parseBlocks(li, [item]) - self.parser.state.reset() - - def get_items(self, block): - """ Break a block into list items. """ - items = [] - for line in block.split('\n'): - m = self.CHILD_RE.match(line) - if m: - # This is a new list item - # Check first item for the start index - if not items and self.TAG == 'ol': - # Detect the integer value of first list item - INTEGER_RE = re.compile(r'(\d+)') - self.STARTSWITH = INTEGER_RE.match(m.group(1)).group() - # Append to the list - items.append(m.group(3)) - elif self.INDENT_RE.match(line): - # This is an indented (possibly nested) item. - if items[-1].startswith(' '*self.tab_length): - # Previous item was indented. Append to that item. - items[-1] = '{}\n{}'.format(items[-1], line) - else: - items.append(line) - else: - # This is another line of previous item. Append to that item. - items[-1] = '{}\n{}'.format(items[-1], line) - return items - - -class UListProcessor(OListProcessor): - """ Process unordered list blocks. """ - - TAG = 'ul' - - def __init__(self, parser): - super().__init__(parser) - # Detect an item (``1. item``). ``group(1)`` contains contents of item. - self.RE = re.compile(r'^[ ]{0,%d}[*+-][ ]+(.*)' % (self.tab_length - 1)) - - -class HashHeaderProcessor(BlockProcessor): - """ Process Hash Headers. """ - - # Detect a header at start of any line in block - RE = re.compile(r'(?:^|\n)(?P<level>#{1,6})(?P<header>(?:\\.|[^\\])*?)#*(?:\n|$)') - - def test(self, parent, block): - return bool(self.RE.search(block)) - - def run(self, parent, blocks): - block = blocks.pop(0) - m = self.RE.search(block) - if m: - before = block[:m.start()] # All lines before header - after = block[m.end():] # All lines after header - if before: - # As the header was not the first line of the block and the - # lines before the header must be parsed first, - # recursively parse this lines as a block. - self.parser.parseBlocks(parent, [before]) - # Create header using named groups from RE - h = etree.SubElement(parent, 'h%d' % len(m.group('level'))) - h.text = m.group('header').strip() - if after: - # Insert remaining lines as first block for future parsing. - blocks.insert(0, after) - else: # pragma: no cover - # This should never happen, but just in case... - logger.warn("We've got a problem header: %r" % block) - - -class SetextHeaderProcessor(BlockProcessor): - """ Process Setext-style Headers. """ - - # Detect Setext-style header. Must be first 2 lines of block. - RE = re.compile(r'^.*?\n[=-]+[ ]*(\n|$)', re.MULTILINE) - - def test(self, parent, block): - return bool(self.RE.match(block)) - - def run(self, parent, blocks): - lines = blocks.pop(0).split('\n') - # Determine level. ``=`` is 1 and ``-`` is 2. - if lines[1].startswith('='): - level = 1 - else: - level = 2 - h = etree.SubElement(parent, 'h%d' % level) - h.text = lines[0].strip() - if len(lines) > 2: - # Block contains additional lines. Add to master blocks for later. - blocks.insert(0, '\n'.join(lines[2:])) - - -class HRProcessor(BlockProcessor): - """ Process Horizontal Rules. """ - - # Python's re module doesn't officially support atomic grouping. However you can fake it. - # See https://stackoverflow.com/a/13577411/866026 - RE = r'^[ ]{0,3}(?=(?P<atomicgroup>(-+[ ]{0,2}){3,}|(_+[ ]{0,2}){3,}|(\*+[ ]{0,2}){3,}))(?P=atomicgroup)[ ]*$' - # Detect hr on any line of a block. - SEARCH_RE = re.compile(RE, re.MULTILINE) - - def test(self, parent, block): - m = self.SEARCH_RE.search(block) - if m: - # Save match object on class instance so we can use it later. - self.match = m - return True - return False - - def run(self, parent, blocks): - block = blocks.pop(0) - match = self.match - # Check for lines in block before hr. - prelines = block[:match.start()].rstrip('\n') - if prelines: - # Recursively parse lines before hr so they get parsed first. - self.parser.parseBlocks(parent, [prelines]) - # create hr - etree.SubElement(parent, 'hr') - # check for lines in block after hr. - postlines = block[match.end():].lstrip('\n') - if postlines: - # Add lines after hr to master blocks for later parsing. - blocks.insert(0, postlines) - - -class EmptyBlockProcessor(BlockProcessor): - """ Process blocks that are empty or start with an empty line. """ - - def test(self, parent, block): - return not block or block.startswith('\n') - - def run(self, parent, blocks): - block = blocks.pop(0) - filler = '\n\n' - if block: - # Starts with empty line - # Only replace a single line. - filler = '\n' - # Save the rest for later. - theRest = block[1:] - if theRest: - # Add remaining lines to master blocks for later. - blocks.insert(0, theRest) - sibling = self.lastChild(parent) - if (sibling is not None and sibling.tag == 'pre' and - len(sibling) and sibling[0].tag == 'code'): - # Last block is a codeblock. Append to preserve whitespace. - sibling[0].text = util.AtomicString( - '{}{}'.format(sibling[0].text, filler) - ) - - -class ReferenceProcessor(BlockProcessor): - """ Process link references. """ - RE = re.compile( - r'^[ ]{0,3}\[([^\[\]]*)\]:[ ]*\n?[ ]*([^\s]+)[ ]*(?:\n[ ]*)?((["\'])(.*)\4[ ]*|\((.*)\)[ ]*)?$', re.MULTILINE - ) - - def test(self, parent, block): - return True - - def run(self, parent, blocks): - block = blocks.pop(0) - m = self.RE.search(block) - if m: - id = m.group(1).strip().lower() - link = m.group(2).lstrip('<').rstrip('>') - title = m.group(5) or m.group(6) - self.parser.md.references[id] = (link, title) - if block[m.end():].strip(): - # Add any content after match back to blocks as separate block - blocks.insert(0, block[m.end():].lstrip('\n')) - if block[:m.start()].strip(): - # Add any content before match back to blocks as separate block - blocks.insert(0, block[:m.start()].rstrip('\n')) - return True - # No match. Restore block. - blocks.insert(0, block) - return False - - -class ParagraphProcessor(BlockProcessor): - """ Process Paragraph blocks. """ - - def test(self, parent, block): - return True - - def run(self, parent, blocks): - block = blocks.pop(0) - if block.strip(): - # Not a blank block. Add to parent, otherwise throw it away. - if self.parser.state.isstate('list'): - # The parent is a tight-list. - # - # Check for any children. This will likely only happen in a - # tight-list when a header isn't followed by a blank line. - # For example: - # - # * # Header - # Line 2 of list item - not part of header. - sibling = self.lastChild(parent) - if sibling is not None: - # Insetrt after sibling. - if sibling.tail: - sibling.tail = '{}\n{}'.format(sibling.tail, block) - else: - sibling.tail = '\n%s' % block - else: - # Append to parent.text - if parent.text: - parent.text = '{}\n{}'.format(parent.text, block) - else: - parent.text = block.lstrip() - else: - # Create a regular paragraph - p = etree.SubElement(parent, 'p') - p.text = block.lstrip()
diff --git a/third_party/Python-Markdown/markdown/core.py b/third_party/Python-Markdown/markdown/core.py deleted file mode 100644 index f6a171c1..0000000 --- a/third_party/Python-Markdown/markdown/core.py +++ /dev/null
@@ -1,407 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import codecs -import sys -import logging -import importlib -from . import util -from .preprocessors import build_preprocessors -from .blockprocessors import build_block_parser -from .treeprocessors import build_treeprocessors -from .inlinepatterns import build_inlinepatterns -from .postprocessors import build_postprocessors -from .extensions import Extension -from .serializers import to_html_string, to_xhtml_string - -__all__ = ['Markdown', 'markdown', 'markdownFromFile'] - - -logger = logging.getLogger('MARKDOWN') - - -class Markdown: - """Convert Markdown to HTML.""" - - doc_tag = "div" # Element used to wrap document - later removed - - output_formats = { - 'html': to_html_string, - 'xhtml': to_xhtml_string, - } - - def __init__(self, **kwargs): - """ - Creates a new Markdown instance. - - Keyword arguments: - - * extensions: A list of extensions. - If an item is an instance of a subclass of `markdown.extension.Extension`, the instance will be used - as-is. If an item is of type string, first an entry point will be loaded. If that fails, the string is - assumed to use Python dot notation (`path.to.module:ClassName`) to load a markdown.Extension subclass. If - no class is specified, then a `makeExtension` function is called within the specified module. - * extension_configs: Configuration settings for extensions. - * output_format: Format of output. Supported formats are: - * "xhtml": Outputs XHTML style tags. Default. - * "html": Outputs HTML style tags. - * tab_length: Length of tabs in the source. Default: 4 - - """ - - self.tab_length = kwargs.get('tab_length', 4) - - self.ESCAPED_CHARS = ['\\', '`', '*', '_', '{', '}', '[', ']', - '(', ')', '>', '#', '+', '-', '.', '!'] - - self.block_level_elements = [ - # Elements which are invalid to wrap in a `<p>` tag. - # See https://w3c.github.io/html/grouping-content.html#the-p-element - 'address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', - 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', - 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'main', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul', - # Other elements which Markdown should not be mucking up the contents of. - 'canvas', 'colgroup', 'dd', 'body', 'dt', 'group', 'iframe', 'li', 'legend', - 'math', 'map', 'noscript', 'output', 'object', 'option', 'progress', 'script', - 'style', 'summary', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'video' - ] - - self.registeredExtensions = [] - self.docType = "" - self.stripTopLevelTags = True - - self.build_parser() - - self.references = {} - self.htmlStash = util.HtmlStash() - self.registerExtensions(extensions=kwargs.get('extensions', []), - configs=kwargs.get('extension_configs', {})) - self.set_output_format(kwargs.get('output_format', 'xhtml')) - self.reset() - - def build_parser(self): - """ Build the parser from the various parts. """ - self.preprocessors = build_preprocessors(self) - self.parser = build_block_parser(self) - self.inlinePatterns = build_inlinepatterns(self) - self.treeprocessors = build_treeprocessors(self) - self.postprocessors = build_postprocessors(self) - return self - - def registerExtensions(self, extensions, configs): - """ - Register extensions with this instance of Markdown. - - Keyword arguments: - - * extensions: A list of extensions, which can either - be strings or objects. - * configs: A dictionary mapping extension names to config options. - - """ - for ext in extensions: - if isinstance(ext, str): - ext = self.build_extension(ext, configs.get(ext, {})) - if isinstance(ext, Extension): - ext.extendMarkdown(self) - logger.debug( - 'Successfully loaded extension "%s.%s".' - % (ext.__class__.__module__, ext.__class__.__name__) - ) - elif ext is not None: - raise TypeError( - 'Extension "{}.{}" must be of type: "{}.{}"'.format( - ext.__class__.__module__, ext.__class__.__name__, - Extension.__module__, Extension.__name__ - ) - ) - return self - - def build_extension(self, ext_name, configs): - """ - Build extension from a string name, then return an instance. - - First attempt to load an entry point. The string name must be registered as an entry point in the - `markdown.extensions` group which points to a subclass of the `markdown.extensions.Extension` class. - If multiple distributions have registered the same name, the first one found is returned. - - If no entry point is found, assume dot notation (`path.to.module:ClassName`). Load the specified class and - return an instance. If no class is specified, import the module and call a `makeExtension` function and return - the Extension instance returned by that function. - """ - configs = dict(configs) - - entry_points = [ep for ep in util.get_installed_extensions() if ep.name == ext_name] - if entry_points: - ext = entry_points[0].load() - return ext(**configs) - - # Get class name (if provided): `path.to.module:ClassName` - ext_name, class_name = ext_name.split(':', 1) if ':' in ext_name else (ext_name, '') - - try: - module = importlib.import_module(ext_name) - logger.debug( - 'Successfully imported extension module "%s".' % ext_name - ) - except ImportError as e: - message = 'Failed loading extension "%s".' % ext_name - e.args = (message,) + e.args[1:] - raise - - if class_name: - # Load given class name from module. - return getattr(module, class_name)(**configs) - else: - # Expect makeExtension() function to return a class. - try: - return module.makeExtension(**configs) - except AttributeError as e: - message = e.args[0] - message = "Failed to initiate extension " \ - "'%s': %s" % (ext_name, message) - e.args = (message,) + e.args[1:] - raise - - def registerExtension(self, extension): - """ This gets called by the extension """ - self.registeredExtensions.append(extension) - return self - - def reset(self): - """ - Resets all state variables so that we can start with a new text. - """ - self.htmlStash.reset() - self.references.clear() - - for extension in self.registeredExtensions: - if hasattr(extension, 'reset'): - extension.reset() - - return self - - def set_output_format(self, format): - """ Set the output format for the class instance. """ - self.output_format = format.lower().rstrip('145') # ignore num - try: - self.serializer = self.output_formats[self.output_format] - except KeyError as e: - valid_formats = list(self.output_formats.keys()) - valid_formats.sort() - message = 'Invalid Output Format: "%s". Use one of %s.' \ - % (self.output_format, - '"' + '", "'.join(valid_formats) + '"') - e.args = (message,) + e.args[1:] - raise - return self - - def is_block_level(self, tag): - """Check if the tag is a block level HTML tag.""" - if isinstance(tag, str): - return tag.lower().rstrip('/') in self.block_level_elements - # Some ElementTree tags are not strings, so return False. - return False - - def convert(self, source): - """ - Convert markdown to serialized XHTML or HTML. - - Keyword arguments: - - * source: Source text as a Unicode string. - - Markdown processing takes place in five steps: - - 1. A bunch of "preprocessors" munge the input text. - 2. BlockParser() parses the high-level structural elements of the - pre-processed text into an ElementTree. - 3. A bunch of "treeprocessors" are run against the ElementTree. One - such treeprocessor runs InlinePatterns against the ElementTree, - detecting inline markup. - 4. Some post-processors are run against the text after the ElementTree - has been serialized into text. - 5. The output is written to a string. - - """ - - # Fixup the source text - if not source.strip(): - return '' # a blank unicode string - - try: - source = str(source) - except UnicodeDecodeError as e: # pragma: no cover - # Customise error message while maintaining original trackback - e.reason += '. -- Note: Markdown only accepts unicode input!' - raise - - # Split into lines and run the line preprocessors. - self.lines = source.split("\n") - for prep in self.preprocessors: - self.lines = prep.run(self.lines) - - # Parse the high-level elements. - root = self.parser.parseDocument(self.lines).getroot() - - # Run the tree-processors - for treeprocessor in self.treeprocessors: - newRoot = treeprocessor.run(root) - if newRoot is not None: - root = newRoot - - # Serialize _properly_. Strip top-level tags. - output = self.serializer(root) - if self.stripTopLevelTags: - try: - start = output.index( - '<%s>' % self.doc_tag) + len(self.doc_tag) + 2 - end = output.rindex('</%s>' % self.doc_tag) - output = output[start:end].strip() - except ValueError as e: # pragma: no cover - if output.strip().endswith('<%s />' % self.doc_tag): - # We have an empty document - output = '' - else: - # We have a serious problem - raise ValueError('Markdown failed to strip top-level ' - 'tags. Document=%r' % output.strip()) from e - - # Run the text post-processors - for pp in self.postprocessors: - output = pp.run(output) - - return output.strip() - - def convertFile(self, input=None, output=None, encoding=None): - """Converts a markdown file and returns the HTML as a unicode string. - - Decodes the file using the provided encoding (defaults to utf-8), - passes the file content to markdown, and outputs the html to either - the provided stream or the file with provided name, using the same - encoding as the source file. The 'xmlcharrefreplace' error handler is - used when encoding the output. - - **Note:** This is the only place that decoding and encoding of unicode - takes place in Python-Markdown. (All other code is unicode-in / - unicode-out.) - - Keyword arguments: - - * input: File object or path. Reads from stdin if `None`. - * output: File object or path. Writes to stdout if `None`. - * encoding: Encoding of input and output files. Defaults to utf-8. - - """ - - encoding = encoding or "utf-8" - - # Read the source - if input: - if isinstance(input, str): - input_file = codecs.open(input, mode="r", encoding=encoding) - else: - input_file = codecs.getreader(encoding)(input) - text = input_file.read() - input_file.close() - else: - text = sys.stdin.read() - if not isinstance(text, str): # pragma: no cover - text = text.decode(encoding) - - text = text.lstrip('\ufeff') # remove the byte-order mark - - # Convert - html = self.convert(text) - - # Write to file or stdout - if output: - if isinstance(output, str): - output_file = codecs.open(output, "w", - encoding=encoding, - errors="xmlcharrefreplace") - output_file.write(html) - output_file.close() - else: - writer = codecs.getwriter(encoding) - output_file = writer(output, errors="xmlcharrefreplace") - output_file.write(html) - # Don't close here. User may want to write more. - else: - # Encode manually and write bytes to stdout. - html = html.encode(encoding, "xmlcharrefreplace") - try: - # Write bytes directly to buffer (Python 3). - sys.stdout.buffer.write(html) - except AttributeError: # pragma: no cover - # Probably Python 2, which works with bytes by default. - sys.stdout.write(html) - - return self - - -""" -EXPORTED FUNCTIONS -============================================================================= - -Those are the two functions we really mean to export: markdown() and -markdownFromFile(). -""" - - -def markdown(text, **kwargs): - """Convert a markdown string to HTML and return HTML as a unicode string. - - This is a shortcut function for `Markdown` class to cover the most - basic use case. It initializes an instance of Markdown, loads the - necessary extensions and runs the parser on the given text. - - Keyword arguments: - - * text: Markdown formatted text as Unicode or ASCII string. - * Any arguments accepted by the Markdown class. - - Returns: An HTML document as a string. - - """ - md = Markdown(**kwargs) - return md.convert(text) - - -def markdownFromFile(**kwargs): - """Read markdown code from a file and write it to a file or a stream. - - This is a shortcut function which initializes an instance of Markdown, - and calls the convertFile method rather than convert. - - Keyword arguments: - - * input: a file name or readable object. - * output: a file name or writable object. - * encoding: Encoding of input and output. - * Any arguments accepted by the Markdown class. - - """ - md = Markdown(**kwargs) - md.convertFile(kwargs.get('input', None), - kwargs.get('output', None), - kwargs.get('encoding', None))
diff --git a/third_party/Python-Markdown/markdown/extensions/__init__.py b/third_party/Python-Markdown/markdown/extensions/__init__.py deleted file mode 100644 index 2d8d72a..0000000 --- a/third_party/Python-Markdown/markdown/extensions/__init__.py +++ /dev/null
@@ -1,86 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -from ..util import parseBoolValue - - -class Extension: - """ Base class for extensions to subclass. """ - - # Default config -- to be overridden by a subclass - # Must be of the following format: - # { - # 'key': ['value', 'description'] - # } - # Note that Extension.setConfig will raise a KeyError - # if a default is not set here. - config = {} - - def __init__(self, **kwargs): - """ Initiate Extension and set up configs. """ - self.setConfigs(kwargs) - - def getConfig(self, key, default=''): - """ Return a setting for the given key or an empty string. """ - if key in self.config: - return self.config[key][0] - else: - return default - - def getConfigs(self): - """ Return all configs settings as a dict. """ - return {key: self.getConfig(key) for key in self.config.keys()} - - def getConfigInfo(self): - """ Return all config descriptions as a list of tuples. """ - return [(key, self.config[key][1]) for key in self.config.keys()] - - def setConfig(self, key, value): - """ Set a config setting for `key` with the given `value`. """ - if isinstance(self.config[key][0], bool): - value = parseBoolValue(value) - if self.config[key][0] is None: - value = parseBoolValue(value, preserve_none=True) - self.config[key][0] = value - - def setConfigs(self, items): - """ Set multiple config settings given a dict or list of tuples. """ - if hasattr(items, 'items'): - # it's a dict - items = items.items() - for key, value in items: - self.setConfig(key, value) - - def extendMarkdown(self, md): - """ - Add the various processors and patterns to the Markdown Instance. - - This method must be overridden by every extension. - - Keyword arguments: - - * md: The Markdown instance. - - """ - raise NotImplementedError( - 'Extension "%s.%s" must define an "extendMarkdown"' - 'method.' % (self.__class__.__module__, self.__class__.__name__) - )
diff --git a/third_party/Python-Markdown/markdown/extensions/abbr.py b/third_party/Python-Markdown/markdown/extensions/abbr.py deleted file mode 100644 index 9879314f..0000000 --- a/third_party/Python-Markdown/markdown/extensions/abbr.py +++ /dev/null
@@ -1,99 +0,0 @@ -''' -Abbreviation Extension for Python-Markdown -========================================== - -This extension adds abbreviation handling to Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/abbreviations> -for documentation. - -Oringinal code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/) and - [Seemant Kulleen](http://www.kulleen.org/) - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -''' - -from . import Extension -from ..blockprocessors import BlockProcessor -from ..inlinepatterns import InlineProcessor -from ..util import AtomicString -import re -import xml.etree.ElementTree as etree - - -class AbbrExtension(Extension): - """ Abbreviation Extension for Python-Markdown. """ - - def extendMarkdown(self, md): - """ Insert AbbrPreprocessor before ReferencePreprocessor. """ - md.parser.blockprocessors.register(AbbrPreprocessor(md.parser), 'abbr', 16) - - -class AbbrPreprocessor(BlockProcessor): - """ Abbreviation Preprocessor - parse text for abbr references. """ - - RE = re.compile(r'^[*]\[(?P<abbr>[^\]]*)\][ ]?:[ ]*\n?[ ]*(?P<title>.*)$', re.MULTILINE) - - def test(self, parent, block): - return True - - def run(self, parent, blocks): - ''' - Find and remove all Abbreviation references from the text. - Each reference is set as a new AbbrPattern in the markdown instance. - - ''' - block = blocks.pop(0) - m = self.RE.search(block) - if m: - abbr = m.group('abbr').strip() - title = m.group('title').strip() - self.parser.md.inlinePatterns.register( - AbbrInlineProcessor(self._generate_pattern(abbr), title), 'abbr-%s' % abbr, 2 - ) - if block[m.end():].strip(): - # Add any content after match back to blocks as separate block - blocks.insert(0, block[m.end():].lstrip('\n')) - if block[:m.start()].strip(): - # Add any content before match back to blocks as separate block - blocks.insert(0, block[:m.start()].rstrip('\n')) - return True - # No match. Restore block. - blocks.insert(0, block) - return False - - def _generate_pattern(self, text): - ''' - Given a string, returns an regex pattern to match that string. - - 'HTML' -> r'(?P<abbr>[H][T][M][L])' - - Note: we force each char as a literal match (in brackets) as we don't - know what they will be beforehand. - - ''' - chars = list(text) - for i in range(len(chars)): - chars[i] = r'[%s]' % chars[i] - return r'(?P<abbr>\b%s\b)' % (r''.join(chars)) - - -class AbbrInlineProcessor(InlineProcessor): - """ Abbreviation inline pattern. """ - - def __init__(self, pattern, title): - super().__init__(pattern) - self.title = title - - def handleMatch(self, m, data): - abbr = etree.Element('abbr') - abbr.text = AtomicString(m.group('abbr')) - abbr.set('title', self.title) - return abbr, m.start(0), m.end(0) - - -def makeExtension(**kwargs): # pragma: no cover - return AbbrExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/admonition.py b/third_party/Python-Markdown/markdown/extensions/admonition.py deleted file mode 100644 index cb8d9015..0000000 --- a/third_party/Python-Markdown/markdown/extensions/admonition.py +++ /dev/null
@@ -1,170 +0,0 @@ -""" -Admonition extension for Python-Markdown -======================================== - -Adds rST-style admonitions. Inspired by [rST][] feature with the same name. - -[rST]: http://docutils.sourceforge.net/docs/ref/rst/directives.html#specific-admonitions # noqa - -See <https://Python-Markdown.github.io/extensions/admonition> -for documentation. - -Original code Copyright [Tiago Serafim](https://www.tiagoserafim.com/). - -All changes Copyright The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import BlockProcessor -import xml.etree.ElementTree as etree -import re - - -class AdmonitionExtension(Extension): - """ Admonition extension for Python-Markdown. """ - - def extendMarkdown(self, md): - """ Add Admonition to Markdown instance. """ - md.registerExtension(self) - - md.parser.blockprocessors.register(AdmonitionProcessor(md.parser), 'admonition', 105) - - -class AdmonitionProcessor(BlockProcessor): - - CLASSNAME = 'admonition' - CLASSNAME_TITLE = 'admonition-title' - RE = re.compile(r'(?:^|\n)!!! ?([\w\-]+(?: +[\w\-]+)*)(?: +"(.*?)")? *(?:\n|$)') - RE_SPACES = re.compile(' +') - - def __init__(self, parser): - """Initialization.""" - - super().__init__(parser) - - self.current_sibling = None - self.content_indention = 0 - - def parse_content(self, parent, block): - """Get sibling admonition. - - Retrieve the appropriate sibling element. This can get tricky when - dealing with lists. - - """ - - old_block = block - the_rest = '' - - # We already acquired the block via test - if self.current_sibling is not None: - sibling = self.current_sibling - block, the_rest = self.detab(block, self.content_indent) - self.current_sibling = None - self.content_indent = 0 - return sibling, block, the_rest - - sibling = self.lastChild(parent) - - if sibling is None or sibling.get('class', '').find(self.CLASSNAME) == -1: - sibling = None - else: - # If the last child is a list and the content is sufficiently indented - # to be under it, then the content's sibling is in the list. - last_child = self.lastChild(sibling) - indent = 0 - while last_child: - if ( - sibling and block.startswith(' ' * self.tab_length * 2) and - last_child and last_child.tag in ('ul', 'ol', 'dl') - ): - - # The expectation is that we'll find an <li> or <dt>. - # We should get its last child as well. - sibling = self.lastChild(last_child) - last_child = self.lastChild(sibling) if sibling else None - - # Context has been lost at this point, so we must adjust the - # text's indentation level so it will be evaluated correctly - # under the list. - block = block[self.tab_length:] - indent += self.tab_length - else: - last_child = None - - if not block.startswith(' ' * self.tab_length): - sibling = None - - if sibling is not None: - indent += self.tab_length - block, the_rest = self.detab(old_block, indent) - self.current_sibling = sibling - self.content_indent = indent - - return sibling, block, the_rest - - def test(self, parent, block): - - if self.RE.search(block): - return True - else: - return self.parse_content(parent, block)[0] is not None - - def run(self, parent, blocks): - block = blocks.pop(0) - m = self.RE.search(block) - - if m: - if m.start() > 0: - self.parser.parseBlocks(parent, [block[:m.start()]]) - block = block[m.end():] # removes the first line - block, theRest = self.detab(block) - else: - sibling, block, theRest = self.parse_content(parent, block) - - if m: - klass, title = self.get_class_and_title(m) - div = etree.SubElement(parent, 'div') - div.set('class', '{} {}'.format(self.CLASSNAME, klass)) - if title: - p = etree.SubElement(div, 'p') - p.text = title - p.set('class', self.CLASSNAME_TITLE) - else: - # Sibling is a list item, but we need to wrap it's content should be wrapped in <p> - if sibling.tag in ('li', 'dd') and sibling.text: - text = sibling.text - sibling.text = '' - p = etree.SubElement(sibling, 'p') - p.text = text - - div = sibling - - self.parser.parseChunk(div, block) - - if theRest: - # This block contained unindented line(s) after the first indented - # line. Insert these lines as the first block of the master blocks - # list for future processing. - blocks.insert(0, theRest) - - def get_class_and_title(self, match): - klass, title = match.group(1).lower(), match.group(2) - klass = self.RE_SPACES.sub(' ', klass) - if title is None: - # no title was provided, use the capitalized classname as title - # e.g.: `!!! note` will render - # `<p class="admonition-title">Note</p>` - title = klass.split(' ', 1)[0].capitalize() - elif title == '': - # an explicit blank title should not be rendered - # e.g.: `!!! warning ""` will *not* render `p` with a title - title = None - return klass, title - - -def makeExtension(**kwargs): # pragma: no cover - return AdmonitionExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/attr_list.py b/third_party/Python-Markdown/markdown/extensions/attr_list.py deleted file mode 100644 index 9a67551..0000000 --- a/third_party/Python-Markdown/markdown/extensions/attr_list.py +++ /dev/null
@@ -1,166 +0,0 @@ -""" -Attribute List Extension for Python-Markdown -============================================ - -Adds attribute list syntax. Inspired by -[maruku](http://maruku.rubyforge.org/proposal.html#attribute_lists)'s -feature of the same name. - -See <https://Python-Markdown.github.io/extensions/attr_list> -for documentation. - -Original code Copyright 2011 [Waylan Limberg](http://achinghead.com/). - -All changes Copyright 2011-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..treeprocessors import Treeprocessor -import re - - -def _handle_double_quote(s, t): - k, v = t.split('=', 1) - return k, v.strip('"') - - -def _handle_single_quote(s, t): - k, v = t.split('=', 1) - return k, v.strip("'") - - -def _handle_key_value(s, t): - return t.split('=', 1) - - -def _handle_word(s, t): - if t.startswith('.'): - return '.', t[1:] - if t.startswith('#'): - return 'id', t[1:] - return t, t - - -_scanner = re.Scanner([ - (r'[^ =]+=".*?"', _handle_double_quote), - (r"[^ =]+='.*?'", _handle_single_quote), - (r'[^ =]+=[^ =]+', _handle_key_value), - (r'[^ =]+', _handle_word), - (r' ', None) -]) - - -def get_attrs(str): - """ Parse attribute list and return a list of attribute tuples. """ - return _scanner.scan(str)[0] - - -def isheader(elem): - return elem.tag in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] - - -class AttrListTreeprocessor(Treeprocessor): - - BASE_RE = r'\{\:?[ ]*([^\}\n ][^\}\n]*)[ ]*\}' - HEADER_RE = re.compile(r'[ ]+{}[ ]*$'.format(BASE_RE)) - BLOCK_RE = re.compile(r'\n[ ]*{}[ ]*$'.format(BASE_RE)) - INLINE_RE = re.compile(r'^{}'.format(BASE_RE)) - NAME_RE = re.compile(r'[^A-Z_a-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff' - r'\u0370-\u037d\u037f-\u1fff\u200c-\u200d' - r'\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff' - r'\uf900-\ufdcf\ufdf0-\ufffd' - r'\:\-\.0-9\u00b7\u0300-\u036f\u203f-\u2040]+') - - def run(self, doc): - for elem in doc.iter(): - if self.md.is_block_level(elem.tag): - # Block level: check for attrs on last line of text - RE = self.BLOCK_RE - if isheader(elem) or elem.tag in ['dt', 'td', 'th']: - # header, def-term, or table cell: check for attrs at end of element - RE = self.HEADER_RE - if len(elem) and elem.tag == 'li': - # special case list items. children may include a ul or ol. - pos = None - # find the ul or ol position - for i, child in enumerate(elem): - if child.tag in ['ul', 'ol']: - pos = i - break - if pos is None and elem[-1].tail: - # use tail of last child. no ul or ol. - m = RE.search(elem[-1].tail) - if m: - self.assign_attrs(elem, m.group(1)) - elem[-1].tail = elem[-1].tail[:m.start()] - elif pos is not None and pos > 0 and elem[pos-1].tail: - # use tail of last child before ul or ol - m = RE.search(elem[pos-1].tail) - if m: - self.assign_attrs(elem, m.group(1)) - elem[pos-1].tail = elem[pos-1].tail[:m.start()] - elif elem.text: - # use text. ul is first child. - m = RE.search(elem.text) - if m: - self.assign_attrs(elem, m.group(1)) - elem.text = elem.text[:m.start()] - elif len(elem) and elem[-1].tail: - # has children. Get from tail of last child - m = RE.search(elem[-1].tail) - if m: - self.assign_attrs(elem, m.group(1)) - elem[-1].tail = elem[-1].tail[:m.start()] - if isheader(elem): - # clean up trailing #s - elem[-1].tail = elem[-1].tail.rstrip('#').rstrip() - elif elem.text: - # no children. Get from text. - m = RE.search(elem.text) - if m: - self.assign_attrs(elem, m.group(1)) - elem.text = elem.text[:m.start()] - if isheader(elem): - # clean up trailing #s - elem.text = elem.text.rstrip('#').rstrip() - else: - # inline: check for attrs at start of tail - if elem.tail: - m = self.INLINE_RE.match(elem.tail) - if m: - self.assign_attrs(elem, m.group(1)) - elem.tail = elem.tail[m.end():] - - def assign_attrs(self, elem, attrs): - """ Assign attrs to element. """ - for k, v in get_attrs(attrs): - if k == '.': - # add to class - cls = elem.get('class') - if cls: - elem.set('class', '{} {}'.format(cls, v)) - else: - elem.set('class', v) - else: - # assign attr k with v - elem.set(self.sanitize_name(k), v) - - def sanitize_name(self, name): - """ - Sanitize name as 'an XML Name, minus the ":"'. - See https://www.w3.org/TR/REC-xml-names/#NT-NCName - """ - return self.NAME_RE.sub('_', name) - - -class AttrListExtension(Extension): - def extendMarkdown(self, md): - md.treeprocessors.register(AttrListTreeprocessor(md), 'attr_list', 8) - md.registerExtension(self) - - -def makeExtension(**kwargs): # pragma: no cover - return AttrListExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/codehilite.py b/third_party/Python-Markdown/markdown/extensions/codehilite.py deleted file mode 100644 index a54ba21..0000000 --- a/third_party/Python-Markdown/markdown/extensions/codehilite.py +++ /dev/null
@@ -1,330 +0,0 @@ -""" -CodeHilite Extension for Python-Markdown -======================================== - -Adds code/syntax highlighting to standard Python-Markdown code blocks. - -See <https://Python-Markdown.github.io/extensions/code_hilite> -for documentation. - -Original code Copyright 2006-2008 [Waylan Limberg](http://achinghead.com/). - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..treeprocessors import Treeprocessor -from ..util import parseBoolValue - -try: # pragma: no cover - from pygments import highlight - from pygments.lexers import get_lexer_by_name, guess_lexer - from pygments.formatters import get_formatter_by_name - from pygments.util import ClassNotFound - pygments = True -except ImportError: # pragma: no cover - pygments = False - - -def parse_hl_lines(expr): - """Support our syntax for emphasizing certain lines of code. - - expr should be like '1 2' to emphasize lines 1 and 2 of a code block. - Returns a list of ints, the line numbers to emphasize. - """ - if not expr: - return [] - - try: - return list(map(int, expr.split())) - except ValueError: # pragma: no cover - return [] - - -# ------------------ The Main CodeHilite Class ---------------------- -class CodeHilite: - """ - Determine language of source code, and pass it on to the Pygments highlighter. - - Usage: - code = CodeHilite(src=some_code, lang='python') - html = code.hilite() - - Arguments: - * src: Source string or any object with a .readline attribute. - - * lang: String name of Pygments lexer to use for highlighting. Default: `None`. - - * guess_lang: Auto-detect which lexer to use. Ignored if `lang` is set to a valid - value. Default: `True`. - - * use_pygments: Pass code to pygments for code highlighting. If `False`, the code is - instead wrapped for highlighting by a JavaScript library. Default: `True`. - - * pygments_formatter: The name of a Pygments formatter or a formatter class used for - highlighting the code blocks. Default: `html`. - - * linenums: An alias to Pygments `linenos` formatter option. Default: `None`. - - * css_class: An alias to Pygments `cssclass` formatter option. Default: 'codehilite'. - - * lang_prefix: Prefix prepended to the language. Default: "language-". - - Other Options: - Any other options are accepted and passed on to the lexer and formatter. Therefore, - valid options include any options which are accepted by the `html` formatter or - whichever lexer the code's language uses. Note that most lexers do not have any - options. However, a few have very useful options, such as PHP's `startinline` option. - Any invalid options are ignored without error. - - Formatter options: https://pygments.org/docs/formatters/#HtmlFormatter - Lexer Options: https://pygments.org/docs/lexers/ - - Additionally, when Pygments is enabled, the code's language is passed to the - formatter as an extra option `lang_str`, whose value being `{lang_prefix}{lang}`. - This option has no effect to the Pygments's builtin formatters. - - Advanced Usage: - code = CodeHilite( - src = some_code, - lang = 'php', - startinline = True, # Lexer option. Snippet does not start with `<?php`. - linenostart = 42, # Formatter option. Snippet starts on line 42. - hl_lines = [45, 49, 50], # Formatter option. Highlight lines 45, 49, and 50. - linenos = 'inline' # Formatter option. Avoid alignment problems. - ) - html = code.hilite() - - """ - - def __init__(self, src, **options): - self.src = src - self.lang = options.pop('lang', None) - self.guess_lang = options.pop('guess_lang', True) - self.use_pygments = options.pop('use_pygments', True) - self.lang_prefix = options.pop('lang_prefix', 'language-') - self.pygments_formatter = options.pop('pygments_formatter', 'html') - - if 'linenos' not in options: - options['linenos'] = options.pop('linenums', None) - if 'cssclass' not in options: - options['cssclass'] = options.pop('css_class', 'codehilite') - if 'wrapcode' not in options: - # Override pygments default - options['wrapcode'] = True - # Disallow use of `full` option - options['full'] = False - - self.options = options - - def hilite(self, shebang=True): - """ - Pass code to the [Pygments](http://pygments.pocoo.org/) highliter with - optional line numbers. The output should then be styled with css to - your liking. No styles are applied by default - only styling hooks - (i.e.: <span class="k">). - - returns : A string of html. - - """ - - self.src = self.src.strip('\n') - - if self.lang is None and shebang: - self._parseHeader() - - if pygments and self.use_pygments: - try: - lexer = get_lexer_by_name(self.lang, **self.options) - except ValueError: - try: - if self.guess_lang: - lexer = guess_lexer(self.src, **self.options) - else: - lexer = get_lexer_by_name('text', **self.options) - except ValueError: # pragma: no cover - lexer = get_lexer_by_name('text', **self.options) - if not self.lang: - # Use the guessed lexer's language instead - self.lang = lexer.aliases[0] - lang_str = f'{self.lang_prefix}{self.lang}' - if isinstance(self.pygments_formatter, str): - try: - formatter = get_formatter_by_name(self.pygments_formatter, **self.options) - except ClassNotFound: - formatter = get_formatter_by_name('html', **self.options) - else: - formatter = self.pygments_formatter(lang_str=lang_str, **self.options) - return highlight(self.src, lexer, formatter) - else: - # just escape and build markup usable by JS highlighting libs - txt = self.src.replace('&', '&') - txt = txt.replace('<', '<') - txt = txt.replace('>', '>') - txt = txt.replace('"', '"') - classes = [] - if self.lang: - classes.append('{}{}'.format(self.lang_prefix, self.lang)) - if self.options['linenos']: - classes.append('linenums') - class_str = '' - if classes: - class_str = ' class="{}"'.format(' '.join(classes)) - return '<pre class="{}"><code{}>{}\n</code></pre>\n'.format( - self.options['cssclass'], - class_str, - txt - ) - - def _parseHeader(self): - """ - Determines language of a code block from shebang line and whether the - said line should be removed or left in place. If the sheband line - contains a path (even a single /) then it is assumed to be a real - shebang line and left alone. However, if no path is given - (e.i.: #!python or :::python) then it is assumed to be a mock shebang - for language identification of a code fragment and removed from the - code block prior to processing for code highlighting. When a mock - shebang (e.i: #!python) is found, line numbering is turned on. When - colons are found in place of a shebang (e.i.: :::python), line - numbering is left in the current state - off by default. - - Also parses optional list of highlight lines, like: - - :::python hl_lines="1 3" - """ - - import re - - # split text into lines - lines = self.src.split("\n") - # pull first line to examine - fl = lines.pop(0) - - c = re.compile(r''' - (?:(?:^::+)|(?P<shebang>^[#]!)) # Shebang or 2 or more colons - (?P<path>(?:/\w+)*[/ ])? # Zero or 1 path - (?P<lang>[\w#.+-]*) # The language - \s* # Arbitrary whitespace - # Optional highlight lines, single- or double-quote-delimited - (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot))? - ''', re.VERBOSE) - # search first line for shebang - m = c.search(fl) - if m: - # we have a match - try: - self.lang = m.group('lang').lower() - except IndexError: # pragma: no cover - self.lang = None - if m.group('path'): - # path exists - restore first line - lines.insert(0, fl) - if self.options['linenos'] is None and m.group('shebang'): - # Overridable and Shebang exists - use line numbers - self.options['linenos'] = True - - self.options['hl_lines'] = parse_hl_lines(m.group('hl_lines')) - else: - # No match - lines.insert(0, fl) - - self.src = "\n".join(lines).strip("\n") - - -# ------------------ The Markdown Extension ------------------------------- - - -class HiliteTreeprocessor(Treeprocessor): - """ Highlight source code in code blocks. """ - - def code_unescape(self, text): - """Unescape code.""" - text = text.replace("<", "<") - text = text.replace(">", ">") - # Escaped '&' should be replaced at the end to avoid - # conflicting with < and >. - text = text.replace("&", "&") - return text - - def run(self, root): - """ Find code blocks and store in htmlStash. """ - blocks = root.iter('pre') - for block in blocks: - if len(block) == 1 and block[0].tag == 'code': - local_config = self.config.copy() - code = CodeHilite( - self.code_unescape(block[0].text), - tab_length=self.md.tab_length, - style=local_config.pop('pygments_style', 'default'), - **local_config - ) - placeholder = self.md.htmlStash.store(code.hilite()) - # Clear codeblock in etree instance - block.clear() - # Change to p element which will later - # be removed when inserting raw html - block.tag = 'p' - block.text = placeholder - - -class CodeHiliteExtension(Extension): - """ Add source code highlighting to markdown codeblocks. """ - - def __init__(self, **kwargs): - # define default configs - self.config = { - 'linenums': [None, - "Use lines numbers. True|table|inline=yes, False=no, None=auto"], - 'guess_lang': [True, - "Automatic language detection - Default: True"], - 'css_class': ["codehilite", - "Set class name for wrapper <div> - " - "Default: codehilite"], - 'pygments_style': ['default', - 'Pygments HTML Formatter Style ' - '(Colorscheme) - Default: default'], - 'noclasses': [False, - 'Use inline styles instead of CSS classes - ' - 'Default false'], - 'use_pygments': [True, - 'Use Pygments to Highlight code blocks. ' - 'Disable if using a JavaScript library. ' - 'Default: True'], - 'lang_prefix': [ - 'language-', - 'Prefix prepended to the language when use_pygments is false. Default: "language-"' - ], - 'pygments_formatter': ['html', - 'Use a specific formatter for Pygments highlighting.' - 'Default: "html"', - ], - } - - for key, value in kwargs.items(): - if key in self.config: - self.setConfig(key, value) - else: - # manually set unknown keywords. - if isinstance(value, str): - try: - # Attempt to parse str as a bool value - value = parseBoolValue(value, preserve_none=True) - except ValueError: - pass # Assume it's not a bool value. Use as-is. - self.config[key] = [value, ''] - - def extendMarkdown(self, md): - """ Add HilitePostprocessor to Markdown instance. """ - hiliter = HiliteTreeprocessor(md) - hiliter.config = self.getConfigs() - md.treeprocessors.register(hiliter, 'hilite', 30) - - md.registerExtension(self) - - -def makeExtension(**kwargs): # pragma: no cover - return CodeHiliteExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/def_list.py b/third_party/Python-Markdown/markdown/extensions/def_list.py deleted file mode 100644 index 17549f0..0000000 --- a/third_party/Python-Markdown/markdown/extensions/def_list.py +++ /dev/null
@@ -1,111 +0,0 @@ -""" -Definition List Extension for Python-Markdown -============================================= - -Adds parsing of Definition Lists to Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/definition_lists> -for documentation. - -Original code Copyright 2008 [Waylan Limberg](http://achinghead.com) - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import BlockProcessor, ListIndentProcessor -import xml.etree.ElementTree as etree -import re - - -class DefListProcessor(BlockProcessor): - """ Process Definition Lists. """ - - RE = re.compile(r'(^|\n)[ ]{0,3}:[ ]{1,3}(.*?)(\n|$)') - NO_INDENT_RE = re.compile(r'^[ ]{0,3}[^ :]') - - def test(self, parent, block): - return bool(self.RE.search(block)) - - def run(self, parent, blocks): - - raw_block = blocks.pop(0) - m = self.RE.search(raw_block) - terms = [term.strip() for term in - raw_block[:m.start()].split('\n') if term.strip()] - block = raw_block[m.end():] - no_indent = self.NO_INDENT_RE.match(block) - if no_indent: - d, theRest = (block, None) - else: - d, theRest = self.detab(block) - if d: - d = '{}\n{}'.format(m.group(2), d) - else: - d = m.group(2) - sibling = self.lastChild(parent) - if not terms and sibling is None: - # This is not a definition item. Most likely a paragraph that - # starts with a colon at the beginning of a document or list. - blocks.insert(0, raw_block) - return False - if not terms and sibling.tag == 'p': - # The previous paragraph contains the terms - state = 'looselist' - terms = sibling.text.split('\n') - parent.remove(sibling) - # Acquire new sibling - sibling = self.lastChild(parent) - else: - state = 'list' - - if sibling is not None and sibling.tag == 'dl': - # This is another item on an existing list - dl = sibling - if not terms and len(dl) and dl[-1].tag == 'dd' and len(dl[-1]): - state = 'looselist' - else: - # This is a new list - dl = etree.SubElement(parent, 'dl') - # Add terms - for term in terms: - dt = etree.SubElement(dl, 'dt') - dt.text = term - # Add definition - self.parser.state.set(state) - dd = etree.SubElement(dl, 'dd') - self.parser.parseBlocks(dd, [d]) - self.parser.state.reset() - - if theRest: - blocks.insert(0, theRest) - - -class DefListIndentProcessor(ListIndentProcessor): - """ Process indented children of definition list items. """ - - # Definition lists need to be aware of all list types - ITEM_TYPES = ['dd', 'li'] - LIST_TYPES = ['dl', 'ol', 'ul'] - - def create_item(self, parent, block): - """ Create a new dd or li (depending on parent) and parse the block with it as the parent. """ - - dd = etree.SubElement(parent, 'dd') - self.parser.parseBlocks(dd, [block]) - - -class DefListExtension(Extension): - """ Add definition lists to Markdown. """ - - def extendMarkdown(self, md): - """ Add an instance of DefListProcessor to BlockParser. """ - md.parser.blockprocessors.register(DefListIndentProcessor(md.parser), 'defindent', 85) - md.parser.blockprocessors.register(DefListProcessor(md.parser), 'deflist', 25) - - -def makeExtension(**kwargs): # pragma: no cover - return DefListExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/extra.py b/third_party/Python-Markdown/markdown/extensions/extra.py deleted file mode 100644 index 909ba075..0000000 --- a/third_party/Python-Markdown/markdown/extensions/extra.py +++ /dev/null
@@ -1,58 +0,0 @@ -""" -Python-Markdown Extra Extension -=============================== - -A compilation of various Python-Markdown extensions that imitates -[PHP Markdown Extra](http://michelf.com/projects/php-markdown/extra/). - -Note that each of the individual extensions still need to be available -on your PYTHONPATH. This extension simply wraps them all up as a -convenience so that only one extension needs to be listed when -initiating Markdown. See the documentation for each individual -extension for specifics about that extension. - -There may be additional extensions that are distributed with -Python-Markdown that are not included here in Extra. Those extensions -are not part of PHP Markdown Extra, and therefore, not part of -Python-Markdown Extra. If you really would like Extra to include -additional extensions, we suggest creating your own clone of Extra -under a different name. You could also edit the `extensions` global -variable defined below, but be aware that such changes may be lost -when you upgrade to any future version of Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/extra> -for documentation. - -Copyright The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension - -extensions = [ - 'fenced_code', - 'footnotes', - 'attr_list', - 'def_list', - 'tables', - 'abbr', - 'md_in_html' -] - - -class ExtraExtension(Extension): - """ Add various extensions to Markdown class.""" - - def __init__(self, **kwargs): - """ config is a dumb holder which gets passed to actual ext later. """ - self.config = kwargs - - def extendMarkdown(self, md): - """ Register extension instances. """ - md.registerExtensions(extensions, self.config) - - -def makeExtension(**kwargs): # pragma: no cover - return ExtraExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/fenced_code.py b/third_party/Python-Markdown/markdown/extensions/fenced_code.py deleted file mode 100644 index 409166ad..0000000 --- a/third_party/Python-Markdown/markdown/extensions/fenced_code.py +++ /dev/null
@@ -1,174 +0,0 @@ -""" -Fenced Code Extension for Python Markdown -========================================= - -This extension adds Fenced Code Blocks to Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/fenced_code_blocks> -for documentation. - -Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/). - - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) -""" - - -from textwrap import dedent -from . import Extension -from ..preprocessors import Preprocessor -from .codehilite import CodeHilite, CodeHiliteExtension, parse_hl_lines -from .attr_list import get_attrs, AttrListExtension -from ..util import parseBoolValue -from ..serializers import _escape_attrib_html -import re - - -class FencedCodeExtension(Extension): - def __init__(self, **kwargs): - self.config = { - 'lang_prefix': ['language-', 'Prefix prepended to the language. Default: "language-"'] - } - super().__init__(**kwargs) - - def extendMarkdown(self, md): - """ Add FencedBlockPreprocessor to the Markdown instance. """ - md.registerExtension(self) - - md.preprocessors.register(FencedBlockPreprocessor(md, self.getConfigs()), 'fenced_code_block', 25) - - -class FencedBlockPreprocessor(Preprocessor): - FENCED_BLOCK_RE = re.compile( - dedent(r''' - (?P<fence>^(?:~{3,}|`{3,}))[ ]* # opening fence - ((\{(?P<attrs>[^\}\n]*)\})| # (optional {attrs} or - (\.?(?P<lang>[\w#.+-]*)[ ]*)? # optional (.)lang - (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot)[ ]*)?) # optional hl_lines) - \n # newline (end of opening fence) - (?P<code>.*?)(?<=\n) # the code block - (?P=fence)[ ]*$ # closing fence - '''), - re.MULTILINE | re.DOTALL | re.VERBOSE - ) - - def __init__(self, md, config): - super().__init__(md) - self.config = config - self.checked_for_deps = False - self.codehilite_conf = {} - self.use_attr_list = False - # List of options to convert to bool values - self.bool_options = [ - 'linenums', - 'guess_lang', - 'noclasses', - 'use_pygments' - ] - - def run(self, lines): - """ Match and store Fenced Code Blocks in the HtmlStash. """ - - # Check for dependent extensions - if not self.checked_for_deps: - for ext in self.md.registeredExtensions: - if isinstance(ext, CodeHiliteExtension): - self.codehilite_conf = ext.getConfigs() - if isinstance(ext, AttrListExtension): - self.use_attr_list = True - - self.checked_for_deps = True - - text = "\n".join(lines) - while 1: - m = self.FENCED_BLOCK_RE.search(text) - if m: - lang, id, classes, config = None, '', [], {} - if m.group('attrs'): - id, classes, config = self.handle_attrs(get_attrs(m.group('attrs'))) - if len(classes): - lang = classes.pop(0) - else: - if m.group('lang'): - lang = m.group('lang') - if m.group('hl_lines'): - # Support hl_lines outside of attrs for backward-compatibility - config['hl_lines'] = parse_hl_lines(m.group('hl_lines')) - - # If config is not empty, then the codehighlite extension - # is enabled, so we call it to highlight the code - if self.codehilite_conf and self.codehilite_conf['use_pygments'] and config.get('use_pygments', True): - local_config = self.codehilite_conf.copy() - local_config.update(config) - # Combine classes with cssclass. Ensure cssclass is at end - # as pygments appends a suffix under certain circumstances. - # Ignore ID as Pygments does not offer an option to set it. - if classes: - local_config['css_class'] = '{} {}'.format( - ' '.join(classes), - local_config['css_class'] - ) - highliter = CodeHilite( - m.group('code'), - lang=lang, - style=local_config.pop('pygments_style', 'default'), - **local_config - ) - - code = highliter.hilite(shebang=False) - else: - id_attr = lang_attr = class_attr = kv_pairs = '' - if lang: - prefix = self.config.get('lang_prefix', 'language-') - lang_attr = f' class="{prefix}{_escape_attrib_html(lang)}"' - if classes: - class_attr = f' class="{_escape_attrib_html(" ".join(classes))}"' - if id: - id_attr = f' id="{_escape_attrib_html(id)}"' - if self.use_attr_list and config and not config.get('use_pygments', False): - # Only assign key/value pairs to code element if attr_list ext is enabled, key/value pairs - # were defined on the code block, and the `use_pygments` key was not set to True. The - # `use_pygments` key could be either set to False or not defined. It is omitted from output. - kv_pairs = ''.join( - f' {k}="{_escape_attrib_html(v)}"' for k, v in config.items() if k != 'use_pygments' - ) - code = self._escape(m.group('code')) - code = f'<pre{id_attr}{class_attr}><code{lang_attr}{kv_pairs}>{code}</code></pre>' - - placeholder = self.md.htmlStash.store(code) - text = f'{text[:m.start()]}\n{placeholder}\n{text[m.end():]}' - else: - break - return text.split("\n") - - def handle_attrs(self, attrs): - """ Return tuple: (id, [list, of, classes], {configs}) """ - id = '' - classes = [] - configs = {} - for k, v in attrs: - if k == 'id': - id = v - elif k == '.': - classes.append(v) - elif k == 'hl_lines': - configs[k] = parse_hl_lines(v) - elif k in self.bool_options: - configs[k] = parseBoolValue(v, fail_on_errors=False, preserve_none=True) - else: - configs[k] = v - return id, classes, configs - - def _escape(self, txt): - """ basic html escaping """ - txt = txt.replace('&', '&') - txt = txt.replace('<', '<') - txt = txt.replace('>', '>') - txt = txt.replace('"', '"') - return txt - - -def makeExtension(**kwargs): # pragma: no cover - return FencedCodeExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/footnotes.py b/third_party/Python-Markdown/markdown/extensions/footnotes.py deleted file mode 100644 index 96ed5c2..0000000 --- a/third_party/Python-Markdown/markdown/extensions/footnotes.py +++ /dev/null
@@ -1,411 +0,0 @@ -""" -Footnotes Extension for Python-Markdown -======================================= - -Adds footnote handling to Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/footnotes> -for documentation. - -Copyright The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import BlockProcessor -from ..inlinepatterns import InlineProcessor -from ..treeprocessors import Treeprocessor -from ..postprocessors import Postprocessor -from .. import util -from collections import OrderedDict -import re -import copy -import xml.etree.ElementTree as etree - -FN_BACKLINK_TEXT = util.STX + "zz1337820767766393qq" + util.ETX -NBSP_PLACEHOLDER = util.STX + "qq3936677670287331zz" + util.ETX -RE_REF_ID = re.compile(r'(fnref)(\d+)') - - -class FootnoteExtension(Extension): - """ Footnote Extension. """ - - def __init__(self, **kwargs): - """ Setup configs. """ - - self.config = { - 'PLACE_MARKER': - ["///Footnotes Go Here///", - "The text string that marks where the footnotes go"], - 'UNIQUE_IDS': - [False, - "Avoid name collisions across " - "multiple calls to reset()."], - "BACKLINK_TEXT": - ["↩", - "The text string that links from the footnote " - "to the reader's place."], - "SUPERSCRIPT_TEXT": - ["{}", - "The text string that links from the reader's place " - "to the footnote."], - "BACKLINK_TITLE": - ["Jump back to footnote %d in the text", - "The text string used for the title HTML attribute " - "of the backlink. %d will be replaced by the " - "footnote number."], - "SEPARATOR": - [":", - "Footnote separator."] - } - super().__init__(**kwargs) - - # In multiple invocations, emit links that don't get tangled. - self.unique_prefix = 0 - self.found_refs = {} - self.used_refs = set() - - self.reset() - - def extendMarkdown(self, md): - """ Add pieces to Markdown. """ - md.registerExtension(self) - self.parser = md.parser - self.md = md - # Insert a blockprocessor before ReferencePreprocessor - md.parser.blockprocessors.register(FootnoteBlockProcessor(self), 'footnote', 17) - - # Insert an inline pattern before ImageReferencePattern - FOOTNOTE_RE = r'\[\^([^\]]*)\]' # blah blah [^1] blah - md.inlinePatterns.register(FootnoteInlineProcessor(FOOTNOTE_RE, self), 'footnote', 175) - # Insert a tree-processor that would actually add the footnote div - # This must be before all other treeprocessors (i.e., inline and - # codehilite) so they can run on the the contents of the div. - md.treeprocessors.register(FootnoteTreeprocessor(self), 'footnote', 50) - - # Insert a tree-processor that will run after inline is done. - # In this tree-processor we want to check our duplicate footnote tracker - # And add additional backrefs to the footnote pointing back to the - # duplicated references. - md.treeprocessors.register(FootnotePostTreeprocessor(self), 'footnote-duplicate', 15) - - # Insert a postprocessor after amp_substitute processor - md.postprocessors.register(FootnotePostprocessor(self), 'footnote', 25) - - def reset(self): - """ Clear footnotes on reset, and prepare for distinct document. """ - self.footnotes = OrderedDict() - self.unique_prefix += 1 - self.found_refs = {} - self.used_refs = set() - - def unique_ref(self, reference, found=False): - """ Get a unique reference if there are duplicates. """ - if not found: - return reference - - original_ref = reference - while reference in self.used_refs: - ref, rest = reference.split(self.get_separator(), 1) - m = RE_REF_ID.match(ref) - if m: - reference = '%s%d%s%s' % (m.group(1), int(m.group(2))+1, self.get_separator(), rest) - else: - reference = '%s%d%s%s' % (ref, 2, self.get_separator(), rest) - - self.used_refs.add(reference) - if original_ref in self.found_refs: - self.found_refs[original_ref] += 1 - else: - self.found_refs[original_ref] = 1 - return reference - - def findFootnotesPlaceholder(self, root): - """ Return ElementTree Element that contains Footnote placeholder. """ - def finder(element): - for child in element: - if child.text: - if child.text.find(self.getConfig("PLACE_MARKER")) > -1: - return child, element, True - if child.tail: - if child.tail.find(self.getConfig("PLACE_MARKER")) > -1: - return child, element, False - child_res = finder(child) - if child_res is not None: - return child_res - return None - - res = finder(root) - return res - - def setFootnote(self, id, text): - """ Store a footnote for later retrieval. """ - self.footnotes[id] = text - - def get_separator(self): - """ Get the footnote separator. """ - return self.getConfig("SEPARATOR") - - def makeFootnoteId(self, id): - """ Return footnote link id. """ - if self.getConfig("UNIQUE_IDS"): - return 'fn%s%d-%s' % (self.get_separator(), self.unique_prefix, id) - else: - return 'fn{}{}'.format(self.get_separator(), id) - - def makeFootnoteRefId(self, id, found=False): - """ Return footnote back-link id. """ - if self.getConfig("UNIQUE_IDS"): - return self.unique_ref('fnref%s%d-%s' % (self.get_separator(), self.unique_prefix, id), found) - else: - return self.unique_ref('fnref{}{}'.format(self.get_separator(), id), found) - - def makeFootnotesDiv(self, root): - """ Return div of footnotes as et Element. """ - - if not list(self.footnotes.keys()): - return None - - div = etree.Element("div") - div.set('class', 'footnote') - etree.SubElement(div, "hr") - ol = etree.SubElement(div, "ol") - surrogate_parent = etree.Element("div") - - # Backward compatibility with old '%d' placeholder - backlink_title = self.getConfig("BACKLINK_TITLE").replace("%d", "{}") - - for index, id in enumerate(self.footnotes.keys(), start=1): - li = etree.SubElement(ol, "li") - li.set("id", self.makeFootnoteId(id)) - # Parse footnote with surrogate parent as li cannot be used. - # List block handlers have special logic to deal with li. - # When we are done parsing, we will copy everything over to li. - self.parser.parseChunk(surrogate_parent, self.footnotes[id]) - for el in list(surrogate_parent): - li.append(el) - surrogate_parent.remove(el) - backlink = etree.Element("a") - backlink.set("href", "#" + self.makeFootnoteRefId(id)) - backlink.set("class", "footnote-backref") - backlink.set( - "title", - backlink_title.format(index) - ) - backlink.text = FN_BACKLINK_TEXT - - if len(li): - node = li[-1] - if node.tag == "p": - node.text = node.text + NBSP_PLACEHOLDER - node.append(backlink) - else: - p = etree.SubElement(li, "p") - p.append(backlink) - return div - - -class FootnoteBlockProcessor(BlockProcessor): - """ Find all footnote references and store for later use. """ - - RE = re.compile(r'^[ ]{0,3}\[\^([^\]]*)\]:[ ]*(.*)$', re.MULTILINE) - - def __init__(self, footnotes): - super().__init__(footnotes.parser) - self.footnotes = footnotes - - def test(self, parent, block): - return True - - def run(self, parent, blocks): - """ Find, set, and remove footnote definitions. """ - block = blocks.pop(0) - m = self.RE.search(block) - if m: - id = m.group(1) - fn_blocks = [m.group(2)] - - # Handle rest of block - therest = block[m.end():].lstrip('\n') - m2 = self.RE.search(therest) - if m2: - # Another footnote exists in the rest of this block. - # Any content before match is continuation of this footnote, which may be lazily indented. - before = therest[:m2.start()].rstrip('\n') - fn_blocks[0] = '\n'.join([fn_blocks[0], self.detab(before)]).lstrip('\n') - # Add back to blocks everything from beginning of match forward for next iteration. - blocks.insert(0, therest[m2.start():]) - else: - # All remaining lines of block are continuation of this footnote, which may be lazily indented. - fn_blocks[0] = '\n'.join([fn_blocks[0], self.detab(therest)]).strip('\n') - - # Check for child elements in remaining blocks. - fn_blocks.extend(self.detectTabbed(blocks)) - - footnote = "\n\n".join(fn_blocks) - self.footnotes.setFootnote(id, footnote.rstrip()) - - if block[:m.start()].strip(): - # Add any content before match back to blocks as separate block - blocks.insert(0, block[:m.start()].rstrip('\n')) - return True - # No match. Restore block. - blocks.insert(0, block) - return False - - def detectTabbed(self, blocks): - """ Find indented text and remove indent before further proccesing. - - Returns: a list of blocks with indentation removed. - """ - fn_blocks = [] - while blocks: - if blocks[0].startswith(' '*4): - block = blocks.pop(0) - # Check for new footnotes within this block and split at new footnote. - m = self.RE.search(block) - if m: - # Another footnote exists in this block. - # Any content before match is continuation of this footnote, which may be lazily indented. - before = block[:m.start()].rstrip('\n') - fn_blocks.append(self.detab(before)) - # Add back to blocks everything from beginning of match forward for next iteration. - blocks.insert(0, block[m.start():]) - # End of this footnote. - break - else: - # Entire block is part of this footnote. - fn_blocks.append(self.detab(block)) - else: - # End of this footnote. - break - return fn_blocks - - def detab(self, block): - """ Remove one level of indent from a block. - - Preserve lazily indented blocks by only removing indent from indented lines. - """ - lines = block.split('\n') - for i, line in enumerate(lines): - if line.startswith(' '*4): - lines[i] = line[4:] - return '\n'.join(lines) - - -class FootnoteInlineProcessor(InlineProcessor): - """ InlinePattern for footnote markers in a document's body text. """ - - def __init__(self, pattern, footnotes): - super().__init__(pattern) - self.footnotes = footnotes - - def handleMatch(self, m, data): - id = m.group(1) - if id in self.footnotes.footnotes.keys(): - sup = etree.Element("sup") - a = etree.SubElement(sup, "a") - sup.set('id', self.footnotes.makeFootnoteRefId(id, found=True)) - a.set('href', '#' + self.footnotes.makeFootnoteId(id)) - a.set('class', 'footnote-ref') - a.text = self.footnotes.getConfig("SUPERSCRIPT_TEXT").format( - list(self.footnotes.footnotes.keys()).index(id) + 1 - ) - return sup, m.start(0), m.end(0) - else: - return None, None, None - - -class FootnotePostTreeprocessor(Treeprocessor): - """ Amend footnote div with duplicates. """ - - def __init__(self, footnotes): - self.footnotes = footnotes - - def add_duplicates(self, li, duplicates): - """ Adjust current li and add the duplicates: fnref2, fnref3, etc. """ - for link in li.iter('a'): - # Find the link that needs to be duplicated. - if link.attrib.get('class', '') == 'footnote-backref': - ref, rest = link.attrib['href'].split(self.footnotes.get_separator(), 1) - # Duplicate link the number of times we need to - # and point the to the appropriate references. - links = [] - for index in range(2, duplicates + 1): - sib_link = copy.deepcopy(link) - sib_link.attrib['href'] = '%s%d%s%s' % (ref, index, self.footnotes.get_separator(), rest) - links.append(sib_link) - self.offset += 1 - # Add all the new duplicate links. - el = list(li)[-1] - for link in links: - el.append(link) - break - - def get_num_duplicates(self, li): - """ Get the number of duplicate refs of the footnote. """ - fn, rest = li.attrib.get('id', '').split(self.footnotes.get_separator(), 1) - link_id = '{}ref{}{}'.format(fn, self.footnotes.get_separator(), rest) - return self.footnotes.found_refs.get(link_id, 0) - - def handle_duplicates(self, parent): - """ Find duplicate footnotes and format and add the duplicates. """ - for li in list(parent): - # Check number of duplicates footnotes and insert - # additional links if needed. - count = self.get_num_duplicates(li) - if count > 1: - self.add_duplicates(li, count) - - def run(self, root): - """ Crawl the footnote div and add missing duplicate footnotes. """ - self.offset = 0 - for div in root.iter('div'): - if div.attrib.get('class', '') == 'footnote': - # Footnotes should be under the first ordered list under - # the footnote div. So once we find it, quit. - for ol in div.iter('ol'): - self.handle_duplicates(ol) - break - - -class FootnoteTreeprocessor(Treeprocessor): - """ Build and append footnote div to end of document. """ - - def __init__(self, footnotes): - self.footnotes = footnotes - - def run(self, root): - footnotesDiv = self.footnotes.makeFootnotesDiv(root) - if footnotesDiv is not None: - result = self.footnotes.findFootnotesPlaceholder(root) - if result: - child, parent, isText = result - ind = list(parent).index(child) - if isText: - parent.remove(child) - parent.insert(ind, footnotesDiv) - else: - parent.insert(ind + 1, footnotesDiv) - child.tail = None - else: - root.append(footnotesDiv) - - -class FootnotePostprocessor(Postprocessor): - """ Replace placeholders with html entities. """ - def __init__(self, footnotes): - self.footnotes = footnotes - - def run(self, text): - text = text.replace( - FN_BACKLINK_TEXT, self.footnotes.getConfig("BACKLINK_TEXT") - ) - return text.replace(NBSP_PLACEHOLDER, " ") - - -def makeExtension(**kwargs): # pragma: no cover - """ Return an instance of the FootnoteExtension """ - return FootnoteExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/legacy_attrs.py b/third_party/Python-Markdown/markdown/extensions/legacy_attrs.py deleted file mode 100644 index 445aba11..0000000 --- a/third_party/Python-Markdown/markdown/extensions/legacy_attrs.py +++ /dev/null
@@ -1,67 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). - -Legacy Attributes Extension -=========================== - -An extension to Python Markdown which implements legacy attributes. - -Prior to Python-Markdown version 3.0, the Markdown class had an `enable_attributes` -keyword which was on by default and provided for attributes to be defined for elements -using the format `{@key=value}`. This extension is provided as a replacement for -backward compatibility. New documents should be authored using attr_lists. However, -numerious documents exist which have been using the old attribute format for many -years. This extension can be used to continue to render those documents correctly. -""" - -import re -from markdown.treeprocessors import Treeprocessor, isString -from markdown.extensions import Extension - - -ATTR_RE = re.compile(r'\{@([^\}]*)=([^\}]*)}') # {@id=123} - - -class LegacyAttrs(Treeprocessor): - def run(self, doc): - """Find and set values of attributes ({@key=value}). """ - for el in doc.iter(): - alt = el.get('alt', None) - if alt is not None: - el.set('alt', self.handleAttributes(el, alt)) - if el.text and isString(el.text): - el.text = self.handleAttributes(el, el.text) - if el.tail and isString(el.tail): - el.tail = self.handleAttributes(el, el.tail) - - def handleAttributes(self, el, txt): - """ Set attributes and return text without definitions. """ - def attributeCallback(match): - el.set(match.group(1), match.group(2).replace('\n', ' ')) - return ATTR_RE.sub(attributeCallback, txt) - - -class LegacyAttrExtension(Extension): - def extendMarkdown(self, md): - md.treeprocessors.register(LegacyAttrs(md), 'legacyattrs', 15) - - -def makeExtension(**kwargs): # pragma: no cover - return LegacyAttrExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/legacy_em.py b/third_party/Python-Markdown/markdown/extensions/legacy_em.py deleted file mode 100644 index 360988b6..0000000 --- a/third_party/Python-Markdown/markdown/extensions/legacy_em.py +++ /dev/null
@@ -1,49 +0,0 @@ -''' -Legacy Em Extension for Python-Markdown -======================================= - -This extension provides legacy behavior for _connected_words_. - -Copyright 2015-2018 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -''' - -from . import Extension -from ..inlinepatterns import UnderscoreProcessor, EmStrongItem, EM_STRONG2_RE, STRONG_EM2_RE -import re - -# _emphasis_ -EMPHASIS_RE = r'(_)([^_]+)\1' - -# __strong__ -STRONG_RE = r'(_{2})(.+?)\1' - -# __strong_em___ -STRONG_EM_RE = r'(_)\1(?!\1)([^_]+?)\1(?!\1)(.+?)\1{3}' - - -class LegacyUnderscoreProcessor(UnderscoreProcessor): - """Emphasis processor for handling strong and em matches inside underscores.""" - - PATTERNS = [ - EmStrongItem(re.compile(EM_STRONG2_RE, re.DOTALL | re.UNICODE), 'double', 'strong,em'), - EmStrongItem(re.compile(STRONG_EM2_RE, re.DOTALL | re.UNICODE), 'double', 'em,strong'), - EmStrongItem(re.compile(STRONG_EM_RE, re.DOTALL | re.UNICODE), 'double2', 'strong,em'), - EmStrongItem(re.compile(STRONG_RE, re.DOTALL | re.UNICODE), 'single', 'strong'), - EmStrongItem(re.compile(EMPHASIS_RE, re.DOTALL | re.UNICODE), 'single', 'em') - ] - - -class LegacyEmExtension(Extension): - """ Add legacy_em extension to Markdown class.""" - - def extendMarkdown(self, md): - """ Modify inline patterns. """ - md.inlinePatterns.register(LegacyUnderscoreProcessor(r'_'), 'em_strong2', 50) - - -def makeExtension(**kwargs): # pragma: no cover - """ Return an instance of the LegacyEmExtension """ - return LegacyEmExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/md_in_html.py b/third_party/Python-Markdown/markdown/extensions/md_in_html.py deleted file mode 100644 index ec7dcba0..0000000 --- a/third_party/Python-Markdown/markdown/extensions/md_in_html.py +++ /dev/null
@@ -1,364 +0,0 @@ -""" -Python-Markdown Markdown in HTML Extension -=============================== - -An implementation of [PHP Markdown Extra](http://michelf.com/projects/php-markdown/extra/)'s -parsing of Markdown syntax in raw HTML. - -See <https://Python-Markdown.github.io/extensions/raw_html> -for documentation. - -Copyright The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import BlockProcessor -from ..preprocessors import Preprocessor -from ..postprocessors import RawHtmlPostprocessor -from .. import util -from ..htmlparser import HTMLExtractor, blank_line_re -import xml.etree.ElementTree as etree - - -class HTMLExtractorExtra(HTMLExtractor): - """ - Override HTMLExtractor and create etree Elements for any elements which should have content parsed as Markdown. - """ - - def __init__(self, md, *args, **kwargs): - # All block-level tags. - self.block_level_tags = set(md.block_level_elements.copy()) - # Block-level tags in which the content only gets span level parsing - self.span_tags = set( - ['address', 'dd', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'legend', 'li', 'p', 'summary', 'td', 'th'] - ) - # Block-level tags which never get their content parsed. - self.raw_tags = set(['canvas', 'math', 'option', 'pre', 'script', 'style', 'textarea']) - - super().__init__(md, *args, **kwargs) - - # Block-level tags in which the content gets parsed as blocks - self.block_tags = set(self.block_level_tags) - (self.span_tags | self.raw_tags | self.empty_tags) - self.span_and_blocks_tags = self.block_tags | self.span_tags - - def reset(self): - """Reset this instance. Loses all unprocessed data.""" - self.mdstack = [] # When markdown=1, stack contains a list of tags - self.treebuilder = etree.TreeBuilder() - self.mdstate = [] # one of 'block', 'span', 'off', or None - super().reset() - - def close(self): - """Handle any buffered data.""" - super().close() - # Handle any unclosed tags. - if self.mdstack: - # Close the outermost parent. handle_endtag will close all unclosed children. - self.handle_endtag(self.mdstack[0]) - - def get_element(self): - """ Return element from treebuilder and reset treebuilder for later use. """ - element = self.treebuilder.close() - self.treebuilder = etree.TreeBuilder() - return element - - def get_state(self, tag, attrs): - """ Return state from tag and `markdown` attr. One of 'block', 'span', or 'off'. """ - md_attr = attrs.get('markdown', '0') - if md_attr == 'markdown': - # `<tag markdown>` is the same as `<tag markdown='1'>`. - md_attr = '1' - parent_state = self.mdstate[-1] if self.mdstate else None - if parent_state == 'off' or (parent_state == 'span' and md_attr != '0'): - # Only use the parent state if it is more restrictive than the markdown attribute. - md_attr = parent_state - if ((md_attr == '1' and tag in self.block_tags) or - (md_attr == 'block' and tag in self.span_and_blocks_tags)): - return 'block' - elif ((md_attr == '1' and tag in self.span_tags) or - (md_attr == 'span' and tag in self.span_and_blocks_tags)): - return 'span' - elif tag in self.block_level_tags: - return 'off' - else: # pragma: no cover - return None - - def handle_starttag(self, tag, attrs): - # Handle tags that should always be empty and do not specify a closing tag - if tag in self.empty_tags and (self.at_line_start() or self.intail): - attrs = {key: value if value is not None else key for key, value in attrs} - if "markdown" in attrs: - attrs.pop('markdown') - element = etree.Element(tag, attrs) - data = etree.tostring(element, encoding='unicode', method='html') - else: - data = self.get_starttag_text() - self.handle_empty_tag(data, True) - return - - if tag in self.block_level_tags and (self.at_line_start() or self.intail): - # Valueless attr (ex: `<tag checked>`) results in `[('checked', None)]`. - # Convert to `{'checked': 'checked'}`. - attrs = {key: value if value is not None else key for key, value in attrs} - state = self.get_state(tag, attrs) - if self.inraw or (state in [None, 'off'] and not self.mdstack): - # fall back to default behavior - attrs.pop('markdown', None) - super().handle_starttag(tag, attrs) - else: - if 'p' in self.mdstack and tag in self.block_level_tags: - # Close unclosed 'p' tag - self.handle_endtag('p') - self.mdstate.append(state) - self.mdstack.append(tag) - attrs['markdown'] = state - self.treebuilder.start(tag, attrs) - else: - # Span level tag - if self.inraw: - super().handle_starttag(tag, attrs) - else: - text = self.get_starttag_text() - if self.mdstate and self.mdstate[-1] == "off": - self.handle_data(self.md.htmlStash.store(text)) - else: - self.handle_data(text) - if tag in self.CDATA_CONTENT_ELEMENTS: - # This is presumably a standalone tag in a code span (see #1036). - self.clear_cdata_mode() - - def handle_endtag(self, tag): - if tag in self.block_level_tags: - if self.inraw: - super().handle_endtag(tag) - elif tag in self.mdstack: - # Close element and any unclosed children - while self.mdstack: - item = self.mdstack.pop() - self.mdstate.pop() - self.treebuilder.end(item) - if item == tag: - break - if not self.mdstack: - # Last item in stack is closed. Stash it - element = self.get_element() - # Get last entry to see if it ends in newlines - # If it is an element, assume there is no newlines - item = self.cleandoc[-1] if self.cleandoc else '' - # If we only have one newline before block element, add another - if not item.endswith('\n\n') and item.endswith('\n'): - self.cleandoc.append('\n') - self.cleandoc.append(self.md.htmlStash.store(element)) - self.cleandoc.append('\n\n') - self.state = [] - # Check if element has a tail - if not blank_line_re.match( - self.rawdata[self.line_offset + self.offset + len(self.get_endtag_text(tag)):]): - # More content exists after endtag. - self.intail = True - else: - # Treat orphan closing tag as a span level tag. - text = self.get_endtag_text(tag) - if self.mdstate and self.mdstate[-1] == "off": - self.handle_data(self.md.htmlStash.store(text)) - else: - self.handle_data(text) - else: - # Span level tag - if self.inraw: - super().handle_endtag(tag) - else: - text = self.get_endtag_text(tag) - if self.mdstate and self.mdstate[-1] == "off": - self.handle_data(self.md.htmlStash.store(text)) - else: - self.handle_data(text) - - def handle_startendtag(self, tag, attrs): - if tag in self.empty_tags: - attrs = {key: value if value is not None else key for key, value in attrs} - if "markdown" in attrs: - attrs.pop('markdown') - element = etree.Element(tag, attrs) - data = etree.tostring(element, encoding='unicode', method='html') - else: - data = self.get_starttag_text() - else: - data = self.get_starttag_text() - self.handle_empty_tag(data, is_block=self.md.is_block_level(tag)) - - def handle_data(self, data): - if self.intail and '\n' in data: - self.intail = False - if self.inraw or not self.mdstack: - super().handle_data(data) - else: - self.treebuilder.data(data) - - def handle_empty_tag(self, data, is_block): - if self.inraw or not self.mdstack: - super().handle_empty_tag(data, is_block) - else: - if self.at_line_start() and is_block: - self.handle_data('\n' + self.md.htmlStash.store(data) + '\n\n') - else: - self.handle_data(self.md.htmlStash.store(data)) - - def parse_pi(self, i): - if self.at_line_start() or self.intail or self.mdstack: - # The same override exists in HTMLExtractor without the check - # for mdstack. Therefore, use HTMLExtractor's parent instead. - return super(HTMLExtractor, self).parse_pi(i) - # This is not the beginning of a raw block so treat as plain data - # and avoid consuming any tags which may follow (see #1066). - self.handle_data('<?') - return i + 2 - - def parse_html_declaration(self, i): - if self.at_line_start() or self.intail or self.mdstack: - # The same override exists in HTMLExtractor without the check - # for mdstack. Therefore, use HTMLExtractor's parent instead. - return super(HTMLExtractor, self).parse_html_declaration(i) - # This is not the beginning of a raw block so treat as plain data - # and avoid consuming any tags which may follow (see #1066). - self.handle_data('<!') - return i + 2 - - -class HtmlBlockPreprocessor(Preprocessor): - """Remove html blocks from the text and store them for later retrieval.""" - - def run(self, lines): - source = '\n'.join(lines) - parser = HTMLExtractorExtra(self.md) - parser.feed(source) - parser.close() - return ''.join(parser.cleandoc).split('\n') - - -class MarkdownInHtmlProcessor(BlockProcessor): - """Process Markdown Inside HTML Blocks which have been stored in the HtmlStash.""" - - def test(self, parent, block): - # ALways return True. `run` will return `False` it not a valid match. - return True - - def parse_element_content(self, element): - """ - Recursively parse the text content of an etree Element as Markdown. - - Any block level elements generated from the Markdown will be inserted as children of the element in place - of the text content. All `markdown` attributes are removed. For any elements in which Markdown parsing has - been disabled, the text content of it and its chidlren are wrapped in an `AtomicString`. - """ - - md_attr = element.attrib.pop('markdown', 'off') - - if md_attr == 'block': - # Parse content as block level - # The order in which the different parts are parsed (text, children, tails) is important here as the - # order of elements needs to be preserved. We can't be inserting items at a later point in the current - # iteration as we don't want to do raw processing on elements created from parsing Markdown text (for - # example). Therefore, the order of operations is children, tails, text. - - # Recursively parse existing children from raw HTML - for child in list(element): - self.parse_element_content(child) - - # Parse Markdown text in tail of children. Do this separate to avoid raw HTML parsing. - # Save the position of each item to be inserted later in reverse. - tails = [] - for pos, child in enumerate(element): - if child.tail: - block = child.tail.rstrip('\n') - child.tail = '' - # Use a dummy placeholder element. - dummy = etree.Element('div') - self.parser.parseBlocks(dummy, block.split('\n\n')) - children = list(dummy) - children.reverse() - tails.append((pos + 1, children)) - - # Insert the elements created from the tails in reverse. - tails.reverse() - for pos, tail in tails: - for item in tail: - element.insert(pos, item) - - # Parse Markdown text content. Do this last to avoid raw HTML parsing. - if element.text: - block = element.text.rstrip('\n') - element.text = '' - # Use a dummy placeholder element as the content needs to get inserted before existing children. - dummy = etree.Element('div') - self.parser.parseBlocks(dummy, block.split('\n\n')) - children = list(dummy) - children.reverse() - for child in children: - element.insert(0, child) - - elif md_attr == 'span': - # Span level parsing will be handled by inlineprocessors. - # Walk children here to remove any `markdown` attributes. - for child in list(element): - self.parse_element_content(child) - - else: - # Disable inline parsing for everything else - if element.text is None: - element.text = '' - element.text = util.AtomicString(element.text) - for child in list(element): - self.parse_element_content(child) - if child.tail: - child.tail = util.AtomicString(child.tail) - - def run(self, parent, blocks): - m = util.HTML_PLACEHOLDER_RE.match(blocks[0]) - if m: - index = int(m.group(1)) - element = self.parser.md.htmlStash.rawHtmlBlocks[index] - if isinstance(element, etree.Element): - # We have a matched element. Process it. - blocks.pop(0) - self.parse_element_content(element) - parent.append(element) - # Cleanup stash. Replace element with empty string to avoid confusing postprocessor. - self.parser.md.htmlStash.rawHtmlBlocks.pop(index) - self.parser.md.htmlStash.rawHtmlBlocks.insert(index, '') - # Confirm the match to the blockparser. - return True - # No match found. - return False - - -class MarkdownInHTMLPostprocessor(RawHtmlPostprocessor): - def stash_to_string(self, text): - """ Override default to handle any etree elements still in the stash. """ - if isinstance(text, etree.Element): - return self.md.serializer(text) - else: - return str(text) - - -class MarkdownInHtmlExtension(Extension): - """Add Markdown parsing in HTML to Markdown class.""" - - def extendMarkdown(self, md): - """ Register extension instances. """ - - # Replace raw HTML preprocessor - md.preprocessors.register(HtmlBlockPreprocessor(md), 'html_block', 20) - # Add blockprocessor which handles the placeholders for etree elements - md.parser.blockprocessors.register( - MarkdownInHtmlProcessor(md.parser), 'markdown_block', 105 - ) - # Replace raw HTML postprocessor - md.postprocessors.register(MarkdownInHTMLPostprocessor(md), 'raw_html', 30) - - -def makeExtension(**kwargs): # pragma: no cover - return MarkdownInHtmlExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/meta.py b/third_party/Python-Markdown/markdown/extensions/meta.py deleted file mode 100644 index 10dee11..0000000 --- a/third_party/Python-Markdown/markdown/extensions/meta.py +++ /dev/null
@@ -1,79 +0,0 @@ -""" -Meta Data Extension for Python-Markdown -======================================= - -This extension adds Meta Data handling to markdown. - -See <https://Python-Markdown.github.io/extensions/meta_data> -for documentation. - -Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..preprocessors import Preprocessor -import re -import logging - -log = logging.getLogger('MARKDOWN') - -# Global Vars -META_RE = re.compile(r'^[ ]{0,3}(?P<key>[A-Za-z0-9_-]+):\s*(?P<value>.*)') -META_MORE_RE = re.compile(r'^[ ]{4,}(?P<value>.*)') -BEGIN_RE = re.compile(r'^-{3}(\s.*)?') -END_RE = re.compile(r'^(-{3}|\.{3})(\s.*)?') - - -class MetaExtension (Extension): - """ Meta-Data extension for Python-Markdown. """ - - def extendMarkdown(self, md): - """ Add MetaPreprocessor to Markdown instance. """ - md.registerExtension(self) - self.md = md - md.preprocessors.register(MetaPreprocessor(md), 'meta', 27) - - def reset(self): - self.md.Meta = {} - - -class MetaPreprocessor(Preprocessor): - """ Get Meta-Data. """ - - def run(self, lines): - """ Parse Meta-Data and store in Markdown.Meta. """ - meta = {} - key = None - if lines and BEGIN_RE.match(lines[0]): - lines.pop(0) - while lines: - line = lines.pop(0) - m1 = META_RE.match(line) - if line.strip() == '' or END_RE.match(line): - break # blank line or end of YAML header - done - if m1: - key = m1.group('key').lower().strip() - value = m1.group('value').strip() - try: - meta[key].append(value) - except KeyError: - meta[key] = [value] - else: - m2 = META_MORE_RE.match(line) - if m2 and key: - # Add another line to existing key - meta[key].append(m2.group('value').strip()) - else: - lines.insert(0, line) - break # no meta data - done - self.md.Meta = meta - return lines - - -def makeExtension(**kwargs): # pragma: no cover - return MetaExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/nl2br.py b/third_party/Python-Markdown/markdown/extensions/nl2br.py deleted file mode 100644 index 6c7491bc..0000000 --- a/third_party/Python-Markdown/markdown/extensions/nl2br.py +++ /dev/null
@@ -1,33 +0,0 @@ -""" -NL2BR Extension -=============== - -A Python-Markdown extension to treat newlines as hard breaks; like -GitHub-flavored Markdown does. - -See <https://Python-Markdown.github.io/extensions/nl2br> -for documentation. - -Oringinal code Copyright 2011 [Brian Neal](https://deathofagremmie.com/) - -All changes Copyright 2011-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..inlinepatterns import SubstituteTagInlineProcessor - -BR_RE = r'\n' - - -class Nl2BrExtension(Extension): - - def extendMarkdown(self, md): - br_tag = SubstituteTagInlineProcessor(BR_RE, 'br') - md.inlinePatterns.register(br_tag, 'nl', 5) - - -def makeExtension(**kwargs): # pragma: no cover - return Nl2BrExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/sane_lists.py b/third_party/Python-Markdown/markdown/extensions/sane_lists.py deleted file mode 100644 index e27eb180..0000000 --- a/third_party/Python-Markdown/markdown/extensions/sane_lists.py +++ /dev/null
@@ -1,54 +0,0 @@ -""" -Sane List Extension for Python-Markdown -======================================= - -Modify the behavior of Lists in Python-Markdown to act in a sane manor. - -See <https://Python-Markdown.github.io/extensions/sane_lists> -for documentation. - -Original code Copyright 2011 [Waylan Limberg](http://achinghead.com) - -All changes Copyright 2011-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import OListProcessor, UListProcessor -import re - - -class SaneOListProcessor(OListProcessor): - - SIBLING_TAGS = ['ol'] - LAZY_OL = False - - def __init__(self, parser): - super().__init__(parser) - self.CHILD_RE = re.compile(r'^[ ]{0,%d}((\d+\.))[ ]+(.*)' % - (self.tab_length - 1)) - - -class SaneUListProcessor(UListProcessor): - - SIBLING_TAGS = ['ul'] - - def __init__(self, parser): - super().__init__(parser) - self.CHILD_RE = re.compile(r'^[ ]{0,%d}(([*+-]))[ ]+(.*)' % - (self.tab_length - 1)) - - -class SaneListExtension(Extension): - """ Add sane lists to Markdown. """ - - def extendMarkdown(self, md): - """ Override existing Processors. """ - md.parser.blockprocessors.register(SaneOListProcessor(md.parser), 'olist', 40) - md.parser.blockprocessors.register(SaneUListProcessor(md.parser), 'ulist', 30) - - -def makeExtension(**kwargs): # pragma: no cover - return SaneListExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/smarty.py b/third_party/Python-Markdown/markdown/extensions/smarty.py deleted file mode 100644 index c4bfd58..0000000 --- a/third_party/Python-Markdown/markdown/extensions/smarty.py +++ /dev/null
@@ -1,257 +0,0 @@ -''' -Smarty extension for Python-Markdown -==================================== - -Adds conversion of ASCII dashes, quotes and ellipses to their HTML -entity equivalents. - -See <https://Python-Markdown.github.io/extensions/smarty> -for documentation. - -Author: 2013, Dmitry Shachnev <mitya57@gmail.com> - -All changes Copyright 2013-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -SmartyPants license: - - Copyright (c) 2003 John Gruber <https://daringfireball.net/> - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name "SmartyPants" nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - This software is provided by the copyright holders and contributors "as - is" and any express or implied warranties, including, but not limited - to, the implied warranties of merchantability and fitness for a - particular purpose are disclaimed. In no event shall the copyright - owner or contributors be liable for any direct, indirect, incidental, - special, exemplary, or consequential damages (including, but not - limited to, procurement of substitute goods or services; loss of use, - data, or profits; or business interruption) however caused and on any - theory of liability, whether in contract, strict liability, or tort - (including negligence or otherwise) arising in any way out of the use - of this software, even if advised of the possibility of such damage. - - -smartypants.py license: - - smartypants.py is a derivative work of SmartyPants. - Copyright (c) 2004, 2007 Chad Miller <http://web.chad.org/> - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - This software is provided by the copyright holders and contributors "as - is" and any express or implied warranties, including, but not limited - to, the implied warranties of merchantability and fitness for a - particular purpose are disclaimed. In no event shall the copyright - owner or contributors be liable for any direct, indirect, incidental, - special, exemplary, or consequential damages (including, but not - limited to, procurement of substitute goods or services; loss of use, - data, or profits; or business interruption) however caused and on any - theory of liability, whether in contract, strict liability, or tort - (including negligence or otherwise) arising in any way out of the use - of this software, even if advised of the possibility of such damage. - -''' - - -from . import Extension -from ..inlinepatterns import HtmlInlineProcessor, HTML_RE -from ..treeprocessors import InlineProcessor -from ..util import Registry - - -# Constants for quote education. -punctClass = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]""" -endOfWordClass = r"[\s.,;:!?)]" -closeClass = r"[^\ \t\r\n\[\{\(\-\u0002\u0003]" - -openingQuotesBase = ( - r'(\s' # a whitespace char - r'| ' # or a non-breaking space entity - r'|--' # or dashes - r'|–|—' # or unicode - r'|&[mn]dash;' # or named dash entities - r'|–|—' # or decimal entities - r')' -) - -substitutions = { - 'mdash': '—', - 'ndash': '–', - 'ellipsis': '…', - 'left-angle-quote': '«', - 'right-angle-quote': '»', - 'left-single-quote': '‘', - 'right-single-quote': '’', - 'left-double-quote': '“', - 'right-double-quote': '”', -} - - -# Special case if the very first character is a quote -# followed by punctuation at a non-word-break. Close the quotes by brute force: -singleQuoteStartRe = r"^'(?=%s\B)" % punctClass -doubleQuoteStartRe = r'^"(?=%s\B)' % punctClass - -# Special case for double sets of quotes, e.g.: -# <p>He said, "'Quoted' words in a larger quote."</p> -doubleQuoteSetsRe = r""""'(?=\w)""" -singleQuoteSetsRe = r"""'"(?=\w)""" - -# Special case for decade abbreviations (the '80s): -decadeAbbrRe = r"(?<!\w)'(?=\d{2}s)" - -# Get most opening double quotes: -openingDoubleQuotesRegex = r'%s"(?=\w)' % openingQuotesBase - -# Double closing quotes: -closingDoubleQuotesRegex = r'"(?=\s)' -closingDoubleQuotesRegex2 = '(?<=%s)"' % closeClass - -# Get most opening single quotes: -openingSingleQuotesRegex = r"%s'(?=\w)" % openingQuotesBase - -# Single closing quotes: -closingSingleQuotesRegex = r"(?<=%s)'(?!\s|s\b|\d)" % closeClass -closingSingleQuotesRegex2 = r"(?<=%s)'(\s|s\b)" % closeClass - -# All remaining quotes should be opening ones -remainingSingleQuotesRegex = r"'" -remainingDoubleQuotesRegex = r'"' - -HTML_STRICT_RE = HTML_RE + r'(?!\>)' - - -class SubstituteTextPattern(HtmlInlineProcessor): - def __init__(self, pattern, replace, md): - """ Replaces matches with some text. """ - HtmlInlineProcessor.__init__(self, pattern) - self.replace = replace - self.md = md - - def handleMatch(self, m, data): - result = '' - for part in self.replace: - if isinstance(part, int): - result += m.group(part) - else: - result += self.md.htmlStash.store(part) - return result, m.start(0), m.end(0) - - -class SmartyExtension(Extension): - def __init__(self, **kwargs): - self.config = { - 'smart_quotes': [True, 'Educate quotes'], - 'smart_angled_quotes': [False, 'Educate angled quotes'], - 'smart_dashes': [True, 'Educate dashes'], - 'smart_ellipses': [True, 'Educate ellipses'], - 'substitutions': [{}, 'Overwrite default substitutions'], - } - super().__init__(**kwargs) - self.substitutions = dict(substitutions) - self.substitutions.update(self.getConfig('substitutions', default={})) - - def _addPatterns(self, md, patterns, serie, priority): - for ind, pattern in enumerate(patterns): - pattern += (md,) - pattern = SubstituteTextPattern(*pattern) - name = 'smarty-%s-%d' % (serie, ind) - self.inlinePatterns.register(pattern, name, priority-ind) - - def educateDashes(self, md): - emDashesPattern = SubstituteTextPattern( - r'(?<!-)---(?!-)', (self.substitutions['mdash'],), md - ) - enDashesPattern = SubstituteTextPattern( - r'(?<!-)--(?!-)', (self.substitutions['ndash'],), md - ) - self.inlinePatterns.register(emDashesPattern, 'smarty-em-dashes', 50) - self.inlinePatterns.register(enDashesPattern, 'smarty-en-dashes', 45) - - def educateEllipses(self, md): - ellipsesPattern = SubstituteTextPattern( - r'(?<!\.)\.{3}(?!\.)', (self.substitutions['ellipsis'],), md - ) - self.inlinePatterns.register(ellipsesPattern, 'smarty-ellipses', 10) - - def educateAngledQuotes(self, md): - leftAngledQuotePattern = SubstituteTextPattern( - r'\<\<', (self.substitutions['left-angle-quote'],), md - ) - rightAngledQuotePattern = SubstituteTextPattern( - r'\>\>', (self.substitutions['right-angle-quote'],), md - ) - self.inlinePatterns.register(leftAngledQuotePattern, 'smarty-left-angle-quotes', 40) - self.inlinePatterns.register(rightAngledQuotePattern, 'smarty-right-angle-quotes', 35) - - def educateQuotes(self, md): - lsquo = self.substitutions['left-single-quote'] - rsquo = self.substitutions['right-single-quote'] - ldquo = self.substitutions['left-double-quote'] - rdquo = self.substitutions['right-double-quote'] - patterns = ( - (singleQuoteStartRe, (rsquo,)), - (doubleQuoteStartRe, (rdquo,)), - (doubleQuoteSetsRe, (ldquo + lsquo,)), - (singleQuoteSetsRe, (lsquo + ldquo,)), - (decadeAbbrRe, (rsquo,)), - (openingSingleQuotesRegex, (1, lsquo)), - (closingSingleQuotesRegex, (rsquo,)), - (closingSingleQuotesRegex2, (rsquo, 1)), - (remainingSingleQuotesRegex, (lsquo,)), - (openingDoubleQuotesRegex, (1, ldquo)), - (closingDoubleQuotesRegex, (rdquo,)), - (closingDoubleQuotesRegex2, (rdquo,)), - (remainingDoubleQuotesRegex, (ldquo,)) - ) - self._addPatterns(md, patterns, 'quotes', 30) - - def extendMarkdown(self, md): - configs = self.getConfigs() - self.inlinePatterns = Registry() - if configs['smart_ellipses']: - self.educateEllipses(md) - if configs['smart_quotes']: - self.educateQuotes(md) - if configs['smart_angled_quotes']: - self.educateAngledQuotes(md) - # Override HTML_RE from inlinepatterns.py so that it does not - # process tags with duplicate closing quotes. - md.inlinePatterns.register(HtmlInlineProcessor(HTML_STRICT_RE, md), 'html', 90) - if configs['smart_dashes']: - self.educateDashes(md) - inlineProcessor = InlineProcessor(md) - inlineProcessor.inlinePatterns = self.inlinePatterns - md.treeprocessors.register(inlineProcessor, 'smarty', 2) - md.ESCAPED_CHARS.extend(['"', "'"]) - - -def makeExtension(**kwargs): # pragma: no cover - return SmartyExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/tables.py b/third_party/Python-Markdown/markdown/extensions/tables.py deleted file mode 100644 index c8b1024..0000000 --- a/third_party/Python-Markdown/markdown/extensions/tables.py +++ /dev/null
@@ -1,236 +0,0 @@ -""" -Tables Extension for Python-Markdown -==================================== - -Added parsing of tables to Python-Markdown. - -See <https://Python-Markdown.github.io/extensions/tables> -for documentation. - -Original code Copyright 2009 [Waylan Limberg](http://achinghead.com) - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..blockprocessors import BlockProcessor -import xml.etree.ElementTree as etree -import re -PIPE_NONE = 0 -PIPE_LEFT = 1 -PIPE_RIGHT = 2 - - -class TableProcessor(BlockProcessor): - """ Process Tables. """ - - RE_CODE_PIPES = re.compile(r'(?:(\\\\)|(\\`+)|(`+)|(\\\|)|(\|))') - RE_END_BORDER = re.compile(r'(?<!\\)(?:\\\\)*\|$') - - def __init__(self, parser, config): - self.border = False - self.separator = '' - self.config = config - - super().__init__(parser) - - def test(self, parent, block): - """ - Ensure first two rows (column header and separator row) are valid table rows. - - Keep border check and separator row do avoid repeating the work. - """ - is_table = False - rows = [row.strip(' ') for row in block.split('\n')] - if len(rows) > 1: - header0 = rows[0] - self.border = PIPE_NONE - if header0.startswith('|'): - self.border |= PIPE_LEFT - if self.RE_END_BORDER.search(header0) is not None: - self.border |= PIPE_RIGHT - row = self._split_row(header0) - row0_len = len(row) - is_table = row0_len > 1 - - # Each row in a single column table needs at least one pipe. - if not is_table and row0_len == 1 and self.border: - for index in range(1, len(rows)): - is_table = rows[index].startswith('|') - if not is_table: - is_table = self.RE_END_BORDER.search(rows[index]) is not None - if not is_table: - break - - if is_table: - row = self._split_row(rows[1]) - is_table = (len(row) == row0_len) and set(''.join(row)) <= set('|:- ') - if is_table: - self.separator = row - - return is_table - - def run(self, parent, blocks): - """ Parse a table block and build table. """ - block = blocks.pop(0).split('\n') - header = block[0].strip(' ') - rows = [] if len(block) < 3 else block[2:] - - # Get alignment of columns - align = [] - for c in self.separator: - c = c.strip(' ') - if c.startswith(':') and c.endswith(':'): - align.append('center') - elif c.startswith(':'): - align.append('left') - elif c.endswith(':'): - align.append('right') - else: - align.append(None) - - # Build table - table = etree.SubElement(parent, 'table') - thead = etree.SubElement(table, 'thead') - self._build_row(header, thead, align) - tbody = etree.SubElement(table, 'tbody') - if len(rows) == 0: - # Handle empty table - self._build_empty_row(tbody, align) - else: - for row in rows: - self._build_row(row.strip(' '), tbody, align) - - def _build_empty_row(self, parent, align): - """Build an empty row.""" - tr = etree.SubElement(parent, 'tr') - count = len(align) - while count: - etree.SubElement(tr, 'td') - count -= 1 - - def _build_row(self, row, parent, align): - """ Given a row of text, build table cells. """ - tr = etree.SubElement(parent, 'tr') - tag = 'td' - if parent.tag == 'thead': - tag = 'th' - cells = self._split_row(row) - # We use align here rather than cells to ensure every row - # contains the same number of columns. - for i, a in enumerate(align): - c = etree.SubElement(tr, tag) - try: - c.text = cells[i].strip(' ') - except IndexError: # pragma: no cover - c.text = "" - if a: - if self.config['use_align_attribute']: - c.set('align', a) - else: - c.set('style', f'text-align: {a};') - - def _split_row(self, row): - """ split a row of text into list of cells. """ - if self.border: - if row.startswith('|'): - row = row[1:] - row = self.RE_END_BORDER.sub('', row) - return self._split(row) - - def _split(self, row): - """ split a row of text with some code into a list of cells. """ - elements = [] - pipes = [] - tics = [] - tic_points = [] - tic_region = [] - good_pipes = [] - - # Parse row - # Throw out \\, and \| - for m in self.RE_CODE_PIPES.finditer(row): - # Store ` data (len, start_pos, end_pos) - if m.group(2): - # \`+ - # Store length of each tic group: subtract \ - tics.append(len(m.group(2)) - 1) - # Store start of group, end of group, and escape length - tic_points.append((m.start(2), m.end(2) - 1, 1)) - elif m.group(3): - # `+ - # Store length of each tic group - tics.append(len(m.group(3))) - # Store start of group, end of group, and escape length - tic_points.append((m.start(3), m.end(3) - 1, 0)) - # Store pipe location - elif m.group(5): - pipes.append(m.start(5)) - - # Pair up tics according to size if possible - # Subtract the escape length *only* from the opening. - # Walk through tic list and see if tic has a close. - # Store the tic region (start of region, end of region). - pos = 0 - tic_len = len(tics) - while pos < tic_len: - try: - tic_size = tics[pos] - tic_points[pos][2] - if tic_size == 0: - raise ValueError - index = tics[pos + 1:].index(tic_size) + 1 - tic_region.append((tic_points[pos][0], tic_points[pos + index][1])) - pos += index + 1 - except ValueError: - pos += 1 - - # Resolve pipes. Check if they are within a tic pair region. - # Walk through pipes comparing them to each region. - # - If pipe position is less that a region, it isn't in a region - # - If it is within a region, we don't want it, so throw it out - # - If we didn't throw it out, it must be a table pipe - for pipe in pipes: - throw_out = False - for region in tic_region: - if pipe < region[0]: - # Pipe is not in a region - break - elif region[0] <= pipe <= region[1]: - # Pipe is within a code region. Throw it out. - throw_out = True - break - if not throw_out: - good_pipes.append(pipe) - - # Split row according to table delimiters. - pos = 0 - for pipe in good_pipes: - elements.append(row[pos:pipe]) - pos = pipe + 1 - elements.append(row[pos:]) - return elements - - -class TableExtension(Extension): - """ Add tables to Markdown. """ - - def __init__(self, **kwargs): - self.config = { - 'use_align_attribute': [False, 'True to use align attribute instead of style.'], - } - - super().__init__(**kwargs) - - def extendMarkdown(self, md): - """ Add an instance of TableProcessor to BlockParser. """ - if '|' not in md.ESCAPED_CHARS: - md.ESCAPED_CHARS.append('|') - processor = TableProcessor(md.parser, self.getConfigs()) - md.parser.blockprocessors.register(processor, 'table', 75) - - -def makeExtension(**kwargs): # pragma: no cover - return TableExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/toc.py b/third_party/Python-Markdown/markdown/extensions/toc.py deleted file mode 100644 index 1ded18d6..0000000 --- a/third_party/Python-Markdown/markdown/extensions/toc.py +++ /dev/null
@@ -1,384 +0,0 @@ -""" -Table of Contents Extension for Python-Markdown -=============================================== - -See <https://Python-Markdown.github.io/extensions/toc> -for documentation. - -Oringinal code Copyright 2008 [Jack Miller](https://codezen.org/) - -All changes Copyright 2008-2014 The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -""" - -from . import Extension -from ..treeprocessors import Treeprocessor -from ..util import code_escape, parseBoolValue, AMP_SUBSTITUTE, HTML_PLACEHOLDER_RE, AtomicString -from ..treeprocessors import UnescapeTreeprocessor -import re -import html -import unicodedata -import xml.etree.ElementTree as etree - - -def slugify(value, separator, unicode=False): - """ Slugify a string, to make it URL friendly. """ - if not unicode: - # Replace Extended Latin characters with ASCII, i.e. žlutý → zluty - value = unicodedata.normalize('NFKD', value) - value = value.encode('ascii', 'ignore').decode('ascii') - value = re.sub(r'[^\w\s-]', '', value).strip().lower() - return re.sub(r'[{}\s]+'.format(separator), separator, value) - - -def slugify_unicode(value, separator): - """ Slugify a string, to make it URL friendly while preserving Unicode characters. """ - return slugify(value, separator, unicode=True) - - -IDCOUNT_RE = re.compile(r'^(.*)_([0-9]+)$') - - -def unique(id, ids): - """ Ensure id is unique in set of ids. Append '_1', '_2'... if not """ - while id in ids or not id: - m = IDCOUNT_RE.match(id) - if m: - id = '%s_%d' % (m.group(1), int(m.group(2))+1) - else: - id = '%s_%d' % (id, 1) - ids.add(id) - return id - - -def get_name(el): - """Get title name.""" - - text = [] - for c in el.itertext(): - if isinstance(c, AtomicString): - text.append(html.unescape(c)) - else: - text.append(c) - return ''.join(text).strip() - - -def stashedHTML2text(text, md, strip_entities=True): - """ Extract raw HTML from stash, reduce to plain text and swap with placeholder. """ - def _html_sub(m): - """ Substitute raw html with plain text. """ - try: - raw = md.htmlStash.rawHtmlBlocks[int(m.group(1))] - except (IndexError, TypeError): # pragma: no cover - return m.group(0) - # Strip out tags and/or entities - leaving text - res = re.sub(r'(<[^>]+>)', '', raw) - if strip_entities: - res = re.sub(r'(&[\#a-zA-Z0-9]+;)', '', res) - return res - - return HTML_PLACEHOLDER_RE.sub(_html_sub, text) - - -def unescape(text): - """ Unescape escaped text. """ - c = UnescapeTreeprocessor() - return c.unescape(text) - - -def nest_toc_tokens(toc_list): - """Given an unsorted list with errors and skips, return a nested one. - [{'level': 1}, {'level': 2}] - => - [{'level': 1, 'children': [{'level': 2, 'children': []}]}] - - A wrong list is also converted: - [{'level': 2}, {'level': 1}] - => - [{'level': 2, 'children': []}, {'level': 1, 'children': []}] - """ - - ordered_list = [] - if len(toc_list): - # Initialize everything by processing the first entry - last = toc_list.pop(0) - last['children'] = [] - levels = [last['level']] - ordered_list.append(last) - parents = [] - - # Walk the rest nesting the entries properly - while toc_list: - t = toc_list.pop(0) - current_level = t['level'] - t['children'] = [] - - # Reduce depth if current level < last item's level - if current_level < levels[-1]: - # Pop last level since we know we are less than it - levels.pop() - - # Pop parents and levels we are less than or equal to - to_pop = 0 - for p in reversed(parents): - if current_level <= p['level']: - to_pop += 1 - else: # pragma: no cover - break - if to_pop: - levels = levels[:-to_pop] - parents = parents[:-to_pop] - - # Note current level as last - levels.append(current_level) - - # Level is the same, so append to - # the current parent (if available) - if current_level == levels[-1]: - (parents[-1]['children'] if parents - else ordered_list).append(t) - - # Current level is > last item's level, - # So make last item a parent and append current as child - else: - last['children'].append(t) - parents.append(last) - levels.append(current_level) - last = t - - return ordered_list - - -class TocTreeprocessor(Treeprocessor): - def __init__(self, md, config): - super().__init__(md) - - self.marker = config["marker"] - self.title = config["title"] - self.base_level = int(config["baselevel"]) - 1 - self.slugify = config["slugify"] - self.sep = config["separator"] - self.toc_class = config["toc_class"] - self.use_anchors = parseBoolValue(config["anchorlink"]) - self.anchorlink_class = config["anchorlink_class"] - self.use_permalinks = parseBoolValue(config["permalink"], False) - if self.use_permalinks is None: - self.use_permalinks = config["permalink"] - self.permalink_class = config["permalink_class"] - self.permalink_title = config["permalink_title"] - self.header_rgx = re.compile("[Hh][123456]") - if isinstance(config["toc_depth"], str) and '-' in config["toc_depth"]: - self.toc_top, self.toc_bottom = [int(x) for x in config["toc_depth"].split('-')] - else: - self.toc_top = 1 - self.toc_bottom = int(config["toc_depth"]) - - def iterparent(self, node): - ''' Iterator wrapper to get allowed parent and child all at once. ''' - - # We do not allow the marker inside a header as that - # would causes an enless loop of placing a new TOC - # inside previously generated TOC. - for child in node: - if not self.header_rgx.match(child.tag) and child.tag not in ['pre', 'code']: - yield node, child - yield from self.iterparent(child) - - def replace_marker(self, root, elem): - ''' Replace marker with elem. ''' - for (p, c) in self.iterparent(root): - text = ''.join(c.itertext()).strip() - if not text: - continue - - # To keep the output from screwing up the - # validation by putting a <div> inside of a <p> - # we actually replace the <p> in its entirety. - - # The <p> element may contain more than a single text content - # (nl2br can introduce a <br>). In this situation, c.text returns - # the very first content, ignore children contents or tail content. - # len(c) == 0 is here to ensure there is only text in the <p>. - if c.text and c.text.strip() == self.marker and len(c) == 0: - for i in range(len(p)): - if p[i] == c: - p[i] = elem - break - - def set_level(self, elem): - ''' Adjust header level according to base level. ''' - level = int(elem.tag[-1]) + self.base_level - if level > 6: - level = 6 - elem.tag = 'h%d' % level - - def add_anchor(self, c, elem_id): # @ReservedAssignment - anchor = etree.Element("a") - anchor.text = c.text - anchor.attrib["href"] = "#" + elem_id - anchor.attrib["class"] = self.anchorlink_class - c.text = "" - for elem in c: - anchor.append(elem) - while len(c): - c.remove(c[0]) - c.append(anchor) - - def add_permalink(self, c, elem_id): - permalink = etree.Element("a") - permalink.text = ("%spara;" % AMP_SUBSTITUTE - if self.use_permalinks is True - else self.use_permalinks) - permalink.attrib["href"] = "#" + elem_id - permalink.attrib["class"] = self.permalink_class - if self.permalink_title: - permalink.attrib["title"] = self.permalink_title - c.append(permalink) - - def build_toc_div(self, toc_list): - """ Return a string div given a toc list. """ - div = etree.Element("div") - div.attrib["class"] = self.toc_class - - # Add title to the div - if self.title: - header = etree.SubElement(div, "span") - header.attrib["class"] = "toctitle" - header.text = self.title - - def build_etree_ul(toc_list, parent): - ul = etree.SubElement(parent, "ul") - for item in toc_list: - # List item link, to be inserted into the toc div - li = etree.SubElement(ul, "li") - link = etree.SubElement(li, "a") - link.text = item.get('name', '') - link.attrib["href"] = '#' + item.get('id', '') - if item['children']: - build_etree_ul(item['children'], li) - return ul - - build_etree_ul(toc_list, div) - - if 'prettify' in self.md.treeprocessors: - self.md.treeprocessors['prettify'].run(div) - - return div - - def run(self, doc): - # Get a list of id attributes - used_ids = set() - for el in doc.iter(): - if "id" in el.attrib: - used_ids.add(el.attrib["id"]) - - toc_tokens = [] - for el in doc.iter(): - if isinstance(el.tag, str) and self.header_rgx.match(el.tag): - self.set_level(el) - text = get_name(el) - - # Do not override pre-existing ids - if "id" not in el.attrib: - innertext = unescape(stashedHTML2text(text, self.md)) - el.attrib["id"] = unique(self.slugify(innertext, self.sep), used_ids) - - if int(el.tag[-1]) >= self.toc_top and int(el.tag[-1]) <= self.toc_bottom: - toc_tokens.append({ - 'level': int(el.tag[-1]), - 'id': el.attrib["id"], - 'name': stashedHTML2text( - code_escape(el.attrib.get('data-toc-label', text)), - self.md, strip_entities=False - ) - }) - - # Remove the data-toc-label attribute as it is no longer needed - if 'data-toc-label' in el.attrib: - del el.attrib['data-toc-label'] - - if self.use_anchors: - self.add_anchor(el, el.attrib["id"]) - if self.use_permalinks not in [False, None]: - self.add_permalink(el, el.attrib["id"]) - - toc_tokens = nest_toc_tokens(toc_tokens) - div = self.build_toc_div(toc_tokens) - if self.marker: - self.replace_marker(doc, div) - - # serialize and attach to markdown instance. - toc = self.md.serializer(div) - for pp in self.md.postprocessors: - toc = pp.run(toc) - self.md.toc_tokens = toc_tokens - self.md.toc = toc - - -class TocExtension(Extension): - - TreeProcessorClass = TocTreeprocessor - - def __init__(self, **kwargs): - self.config = { - "marker": ['[TOC]', - 'Text to find and replace with Table of Contents - ' - 'Set to an empty string to disable. Defaults to "[TOC]"'], - "title": ["", - "Title to insert into TOC <div> - " - "Defaults to an empty string"], - "toc_class": ['toc', - 'CSS class(es) used for the link. ' - 'Defaults to "toclink"'], - "anchorlink": [False, - "True if header should be a self link - " - "Defaults to False"], - "anchorlink_class": ['toclink', - 'CSS class(es) used for the link. ' - 'Defaults to "toclink"'], - "permalink": [0, - "True or link text if a Sphinx-style permalink should " - "be added - Defaults to False"], - "permalink_class": ['headerlink', - 'CSS class(es) used for the link. ' - 'Defaults to "headerlink"'], - "permalink_title": ["Permanent link", - "Title attribute of the permalink - " - "Defaults to 'Permanent link'"], - "baselevel": ['1', 'Base level for headers.'], - "slugify": [slugify, - "Function to generate anchors based on header text - " - "Defaults to the headerid ext's slugify function."], - 'separator': ['-', 'Word separator. Defaults to "-".'], - "toc_depth": [6, - 'Define the range of section levels to include in' - 'the Table of Contents. A single integer (b) defines' - 'the bottom section level (<h1>..<hb>) only.' - 'A string consisting of two digits separated by a hyphen' - 'in between ("2-5"), define the top (t) and the' - 'bottom (b) (<ht>..<hb>). Defaults to `6` (bottom).'], - } - - super().__init__(**kwargs) - - def extendMarkdown(self, md): - md.registerExtension(self) - self.md = md - self.reset() - tocext = self.TreeProcessorClass(md, self.getConfigs()) - # Headerid ext is set to '>prettify'. With this set to '_end', - # it should always come after headerid ext (and honor ids assigned - # by the header id extension) if both are used. Same goes for - # attr_list extension. This must come last because we don't want - # to redefine ids after toc is created. But we do want toc prettified. - md.treeprocessors.register(tocext, 'toc', 5) - - def reset(self): - self.md.toc = '' - self.md.toc_tokens = [] - - -def makeExtension(**kwargs): # pragma: no cover - return TocExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/extensions/wikilinks.py b/third_party/Python-Markdown/markdown/extensions/wikilinks.py deleted file mode 100644 index cddee7a..0000000 --- a/third_party/Python-Markdown/markdown/extensions/wikilinks.py +++ /dev/null
@@ -1,87 +0,0 @@ -''' -WikiLinks Extension for Python-Markdown -====================================== - -Converts [[WikiLinks]] to relative links. - -See <https://Python-Markdown.github.io/extensions/wikilinks> -for documentation. - -Original code Copyright [Waylan Limberg](http://achinghead.com/). - -All changes Copyright The Python Markdown Project - -License: [BSD](https://opensource.org/licenses/bsd-license.php) - -''' - -from . import Extension -from ..inlinepatterns import InlineProcessor -import xml.etree.ElementTree as etree -import re - - -def build_url(label, base, end): - """ Build a url from the label, a base, and an end. """ - clean_label = re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', label) - return '{}{}{}'.format(base, clean_label, end) - - -class WikiLinkExtension(Extension): - - def __init__(self, **kwargs): - self.config = { - 'base_url': ['/', 'String to append to beginning or URL.'], - 'end_url': ['/', 'String to append to end of URL.'], - 'html_class': ['wikilink', 'CSS hook. Leave blank for none.'], - 'build_url': [build_url, 'Callable formats URL from label.'], - } - - super().__init__(**kwargs) - - def extendMarkdown(self, md): - self.md = md - - # append to end of inline patterns - WIKILINK_RE = r'\[\[([\w0-9_ -]+)\]\]' - wikilinkPattern = WikiLinksInlineProcessor(WIKILINK_RE, self.getConfigs()) - wikilinkPattern.md = md - md.inlinePatterns.register(wikilinkPattern, 'wikilink', 75) - - -class WikiLinksInlineProcessor(InlineProcessor): - def __init__(self, pattern, config): - super().__init__(pattern) - self.config = config - - def handleMatch(self, m, data): - if m.group(1).strip(): - base_url, end_url, html_class = self._getMeta() - label = m.group(1).strip() - url = self.config['build_url'](label, base_url, end_url) - a = etree.Element('a') - a.text = label - a.set('href', url) - if html_class: - a.set('class', html_class) - else: - a = '' - return a, m.start(0), m.end(0) - - def _getMeta(self): - """ Return meta data or config data. """ - base_url = self.config['base_url'] - end_url = self.config['end_url'] - html_class = self.config['html_class'] - if hasattr(self.md, 'Meta'): - if 'wiki_base_url' in self.md.Meta: - base_url = self.md.Meta['wiki_base_url'][0] - if 'wiki_end_url' in self.md.Meta: - end_url = self.md.Meta['wiki_end_url'][0] - if 'wiki_html_class' in self.md.Meta: - html_class = self.md.Meta['wiki_html_class'][0] - return base_url, end_url, html_class - - -def makeExtension(**kwargs): # pragma: no cover - return WikiLinkExtension(**kwargs)
diff --git a/third_party/Python-Markdown/markdown/htmlparser.py b/third_party/Python-Markdown/markdown/htmlparser.py deleted file mode 100644 index 3512d1a7..0000000 --- a/third_party/Python-Markdown/markdown/htmlparser.py +++ /dev/null
@@ -1,323 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2020 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import re -import importlib.util -import sys - - -# Import a copy of the html.parser lib as `htmlparser` so we can monkeypatch it. -# Users can still do `from html import parser` and get the default behavior. -spec = importlib.util.find_spec('html.parser') -htmlparser = importlib.util.module_from_spec(spec) -spec.loader.exec_module(htmlparser) -sys.modules['htmlparser'] = htmlparser - -# Monkeypatch HTMLParser to only accept `?>` to close Processing Instructions. -htmlparser.piclose = re.compile(r'\?>') -# Monkeypatch HTMLParser to only recognize entity references with a closing semicolon. -htmlparser.entityref = re.compile(r'&([a-zA-Z][-.a-zA-Z0-9]*);') -# Monkeypatch HTMLParser to no longer support partial entities. We are always feeding a complete block, -# so the 'incomplete' functionality is unnecessary. As the entityref regex is run right before incomplete, -# and the two regex are the same, then incomplete will simply never match and we avoid the logic within. -htmlparser.incomplete = htmlparser.entityref -# Monkeypatch HTMLParser to not accept a backtick in a tag name, attribute name, or bare value. -htmlparser.locatestarttagend_tolerant = re.compile(r""" - <[a-zA-Z][^`\t\n\r\f />\x00]* # tag name <= added backtick here - (?:[\s/]* # optional whitespace before attribute name - (?:(?<=['"\s/])[^`\s/>][^\s/=>]* # attribute name <= added backtick here - (?:\s*=+\s* # value indicator - (?:'[^']*' # LITA-enclosed value - |"[^"]*" # LIT-enclosed value - |(?!['"])[^`>\s]* # bare value <= added backtick here - ) - (?:\s*,)* # possibly followed by a comma - )?(?:\s|/(?!>))* - )* - )? - \s* # trailing whitespace -""", re.VERBOSE) - -# Match a blank line at the start of a block of text (two newlines). -# The newlines may be preceded by additional whitespace. -blank_line_re = re.compile(r'^([ ]*\n){2}') - - -class HTMLExtractor(htmlparser.HTMLParser): - """ - Extract raw HTML from text. - - The raw HTML is stored in the `htmlStash` of the Markdown instance passed - to `md` and the remaining text is stored in `cleandoc` as a list of strings. - """ - - def __init__(self, md, *args, **kwargs): - if 'convert_charrefs' not in kwargs: - kwargs['convert_charrefs'] = False - - # Block tags that should contain no content (self closing) - self.empty_tags = set(['hr']) - - # This calls self.reset - super().__init__(*args, **kwargs) - self.md = md - - def reset(self): - """Reset this instance. Loses all unprocessed data.""" - self.inraw = False - self.intail = False - self.stack = [] # When inraw==True, stack contains a list of tags - self._cache = [] - self.cleandoc = [] - super().reset() - - def close(self): - """Handle any buffered data.""" - super().close() - if len(self.rawdata): - # Temp fix for https://bugs.python.org/issue41989 - # TODO: remove this when the bug is fixed in all supported Python versions. - if self.convert_charrefs and not self.cdata_elem: # pragma: no cover - self.handle_data(htmlparser.unescape(self.rawdata)) - else: - self.handle_data(self.rawdata) - # Handle any unclosed tags. - if len(self._cache): - self.cleandoc.append(self.md.htmlStash.store(''.join(self._cache))) - self._cache = [] - - @property - def line_offset(self): - """Returns char index in self.rawdata for the start of the current line. """ - if self.lineno > 1 and '\n' in self.rawdata: - m = re.match(r'([^\n]*\n){{{}}}'.format(self.lineno-1), self.rawdata) - if m: - return m.end() - else: # pragma: no cover - # Value of self.lineno must exceed total number of lines. - # Find index of beginning of last line. - return self.rawdata.rfind('\n') - return 0 - - def at_line_start(self): - """ - Returns True if current position is at start of line. - - Allows for up to three blank spaces at start of line. - """ - if self.offset == 0: - return True - if self.offset > 3: - return False - # Confirm up to first 3 chars are whitespace - return self.rawdata[self.line_offset:self.line_offset + self.offset].strip() == '' - - def get_endtag_text(self, tag): - """ - Returns the text of the end tag. - - If it fails to extract the actual text from the raw data, it builds a closing tag with `tag`. - """ - # Attempt to extract actual tag from raw source text - start = self.line_offset + self.offset - m = htmlparser.endendtag.search(self.rawdata, start) - if m: - return self.rawdata[start:m.end()] - else: # pragma: no cover - # Failed to extract from raw data. Assume well formed and lowercase. - return '</{}>'.format(tag) - - def handle_starttag(self, tag, attrs): - # Handle tags that should always be empty and do not specify a closing tag - if tag in self.empty_tags: - self.handle_startendtag(tag, attrs) - return - - if self.md.is_block_level(tag) and (self.intail or (self.at_line_start() and not self.inraw)): - # Started a new raw block. Prepare stack. - self.inraw = True - self.cleandoc.append('\n') - - text = self.get_starttag_text() - if self.inraw: - self.stack.append(tag) - self._cache.append(text) - else: - self.cleandoc.append(text) - if tag in self.CDATA_CONTENT_ELEMENTS: - # This is presumably a standalone tag in a code span (see #1036). - self.clear_cdata_mode() - - def handle_endtag(self, tag): - text = self.get_endtag_text(tag) - - if self.inraw: - self._cache.append(text) - if tag in self.stack: - # Remove tag from stack - while self.stack: - if self.stack.pop() == tag: - break - if len(self.stack) == 0: - # End of raw block. - if blank_line_re.match(self.rawdata[self.line_offset + self.offset + len(text):]): - # Preserve blank line and end of raw block. - self._cache.append('\n') - else: - # More content exists after endtag. - self.intail = True - # Reset stack. - self.inraw = False - self.cleandoc.append(self.md.htmlStash.store(''.join(self._cache))) - # Insert blank line between this and next line. - self.cleandoc.append('\n\n') - self._cache = [] - else: - self.cleandoc.append(text) - - def handle_data(self, data): - if self.intail and '\n' in data: - self.intail = False - if self.inraw: - self._cache.append(data) - else: - self.cleandoc.append(data) - - def handle_empty_tag(self, data, is_block): - """ Handle empty tags (`<data>`). """ - if self.inraw or self.intail: - # Append this to the existing raw block - self._cache.append(data) - elif self.at_line_start() and is_block: - # Handle this as a standalone raw block - if blank_line_re.match(self.rawdata[self.line_offset + self.offset + len(data):]): - # Preserve blank line after tag in raw block. - data += '\n' - else: - # More content exists after tag. - self.intail = True - item = self.cleandoc[-1] if self.cleandoc else '' - # If we only have one newline before block element, add another - if not item.endswith('\n\n') and item.endswith('\n'): - self.cleandoc.append('\n') - self.cleandoc.append(self.md.htmlStash.store(data)) - # Insert blank line between this and next line. - self.cleandoc.append('\n\n') - else: - self.cleandoc.append(data) - - def handle_startendtag(self, tag, attrs): - self.handle_empty_tag(self.get_starttag_text(), is_block=self.md.is_block_level(tag)) - - def handle_charref(self, name): - self.handle_empty_tag('&#{};'.format(name), is_block=False) - - def handle_entityref(self, name): - self.handle_empty_tag('&{};'.format(name), is_block=False) - - def handle_comment(self, data): - self.handle_empty_tag('<!--{}-->'.format(data), is_block=True) - - def handle_decl(self, data): - self.handle_empty_tag('<!{}>'.format(data), is_block=True) - - def handle_pi(self, data): - self.handle_empty_tag('<?{}?>'.format(data), is_block=True) - - def unknown_decl(self, data): - end = ']]>' if data.startswith('CDATA[') else ']>' - self.handle_empty_tag('<![{}{}'.format(data, end), is_block=True) - - def parse_pi(self, i): - if self.at_line_start() or self.intail: - return super().parse_pi(i) - # This is not the beginning of a raw block so treat as plain data - # and avoid consuming any tags which may follow (see #1066). - self.handle_data('<?') - return i + 2 - - def parse_html_declaration(self, i): - if self.at_line_start() or self.intail: - return super().parse_html_declaration(i) - # This is not the beginning of a raw block so treat as plain data - # and avoid consuming any tags which may follow (see #1066). - self.handle_data('<!') - return i + 2 - - # The rest has been copied from base class in standard lib to address #1036. - # As __startag_text is private, all references to it must be in this subclass. - # The last few lines of parse_starttag are reversed so that handle_starttag - # can override cdata_mode in certain situations (in a code span). - __starttag_text = None - - def get_starttag_text(self): - """Return full source of start tag: '<...>'.""" - return self.__starttag_text - - def parse_starttag(self, i): # pragma: no cover - self.__starttag_text = None - endpos = self.check_for_whole_start_tag(i) - if endpos < 0: - return endpos - rawdata = self.rawdata - self.__starttag_text = rawdata[i:endpos] - - # Now parse the data between i+1 and j into a tag and attrs - attrs = [] - match = htmlparser.tagfind_tolerant.match(rawdata, i+1) - assert match, 'unexpected call to parse_starttag()' - k = match.end() - self.lasttag = tag = match.group(1).lower() - while k < endpos: - m = htmlparser.attrfind_tolerant.match(rawdata, k) - if not m: - break - attrname, rest, attrvalue = m.group(1, 2, 3) - if not rest: - attrvalue = None - elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ - attrvalue[:1] == '"' == attrvalue[-1:]: # noqa: E127 - attrvalue = attrvalue[1:-1] - if attrvalue: - attrvalue = htmlparser.unescape(attrvalue) - attrs.append((attrname.lower(), attrvalue)) - k = m.end() - - end = rawdata[k:endpos].strip() - if end not in (">", "/>"): - lineno, offset = self.getpos() - if "\n" in self.__starttag_text: - lineno = lineno + self.__starttag_text.count("\n") - offset = len(self.__starttag_text) \ - - self.__starttag_text.rfind("\n") # noqa: E127 - else: - offset = offset + len(self.__starttag_text) - self.handle_data(rawdata[i:endpos]) - return endpos - if end.endswith('/>'): - # XHTML-style empty tag: <span attr="value" /> - self.handle_startendtag(tag, attrs) - else: - # *** set cdata_mode first so we can override it in handle_starttag (see #1036) *** - if tag in self.CDATA_CONTENT_ELEMENTS: - self.set_cdata_mode(tag) - self.handle_starttag(tag, attrs) - return endpos
diff --git a/third_party/Python-Markdown/markdown/inlinepatterns.py b/third_party/Python-Markdown/markdown/inlinepatterns.py deleted file mode 100644 index eb313bd..0000000 --- a/third_party/Python-Markdown/markdown/inlinepatterns.py +++ /dev/null
@@ -1,886 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). - -INLINE PATTERNS -============================================================================= - -Inline patterns such as *emphasis* are handled by means of auxiliary -objects, one per pattern. Pattern objects must be instances of classes -that extend markdown.Pattern. Each pattern object uses a single regular -expression and needs support the following methods: - - pattern.getCompiledRegExp() # returns a regular expression - - pattern.handleMatch(m) # takes a match object and returns - # an ElementTree element or just plain text - -All of python markdown's built-in patterns subclass from Pattern, -but you can add additional patterns that don't. - -Also note that all the regular expressions used by inline must -capture the whole block. For this reason, they all start with -'^(.*)' and end with '(.*)!'. In case with built-in expression -Pattern takes care of adding the "^(.*)" and "(.*)!". - -Finally, the order in which regular expressions are applied is very -important - e.g. if we first replace http://.../ links with <a> tags -and _then_ try to replace inline html, we would end up with a mess. -So, we apply the expressions in the following order: - -* escape and backticks have to go before everything else, so - that we can preempt any markdown patterns by escaping them. - -* then we handle auto-links (must be done before inline html) - -* then we handle inline HTML. At this point we will simply - replace all inline HTML strings with a placeholder and add - the actual HTML to a hash. - -* then inline images (must be done before links) - -* then bracketed links, first regular then reference-style - -* finally we apply strong and emphasis -""" - -from . import util -from collections import namedtuple -import re -import xml.etree.ElementTree as etree -try: # pragma: no cover - from html import entities -except ImportError: # pragma: no cover - import htmlentitydefs as entities - - -def build_inlinepatterns(md, **kwargs): - """ Build the default set of inline patterns for Markdown. """ - inlinePatterns = util.Registry() - inlinePatterns.register(BacktickInlineProcessor(BACKTICK_RE), 'backtick', 190) - inlinePatterns.register(EscapeInlineProcessor(ESCAPE_RE, md), 'escape', 180) - inlinePatterns.register(ReferenceInlineProcessor(REFERENCE_RE, md), 'reference', 170) - inlinePatterns.register(LinkInlineProcessor(LINK_RE, md), 'link', 160) - inlinePatterns.register(ImageInlineProcessor(IMAGE_LINK_RE, md), 'image_link', 150) - inlinePatterns.register( - ImageReferenceInlineProcessor(IMAGE_REFERENCE_RE, md), 'image_reference', 140 - ) - inlinePatterns.register( - ShortReferenceInlineProcessor(REFERENCE_RE, md), 'short_reference', 130 - ) - inlinePatterns.register( - ShortImageReferenceInlineProcessor(IMAGE_REFERENCE_RE, md), 'short_image_ref', 125 - ) - inlinePatterns.register(AutolinkInlineProcessor(AUTOLINK_RE, md), 'autolink', 120) - inlinePatterns.register(AutomailInlineProcessor(AUTOMAIL_RE, md), 'automail', 110) - inlinePatterns.register(SubstituteTagInlineProcessor(LINE_BREAK_RE, 'br'), 'linebreak', 100) - inlinePatterns.register(HtmlInlineProcessor(HTML_RE, md), 'html', 90) - inlinePatterns.register(HtmlInlineProcessor(ENTITY_RE, md), 'entity', 80) - inlinePatterns.register(SimpleTextInlineProcessor(NOT_STRONG_RE), 'not_strong', 70) - inlinePatterns.register(AsteriskProcessor(r'\*'), 'em_strong', 60) - inlinePatterns.register(UnderscoreProcessor(r'_'), 'em_strong2', 50) - return inlinePatterns - - -""" -The actual regular expressions for patterns ------------------------------------------------------------------------------ -""" - -NOIMG = r'(?<!\!)' - -# `e=f()` or ``e=f("`")`` -BACKTICK_RE = r'(?:(?<!\\)((?:\\{2})+)(?=`+)|(?<!\\)(`+)(.+?)(?<!`)\2(?!`))' - -# \< -ESCAPE_RE = r'\\(.)' - -# *emphasis* -EMPHASIS_RE = r'(\*)([^\*]+)\1' - -# **strong** -STRONG_RE = r'(\*{2})(.+?)\1' - -# __smart__strong__ -SMART_STRONG_RE = r'(?<!\w)(_{2})(?!_)(.+?)(?<!_)\1(?!\w)' - -# _smart_emphasis_ -SMART_EMPHASIS_RE = r'(?<!\w)(_)(?!_)(.+?)(?<!_)\1(?!\w)' - -# __strong _em__ -SMART_STRONG_EM_RE = r'(?<!\w)(\_)\1(?!\1)(.+?)(?<!\w)\1(?!\1)(.+?)\1{3}(?!\w)' - -# ***strongem*** or ***em*strong** -EM_STRONG_RE = r'(\*)\1{2}(.+?)\1(.*?)\1{2}' - -# ___strongem___ or ___em_strong__ -EM_STRONG2_RE = r'(_)\1{2}(.+?)\1(.*?)\1{2}' - -# ***strong**em* -STRONG_EM_RE = r'(\*)\1{2}(.+?)\1{2}(.*?)\1' - -# ___strong__em_ -STRONG_EM2_RE = r'(_)\1{2}(.+?)\1{2}(.*?)\1' - -# **strong*em*** -STRONG_EM3_RE = r'(\*)\1(?!\1)([^*]+?)\1(?!\1)(.+?)\1{3}' - -# [text](url) or [text](<url>) or [text](url "title") -LINK_RE = NOIMG + r'\[' - -#  or  -IMAGE_LINK_RE = r'\!\[' - -# [Google][3] -REFERENCE_RE = LINK_RE - -# ![alt text][2] -IMAGE_REFERENCE_RE = IMAGE_LINK_RE - -# stand-alone * or _ -NOT_STRONG_RE = r'((^|\s)(\*|_)(\s|$))' - -# <http://www.123.com> -AUTOLINK_RE = r'<((?:[Ff]|[Hh][Tt])[Tt][Pp][Ss]?://[^<>]*)>' - -# <me@example.com> -AUTOMAIL_RE = r'<([^<> !]+@[^@<> ]+)>' - -# <...> -HTML_RE = r'(<(\/?[a-zA-Z][^<>@ ]*( [^<>]*)?|!--(?:(?!<!--|-->).)*--)>)' - -# "&" (decimal) or "&" (hex) or "&" (named) -ENTITY_RE = r'(&(?:\#[0-9]+|\#x[0-9a-fA-F]+|[a-zA-Z0-9]+);)' - -# two spaces at end of line -LINE_BREAK_RE = r' \n' - - -def dequote(string): - """Remove quotes from around a string.""" - if ((string.startswith('"') and string.endswith('"')) or - (string.startswith("'") and string.endswith("'"))): - return string[1:-1] - else: - return string - - -class EmStrongItem(namedtuple('EmStrongItem', ['pattern', 'builder', 'tags'])): - """Emphasis/strong pattern item.""" - - -""" -The pattern classes ------------------------------------------------------------------------------ -""" - - -class Pattern: # pragma: no cover - """Base class that inline patterns subclass. """ - - ANCESTOR_EXCLUDES = tuple() - - def __init__(self, pattern, md=None): - """ - Create an instant of an inline pattern. - - Keyword arguments: - - * pattern: A regular expression that matches a pattern - - """ - self.pattern = pattern - self.compiled_re = re.compile(r"^(.*?)%s(.*)$" % pattern, - re.DOTALL | re.UNICODE) - - self.md = md - - def getCompiledRegExp(self): - """ Return a compiled regular expression. """ - return self.compiled_re - - def handleMatch(self, m): - """Return a ElementTree element from the given match. - - Subclasses should override this method. - - Keyword arguments: - - * m: A re match object containing a match of the pattern. - - """ - pass # pragma: no cover - - def type(self): - """ Return class name, to define pattern type """ - return self.__class__.__name__ - - def unescape(self, text): - """ Return unescaped text given text with an inline placeholder. """ - try: - stash = self.md.treeprocessors['inline'].stashed_nodes - except KeyError: # pragma: no cover - return text - - def get_stash(m): - id = m.group(1) - if id in stash: - value = stash.get(id) - if isinstance(value, str): - return value - else: - # An etree Element - return text content only - return ''.join(value.itertext()) - return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) - - -class InlineProcessor(Pattern): - """ - Base class that inline patterns subclass. - - This is the newer style inline processor that uses a more - efficient and flexible search approach. - """ - - def __init__(self, pattern, md=None): - """ - Create an instant of an inline pattern. - - Keyword arguments: - - * pattern: A regular expression that matches a pattern - - """ - self.pattern = pattern - self.compiled_re = re.compile(pattern, re.DOTALL | re.UNICODE) - - # Api for Markdown to pass safe_mode into instance - self.safe_mode = False - self.md = md - - def handleMatch(self, m, data): - """Return a ElementTree element from the given match and the - start and end index of the matched text. - - If `start` and/or `end` are returned as `None`, it will be - assumed that the processor did not find a valid region of text. - - Subclasses should override this method. - - Keyword arguments: - - * m: A re match object containing a match of the pattern. - * data: The buffer current under analysis - - Returns: - - * el: The ElementTree element, text or None. - * start: The start of the region that has been matched or None. - * end: The end of the region that has been matched or None. - - """ - pass # pragma: no cover - - -class SimpleTextPattern(Pattern): # pragma: no cover - """ Return a simple text of group(2) of a Pattern. """ - def handleMatch(self, m): - return m.group(2) - - -class SimpleTextInlineProcessor(InlineProcessor): - """ Return a simple text of group(1) of a Pattern. """ - def handleMatch(self, m, data): - return m.group(1), m.start(0), m.end(0) - - -class EscapeInlineProcessor(InlineProcessor): - """ Return an escaped character. """ - - def handleMatch(self, m, data): - char = m.group(1) - if char in self.md.ESCAPED_CHARS: - return '{}{}{}'.format(util.STX, ord(char), util.ETX), m.start(0), m.end(0) - else: - return None, m.start(0), m.end(0) - - -class SimpleTagPattern(Pattern): # pragma: no cover - """ - Return element of type `tag` with a text attribute of group(3) - of a Pattern. - - """ - def __init__(self, pattern, tag): - Pattern.__init__(self, pattern) - self.tag = tag - - def handleMatch(self, m): - el = etree.Element(self.tag) - el.text = m.group(3) - return el - - -class SimpleTagInlineProcessor(InlineProcessor): - """ - Return element of type `tag` with a text attribute of group(2) - of a Pattern. - - """ - def __init__(self, pattern, tag): - InlineProcessor.__init__(self, pattern) - self.tag = tag - - def handleMatch(self, m, data): # pragma: no cover - el = etree.Element(self.tag) - el.text = m.group(2) - return el, m.start(0), m.end(0) - - -class SubstituteTagPattern(SimpleTagPattern): # pragma: no cover - """ Return an element of type `tag` with no children. """ - def handleMatch(self, m): - return etree.Element(self.tag) - - -class SubstituteTagInlineProcessor(SimpleTagInlineProcessor): - """ Return an element of type `tag` with no children. """ - def handleMatch(self, m, data): - return etree.Element(self.tag), m.start(0), m.end(0) - - -class BacktickInlineProcessor(InlineProcessor): - """ Return a `<code>` element containing the matching text. """ - def __init__(self, pattern): - InlineProcessor.__init__(self, pattern) - self.ESCAPED_BSLASH = '{}{}{}'.format(util.STX, ord('\\'), util.ETX) - self.tag = 'code' - - def handleMatch(self, m, data): - if m.group(3): - el = etree.Element(self.tag) - el.text = util.AtomicString(util.code_escape(m.group(3).strip())) - return el, m.start(0), m.end(0) - else: - return m.group(1).replace('\\\\', self.ESCAPED_BSLASH), m.start(0), m.end(0) - - -class DoubleTagPattern(SimpleTagPattern): # pragma: no cover - """Return a ElementTree element nested in tag2 nested in tag1. - - Useful for strong emphasis etc. - - """ - def handleMatch(self, m): - tag1, tag2 = self.tag.split(",") - el1 = etree.Element(tag1) - el2 = etree.SubElement(el1, tag2) - el2.text = m.group(3) - if len(m.groups()) == 5: - el2.tail = m.group(4) - return el1 - - -class DoubleTagInlineProcessor(SimpleTagInlineProcessor): - """Return a ElementTree element nested in tag2 nested in tag1. - - Useful for strong emphasis etc. - - """ - def handleMatch(self, m, data): # pragma: no cover - tag1, tag2 = self.tag.split(",") - el1 = etree.Element(tag1) - el2 = etree.SubElement(el1, tag2) - el2.text = m.group(2) - if len(m.groups()) == 3: - el2.tail = m.group(3) - return el1, m.start(0), m.end(0) - - -class HtmlInlineProcessor(InlineProcessor): - """ Store raw inline html and return a placeholder. """ - def handleMatch(self, m, data): - rawhtml = self.unescape(m.group(1)) - place_holder = self.md.htmlStash.store(rawhtml) - return place_holder, m.start(0), m.end(0) - - def unescape(self, text): - """ Return unescaped text given text with an inline placeholder. """ - try: - stash = self.md.treeprocessors['inline'].stashed_nodes - except KeyError: # pragma: no cover - return text - - def get_stash(m): - id = m.group(1) - value = stash.get(id) - if value is not None: - try: - return self.md.serializer(value) - except Exception: - return r'\%s' % value - - return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) - - -class AsteriskProcessor(InlineProcessor): - """Emphasis processor for handling strong and em matches inside asterisks.""" - - PATTERNS = [ - EmStrongItem(re.compile(EM_STRONG_RE, re.DOTALL | re.UNICODE), 'double', 'strong,em'), - EmStrongItem(re.compile(STRONG_EM_RE, re.DOTALL | re.UNICODE), 'double', 'em,strong'), - EmStrongItem(re.compile(STRONG_EM3_RE, re.DOTALL | re.UNICODE), 'double2', 'strong,em'), - EmStrongItem(re.compile(STRONG_RE, re.DOTALL | re.UNICODE), 'single', 'strong'), - EmStrongItem(re.compile(EMPHASIS_RE, re.DOTALL | re.UNICODE), 'single', 'em') - ] - - def build_single(self, m, tag, idx): - """Return single tag.""" - el1 = etree.Element(tag) - text = m.group(2) - self.parse_sub_patterns(text, el1, None, idx) - return el1 - - def build_double(self, m, tags, idx): - """Return double tag.""" - - tag1, tag2 = tags.split(",") - el1 = etree.Element(tag1) - el2 = etree.Element(tag2) - text = m.group(2) - self.parse_sub_patterns(text, el2, None, idx) - el1.append(el2) - if len(m.groups()) == 3: - text = m.group(3) - self.parse_sub_patterns(text, el1, el2, idx) - return el1 - - def build_double2(self, m, tags, idx): - """Return double tags (variant 2): `<strong>text <em>text</em></strong>`.""" - - tag1, tag2 = tags.split(",") - el1 = etree.Element(tag1) - el2 = etree.Element(tag2) - text = m.group(2) - self.parse_sub_patterns(text, el1, None, idx) - text = m.group(3) - el1.append(el2) - self.parse_sub_patterns(text, el2, None, idx) - return el1 - - def parse_sub_patterns(self, data, parent, last, idx): - """ - Parses sub patterns. - - `data` (`str`): - text to evaluate. - - `parent` (`etree.Element`): - Parent to attach text and sub elements to. - - `last` (`etree.Element`): - Last appended child to parent. Can also be None if parent has no children. - - `idx` (`int`): - Current pattern index that was used to evaluate the parent. - - """ - - offset = 0 - pos = 0 - - length = len(data) - while pos < length: - # Find the start of potential emphasis or strong tokens - if self.compiled_re.match(data, pos): - matched = False - # See if the we can match an emphasis/strong pattern - for index, item in enumerate(self.PATTERNS): - # Only evaluate patterns that are after what was used on the parent - if index <= idx: - continue - m = item.pattern.match(data, pos) - if m: - # Append child nodes to parent - # Text nodes should be appended to the last - # child if present, and if not, it should - # be added as the parent's text node. - text = data[offset:m.start(0)] - if text: - if last is not None: - last.tail = text - else: - parent.text = text - el = self.build_element(m, item.builder, item.tags, index) - parent.append(el) - last = el - # Move our position past the matched hunk - offset = pos = m.end(0) - matched = True - if not matched: - # We matched nothing, move on to the next character - pos += 1 - else: - # Increment position as no potential emphasis start was found. - pos += 1 - - # Append any leftover text as a text node. - text = data[offset:] - if text: - if last is not None: - last.tail = text - else: - parent.text = text - - def build_element(self, m, builder, tags, index): - """Element builder.""" - - if builder == 'double2': - return self.build_double2(m, tags, index) - elif builder == 'double': - return self.build_double(m, tags, index) - else: - return self.build_single(m, tags, index) - - def handleMatch(self, m, data): - """Parse patterns.""" - - el = None - start = None - end = None - - for index, item in enumerate(self.PATTERNS): - m1 = item.pattern.match(data, m.start(0)) - if m1: - start = m1.start(0) - end = m1.end(0) - el = self.build_element(m1, item.builder, item.tags, index) - break - return el, start, end - - -class UnderscoreProcessor(AsteriskProcessor): - """Emphasis processor for handling strong and em matches inside underscores.""" - - PATTERNS = [ - EmStrongItem(re.compile(EM_STRONG2_RE, re.DOTALL | re.UNICODE), 'double', 'strong,em'), - EmStrongItem(re.compile(STRONG_EM2_RE, re.DOTALL | re.UNICODE), 'double', 'em,strong'), - EmStrongItem(re.compile(SMART_STRONG_EM_RE, re.DOTALL | re.UNICODE), 'double2', 'strong,em'), - EmStrongItem(re.compile(SMART_STRONG_RE, re.DOTALL | re.UNICODE), 'single', 'strong'), - EmStrongItem(re.compile(SMART_EMPHASIS_RE, re.DOTALL | re.UNICODE), 'single', 'em') - ] - - -class LinkInlineProcessor(InlineProcessor): - """ Return a link element from the given match. """ - RE_LINK = re.compile(r'''\(\s*(?:(<[^<>]*>)\s*(?:('[^']*'|"[^"]*")\s*)?\))?''', re.DOTALL | re.UNICODE) - RE_TITLE_CLEAN = re.compile(r'\s') - - def handleMatch(self, m, data): - text, index, handled = self.getText(data, m.end(0)) - - if not handled: - return None, None, None - - href, title, index, handled = self.getLink(data, index) - if not handled: - return None, None, None - - el = etree.Element("a") - el.text = text - - el.set("href", href) - - if title is not None: - el.set("title", title) - - return el, m.start(0), index - - def getLink(self, data, index): - """Parse data between `()` of `[Text]()` allowing recursive `()`. """ - - href = '' - title = None - handled = False - - m = self.RE_LINK.match(data, pos=index) - if m and m.group(1): - # Matches [Text](<link> "title") - href = m.group(1)[1:-1].strip() - if m.group(2): - title = m.group(2)[1:-1] - index = m.end(0) - handled = True - elif m: - # Track bracket nesting and index in string - bracket_count = 1 - backtrack_count = 1 - start_index = m.end() - index = start_index - last_bracket = -1 - - # Primary (first found) quote tracking. - quote = None - start_quote = -1 - exit_quote = -1 - ignore_matches = False - - # Secondary (second found) quote tracking. - alt_quote = None - start_alt_quote = -1 - exit_alt_quote = -1 - - # Track last character - last = '' - - for pos in range(index, len(data)): - c = data[pos] - if c == '(': - # Count nested ( - # Don't increment the bracket count if we are sure we're in a title. - if not ignore_matches: - bracket_count += 1 - elif backtrack_count > 0: - backtrack_count -= 1 - elif c == ')': - # Match nested ) to ( - # Don't decrement if we are sure we are in a title that is unclosed. - if ((exit_quote != -1 and quote == last) or (exit_alt_quote != -1 and alt_quote == last)): - bracket_count = 0 - elif not ignore_matches: - bracket_count -= 1 - elif backtrack_count > 0: - backtrack_count -= 1 - # We've found our backup end location if the title doesn't resolve. - if backtrack_count == 0: - last_bracket = index + 1 - - elif c in ("'", '"'): - # Quote has started - if not quote: - # We'll assume we are now in a title. - # Brackets are quoted, so no need to match them (except for the final one). - ignore_matches = True - backtrack_count = bracket_count - bracket_count = 1 - start_quote = index + 1 - quote = c - # Secondary quote (in case the first doesn't resolve): [text](link'"title") - elif c != quote and not alt_quote: - start_alt_quote = index + 1 - alt_quote = c - # Update primary quote match - elif c == quote: - exit_quote = index + 1 - # Update secondary quote match - elif alt_quote and c == alt_quote: - exit_alt_quote = index + 1 - - index += 1 - - # Link is closed, so let's break out of the loop - if bracket_count == 0: - # Get the title if we closed a title string right before link closed - if exit_quote >= 0 and quote == last: - href = data[start_index:start_quote - 1] - title = ''.join(data[start_quote:exit_quote - 1]) - elif exit_alt_quote >= 0 and alt_quote == last: - href = data[start_index:start_alt_quote - 1] - title = ''.join(data[start_alt_quote:exit_alt_quote - 1]) - else: - href = data[start_index:index - 1] - break - - if c != ' ': - last = c - - # We have a scenario: [test](link"notitle) - # When we enter a string, we stop tracking bracket resolution in the main counter, - # but we do keep a backup counter up until we discover where we might resolve all brackets - # if the title string fails to resolve. - if bracket_count != 0 and backtrack_count == 0: - href = data[start_index:last_bracket - 1] - index = last_bracket - bracket_count = 0 - - handled = bracket_count == 0 - - if title is not None: - title = self.RE_TITLE_CLEAN.sub(' ', dequote(self.unescape(title.strip()))) - - href = self.unescape(href).strip() - - return href, title, index, handled - - def getText(self, data, index): - """Parse the content between `[]` of the start of an image or link - resolving nested square brackets. - - """ - bracket_count = 1 - text = [] - for pos in range(index, len(data)): - c = data[pos] - if c == ']': - bracket_count -= 1 - elif c == '[': - bracket_count += 1 - index += 1 - if bracket_count == 0: - break - text.append(c) - return ''.join(text), index, bracket_count == 0 - - -class ImageInlineProcessor(LinkInlineProcessor): - """ Return a img element from the given match. """ - - def handleMatch(self, m, data): - text, index, handled = self.getText(data, m.end(0)) - if not handled: - return None, None, None - - src, title, index, handled = self.getLink(data, index) - if not handled: - return None, None, None - - el = etree.Element("img") - - el.set("src", src) - - if title is not None: - el.set("title", title) - - el.set('alt', self.unescape(text)) - return el, m.start(0), index - - -class ReferenceInlineProcessor(LinkInlineProcessor): - """ Match to a stored reference and return link element. """ - NEWLINE_CLEANUP_RE = re.compile(r'\s+', re.MULTILINE) - - RE_LINK = re.compile(r'\s?\[([^\]]*)\]', re.DOTALL | re.UNICODE) - - def handleMatch(self, m, data): - text, index, handled = self.getText(data, m.end(0)) - if not handled: - return None, None, None - - id, end, handled = self.evalId(data, index, text) - if not handled: - return None, None, None - - # Clean up linebreaks in id - id = self.NEWLINE_CLEANUP_RE.sub(' ', id) - if id not in self.md.references: # ignore undefined refs - return None, m.start(0), end - - href, title = self.md.references[id] - - return self.makeTag(href, title, text), m.start(0), end - - def evalId(self, data, index, text): - """ - Evaluate the id portion of [ref][id]. - - If [ref][] use [ref]. - """ - m = self.RE_LINK.match(data, pos=index) - if not m: - return None, index, False - else: - id = m.group(1).lower() - end = m.end(0) - if not id: - id = text.lower() - return id, end, True - - def makeTag(self, href, title, text): - el = etree.Element('a') - - el.set('href', href) - if title: - el.set('title', title) - - el.text = text - return el - - -class ShortReferenceInlineProcessor(ReferenceInlineProcessor): - """Short form of reference: [google]. """ - def evalId(self, data, index, text): - """Evaluate the id from of [ref] """ - - return text.lower(), index, True - - -class ImageReferenceInlineProcessor(ReferenceInlineProcessor): - """ Match to a stored reference and return img element. """ - def makeTag(self, href, title, text): - el = etree.Element("img") - el.set("src", href) - if title: - el.set("title", title) - el.set("alt", self.unescape(text)) - return el - - -class ShortImageReferenceInlineProcessor(ImageReferenceInlineProcessor): - """ Short form of inage reference: ![ref]. """ - def evalId(self, data, index, text): - """Evaluate the id from of [ref] """ - - return text.lower(), index, True - - -class AutolinkInlineProcessor(InlineProcessor): - """ Return a link Element given an autolink (`<http://example/com>`). """ - def handleMatch(self, m, data): - el = etree.Element("a") - el.set('href', self.unescape(m.group(1))) - el.text = util.AtomicString(m.group(1)) - return el, m.start(0), m.end(0) - - -class AutomailInlineProcessor(InlineProcessor): - """ - Return a mailto link Element given an automail link (`<foo@example.com>`). - """ - def handleMatch(self, m, data): - el = etree.Element('a') - email = self.unescape(m.group(1)) - if email.startswith("mailto:"): - email = email[len("mailto:"):] - - def codepoint2name(code): - """Return entity definition by code, or the code if not defined.""" - entity = entities.codepoint2name.get(code) - if entity: - return "{}{};".format(util.AMP_SUBSTITUTE, entity) - else: - return "%s#%d;" % (util.AMP_SUBSTITUTE, code) - - letters = [codepoint2name(ord(letter)) for letter in email] - el.text = util.AtomicString(''.join(letters)) - - mailto = "mailto:" + email - mailto = "".join([util.AMP_SUBSTITUTE + '#%d;' % - ord(letter) for letter in mailto]) - el.set('href', mailto) - return el, m.start(0), m.end(0)
diff --git a/third_party/Python-Markdown/markdown/postprocessors.py b/third_party/Python-Markdown/markdown/postprocessors.py deleted file mode 100644 index 498f7e8..0000000 --- a/third_party/Python-Markdown/markdown/postprocessors.py +++ /dev/null
@@ -1,137 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). - -POST-PROCESSORS -============================================================================= - -Markdown also allows post-processors, which are similar to preprocessors in -that they need to implement a "run" method. However, they are run after core -processing. - -""" - -from collections import OrderedDict -from . import util -import re - - -def build_postprocessors(md, **kwargs): - """ Build the default postprocessors for Markdown. """ - postprocessors = util.Registry() - postprocessors.register(RawHtmlPostprocessor(md), 'raw_html', 30) - postprocessors.register(AndSubstitutePostprocessor(), 'amp_substitute', 20) - return postprocessors - - -class Postprocessor(util.Processor): - """ - Postprocessors are run after the ElementTree it converted back into text. - - Each Postprocessor implements a "run" method that takes a pointer to a - text string, modifies it as necessary and returns a text string. - - Postprocessors must extend markdown.Postprocessor. - - """ - - def run(self, text): - """ - Subclasses of Postprocessor should implement a `run` method, which - takes the html document as a single text string and returns a - (possibly modified) string. - - """ - pass # pragma: no cover - - -class RawHtmlPostprocessor(Postprocessor): - """ Restore raw html to the document. """ - - BLOCK_LEVEL_REGEX = re.compile(r'^\<\/?([^ >]+)') - - def run(self, text): - """ Iterate over html stash and restore html. """ - replacements = OrderedDict() - for i in range(self.md.htmlStash.html_counter): - html = self.stash_to_string(self.md.htmlStash.rawHtmlBlocks[i]) - if self.isblocklevel(html): - replacements["<p>{}</p>".format( - self.md.htmlStash.get_placeholder(i))] = html - replacements[self.md.htmlStash.get_placeholder(i)] = html - - def substitute_match(m): - key = m.group(0) - - if key not in replacements: - if key[3:-4] in replacements: - return f'<p>{ replacements[key[3:-4]] }</p>' - else: - return key - - return replacements[key] - - if replacements: - base_placeholder = util.HTML_PLACEHOLDER % r'([0-9]+)' - pattern = re.compile(f'<p>{ base_placeholder }</p>|{ base_placeholder }') - processed_text = pattern.sub(substitute_match, text) - else: - return text - - if processed_text == text: - return processed_text - else: - return self.run(processed_text) - - def isblocklevel(self, html): - m = self.BLOCK_LEVEL_REGEX.match(html) - if m: - if m.group(1)[0] in ('!', '?', '@', '%'): - # Comment, php etc... - return True - return self.md.is_block_level(m.group(1)) - return False - - def stash_to_string(self, text): - """ Convert a stashed object to a string. """ - return str(text) - - -class AndSubstitutePostprocessor(Postprocessor): - """ Restore valid entities """ - - def run(self, text): - text = text.replace(util.AMP_SUBSTITUTE, "&") - return text - - -@util.deprecated( - "This class will be removed in the future; " - "use 'treeprocessors.UnescapeTreeprocessor' instead." -) -class UnescapePostprocessor(Postprocessor): - """ Restore escaped chars """ - - RE = re.compile(r'{}(\d+){}'.format(util.STX, util.ETX)) - - def unescape(self, m): - return chr(int(m.group(1))) - - def run(self, text): - return self.RE.sub(self.unescape, text)
diff --git a/third_party/Python-Markdown/markdown/preprocessors.py b/third_party/Python-Markdown/markdown/preprocessors.py deleted file mode 100644 index e1023c5..0000000 --- a/third_party/Python-Markdown/markdown/preprocessors.py +++ /dev/null
@@ -1,82 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). - -PRE-PROCESSORS -============================================================================= - -Preprocessors work on source text before we start doing anything too -complicated. -""" - -from . import util -from .htmlparser import HTMLExtractor -import re - - -def build_preprocessors(md, **kwargs): - """ Build the default set of preprocessors used by Markdown. """ - preprocessors = util.Registry() - preprocessors.register(NormalizeWhitespace(md), 'normalize_whitespace', 30) - preprocessors.register(HtmlBlockPreprocessor(md), 'html_block', 20) - return preprocessors - - -class Preprocessor(util.Processor): - """ - Preprocessors are run after the text is broken into lines. - - Each preprocessor implements a "run" method that takes a pointer to a - list of lines of the document, modifies it as necessary and returns - either the same pointer or a pointer to a new list. - - Preprocessors must extend markdown.Preprocessor. - - """ - def run(self, lines): - """ - Each subclass of Preprocessor should override the `run` method, which - takes the document as a list of strings split by newlines and returns - the (possibly modified) list of lines. - - """ - pass # pragma: no cover - - -class NormalizeWhitespace(Preprocessor): - """ Normalize whitespace for consistent parsing. """ - - def run(self, lines): - source = '\n'.join(lines) - source = source.replace(util.STX, "").replace(util.ETX, "") - source = source.replace("\r\n", "\n").replace("\r", "\n") + "\n\n" - source = source.expandtabs(self.md.tab_length) - source = re.sub(r'(?<=\n) +\n', '\n', source) - return source.split('\n') - - -class HtmlBlockPreprocessor(Preprocessor): - """Remove html blocks from the text and store them for later retrieval.""" - - def run(self, lines): - source = '\n'.join(lines) - parser = HTMLExtractor(self.md) - parser.feed(source) - parser.close() - return ''.join(parser.cleandoc).split('\n')
diff --git a/third_party/Python-Markdown/markdown/serializers.py b/third_party/Python-Markdown/markdown/serializers.py deleted file mode 100644 index 59bab18..0000000 --- a/third_party/Python-Markdown/markdown/serializers.py +++ /dev/null
@@ -1,189 +0,0 @@ -# markdown/searializers.py -# -# Add x/html serialization to Elementree -# Taken from ElementTree 1.3 preview with slight modifications -# -# Copyright (c) 1999-2007 by Fredrik Lundh. All rights reserved. -# -# fredrik@pythonware.com -# https://www.pythonware.com/ -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2007 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -# OF THIS SOFTWARE. -# -------------------------------------------------------------------- - - -from xml.etree.ElementTree import ProcessingInstruction -from xml.etree.ElementTree import Comment, ElementTree, QName -import re - -__all__ = ['to_html_string', 'to_xhtml_string'] - -HTML_EMPTY = ("area", "base", "basefont", "br", "col", "frame", "hr", - "img", "input", "isindex", "link", "meta", "param") -RE_AMP = re.compile(r'&(?!(?:\#[0-9]+|\#x[0-9a-f]+|[0-9a-z]+);)', re.I) - -try: - HTML_EMPTY = set(HTML_EMPTY) -except NameError: # pragma: no cover - pass - - -def _raise_serialization_error(text): # pragma: no cover - raise TypeError( - "cannot serialize {!r} (type {})".format(text, type(text).__name__) - ) - - -def _escape_cdata(text): - # escape character data - try: - # it's worth avoiding do-nothing calls for strings that are - # shorter than 500 character, or so. assume that's, by far, - # the most common case in most applications. - if "&" in text: - # Only replace & when not part of an entity - text = RE_AMP.sub('&', text) - if "<" in text: - text = text.replace("<", "<") - if ">" in text: - text = text.replace(">", ">") - return text - except (TypeError, AttributeError): # pragma: no cover - _raise_serialization_error(text) - - -def _escape_attrib(text): - # escape attribute value - try: - if "&" in text: - # Only replace & when not part of an entity - text = RE_AMP.sub('&', text) - if "<" in text: - text = text.replace("<", "<") - if ">" in text: - text = text.replace(">", ">") - if "\"" in text: - text = text.replace("\"", """) - if "\n" in text: - text = text.replace("\n", " ") - return text - except (TypeError, AttributeError): # pragma: no cover - _raise_serialization_error(text) - - -def _escape_attrib_html(text): - # escape attribute value - try: - if "&" in text: - # Only replace & when not part of an entity - text = RE_AMP.sub('&', text) - if "<" in text: - text = text.replace("<", "<") - if ">" in text: - text = text.replace(">", ">") - if "\"" in text: - text = text.replace("\"", """) - return text - except (TypeError, AttributeError): # pragma: no cover - _raise_serialization_error(text) - - -def _serialize_html(write, elem, format): - tag = elem.tag - text = elem.text - if tag is Comment: - write("<!--%s-->" % _escape_cdata(text)) - elif tag is ProcessingInstruction: - write("<?%s?>" % _escape_cdata(text)) - elif tag is None: - if text: - write(_escape_cdata(text)) - for e in elem: - _serialize_html(write, e, format) - else: - namespace_uri = None - if isinstance(tag, QName): - # QNAME objects store their data as a string: `{uri}tag` - if tag.text[:1] == "{": - namespace_uri, tag = tag.text[1:].split("}", 1) - else: - raise ValueError('QName objects must define a tag.') - write("<" + tag) - items = elem.items() - if items: - items = sorted(items) # lexical order - for k, v in items: - if isinstance(k, QName): - # Assume a text only QName - k = k.text - if isinstance(v, QName): - # Assume a text only QName - v = v.text - else: - v = _escape_attrib_html(v) - if k == v and format == 'html': - # handle boolean attributes - write(" %s" % v) - else: - write(' {}="{}"'.format(k, v)) - if namespace_uri: - write(' xmlns="%s"' % (_escape_attrib(namespace_uri))) - if format == "xhtml" and tag.lower() in HTML_EMPTY: - write(" />") - else: - write(">") - if text: - if tag.lower() in ["script", "style"]: - write(text) - else: - write(_escape_cdata(text)) - for e in elem: - _serialize_html(write, e, format) - if tag.lower() not in HTML_EMPTY: - write("</" + tag + ">") - if elem.tail: - write(_escape_cdata(elem.tail)) - - -def _write_html(root, format="html"): - assert root is not None - data = [] - write = data.append - _serialize_html(write, root, format) - return "".join(data) - - -# -------------------------------------------------------------------- -# public functions - -def to_html_string(element): - return _write_html(ElementTree(element).getroot(), format="html") - - -def to_xhtml_string(element): - return _write_html(ElementTree(element).getroot(), format="xhtml")
diff --git a/third_party/Python-Markdown/markdown/test_tools.py b/third_party/Python-Markdown/markdown/test_tools.py deleted file mode 100644 index 2ce0e74f7..0000000 --- a/third_party/Python-Markdown/markdown/test_tools.py +++ /dev/null
@@ -1,220 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import os -import sys -import unittest -import textwrap -from . import markdown, Markdown, util - -try: - import tidylib -except ImportError: - tidylib = None - -__all__ = ['TestCase', 'LegacyTestCase', 'Kwargs'] - - -class TestCase(unittest.TestCase): - """ - A unittest.TestCase subclass with helpers for testing Markdown output. - - Define `default_kwargs` as a dict of keywords to pass to Markdown for each - test. The defaults can be overridden on individual tests. - - The `assertMarkdownRenders` method accepts the source text, the expected - output, and any keywords to pass to Markdown. The `default_kwargs` are used - except where overridden by `kwargs`. The output and expected output are passed - to `TestCase.assertMultiLineEqual`. An AssertionError is raised with a diff - if the actual output does not equal the expected output. - - The `dedent` method is available to dedent triple-quoted strings if - necessary. - - In all other respects, behaves as unittest.TestCase. - """ - - default_kwargs = {} - - def assertMarkdownRenders(self, source, expected, expected_attrs=None, **kwargs): - """ - Test that source Markdown text renders to expected output with given keywords. - - `expected_attrs` accepts a dict. Each key should be the name of an attribute - on the `Markdown` instance and the value should be the expected value after - the source text is parsed by Markdown. After the expected output is tested, - the expected value for each attribute is compared against the actual - attribute of the `Markdown` instance using `TestCase.assertEqual`. - """ - - expected_attrs = expected_attrs or {} - kws = self.default_kwargs.copy() - kws.update(kwargs) - md = Markdown(**kws) - output = md.convert(source) - self.assertMultiLineEqual(output, expected) - for key, value in expected_attrs.items(): - self.assertEqual(getattr(md, key), value) - - def dedent(self, text): - """ - Dedent text. - """ - - # TODO: If/when actual output ends with a newline, then use: - # return textwrap.dedent(text.strip('/n')) - return textwrap.dedent(text).strip() - - -class recursionlimit: - """ - A context manager which temporarily modifies the Python recursion limit. - - The testing framework, coverage, etc. may add an arbitrary number of levels to the depth. To maintain consistency - in the tests, the current stack depth is determined when called, then added to the provided limit. - - Example usage: - - with recursionlimit(20): - # test code here - - See https://stackoverflow.com/a/50120316/866026 - """ - - def __init__(self, limit): - self.limit = util._get_stack_depth() + limit - self.old_limit = sys.getrecursionlimit() - - def __enter__(self): - sys.setrecursionlimit(self.limit) - - def __exit__(self, type, value, tb): - sys.setrecursionlimit(self.old_limit) - - -######################### -# Legacy Test Framework # -######################### - - -class Kwargs(dict): - """ A dict like class for holding keyword arguments. """ - pass - - -def _normalize_whitespace(text): - """ Normalize whitespace for a string of html using tidylib. """ - output, errors = tidylib.tidy_fragment(text, options={ - 'drop_empty_paras': 0, - 'fix_backslash': 0, - 'fix_bad_comments': 0, - 'fix_uri': 0, - 'join_styles': 0, - 'lower_literals': 0, - 'merge_divs': 0, - 'output_xhtml': 1, - 'quote_ampersand': 0, - 'newline': 'LF' - }) - return output - - -class LegacyTestMeta(type): - def __new__(cls, name, bases, dct): - - def generate_test(infile, outfile, normalize, kwargs): - def test(self): - with open(infile, encoding="utf-8") as f: - input = f.read() - with open(outfile, encoding="utf-8") as f: - # Normalize line endings - # (on Windows, git may have altered line endings). - expected = f.read().replace("\r\n", "\n") - output = markdown(input, **kwargs) - if tidylib and normalize: - try: - expected = _normalize_whitespace(expected) - output = _normalize_whitespace(output) - except OSError: - self.skipTest("Tidylib's c library not available.") - elif normalize: - self.skipTest('Tidylib not available.') - self.assertMultiLineEqual(output, expected) - return test - - location = dct.get('location', '') - exclude = dct.get('exclude', []) - normalize = dct.get('normalize', False) - input_ext = dct.get('input_ext', '.txt') - output_ext = dct.get('output_ext', '.html') - kwargs = dct.get('default_kwargs', Kwargs()) - - if os.path.isdir(location): - for file in os.listdir(location): - infile = os.path.join(location, file) - if os.path.isfile(infile): - tname, ext = os.path.splitext(file) - if ext == input_ext: - outfile = os.path.join(location, tname + output_ext) - tname = tname.replace(' ', '_').replace('-', '_') - kws = kwargs.copy() - if tname in dct: - kws.update(dct[tname]) - test_name = 'test_%s' % tname - if tname not in exclude: - dct[test_name] = generate_test(infile, outfile, normalize, kws) - else: - dct[test_name] = unittest.skip('Excluded')(lambda: None) - - return type.__new__(cls, name, bases, dct) - - -class LegacyTestCase(unittest.TestCase, metaclass=LegacyTestMeta): - """ - A `unittest.TestCase` subclass for running Markdown's legacy file-based tests. - - A subclass should define various properties which point to a directory of - text-based test files and define various behaviors/defaults for those tests. - The following properties are supported: - - location: A path to the directory of test files. An absolute path is preferred. - exclude: A list of tests to exclude. Each test name should comprise the filename - without an extension. - normalize: A boolean value indicating if the HTML should be normalized. - Default: `False`. - input_ext: A string containing the file extension of input files. Default: `.txt`. - ouput_ext: A string containing the file extension of expected output files. - Default: `html`. - default_kwargs: A `Kwargs` instance which stores the default set of keyword - arguments for all test files in the directory. - - In addition, properties can be defined for each individual set of test files within - the directory. The property should be given the name of the file without the file - extension. Any spaces and dashes in the filename should be replaced with - underscores. The value of the property should be a `Kwargs` instance which - contains the keyword arguments that should be passed to `Markdown` for that - test file. The keyword arguments will "update" the `default_kwargs`. - - When the class instance is created, it will walk the given directory and create - a separate unitttest for each set of test files using the naming scheme: - `test_filename`. One unittest will be run for each set of input and output files. - """ - pass
diff --git a/third_party/Python-Markdown/markdown/treeprocessors.py b/third_party/Python-Markdown/markdown/treeprocessors.py deleted file mode 100644 index e9f48ca..0000000 --- a/third_party/Python-Markdown/markdown/treeprocessors.py +++ /dev/null
@@ -1,458 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import re -import xml.etree.ElementTree as etree -from . import util -from . import inlinepatterns - - -def build_treeprocessors(md, **kwargs): - """ Build the default treeprocessors for Markdown. """ - treeprocessors = util.Registry() - treeprocessors.register(InlineProcessor(md), 'inline', 20) - treeprocessors.register(PrettifyTreeprocessor(md), 'prettify', 10) - treeprocessors.register(UnescapeTreeprocessor(md), 'unescape', 0) - return treeprocessors - - -def isString(s): - """ Check if it's string """ - if not isinstance(s, util.AtomicString): - return isinstance(s, str) - return False - - -class Treeprocessor(util.Processor): - """ - Treeprocessors are run on the ElementTree object before serialization. - - Each Treeprocessor implements a "run" method that takes a pointer to an - ElementTree, modifies it as necessary and returns an ElementTree - object. - - Treeprocessors must extend markdown.Treeprocessor. - - """ - def run(self, root): - """ - Subclasses of Treeprocessor should implement a `run` method, which - takes a root ElementTree. This method can return another ElementTree - object, and the existing root ElementTree will be replaced, or it can - modify the current tree and return None. - """ - pass # pragma: no cover - - -class InlineProcessor(Treeprocessor): - """ - A Treeprocessor that traverses a tree, applying inline patterns. - """ - - def __init__(self, md): - self.__placeholder_prefix = util.INLINE_PLACEHOLDER_PREFIX - self.__placeholder_suffix = util.ETX - self.__placeholder_length = 4 + len(self.__placeholder_prefix) \ - + len(self.__placeholder_suffix) - self.__placeholder_re = util.INLINE_PLACEHOLDER_RE - self.md = md - self.inlinePatterns = md.inlinePatterns - self.ancestors = [] - - def __makePlaceholder(self, type): - """ Generate a placeholder """ - id = "%04d" % len(self.stashed_nodes) - hash = util.INLINE_PLACEHOLDER % id - return hash, id - - def __findPlaceholder(self, data, index): - """ - Extract id from data string, start from index - - Keyword arguments: - - * data: string - * index: index, from which we start search - - Returns: placeholder id and string index, after the found placeholder. - - """ - m = self.__placeholder_re.search(data, index) - if m: - return m.group(1), m.end() - else: - return None, index + 1 - - def __stashNode(self, node, type): - """ Add node to stash """ - placeholder, id = self.__makePlaceholder(type) - self.stashed_nodes[id] = node - return placeholder - - def __handleInline(self, data, patternIndex=0): - """ - Process string with inline patterns and replace it - with placeholders - - Keyword arguments: - - * data: A line of Markdown text - * patternIndex: The index of the inlinePattern to start with - - Returns: String with placeholders. - - """ - if not isinstance(data, util.AtomicString): - startIndex = 0 - count = len(self.inlinePatterns) - while patternIndex < count: - data, matched, startIndex = self.__applyPattern( - self.inlinePatterns[patternIndex], data, patternIndex, startIndex - ) - if not matched: - patternIndex += 1 - return data - - def __processElementText(self, node, subnode, isText=True): - """ - Process placeholders in Element.text or Element.tail - of Elements popped from self.stashed_nodes. - - Keywords arguments: - - * node: parent node - * subnode: processing node - * isText: bool variable, True - it's text, False - it's tail - - Returns: None - - """ - if isText: - text = subnode.text - subnode.text = None - else: - text = subnode.tail - subnode.tail = None - - childResult = self.__processPlaceholders(text, subnode, isText) - - if not isText and node is not subnode: - pos = list(node).index(subnode) + 1 - else: - pos = 0 - - childResult.reverse() - for newChild in childResult: - node.insert(pos, newChild[0]) - - def __processPlaceholders(self, data, parent, isText=True): - """ - Process string with placeholders and generate ElementTree tree. - - Keyword arguments: - - * data: string with placeholders instead of ElementTree elements. - * parent: Element, which contains processing inline data - - Returns: list with ElementTree elements with applied inline patterns. - - """ - def linkText(text): - if text: - if result: - if result[-1][0].tail: - result[-1][0].tail += text - else: - result[-1][0].tail = text - elif not isText: - if parent.tail: - parent.tail += text - else: - parent.tail = text - else: - if parent.text: - parent.text += text - else: - parent.text = text - result = [] - strartIndex = 0 - while data: - index = data.find(self.__placeholder_prefix, strartIndex) - if index != -1: - id, phEndIndex = self.__findPlaceholder(data, index) - - if id in self.stashed_nodes: - node = self.stashed_nodes.get(id) - - if index > 0: - text = data[strartIndex:index] - linkText(text) - - if not isString(node): # it's Element - for child in [node] + list(node): - if child.tail: - if child.tail.strip(): - self.__processElementText( - node, child, False - ) - if child.text: - if child.text.strip(): - self.__processElementText(child, child) - else: # it's just a string - linkText(node) - strartIndex = phEndIndex - continue - - strartIndex = phEndIndex - result.append((node, self.ancestors[:])) - - else: # wrong placeholder - end = index + len(self.__placeholder_prefix) - linkText(data[strartIndex:end]) - strartIndex = end - else: - text = data[strartIndex:] - if isinstance(data, util.AtomicString): - # We don't want to loose the AtomicString - text = util.AtomicString(text) - linkText(text) - data = "" - - return result - - def __applyPattern(self, pattern, data, patternIndex, startIndex=0): - """ - Check if the line fits the pattern, create the necessary - elements, add it to stashed_nodes. - - Keyword arguments: - - * data: the text to be processed - * pattern: the pattern to be checked - * patternIndex: index of current pattern - * startIndex: string index, from which we start searching - - Returns: String with placeholders instead of ElementTree elements. - - """ - new_style = isinstance(pattern, inlinepatterns.InlineProcessor) - - for exclude in pattern.ANCESTOR_EXCLUDES: - if exclude.lower() in self.ancestors: - return data, False, 0 - - if new_style: - match = None - # Since handleMatch may reject our first match, - # we iterate over the buffer looking for matches - # until we can't find any more. - for match in pattern.getCompiledRegExp().finditer(data, startIndex): - node, start, end = pattern.handleMatch(match, data) - if start is None or end is None: - startIndex += match.end(0) - match = None - continue - break - else: # pragma: no cover - match = pattern.getCompiledRegExp().match(data[startIndex:]) - leftData = data[:startIndex] - - if not match: - return data, False, 0 - - if not new_style: # pragma: no cover - node = pattern.handleMatch(match) - start = match.start(0) - end = match.end(0) - - if node is None: - return data, True, end - - if not isString(node): - if not isinstance(node.text, util.AtomicString): - # We need to process current node too - for child in [node] + list(node): - if not isString(node): - if child.text: - self.ancestors.append(child.tag.lower()) - child.text = self.__handleInline( - child.text, patternIndex + 1 - ) - self.ancestors.pop() - if child.tail: - child.tail = self.__handleInline( - child.tail, patternIndex - ) - - placeholder = self.__stashNode(node, pattern.type()) - - if new_style: - return "{}{}{}".format(data[:start], - placeholder, data[end:]), True, 0 - else: # pragma: no cover - return "{}{}{}{}".format(leftData, - match.group(1), - placeholder, match.groups()[-1]), True, 0 - - def __build_ancestors(self, parent, parents): - """Build the ancestor list.""" - ancestors = [] - while parent is not None: - if parent is not None: - ancestors.append(parent.tag.lower()) - parent = self.parent_map.get(parent) - ancestors.reverse() - parents.extend(ancestors) - - def run(self, tree, ancestors=None): - """Apply inline patterns to a parsed Markdown tree. - - Iterate over ElementTree, find elements with inline tag, apply inline - patterns and append newly created Elements to tree. If you don't - want to process your data with inline patterns, instead of normal - string, use subclass AtomicString: - - node.text = markdown.AtomicString("This will not be processed.") - - Arguments: - - * tree: ElementTree object, representing Markdown tree. - * ancestors: List of parent tag names that precede the tree node (if needed). - - Returns: ElementTree object with applied inline patterns. - - """ - self.stashed_nodes = {} - - # Ensure a valid parent list, but copy passed in lists - # to ensure we don't have the user accidentally change it on us. - tree_parents = [] if ancestors is None else ancestors[:] - - self.parent_map = {c: p for p in tree.iter() for c in p} - stack = [(tree, tree_parents)] - - while stack: - currElement, parents = stack.pop() - - self.ancestors = parents - self.__build_ancestors(currElement, self.ancestors) - - insertQueue = [] - for child in currElement: - if child.text and not isinstance( - child.text, util.AtomicString - ): - self.ancestors.append(child.tag.lower()) - text = child.text - child.text = None - lst = self.__processPlaceholders( - self.__handleInline(text), child - ) - for item in lst: - self.parent_map[item[0]] = child - stack += lst - insertQueue.append((child, lst)) - self.ancestors.pop() - if child.tail: - tail = self.__handleInline(child.tail) - dumby = etree.Element('d') - child.tail = None - tailResult = self.__processPlaceholders(tail, dumby, False) - if dumby.tail: - child.tail = dumby.tail - pos = list(currElement).index(child) + 1 - tailResult.reverse() - for newChild in tailResult: - self.parent_map[newChild[0]] = currElement - currElement.insert(pos, newChild[0]) - if len(child): - self.parent_map[child] = currElement - stack.append((child, self.ancestors[:])) - - for element, lst in insertQueue: - for i, obj in enumerate(lst): - newChild = obj[0] - element.insert(i, newChild) - return tree - - -class PrettifyTreeprocessor(Treeprocessor): - """ Add linebreaks to the html document. """ - - def _prettifyETree(self, elem): - """ Recursively add linebreaks to ElementTree children. """ - - i = "\n" - if self.md.is_block_level(elem.tag) and elem.tag not in ['code', 'pre']: - if (not elem.text or not elem.text.strip()) \ - and len(elem) and self.md.is_block_level(elem[0].tag): - elem.text = i - for e in elem: - if self.md.is_block_level(e.tag): - self._prettifyETree(e) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - - def run(self, root): - """ Add linebreaks to ElementTree root object. """ - - self._prettifyETree(root) - # Do <br />'s separately as they are often in the middle of - # inline content and missed by _prettifyETree. - brs = root.iter('br') - for br in brs: - if not br.tail or not br.tail.strip(): - br.tail = '\n' - else: - br.tail = '\n%s' % br.tail - # Clean up extra empty lines at end of code blocks. - pres = root.iter('pre') - for pre in pres: - if len(pre) and pre[0].tag == 'code': - code = pre[0] - # Only prettify code containing text only - if not len(code) and code.text is not None: - code.text = util.AtomicString(code.text.rstrip() + '\n') - - -class UnescapeTreeprocessor(Treeprocessor): - """ Restore escaped chars """ - - RE = re.compile(r'{}(\d+){}'.format(util.STX, util.ETX)) - - def _unescape(self, m): - return chr(int(m.group(1))) - - def unescape(self, text): - return self.RE.sub(self._unescape, text) - - def run(self, root): - """ Loop over all elements and unescape all text. """ - for elem in root.iter(): - # Unescape text content - if elem.text and not elem.tag == 'code': - elem.text = self.unescape(elem.text) - # Unescape tail content - if elem.tail: - elem.tail = self.unescape(elem.tail) - # Unescape attribute values - for key, value in elem.items(): - elem.set(key, self.unescape(value))
diff --git a/third_party/Python-Markdown/markdown/util.py b/third_party/Python-Markdown/markdown/util.py deleted file mode 100644 index e6b08e5..0000000 --- a/third_party/Python-Markdown/markdown/util.py +++ /dev/null
@@ -1,358 +0,0 @@ -""" -Python Markdown - -A Python implementation of John Gruber's Markdown. - -Documentation: https://python-markdown.github.io/ -GitHub: https://github.com/Python-Markdown/markdown/ -PyPI: https://pypi.org/project/Markdown/ - -Started by Manfred Stienstra (http://www.dwerg.net/). -Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). -Currently maintained by Waylan Limberg (https://github.com/waylan), -Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). - -Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -License: BSD (see LICENSE.md for details). -""" - -import re -import sys -import warnings -from collections import namedtuple -from functools import wraps, lru_cache -from itertools import count - - -""" -Constants you might want to modify ------------------------------------------------------------------------------ -""" - - -BLOCK_LEVEL_ELEMENTS = [ - # Elements which are invalid to wrap in a `<p>` tag. - # See https://w3c.github.io/html/grouping-content.html#the-p-element - 'address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', - 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', - 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'main', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul', - # Other elements which Markdown should not be mucking up the contents of. - 'canvas', 'colgroup', 'dd', 'body', 'dt', 'group', 'iframe', 'li', 'legend', - 'math', 'map', 'noscript', 'output', 'object', 'option', 'progress', 'script', - 'style', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'video' -] - -# Placeholders -STX = '\u0002' # Use STX ("Start of text") for start-of-placeholder -ETX = '\u0003' # Use ETX ("End of text") for end-of-placeholder -INLINE_PLACEHOLDER_PREFIX = STX+"klzzwxh:" -INLINE_PLACEHOLDER = INLINE_PLACEHOLDER_PREFIX + "%s" + ETX -INLINE_PLACEHOLDER_RE = re.compile(INLINE_PLACEHOLDER % r'([0-9]+)') -AMP_SUBSTITUTE = STX+"amp"+ETX -HTML_PLACEHOLDER = STX + "wzxhzdk:%s" + ETX -HTML_PLACEHOLDER_RE = re.compile(HTML_PLACEHOLDER % r'([0-9]+)') -TAG_PLACEHOLDER = STX + "hzzhzkh:%s" + ETX - - -""" -Constants you probably do not need to change ------------------------------------------------------------------------------ -""" - -RTL_BIDI_RANGES = ( - ('\u0590', '\u07FF'), - # Hebrew (0590-05FF), Arabic (0600-06FF), - # Syriac (0700-074F), Arabic supplement (0750-077F), - # Thaana (0780-07BF), Nko (07C0-07FF). - ('\u2D30', '\u2D7F') # Tifinagh -) - - -""" -AUXILIARY GLOBAL FUNCTIONS -============================================================================= -""" - - -@lru_cache(maxsize=None) -def get_installed_extensions(): - if sys.version_info >= (3, 10): - from importlib import metadata - else: # <PY310 use backport - import importlib_metadata as metadata - # Only load extension entry_points once. - return metadata.entry_points(group='markdown.extensions') - - -def deprecated(message, stacklevel=2): - """ - Raise a DeprecationWarning when wrapped function/method is called. - - Usage: - @deprecated("This method will be removed in version X; use Y instead.") - def some_method()" - pass - """ - def wrapper(func): - @wraps(func) - def deprecated_func(*args, **kwargs): - warnings.warn( - f"'{func.__name__}' is deprecated. {message}", - category=DeprecationWarning, - stacklevel=stacklevel - ) - return func(*args, **kwargs) - return deprecated_func - return wrapper - - -def parseBoolValue(value, fail_on_errors=True, preserve_none=False): - """Parses a string representing bool value. If parsing was successful, - returns True or False. If preserve_none=True, returns True, False, - or None. If parsing was not successful, raises ValueError, or, if - fail_on_errors=False, returns None.""" - if not isinstance(value, str): - if preserve_none and value is None: - return value - return bool(value) - elif preserve_none and value.lower() == 'none': - return None - elif value.lower() in ('true', 'yes', 'y', 'on', '1'): - return True - elif value.lower() in ('false', 'no', 'n', 'off', '0', 'none'): - return False - elif fail_on_errors: - raise ValueError('Cannot parse bool value: %r' % value) - - -def code_escape(text): - """Escape code.""" - if "&" in text: - text = text.replace("&", "&") - if "<" in text: - text = text.replace("<", "<") - if ">" in text: - text = text.replace(">", ">") - return text - - -def _get_stack_depth(size=2): - """Get current stack depth, performantly. - """ - frame = sys._getframe(size) - - for size in count(size): - frame = frame.f_back - if not frame: - return size - - -def nearing_recursion_limit(): - """Return true if current stack depth is within 100 of maximum limit.""" - return sys.getrecursionlimit() - _get_stack_depth() < 100 - - -""" -MISC AUXILIARY CLASSES -============================================================================= -""" - - -class AtomicString(str): - """A string which should not be further processed.""" - pass - - -class Processor: - def __init__(self, md=None): - self.md = md - - -class HtmlStash: - """ - This class is used for stashing HTML objects that we extract - in the beginning and replace with place-holders. - """ - - def __init__(self): - """ Create a HtmlStash. """ - self.html_counter = 0 # for counting inline html segments - self.rawHtmlBlocks = [] - self.tag_counter = 0 - self.tag_data = [] # list of dictionaries in the order tags appear - - def store(self, html): - """ - Saves an HTML segment for later reinsertion. Returns a - placeholder string that needs to be inserted into the - document. - - Keyword arguments: - - * html: an html segment - - Returns : a placeholder string - - """ - self.rawHtmlBlocks.append(html) - placeholder = self.get_placeholder(self.html_counter) - self.html_counter += 1 - return placeholder - - def reset(self): - self.html_counter = 0 - self.rawHtmlBlocks = [] - - def get_placeholder(self, key): - return HTML_PLACEHOLDER % key - - def store_tag(self, tag, attrs, left_index, right_index): - """Store tag data and return a placeholder.""" - self.tag_data.append({'tag': tag, 'attrs': attrs, - 'left_index': left_index, - 'right_index': right_index}) - placeholder = TAG_PLACEHOLDER % str(self.tag_counter) - self.tag_counter += 1 # equal to the tag's index in self.tag_data - return placeholder - - -# Used internally by `Registry` for each item in its sorted list. -# Provides an easier to read API when editing the code later. -# For example, `item.name` is more clear than `item[0]`. -_PriorityItem = namedtuple('PriorityItem', ['name', 'priority']) - - -class Registry: - """ - A priority sorted registry. - - A `Registry` instance provides two public methods to alter the data of the - registry: `register` and `deregister`. Use `register` to add items and - `deregister` to remove items. See each method for specifics. - - When registering an item, a "name" and a "priority" must be provided. All - items are automatically sorted by "priority" from highest to lowest. The - "name" is used to remove ("deregister") and get items. - - A `Registry` instance it like a list (which maintains order) when reading - data. You may iterate over the items, get an item and get a count (length) - of all items. You may also check that the registry contains an item. - - When getting an item you may use either the index of the item or the - string-based "name". For example: - - registry = Registry() - registry.register(SomeItem(), 'itemname', 20) - # Get the item by index - item = registry[0] - # Get the item by name - item = registry['itemname'] - - When checking that the registry contains an item, you may use either the - string-based "name", or a reference to the actual item. For example: - - someitem = SomeItem() - registry.register(someitem, 'itemname', 20) - # Contains the name - assert 'itemname' in registry - # Contains the item instance - assert someitem in registry - - The method `get_index_for_name` is also available to obtain the index of - an item using that item's assigned "name". - """ - - def __init__(self): - self._data = {} - self._priority = [] - self._is_sorted = False - - def __contains__(self, item): - if isinstance(item, str): - # Check if an item exists by this name. - return item in self._data.keys() - # Check if this instance exists. - return item in self._data.values() - - def __iter__(self): - self._sort() - return iter([self._data[k] for k, p in self._priority]) - - def __getitem__(self, key): - self._sort() - if isinstance(key, slice): - data = Registry() - for k, p in self._priority[key]: - data.register(self._data[k], k, p) - return data - if isinstance(key, int): - return self._data[self._priority[key].name] - return self._data[key] - - def __len__(self): - return len(self._priority) - - def __repr__(self): - return '<{}({})>'.format(self.__class__.__name__, list(self)) - - def get_index_for_name(self, name): - """ - Return the index of the given name. - """ - if name in self: - self._sort() - return self._priority.index( - [x for x in self._priority if x.name == name][0] - ) - raise ValueError('No item named "{}" exists.'.format(name)) - - def register(self, item, name, priority): - """ - Add an item to the registry with the given name and priority. - - Parameters: - - * `item`: The item being registered. - * `name`: A string used to reference the item. - * `priority`: An integer or float used to sort against all items. - - If an item is registered with a "name" which already exists, the - existing item is replaced with the new item. Treat carefully as the - old item is lost with no way to recover it. The new item will be - sorted according to its priority and will **not** retain the position - of the old item. - """ - if name in self: - # Remove existing item of same name first - self.deregister(name) - self._is_sorted = False - self._data[name] = item - self._priority.append(_PriorityItem(name, priority)) - - def deregister(self, name, strict=True): - """ - Remove an item from the registry. - - Set `strict=False` to fail silently. - """ - try: - index = self.get_index_for_name(name) - del self._priority[index] - del self._data[name] - except ValueError: - if strict: - raise - - def _sort(self): - """ - Sort the registry by priority from highest to lowest. - - This method is called internally and should never be explicitly called. - """ - if not self._is_sorted: - self._priority.sort(key=lambda item: item.priority, reverse=True) - self._is_sorted = True
diff --git a/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules.html b/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules.html new file mode 100644 index 0000000..0187d9ce --- /dev/null +++ b/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules.html
@@ -0,0 +1,56 @@ +<!-- +This tests the overhead added by document rules to style recalc with display +locked elements. It adds 1,000 display-locked divs (with 4 links each), applies +and removes the lock, and forces a style update after. This test can be run with +and without "SpeculationRulesDocumentRulesSelectorMatches" enabled, and the +performance should be comparable. +--> +<!DOCTYPE html> +<head> + <script src="../resources/runner.js"></script> + <style> + #root > * { content-visibility: visible; } + </style> + <script type="speculationrules"> + {"prefetch": [{"source": "document"}]} + </script> +</head> +<body> + <div id="root"></div> +</body> +<script> + const NUM_BLOCKS = 1000; + + function setup() { + let id = 0; + root.innerHTML = ""; + document.styleSheets[0].rules[0].style.contentVisibility = 'visible'; + + for (let i = 0; i < NUM_BLOCKS; i++) { + const block = document.createElement("div"); + block.id = ++id; + block.innerHTML = ` + <a href="/foo.com" id="${++id}">${id}</a> + <a href="/foo.com" id="${++id}">${id}</a> + <a href="/foo.com" id="${++id}">${id}</a> + <a href="/foo.com" id="${++id}">${id}</a> + ` + root.appendChild(block); + } + root.offsetLeft; + } + + function runTest() { + document.styleSheets[0].rules[0].style.contentVisibility = 'hidden'; + root.offsetTop; + + document.styleSheets[0].rules[0].style.contentVisibility = 'visible'; + root.offsetTop; + } + + PerfTestRunner.measureTime({ + setup: setup, + run: runTest, + iterationCount: 10, + }); +</script>
diff --git a/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules_sparse.html b/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules_sparse.html new file mode 100644 index 0000000..163b0a04 --- /dev/null +++ b/third_party/blink/perf_tests/display_locking/link_invalidation_document_rules_sparse.html
@@ -0,0 +1,67 @@ +<!-- +This tests the overhead added by document rules to style recalc with display +locked elements. It adds 25 display-locked divs that have 26 children +(25 divs, 1 link) and 625 (25*25) grandchildren (divs) each. It applies and +removes the lock, and forces a style update after. This test can be run with +and without "SpeculationRulesDocumentRulesSelectorMatches" enabled, and the +performance should be comparable. +--> +<!DOCTYPE html> +<head> + <script src="../resources/runner.js"></script> + <style> + #root > * { content-visibility: visible; } + </style> + <script type="speculationrules"> + {"prefetch": [{"source": "document"}]} + </script> +</head> +<body> + <div id="root"></div> +</body> +<script> + const NUM_BLOCKS = 25; + const NUM_CHILDREN = 25; + const NUM_GRANDCHILDREN = 25; + + function setup() { + let id = 0; + root.innerHTML = ""; + document.styleSheets[0].rules[0].style.contentVisibility = 'visible'; + + for (let i = 0; i < NUM_BLOCKS; i++) { + const block = document.createElement("div"); + for (let j = 0; j < NUM_CHILDREN; j++) { + let child = document.createElement("div"); + for (let k = 0; k < NUM_GRANDCHILDREN; k++) { + let grandchild = document.createElement("div"); + grandchild.id = ++id; + grandchild.innerText = id; + child.appendChild(grandchild); + } + let a = document.createElement("a") + a.href = "/foo.com" + a.id = ++id; + a.innerText = id; + child.appendChild(a); + block.appendChild(child); + } + root.appendChild(block); + } + root.offsetLeft; + } + + function runTest() { + document.styleSheets[0].rules[0].style.contentVisibility = 'hidden'; + root.offsetTop; + + document.styleSheets[0].rules[0].style.contentVisibility = 'visible'; + root.offsetTop; + } + + PerfTestRunner.measureTime({ + setup: setup, + run: runTest, + iterationCount: 10, + }); +</script>
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index d746aab..c32cdd35 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -234,7 +234,6 @@ "platform/web_prescient_networking.h", "platform/web_private_ptr.h", "platform/web_request_peer.h", - "platform/web_resource_request_sender_delegate.h", "platform/web_runtime_features.h", "platform/web_scoped_page_pauser.h", "platform/web_scroll_anchor_data.h",
diff --git a/third_party/blink/public/mojom/payments/payment_request.mojom b/third_party/blink/public/mojom/payments/payment_request.mojom index cd107e2..76daf281 100644 --- a/third_party/blink/public/mojom/payments/payment_request.mojom +++ b/third_party/blink/public/mojom/payments/payment_request.mojom
@@ -230,6 +230,10 @@ string? id; string? stringified_payment_method_errors; + + // Whether the execution context of the payment request has the + // PaymentHandlerMinimalHeaderUX feature enabled, e.g. via origin trial. + bool payment_handler_minimal_header_ux_enabled = false; }; enum PaymentShippingType {
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index e2fb979..7b45e20cd 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -131,7 +131,6 @@ class WebDedicatedWorkerHostFactoryClient; class WebGraphicsContext3DProvider; class WebLocalFrame; -class WebResourceRequestSenderDelegate; class WebSandboxSupport; class WebSecurityOrigin; class WebThemeEngine; @@ -275,11 +274,6 @@ return false; } - // Returns the WebResourceRequestSenderDelegate of this renderer. - virtual WebResourceRequestSenderDelegate* GetResourceRequestSenderDelegate() { - return nullptr; - } - // Appends throttles if the browser has sent a variations header to the // renderer. virtual void AppendVariationsThrottles(
diff --git a/third_party/blink/public/platform/web_resource_request_sender_delegate.h b/third_party/blink/public/platform/web_resource_request_sender_delegate.h deleted file mode 100644 index 2ab17d23..0000000 --- a/third_party/blink/public/platform/web_resource_request_sender_delegate.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_RESOURCE_REQUEST_SENDER_DELEGATE_H_ -#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_RESOURCE_REQUEST_SENDER_DELEGATE_H_ - -#include "third_party/blink/public/platform/web_common.h" - -namespace blink { -class WebRequestPeer; -class WebString; -class WebURL; - -// Interface that allows observing request events and optionally replacing -// the peer. Note that if it doesn't replace the peer it must return the -// current peer so that the ownership is continued to be held by -// ResourceRequestSender. -class BLINK_PLATFORM_EXPORT WebResourceRequestSenderDelegate { - public: - virtual ~WebResourceRequestSenderDelegate() = default; - - virtual void OnRequestComplete() = 0; - - // Note that |url| is the final values (e.g. after any redirects). - virtual scoped_refptr<WebRequestPeer> OnReceivedResponse( - scoped_refptr<WebRequestPeer> current_peer, - const WebString& mime_type, - const WebURL& url) = 0; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_RESOURCE_REQUEST_SENDER_DELEGATE_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc b/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc index 06ac69c..b63ba29 100644 --- a/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc +++ b/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc
@@ -28,11 +28,15 @@ std::move(stack_trace)); } - LocalDOMWindow* window = DynamicTo<LocalDOMWindow>(execution_context); - Document* document = window ? window->document() : nullptr; - // window->document() may be null in rare cases (e.g. during header parsing). - if (document) { - unsigned line_number = 0; + unsigned line_number = 0; + if (LocalDOMWindow* window = DynamicTo<LocalDOMWindow>(execution_context)) { + Document* document = window->document(); + // window->document() may be null in rare cases (e.g. during header + // parsing). + if (!document) { + return std::make_unique<SourceLocation>(String(), String(), 0, 0, + std::move(stack_trace)); + } if (document->GetScriptableDocumentParser() && !document->IsInDocumentWrite()) { if (document->GetScriptableDocumentParser()->IsParsingAtLineNumber()) { @@ -40,14 +44,11 @@ document->GetScriptableDocumentParser()->LineNumber().OneBasedInt(); } } - return std::make_unique<SourceLocation>(document->Url().GetString(), - String(), line_number, 0, - std::move(stack_trace)); } return std::make_unique<SourceLocation>( execution_context ? execution_context->Url().GetString() : String(), - String(), 0, 0, std::move(stack_trace)); + String(), line_number, 0, std::move(stack_trace)); } std::unique_ptr<SourceLocation> CaptureSourceLocation( @@ -57,21 +58,25 @@ v8::Local<v8::StackTrace> stack = message->GetStackTrace(); std::unique_ptr<v8_inspector::V8StackTrace> stack_trace; ThreadDebugger* debugger = ThreadDebugger::From(isolate); - if (debugger) + if (debugger) { stack_trace = debugger->GetV8Inspector()->createStackTrace(stack); + } int script_id = message->GetScriptOrigin().ScriptId(); if (!stack.IsEmpty() && stack->GetFrameCount() > 0) { int top_script_id = stack->GetFrame(isolate, 0)->GetScriptId(); - if (top_script_id == script_id) + if (top_script_id == script_id) { script_id = 0; + } } int line_number = 0; int column_number = 0; if (message->GetLineNumber(isolate->GetCurrentContext()).To(&line_number) && - message->GetStartColumn(isolate->GetCurrentContext()).To(&column_number)) + message->GetStartColumn(isolate->GetCurrentContext()) + .To(&column_number)) { ++column_number; + } if ((!script_id || !line_number) && stack_trace && !stack_trace->isEmpty()) { return SourceLocation::CreateFromNonEmptyV8StackTraceInternal( @@ -80,8 +85,9 @@ String url = ToCoreStringWithUndefinedOrNullCheck( message->GetScriptOrigin().ResourceName()); - if (url.empty()) + if (url.empty()) { url = execution_context->Url(); + } return std::make_unique<SourceLocation>(url, String(), line_number, column_number, std::move(stack_trace), script_id);
diff --git a/third_party/blink/renderer/core/annotation/annotation_agent_impl.cc b/third_party/blink/renderer/core/annotation/annotation_agent_impl.cc index 9d517ca..7b348f1 100644 --- a/third_party/blink/renderer/core/annotation/annotation_agent_impl.cc +++ b/third_party/blink/renderer/core/annotation/annotation_agent_impl.cc
@@ -129,7 +129,7 @@ EphemeralRangeInFlatTree range = attached_range_->ToEphemeralRange(); - DCHECK(range.Nodes().begin() != range.Nodes().end()); + CHECK(range.Nodes().begin() != range.Nodes().end()); Node& first_node = *range.Nodes().begin();
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 98fdaf8..5e20b62d 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -32,6 +32,7 @@ #include "third_party/blink/renderer/core/page/page_animator.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/pre_paint_tree_walk.h" +#include "third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h" #include "third_party/blink/renderer/core/style/toggle_trigger.h" #include "third_party/blink/renderer/core/view_transition/view_transition_utils.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h" @@ -964,6 +965,11 @@ DCHECK(!element_->GetComputedStyle()); SetRequestedState(EContentVisibility::kVisible, g_null_atom); + if (auto* document_rules = + DocumentSpeculationRules::FromIfExists(*document_)) { + document_rules->DisplayLockedElementDisconnected(element_); + } + // blocked_child_recalc_change_ must be cleared because things can be in an // inconsistent state when we add the element back (e.g. crbug.com/1262742). blocked_child_recalc_change_ = StyleRecalcChange();
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 9aabd10..4aa4d07f 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -66,6 +66,7 @@ #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/public/mojom/page_state/page_state.mojom-blink.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink-forward.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_content_settings_client.h" @@ -324,6 +325,7 @@ #include "third_party/blink/renderer/platform/bindings/exception_messages.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/source_location.h" #include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h" #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" @@ -6078,8 +6080,7 @@ data_->permission_service_.reset(); } -// TODO(crbug.com/1401089): This method currently always returns false since -// nothing sets the HasStorageAccess member in `dom_window_`. It's not tied +// TODO(crbug.com/1401089): The caller of this method is not tied // to an end point yet thus not affecting current behavior. bool Document::HasStorageAccess() const { DCHECK(GetExecutionContext()); @@ -6090,7 +6091,7 @@ // https://privacycg.github.io/storage-access/#dom-document-hasstorageaccess. // #3: if doc's origin is opaque, return false. - if (!GetExecutionContext()->GetSecurityOrigin()->IsOpaque()) { + if (GetExecutionContext()->GetSecurityOrigin()->IsOpaque()) { return false; } @@ -6121,8 +6122,6 @@ return dom_window_->HasStorageAccess(); } -// TODO(crbug.com/1401089): Update the method to return the result from -// `HasStorageAccess()`; ScriptPromise Document::hasStorageAccess(ScriptState* script_state) { if (!GetFrame()) { // Note that in detached frames, resolvers are not able to return a promise. @@ -6133,20 +6132,11 @@ "document is fully active.")); } - const bool has_access = - TopFrameOrigin() && GetExecutionContext() && - !GetExecutionContext()->GetSecurityOrigin()->IsOpaque() && - dom_window_->isSecureContext() && - (IsInOutermostMainFrame() || - (!TopFrameOrigin()->IsOpaque() && - (GetExecutionContext()->GetSecurityOrigin()->IsSameOriginWith( - &*TopFrameOrigin()) || - CookiesEnabled()))); ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); - resolver->Resolve(has_access); + resolver->Resolve(HasStorageAccess()); return promise; } @@ -6276,7 +6266,6 @@ switch (status) { case mojom::blink::PermissionStatus::GRANTED: - document->expressly_denied_storage_access_ = false; FireRequestStorageAccessForOriginHistogram( RequestStorageResult::APPROVED_NEW_GRANT); resolver->Resolve(); @@ -6284,7 +6273,6 @@ case mojom::blink::PermissionStatus::DENIED: LocalFrame::ConsumeTransientUserActivation( document->GetFrame()); - document->expressly_denied_storage_access_ = true; [[fallthrough]]; case mojom::blink::PermissionStatus::ASK: default: @@ -6343,23 +6331,6 @@ // If this is the outermost frame we no longer need to make a request and // can resolve the promise. resolver->Resolve(); - dom_window_->SetHasStorageAccess(); - return promise; - } - - const bool has_user_gesture = - LocalFrame::HasTransientUserActivation(GetFrame()); - if (!has_user_gesture) { - AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kSecurity, - mojom::blink::ConsoleMessageLevel::kError, - "requestStorageAccess: Must be handling a user gesture to use.")); - FireRequestStorageAccessHistogram( - RequestStorageResult::REJECTED_NO_USER_GESTURE); - - resolver->Reject(V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, - "requestStorageAccess not allowed")); return promise; } @@ -6410,59 +6381,114 @@ return promise; } - if (expressly_denied_storage_access_) { + if (HasStorageAccess()) { FireRequestStorageAccessHistogram( - RequestStorageResult::REJECTED_EXISTING_DENIAL); + RequestStorageResult::APPROVED_EXISTING_ACCESS); - // If a previous rejection has been received the promise can be immediately - // rejected without further action. - resolver->Reject(V8ThrowDOMException::CreateOrEmpty( - script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, - "requestStorageAccess not allowed")); + // If there is current access to storage for this document we no longer need + // to make a request and can resolve the promise. + resolver->Resolve(); return promise; } auto descriptor = mojom::blink::PermissionDescriptor::New(); descriptor->name = mojom::blink::PermissionName::STORAGE_ACCESS; GetPermissionService(ExecutionContext::From(script_state)) - ->RequestPermission( - std::move(descriptor), has_user_gesture, - WTF::BindOnce( - [](ScriptPromiseResolver* resolver, Document* document, - mojom::blink::PermissionStatus status) { - DCHECK(resolver); - DCHECK(document->GetFrame()); - - switch (status) { - case mojom::blink::PermissionStatus::GRANTED: - document->expressly_denied_storage_access_ = false; - FireRequestStorageAccessHistogram( - RequestStorageResult::APPROVED_NEW_GRANT); - document->dom_window_->SetHasStorageAccess(); - resolver->Resolve(); - break; - case mojom::blink::PermissionStatus::DENIED: - LocalFrame::ConsumeTransientUserActivation( - document->GetFrame()); - document->expressly_denied_storage_access_ = true; - [[fallthrough]]; - case mojom::blink::PermissionStatus::ASK: - default: - FireRequestStorageAccessHistogram( - RequestStorageResult::REJECTED_GRANT_DENIED); - ScriptState* state = resolver->GetScriptState(); - DCHECK(state->ContextIsValid()); - ScriptState::Scope scope(state); - resolver->Reject(V8ThrowDOMException::CreateOrEmpty( - state->GetIsolate(), DOMExceptionCode::kNotAllowedError, - "requestStorageAccess not allowed")); - } - }, - WrapPersistent(resolver), WrapPersistent(this))); + ->HasPermission( + std::move(descriptor), + WTF::BindOnce(&Document::OnGotExistingStorageAccessPermissionState, + WrapPersistent(this), WrapPersistent(resolver), + LocalFrame::HasTransientUserActivation(GetFrame()))); return promise; } +void Document::OnGotExistingStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + bool has_user_gesture, + mojom::blink::PermissionStatus previous_status) { + DCHECK(resolver); + DCHECK(GetFrame()); + ScriptState* script_state = resolver->GetScriptState(); + DCHECK(script_state); + ScriptState::Scope scope(script_state); + + if (previous_status != mojom::blink::PermissionStatus::ASK) { + // Permission state already exists, resolve with the existing value. + ProcessStorageAccessPermissionState(resolver, /*use_existing_status=*/true, + previous_status); + return; + } + // Proceed to request permission. + if (!has_user_gesture) { + AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kSecurity, + mojom::blink::ConsoleMessageLevel::kError, + "requestStorageAccess: Must be handling a user gesture to use.")); + FireRequestStorageAccessHistogram( + RequestStorageResult::REJECTED_NO_USER_GESTURE); + + resolver->Reject(V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, + "requestStorageAccess not allowed")); + return; + } + + auto descriptor = mojom::blink::PermissionDescriptor::New(); + descriptor->name = mojom::blink::PermissionName::STORAGE_ACCESS; + GetPermissionService(ExecutionContext::From(resolver->GetScriptState())) + ->RequestPermission( + std::move(descriptor), has_user_gesture, + WTF::BindOnce(&Document::OnRequestedStorageAccessPermissionState, + WrapPersistent(this), WrapPersistent(resolver))); +} + +void Document::OnRequestedStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + mojom::blink::PermissionStatus status) { + DCHECK(resolver); + DCHECK(GetFrame()); + ScriptState* script_state = resolver->GetScriptState(); + DCHECK(script_state); + ScriptState::Scope scope(script_state); + + ProcessStorageAccessPermissionState(resolver, + /*use_existing_status=*/false, status); +} + +void Document::ProcessStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + bool use_existing_status, + mojom::blink::PermissionStatus status) { + DCHECK(resolver); + DCHECK(GetFrame()); + + if (status == mojom::blink::PermissionStatus::GRANTED) { + if (use_existing_status) { + FireRequestStorageAccessHistogram( + RequestStorageResult::APPROVED_EXISTING_ACCESS); + } else { + FireRequestStorageAccessHistogram( + RequestStorageResult::APPROVED_NEW_GRANT); + } + dom_window_->SetHasStorageAccess(); + resolver->Resolve(); + } else { + LocalFrame::ConsumeTransientUserActivation(GetFrame()); + FireRequestStorageAccessHistogram( + RequestStorageResult::REJECTED_GRANT_DENIED); + AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kSecurity, + mojom::blink::ConsoleMessageLevel::kError, + "requestStorageAccess: Permission denied.")); + ScriptState* script_state = resolver->GetScriptState(); + DCHECK(script_state); + resolver->Reject(V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, + "requestStorageAccess not allowed")); + } +} + FragmentDirective& Document::fragmentDirective() const { return *fragment_directive_; }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index c5c61af..5f5246f1 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -50,6 +50,7 @@ #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/page/page.mojom-blink-forward.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink-forward.h" #include "third_party/blink/public/mojom/permissions_policy/document_policy_feature.mojom-blink-forward.h" #include "third_party/blink/public/mojom/scroll/scrollbar_mode.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" @@ -217,6 +218,7 @@ class SVGUseElement; class ScriptElementBase; class ScriptPromise; +class ScriptPromiseResolver; class ScriptRegexp; class ScriptRunner; class ScriptRunnerDelayer; @@ -2139,6 +2141,27 @@ void RunPostPrerenderingActivationSteps(); + // Resolves/rejects the promise if an existing permission grant can + // approve/deny; otherwise rejects if without user gesture, or + // resolves/rejects based on the requested status. + void OnGotExistingStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + bool has_user_gesture, + mojom::blink::PermissionStatus previous_status); + + // Wraps `ProcessStorageAccessPermissionState` to handle the requested + // permission status. + void OnRequestedStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + mojom::blink::PermissionStatus status); + + // Resolves the promise if the `status` can approve; rejects the promise + // otherwise, and consumes user activation. + void ProcessStorageAccessPermissionState( + ScriptPromiseResolver* resolver, + bool use_existing_status, + mojom::blink::PermissionStatus status); + const DocumentToken token_; // Bitfield used for tracking UKM sampling of media features such that each @@ -2565,11 +2588,6 @@ bool dir_attribute_dirty_ = false; - // To reduce the API noisiness an explicit deny decision will set a - // flag that auto rejects the promise without the need for an IPC - // call or potential user prompt. - bool expressly_denied_storage_access_ = false; - // True if the developer supplied a media query indicating that // the site has support for reduced motion. bool supports_reduced_motion_ = false;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 3dc6595..01de411 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -244,6 +244,10 @@ if (auto* context = element_->GetDisplayLockContext()) { if (did_update_children_) { context->DidStyleChildren(); + if (auto* document_rules = DocumentSpeculationRules::FromIfExists( + element_->GetDocument())) { + document_rules->DidStyleChildren(element_); + } } } } @@ -274,6 +278,10 @@ DCHECK(element_->GetDisplayLockContext()); element_->GetDisplayLockContext()->NotifyChildStyleRecalcWasBlocked(change); + if (auto* document_rules = + DocumentSpeculationRules::FromIfExists(element_->GetDocument())) { + document_rules->ChildStyleRecalcBlocked(element_); + } } private:
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 f218293a..c41a47f 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2934,7 +2934,8 @@ bool repainted = false; bool needs_clear_repaint_flags = false; - PaintChunkSubset previous_chunks(paint_controller_->GetPaintArtifactShared()); + scoped_refptr<const PaintArtifact> previous_artifact = + paint_controller_->GetPaintArtifactShared(); PaintController::ScopedBenchmarkMode scoped_benchmark(*paint_controller_, benchmark_mode); @@ -2973,7 +2974,7 @@ repainted = true; if (paint_artifact_compositor_) { paint_artifact_compositor_->SetNeedsFullUpdateAfterPaintIfNeeded( - previous_chunks, paint_controller_->GetPaintArtifactShared()); + *previous_artifact, paint_controller_->GetPaintArtifact()); } }
diff --git a/third_party/blink/renderer/core/input/keyboard_event_manager.cc b/third_party/blink/renderer/core/input/keyboard_event_manager.cc index cebd778..d335fa8 100644 --- a/third_party/blink/renderer/core/input/keyboard_event_manager.cc +++ b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
@@ -48,6 +48,18 @@ const int kVKeyProcessKey = 229; +bool IsPageUpOrDownKeyEvent(int key_code, WebInputEvent::Modifiers modifiers) { + if (modifiers & WebInputEvent::kAltKey) { + // Alt-Up/Down should behave like PageUp/Down on Mac. (Note that Alt-keys + // on other platforms are suppressed due to isSystemKey being set.) + return key_code == VKEY_UP || key_code == VKEY_DOWN; + } else if (key_code == VKEY_PRIOR || key_code == VKEY_NEXT) { + return modifiers == WebInputEvent::kNoModifiers; + } + + return false; +} + bool MapKeyCodeForScroll(int key_code, WebInputEvent::Modifiers modifiers, mojom::blink::ScrollDirection* scroll_direction, @@ -450,7 +462,8 @@ } if (IsSpatialNavigationEnabled(frame_) && - !frame_->GetDocument()->InDesignMode()) { + !frame_->GetDocument()->InDesignMode() && + !IsPageUpOrDownKeyEvent(event->keyCode(), event->GetModifiers())) { if (page->GetSpatialNavigationController().HandleArrowKeyboardEvent( event)) { event->SetDefaultHandled();
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_rect.h b/third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_rect.h index 8c1b14bb..bcf38ffb 100644 --- a/third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_rect.h +++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_rect.h
@@ -34,8 +34,10 @@ return end_offset.block_offset - start_offset.block_offset; } LayoutUnit InlineSize() const { - if (end_offset.line_offset == LayoutUnit::Max()) - return LayoutUnit::Max(); + if (end_offset.line_offset == LayoutUnit::Max()) { + return start_offset.line_offset == LayoutUnit::Max() ? LayoutUnit() + : LayoutUnit::Max(); + } return end_offset.line_offset - start_offset.line_offset; }
diff --git a/third_party/blink/renderer/core/navigation_api/navigate_event.cc b/third_party/blink/renderer/core/navigation_api/navigate_event.cc index 74356a7b..cbb8134 100644 --- a/third_party/blink/renderer/core/navigation_api/navigate_event.cc +++ b/third_party/blink/renderer/core/navigation_api/navigate_event.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/html/forms/form_data.h" #include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/navigation_api/navigation_destination.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -59,7 +60,7 @@ if (!can_intercept_) { exception_state.ThrowSecurityError( - "A navigation with URL '" + url_.ElidedString() + + "A navigation with URL '" + dispatch_params_->url.ElidedString() + "' cannot be intercepted by in a window with origin '" + DomWindow()->GetSecurityOrigin()->ToString() + "' and URL '" + DomWindow()->Url().ElidedString() + "'."); @@ -120,6 +121,25 @@ navigation_action_handlers_list_.push_back(options->handler()); } +void NavigateEvent::DoCommit() { + DCHECK(!dispatch_params_->destination_item || + !dispatch_params_->state_object); + auto* state_object = dispatch_params_->destination_item + ? dispatch_params_->destination_item->StateObject() + : dispatch_params_->state_object.get(); + + // In the spec, the URL and history update steps are not called for reloads. + // In our implementation, we call the corresponding function anyway, but + // |type| being a reload type makes it do none of the spec-relevant + // steps. Instead it does stuff like the loading spinner and use counters. + DomWindow()->document()->Loader()->RunURLAndHistoryUpdateSteps( + dispatch_params_->url, dispatch_params_->destination_item, + mojom::blink::SameDocumentNavigationType::kNavigationApiIntercept, + state_object, dispatch_params_->frame_load_type, + dispatch_params_->is_browser_initiated, + dispatch_params_->is_synchronously_committed_same_document); +} + void NavigateEvent::FinalizeNavigationActionPromisesList() { for (auto& function : navigation_action_handlers_list_) { ScriptPromise result; @@ -205,11 +225,6 @@ DefinitelyProcessScrollBehavior(); } -void NavigateEvent::SaveStateFromDestinationItem(HistoryItem* item) { - if (item) - history_item_view_state_ = item->GetViewState(); -} - WebFrameLoadType LoadTypeFromNavigation(const String& navigation_type) { if (navigation_type == "push") return WebFrameLoadType::kStandard; @@ -226,13 +241,19 @@ void NavigateEvent::DefinitelyProcessScrollBehavior() { DCHECK(!did_process_scroll_behavior_); did_process_scroll_behavior_ = true; + + absl::optional<HistoryItem::ViewState> view_state = + dispatch_params_->destination_item + ? dispatch_params_->destination_item->GetViewState() + : absl::nullopt; + // Use mojom::blink::ScrollRestorationType::kAuto unconditionally here // because we are certain that we want to actually scroll if we reach this // point. Using mojom::blink::ScrollRestorationType::kManual would block the // scroll. DomWindow()->GetFrame()->Loader().ProcessScrollForSameDocumentNavigation( - url_, LoadTypeFromNavigation(navigation_type_), history_item_view_state_, - mojom::blink::ScrollRestorationType::kAuto); + dispatch_params_->url, LoadTypeFromNavigation(navigation_type_), + view_state, mojom::blink::ScrollRestorationType::kAuto); } const AtomicString& NavigateEvent::InterfaceName() const { @@ -242,6 +263,7 @@ void NavigateEvent::Trace(Visitor* visitor) const { Event::Trace(visitor); ExecutionContextClient::Trace(visitor); + visitor->Trace(dispatch_params_); visitor->Trace(destination_); visitor->Trace(signal_); visitor->Trace(form_data_);
diff --git a/third_party/blink/renderer/core/navigation_api/navigate_event.h b/third_party/blink/renderer/core/navigation_api/navigate_event.h index a977df4..29071507 100644 --- a/third_party/blink/renderer/core/navigation_api/navigate_event.h +++ b/third_party/blink/renderer/core/navigation_api/navigate_event.h
@@ -47,7 +47,9 @@ const AtomicString& type, NavigateEventInit* init); - void SetUrl(const KURL& url) { url_ = url; } + void SetDispatchParams(NavigateEventDispatchParams* dispatch_params) { + dispatch_params_ = dispatch_params; + } String navigationType() { return navigation_type_; } NavigationDestination* destination() { return destination_; } @@ -61,6 +63,8 @@ void intercept(NavigationInterceptOptions*, ExceptionState&); + void DoCommit(); + void scroll(ExceptionState&); void PotentiallyProcessScrollBehavior(); @@ -73,8 +77,6 @@ void ResetFocusIfNeeded(); bool ShouldSendAxEvents() const; - void SaveStateFromDestinationItem(HistoryItem*); - // FocusedElementChangeObserver implementation: void DidChangeFocus() final; @@ -95,9 +97,9 @@ ScriptValue info_; absl::optional<V8NavigationFocusReset> focus_reset_behavior_ = absl::nullopt; absl::optional<V8NavigationScrollBehavior> scroll_behavior_ = absl::nullopt; - absl::optional<HistoryItem::ViewState> history_item_view_state_; - KURL url_; + Member<NavigateEventDispatchParams> dispatch_params_; + bool has_navigation_actions_ = false; HeapVector<ScriptPromise> navigation_action_promises_list_; HeapVector<Member<V8NavigationInterceptHandler>>
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_api.cc b/third_party/blink/renderer/core/navigation_api/navigation_api.cc index 61ed0bb..b18d8405 100644 --- a/third_party/blink/renderer/core/navigation_api/navigation_api.cc +++ b/third_party/blink/renderer/core/navigation_api/navigation_api.cc
@@ -838,8 +838,7 @@ } auto* navigate_event = NavigateEvent::Create(window_, event_type_names::kNavigate, init); - navigate_event->SetUrl(params->url); - navigate_event->SaveStateFromDestinationItem(params->destination_item); + navigate_event->SetDispatchParams(params); DCHECK(!ongoing_navigate_event_); ongoing_navigate_event_ = navigate_event; @@ -860,21 +859,7 @@ if (navigate_event->HasNavigationActions()) { transition_ = MakeGarbageCollected<NavigationTransition>( script_state, navigation_type, currentEntry()); - - DCHECK(!params->destination_item || !params->state_object); - auto* state_object = params->destination_item - ? params->destination_item->StateObject() - : params->state_object.get(); - - // In the spec, the URL and history update steps are not called for reloads. - // In our implementation, we call the corresponding function anyway, but - // |type| being a reload type makes it do none of the spec-relevant - // steps. Instead it does stuff like the loading spinner and use counters. - window_->document()->Loader()->RunURLAndHistoryUpdateSteps( - params->url, params->destination_item, - mojom::blink::SameDocumentNavigationType::kNavigationApiIntercept, - state_object, params->frame_load_type, params->is_browser_initiated, - params->is_synchronously_committed_same_document); + navigate_event->DoCommit(); // This is considered a soft navigation URL change at this point, when the // user visible URL change happens, and before the interception handler
diff --git a/third_party/blink/renderer/core/paint/paint_controller_paint_test.h b/third_party/blink/renderer/core/paint/paint_controller_paint_test.h index a2b3570..dcb4473 100644 --- a/third_party/blink/renderer/core/paint/paint_controller_paint_test.h +++ b/third_party/blink/renderer/core/paint/paint_controller_paint_test.h
@@ -120,10 +120,15 @@ begin_index++; } while (end_index > begin_index && - IsNotContentType(chunks[end_index - 1].id.type)) + IsNotContentType(chunks[end_index - 1].id.type)) { end_index--; - return PaintChunkSubset(RootPaintController().GetPaintArtifactShared(), - begin_index, end_index); + } + auto artifact = RootPaintController().GetPaintArtifactShared(); + PaintChunkSubset subset(artifact, chunks[begin_index]); + for (wtf_size_t i = begin_index + 1; i < end_index; i++) { + subset.Merge(PaintChunkSubset(artifact, chunks[i])); + } + return subset; } };
diff --git a/third_party/blink/renderer/core/speculation_rules/document_rule_predicate.cc b/third_party/blink/renderer/core/speculation_rules/document_rule_predicate.cc index 592fa942..773f6bf 100644 --- a/third_party/blink/renderer/core/speculation_rules/document_rule_predicate.cc +++ b/third_party/blink/renderer/core/speculation_rules/document_rule_predicate.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_url_pattern_init.h" #include "third_party/blink/renderer/core/css/parser/css_parser.h" #include "third_party/blink/renderer/core/css/style_rule.h" +#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -229,9 +230,7 @@ DCHECK(!link.GetDocument().NeedsLayoutTreeUpdate()); const ComputedStyle* computed_style = link.GetComputedStyle(); DCHECK(computed_style); - // TODO(crbug.com/1371522): If the link has a display-locked ancestor, - // it will have a ComputedStyle with a stale list of matched selectors - // (styling is skipped but the old ComputedStyle is still kept). + DCHECK(!DisplayLockUtilities::LockedAncestorPreventingStyle(link)); const Persistent<HeapHashSet<WeakMember<StyleRule>>>& matched_selectors = computed_style->DocumentRulesSelectors(); if (!matched_selectors) {
diff --git a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc index f80048b..de05bfe 100644 --- a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc +++ b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
@@ -10,6 +10,8 @@ #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/css/style_rule.h" +#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" +#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/shadow_including_tree_order_traversal.h" #include "third_party/blink/renderer/core/execution_context/agent.h" @@ -325,6 +327,94 @@ } } +void DocumentSpeculationRules::ChildStyleRecalcBlocked(Element* root) { + if (!SelectorMatchesEnabled() || !initialized_) { + return; + } + + if (!elements_blocking_child_style_recalc_.insert(root).is_new_entry) { + return; + } + + bool queue_update = false; + + Node* node = FlatTreeTraversal::Next(*root, root); + while (node) { + if (node->IsLink() && (node->HasTagName(html_names::kATag) || + node->HasTagName(html_names::kAreaTag))) { + HTMLAnchorElement* anchor = node->HasTagName(html_names::kATag) + ? To<HTMLAnchorElement>(node) + : To<HTMLAreaElement>(node); + if (stale_links_.insert(anchor).is_new_entry) { + InvalidateLink(anchor); + queue_update = true; + } + } + + // If |node| is an element that is already marked as blocking child style + // recalc, we don't need to traverse its subtree (all of its children should + // already be accounted for). + if (auto* element = DynamicTo<Element>(node); + element && elements_blocking_child_style_recalc_.Contains(element)) { + node = FlatTreeTraversal::NextSkippingChildren(*node, root); + continue; + } + + node = FlatTreeTraversal::Next(*node, root); + } + + if (queue_update) { + QueueUpdateSpeculationCandidates(); + } +} + +void DocumentSpeculationRules::DidStyleChildren(Element* root) { + if (!SelectorMatchesEnabled() || !initialized_) { + return; + } + + if (!elements_blocking_child_style_recalc_.Take(root)) { + return; + } + + bool queue_update = false; + + Node* node = FlatTreeTraversal::Next(*root, root); + while (node) { + if (node->IsLink() && (node->HasTagName(html_names::kATag) || + node->HasTagName(html_names::kAreaTag))) { + HTMLAnchorElement* anchor = node->HasTagName(html_names::kATag) + ? To<HTMLAnchorElement>(node) + : To<HTMLAreaElement>(node); + if (auto it = stale_links_.find(anchor); it != stale_links_.end()) { + stale_links_.erase(it); + InvalidateLink(anchor); + queue_update = true; + } + } + + // If |node| is a display-locked element that is already marked as blocking + // child style recalc, we don't need to traverse its children. + if (auto* element = DynamicTo<Element>(node); + element && elements_blocking_child_style_recalc_.Contains(element)) { + node = FlatTreeTraversal::NextSkippingChildren(*node, root); + continue; + } + + node = FlatTreeTraversal::Next(*node, root); + } + + if (queue_update) { + QueueUpdateSpeculationCandidates(); + } +} + +void DocumentSpeculationRules::DisplayLockedElementDisconnected(Element* root) { + elements_blocking_child_style_recalc_.erase(root); + // Note: We don't queue an update or invalidate any links here because + // |root|'s children will also be disconnected shortly after this. +} + void DocumentSpeculationRules::Trace(Visitor* visitor) const { Supplement::Trace(visitor); visitor->Trace(rule_sets_); @@ -333,6 +423,8 @@ visitor->Trace(matched_links_); visitor->Trace(unmatched_links_); visitor->Trace(pending_links_); + visitor->Trace(stale_links_); + visitor->Trace(elements_blocking_child_style_recalc_); visitor->Trace(selectors_); } @@ -473,20 +565,27 @@ ExecutionContext* execution_context = GetSupplementable()->GetExecutionContext(); DCHECK(execution_context); - const bool selector_matches_enabled = SelectorMatchesEnabled(); const auto push_link_candidates = - [&link, &link_candidates, &execution_context, - &selector_matches_enabled]( + [&link, &link_candidates, &execution_context, this]( mojom::blink::SpeculationAction action, const HeapVector<Member<SpeculationRule>>& speculation_rules) { - // We exclude links that don't have a ComputedStyle stored (or have a - // ComputedStyle only because EnsureComputedStyle was called, and - // otherwise wouldn't). This corresponds to links that are not in the - // flat tree or links with a "display: none" inclusive-ancestor. - if (selector_matches_enabled && - ComputedStyle::IsNullOrEnsured(link->GetComputedStyle())) { - return; + if (SelectorMatchesEnabled()) { + // We exclude links that don't have a ComputedStyle stored (or have + // a ComputedStyle only because EnsureComputedStyle was called, and + // otherwise wouldn't). This corresponds to links that are not in + // the flat tree or links with a "display: none" inclusive-ancestor. + if (ComputedStyle::IsNullOrEnsured(link->GetComputedStyle())) { + return; + } + + // Links with display locked ancestors can have a stale + // ComputedStyle, i.e. a ComputedStyle that wasn't updated during a + // style update because the element isn't currently being rendered, + // but is not discarded either. We ignore these links as well. + if (stale_links_.Contains(link)) { + return; + } } for (SpeculationRule* rule : speculation_rules) { @@ -578,12 +677,20 @@ DCHECK(!base::Contains(unmatched_links_, link)); DCHECK(!base::Contains(matched_links_, link)); DCHECK(!base::Contains(pending_links_, link)); + DCHECK(!base::Contains(stale_links_, link)); pending_links_.insert(link); + // TODO(crbug.com/1371522): A stale link is guaranteed to not match, so we + // should put it into |unmatched_links_| directly and skip queueing an update. + if (SelectorMatchesEnabled() && + DisplayLockUtilities::LockedAncestorPreventingStyle(*link)) { + stale_links_.insert(link); + } } void DocumentSpeculationRules::RemoveLink(HTMLAnchorElement* link) { DCHECK(initialized_); + stale_links_.erase(link); if (auto it = matched_links_.find(link); it != matched_links_.end()) { matched_links_.erase(it);
diff --git a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h index a730c82f3..fb28864 100644 --- a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h +++ b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h
@@ -58,6 +58,9 @@ void LinkMatchedSelectorsUpdated(HTMLAnchorElement* link); void LinkGainedOrLostComputedStyle(HTMLAnchorElement* link); void DocumentStyleUpdated(); + void ChildStyleRecalcBlocked(Element* root); + void DidStyleChildren(Element* root); + void DisplayLockedElementDisconnected(Element* root); const HeapVector<Member<StyleRule>>& selectors() { return selectors_; } @@ -134,6 +137,11 @@ HeapHashSet<Member<HTMLAnchorElement>> unmatched_links_; HeapHashSet<Member<HTMLAnchorElement>> pending_links_; + // Links with ComputedStyle that wasn't updated after the most recent style + // update (due to having a display-locked ancestor). + HeapHashSet<Member<HTMLAnchorElement>> stale_links_; + HeapHashSet<Member<Element>> elements_blocking_child_style_recalc_; + // Collects every CSS selector from every CSS selector document rule predicate // in this document's speculation rules. HeapVector<Member<StyleRule>> selectors_;
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc index c3b23875..6fa50701 100644 --- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc +++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
@@ -3116,6 +3116,382 @@ EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/two"))); } +TEST_F(DocumentRulesTest, LinkInsideDisplayLockedElement) { + ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest + enabled_selector_matches{true}; + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"></div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + AddAnchor(*important_section, "https://foo.com/bar"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"selector_matches": "#important-section a"} + }]} + )"; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + }); + EXPECT_THAT(candidates, HasURLs()); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + }); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); +} + +TEST_F(DocumentRulesTest, LinkInsideNestedDisplayLockedElement) { + ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest + enabled_selector_matches{true}; + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"> + <div id="links"></div> + </div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + auto* links = document.getElementById("links"); + AddAnchor(*links, "https://foo.com/bar"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"selector_matches": "#important-section a"} + }]} + )"; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + // Scenario 1: Lock links, lock important-section, unlock important-section, + // unlock links. + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + links->SetInlineStyleProperty(CSSPropertyID::kContentVisibility, + CSSValueID::kHidden); + }); + EXPECT_THAT(candidates, HasURLs()); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + links->RemoveInlineStyleProperty(CSSPropertyID::kContentVisibility); + }); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + // Scenario 2: Lock links, lock important-section, unlock links, unlock + // important-section. + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + links->SetInlineStyleProperty(CSSPropertyID::kContentVisibility, + CSSValueID::kHidden); + }); + EXPECT_THAT(candidates, HasURLs()); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + links->RemoveInlineStyleProperty(CSSPropertyID::kContentVisibility); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + }); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + // Scenario 3: Lock important-section, lock links, unlock important-section, + // unlock links. + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + }); + EXPECT_THAT(candidates, HasURLs()); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + links->SetInlineStyleProperty(CSSPropertyID::kContentVisibility, + CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + links->RemoveInlineStyleProperty(CSSPropertyID::kContentVisibility); + }); + + // Scenario 4: Lock links and important-section together, unlock links and + // important-section together. + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + links->SetInlineStyleProperty(CSSPropertyID::kContentVisibility, + CSSValueID::kHidden); + }); + EXPECT_THAT(candidates, HasURLs()); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + links->RemoveInlineStyleProperty(CSSPropertyID::kContentVisibility); + }); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); +} + +TEST_F(DocumentRulesTest, DisplayLockedLink) { + ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest + enabled_selector_matches{true}; + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"></div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + auto* anchor = AddAnchor(*important_section, "https://foo.com/bar"); + anchor->setInnerText("Bar"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"selector_matches": "#important-section a"} + }]} + )"; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + anchor->SetInlineStyleProperty(CSSPropertyID::kContentVisibility, + CSSValueID::kHidden); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + anchor->RemoveInlineStyleProperty(CSSPropertyID::kContentVisibility); + }); +} + +// Sanity test to make sure things work when display-locked elements are +// present but "selector_matches" isn't enabled. +TEST_F(DocumentRulesTest, DisplayLockedElementWithoutSelectorMatchesEnabled) { + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"> + </div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + AddAnchor(*important_section, "https://bar.com/foo"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"href_matches": "https://bar.com/*"} + }]} + )"; + PropagateRulesToStubSpeculationHost(page_holder, speculation_host, + speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs(KURL("https://bar.com/foo"))); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kVisible); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); +} + +TEST_F(DocumentRulesTest, AddLinkToDisplayLockedContainer) { + ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest + enabled_selector_matches{true}; + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"> + </div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"selector_matches": "#important-section a"} + }]} + )"; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs()); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + HTMLAnchorElement* anchor = nullptr; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, + [&]() { anchor = AddAnchor(*important_section, "https://foo.com/bar"); }); + EXPECT_THAT(candidates, HasURLs()); + + // Tests removing a display-locked container with links. + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { important_section->remove(); }); + EXPECT_THAT(candidates, HasURLs()); +} + +TEST_F(DocumentRulesTest, DisplayLockedContainerTracking) { + ScopedSpeculationRulesDocumentRulesSelectorMatchesForTest + enabled_selector_matches{true}; + DummyPageHolder page_holder; + StubSpeculationHost speculation_host; + Document& document = page_holder.GetDocument(); + + document.body()->setInnerHTML(R"HTML( + <div id="important-section"></div> + <div id="irrelevant-section"><span></span></div> + )HTML"); + auto* important_section = document.getElementById("important-section"); + auto* irrelevant_section = document.getElementById("irrelevant-section"); + auto* anchor_1 = AddAnchor(*important_section, "https://foo.com/bar"); + AddAnchor(*important_section, "https://foo.com/logout"); + AddAnchor(*document.body(), "https://foo.com/logout"); + + String speculation_script = R"( + {"prefetch": [{ + "source": "document", + "where": {"and": [{ + "selector_matches": "#important-section a" + }, { + "not": {"href_matches": "https://*/logout"} + }]} + }]} + )"; + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, speculation_script); + const auto& candidates = speculation_host.candidates(); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/bar"))); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + anchor_1->SetHref("https://foo.com/fizz.html"); + }); + EXPECT_THAT(candidates, HasURLs()); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + // Changing style of the display-locked container should not cause an + // update. + important_section->SetInlineStyleProperty(CSSPropertyID::kColor, + CSSValueID::kDarkviolet); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + PropagateRulesToStubSpeculationHostWithStyleUpdate( + page_holder, speculation_host, [&]() { + important_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kVisible); + }); + EXPECT_THAT(candidates, HasURLs(KURL("https://foo.com/fizz.html"))); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + // Changing style of the display-locked container should not cause an + // update. + important_section->SetInlineStyleProperty(CSSPropertyID::kColor, + CSSValueID::kDeepskyblue); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + irrelevant_section->SetInlineStyleProperty( + CSSPropertyID::kContentVisibility, CSSValueID::kHidden); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); + + AssertNoRulesPropagatedToStubSpeculationHost( + page_holder, speculation_host, [&]() { + irrelevant_section->RemoveInlineStyleProperty( + CSSPropertyID::kContentVisibility); + page_holder.GetFrameView().UpdateAllLifecyclePhasesForTest(); + }); +} + TEST_F(SpeculationRuleSetTest, EagernessRuntimeEnabledFlag) { ScopedSpeculationRulesEagernessForTest enable_eagerness{false};
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index bd3cc9f..40deeab7 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -1535,6 +1535,8 @@ return true; } +// TODO(caraitto): Consider validating keys -- no bucket base + offset +// conflicts, no overflow, etc. bool CopyAuctionReportBuyerKeysFromIdlToMojo( ExceptionState& exception_state, const AuctionAdConfig& input,
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc index d3a385ed9..aae21a3 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph.cc
@@ -316,6 +316,9 @@ operators_queue.push_back(operand->Operator()); } + // An input MLOperand may be used by more than one MLOperators. This set + // ensures an input MLOperand won't be validated multiple times. + HeapHashSet<Member<const MLOperand>> visited_input_operands; while (operators_queue.size() > 0) { // If the queue is not empty, dequeue an operator from the queue. const auto current_operator = operators_queue.TakeFirst(); @@ -333,6 +336,12 @@ } break; case MLOperand::OperandKind::kInput: + // If the operand has been validated, it doesn't need to be verified + // multiple times. + if (visited_input_operands.Contains(operand)) { + continue; + } + visited_input_operands.insert(operand); // If the operand is an input operand, validate whether its name is // unique. if (input_resources_info_.Contains(operand->Name())) {
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc index 26f4a9c..8c7f367f 100644 --- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc +++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder_test.cc
@@ -2477,6 +2477,58 @@ EXPECT_EQ(exception->message(), "The input name \"a\" is duplicated."); } { + // Test building a graph with an elementwise add operator that uses the same + // input for both lhs and rhs: + // [a] + // / \ + // \ / + // add + // | + // [b] + auto* a = + BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32, + scope.GetExceptionState()); + auto* output = builder->add(a, a, scope.GetExceptionState()); + ASSERT_NE(output, nullptr); + auto [graph, exception] = BuildGraph(scope, builder, {{"b", output}}); + EXPECT_NE(graph, nullptr); + const auto& inputs = graph->GetInputResourcesInfo(); + EXPECT_EQ(inputs.size(), static_cast<uint32_t>(1)); + EXPECT_EQ(inputs.at("a").type, a->Type()); + EXPECT_EQ(inputs.at("a").byte_length, a->ByteLength()); + const auto& outputs = graph->GetOutputResourcesInfo(); + EXPECT_EQ(outputs.size(), static_cast<uint32_t>(1)); + EXPECT_EQ(outputs.at("b").type, output->Type()); + EXPECT_EQ(outputs.at("b").byte_length, output->ByteLength()); + } + { + // Test building a graph with two operators sharing a same input: + // [a] + // / \ + // relu sigmoid + // | | + // [b] [c] + auto* a = + BuildInput(builder, "a", {3, 4, 5}, V8MLOperandType::Enum::kFloat32, + scope.GetExceptionState()); + auto* b = builder->relu(a, scope.GetExceptionState()); + ASSERT_NE(b, nullptr); + auto* c = builder->sigmoid(a, scope.GetExceptionState()); + ASSERT_NE(c, nullptr); + auto [graph, exception] = BuildGraph(scope, builder, {{"b", b}, {"c", c}}); + EXPECT_NE(graph, nullptr); + const auto& inputs = graph->GetInputResourcesInfo(); + EXPECT_EQ(inputs.size(), static_cast<uint32_t>(1)); + EXPECT_EQ(inputs.at("a").type, a->Type()); + EXPECT_EQ(inputs.at("a").byte_length, a->ByteLength()); + const auto& outputs = graph->GetOutputResourcesInfo(); + EXPECT_EQ(outputs.size(), static_cast<uint32_t>(2)); + EXPECT_EQ(outputs.at("b").type, b->Type()); + EXPECT_EQ(outputs.at("b").byte_length, b->ByteLength()); + EXPECT_EQ(outputs.at("c").type, b->Type()); + EXPECT_EQ(outputs.at("c").byte_length, b->ByteLength()); + } + { // Test building a fake graph with two inputs, one gemm operation and one // output. auto* a = BuildInput(builder, "a", {3, 4}, V8MLOperandType::Enum::kFloat32,
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc index ebec683..467b4a3 100644 --- a/third_party/blink/renderer/modules/payments/payment_request.cc +++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -541,6 +541,10 @@ input->modifiers(), *output->modifiers, execution_context, exception_state); } + + output->payment_handler_minimal_header_ux_enabled = + RuntimeEnabledFeatures::PaymentHandlerMinimalHeaderUXEnabled( + &execution_context); } PaymentItemPtr CreateTotalPlaceHolderForAppStoreBilling(
diff --git a/third_party/blink/renderer/platform/DEPS b/third_party/blink/renderer/platform/DEPS index 892eb01..5a805162 100644 --- a/third_party/blink/renderer/platform/DEPS +++ b/third_party/blink/renderer/platform/DEPS
@@ -71,6 +71,7 @@ "+device", "+gpu/GLES2", "+gpu/command_buffer/common/sync_token.h", + "+mojo/core/embedder/embedder.h", "+mojo/public", "+mozilla", "+services/metrics/public/cpp/metrics_utils.h",
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index d47c225e..30f5cd6b 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -263,28 +263,23 @@ } // namespace void PaintArtifactCompositor::SetNeedsFullUpdateAfterPaintIfNeeded( - const PaintChunkSubset& previous, - const PaintChunkSubset& repainted) { + const PaintArtifact& previous, + const PaintArtifact& repainted) { if (needs_update_) return; // Adding or removing chunks requires a full update to add/remove cc::layers. - if (previous.size() != repainted.size()) { + if (previous.PaintChunks().size() != repainted.PaintChunks().size()) { SetNeedsUpdate(PaintArtifactCompositorUpdateReason:: kPaintArtifactCompositorNeedsFullUpdateChunksChanged); return; } // Loop over both paint chunk subsets in order. - auto previous_chunk_it = previous.begin(); - auto repainted_chunk_it = repainted.begin(); - for (; previous_chunk_it != previous.end(); - ++previous_chunk_it, ++repainted_chunk_it) { - const auto& previous_chunk = *previous_chunk_it; - const auto& repainted_chunk = *repainted_chunk_it; - if (NeedsFullUpdateAfterPaintingChunk( - previous_chunk, previous.GetPaintArtifact(), repainted_chunk, - repainted.GetPaintArtifact())) { + for (wtf_size_t i = 0; i < previous.PaintChunks().size(); i++) { + if (NeedsFullUpdateAfterPaintingChunk(previous.PaintChunks()[i], previous, + repainted.PaintChunks()[i], + repainted)) { SetNeedsUpdate( PaintArtifactCompositorUpdateReason:: kPaintArtifactCompositorNeedsFullUpdateAfterPaintingChunk); @@ -376,9 +371,9 @@ } void PaintArtifactCompositor::LayerizeGroup( - const PaintChunkSubset& chunks, + scoped_refptr<const PaintArtifact> artifact, const EffectPaintPropertyNode& current_group, - PaintChunkIterator& chunk_cursor, + Vector<PaintChunk>::const_iterator& chunk_cursor, HashSet<const TransformPaintPropertyNode*>& directly_composited_transforms, bool force_draws_content) { wtf_size_t first_layer_in_current_group = pending_layers_.size(); @@ -400,14 +395,14 @@ // previous layer. Again finding the host costs O(qd). Merging would cost // O(p) due to copying the chunk list. Subtotal: O((qd + p)d) = O(qd^2 + pd) // Assuming p > d, the total complexity would be O(pqd + qd^2 + pd) = O(pqd) - while (chunk_cursor != chunks.end()) { + while (chunk_cursor != artifact->PaintChunks().end()) { // Look at the effect node of the next chunk. There are 3 possible cases: // A. The next chunk belongs to the current group but no subgroup. // B. The next chunk does not belong to the current group. // C. The next chunk belongs to some subgroup of the current group. const auto& chunk_effect = chunk_cursor->properties.Effect().Unalias(); if (&chunk_effect == ¤t_group) { - pending_layers_.emplace_back(chunks, chunk_cursor); + pending_layers_.emplace_back(artifact, *chunk_cursor); ++chunk_cursor; // force_draws_content doesn't apply to pending layers that require own // layer, specifically scrollbar layers, foreign layers, scroll hit @@ -424,7 +419,7 @@ // Case C: The following chunks belong to a subgroup. Process them by // a recursion call. wtf_size_t first_layer_in_subgroup = pending_layers_.size(); - LayerizeGroup(chunks, *subgroup, chunk_cursor, + LayerizeGroup(artifact, *subgroup, chunk_cursor, directly_composited_transforms, force_draws_content || subgroup->DrawsContent()); // The above LayerizeGroup generated new layers in pending_layers_ @@ -480,12 +475,11 @@ void PaintArtifactCompositor::CollectPendingLayers( scoped_refptr<const PaintArtifact> artifact) { - PaintChunkSubset subset(artifact); - auto cursor = subset.begin(); HashSet<const TransformPaintPropertyNode*> directly_composited_transforms; - LayerizeGroup(subset, EffectPaintPropertyNode::Root(), cursor, + Vector<PaintChunk>::const_iterator cursor = artifact->PaintChunks().begin(); + LayerizeGroup(artifact, EffectPaintPropertyNode::Root(), cursor, directly_composited_transforms, /*force_draws_content*/ false); - DCHECK(cursor == subset.end()); + DCHECK(cursor == artifact->PaintChunks().end()); pending_layers_.ShrinkToReasonableCapacity(); } @@ -664,7 +658,7 @@ pending_layers_.reserve(old_size); // Make compositing decisions, storing the result in |pending_layers_|. - CollectPendingLayers(artifact); + CollectPendingLayers(std::move(artifact)); PendingLayer::DecompositeTransforms(pending_layers_); LayerListBuilder layer_list_builder;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h index 5f6887e..3897002 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
@@ -237,8 +237,8 @@ previous_update_for_testing_ = PreviousUpdateType::kNone; } - void SetNeedsFullUpdateAfterPaintIfNeeded(const PaintChunkSubset& previous, - const PaintChunkSubset& repainted); + void SetNeedsFullUpdateAfterPaintIfNeeded(const PaintArtifact& previous, + const PaintArtifact& repainted); // Returns true if a property tree node associated with |element_id| exists // on any of the PropertyTrees constructed by |Update|. @@ -259,7 +259,7 @@ // cc layer. This is the entry point of the layerization algorithm. void CollectPendingLayers(scoped_refptr<const PaintArtifact>); - // This is the internal recursion of collectPendingLayers. This function + // This is the internal recursion of CollectPendingLayers. This function // loops over the list of paint chunks, scoped by an isolated group // (i.e. effect node). Inside of the loop, chunks are tested for overlap // and merge compatibility. Subgroups are handled by recursion, and will @@ -280,9 +280,9 @@ // time a paint property tree node is encountered that has direct compositing // reasons. This case will always start a new layer and can skip merge tests. // New values are added when transform nodes are first encountered. - void LayerizeGroup(const PaintChunkSubset&, + void LayerizeGroup(scoped_refptr<const PaintArtifact>, const EffectPaintPropertyNode&, - PaintChunkIterator& chunk_cursor, + Vector<PaintChunk>::const_iterator& chunk_cursor, HashSet<const TransformPaintPropertyNode*>& directly_composited_transforms, bool force_draws_content);
diff --git a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc index bf033a217..fbb34e5 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.cc
@@ -60,20 +60,15 @@ } // anonymous namespace -PendingLayer::PendingLayer(const PaintChunkSubset& chunks, - const PaintChunkIterator& first_chunk) - : PendingLayer(chunks, *first_chunk, first_chunk.IndexInPaintArtifact()) {} - -PendingLayer::PendingLayer(const PaintChunkSubset& chunks, - const PaintChunk& first_chunk, - wtf_size_t first_chunk_index_in_paint_artifact) +PendingLayer::PendingLayer(scoped_refptr<const PaintArtifact> artifact, + const PaintChunk& first_chunk) : bounds_(first_chunk.bounds), rect_known_to_be_opaque_(first_chunk.rect_known_to_be_opaque), has_text_(first_chunk.has_text), draws_content_(first_chunk.DrawsContent()), text_known_to_be_on_opaque_background_( first_chunk.text_known_to_be_on_opaque_background), - chunks_(&chunks.GetPaintArtifact(), first_chunk_index_in_paint_artifact), + chunks_(std::move(artifact), first_chunk), property_tree_state_( first_chunk.properties.GetPropertyTreeState().Unalias()), compositing_type_(kOther) { @@ -85,18 +80,20 @@ if (const absl::optional<gfx::RectF>& visibility_limit = VisibilityLimit(GetPropertyTreeState())) { bounds_.Intersect(*visibility_limit); - if (bounds_.IsEmpty()) + if (bounds_.IsEmpty()) { draws_content_ = false; + } } if (IsCompositedScrollHitTest(first_chunk)) { compositing_type_ = kScrollHitTestLayer; } else if (first_chunk.size()) { const auto& first_display_item = FirstDisplayItem(); - if (first_display_item.IsForeignLayer()) + if (first_display_item.IsForeignLayer()) { compositing_type_ = kForeignLayer; - else if (IsCompositedScrollbar(first_display_item)) + } else if (IsCompositedScrollbar(first_display_item)) { compositing_type_ = kScrollbarLayer; + } } }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h index 6f72c237..481b334 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h +++ b/third_party/blink/renderer/platform/graphics/compositing/pending_layer.h
@@ -32,7 +32,8 @@ kOther, }; - PendingLayer(const PaintChunkSubset&, const PaintChunkIterator&); + PendingLayer(scoped_refptr<const PaintArtifact>, + const PaintChunk& first_chunk); // Returns the offset/bounds for the final cc::Layer, rounded if needed. gfx::Vector2dF LayerOffset() const; @@ -63,7 +64,7 @@ } void SetPaintArtifact(scoped_refptr<const PaintArtifact> paint_artifact) { - chunks_.SetPaintArtifact(paint_artifact); + chunks_.SetPaintArtifact(std::move(paint_artifact)); } // Merges |guest| into |this| if it can, by appending chunks of |guest| @@ -157,9 +158,6 @@ SkColor4f ComputeBackgroundColor() const; private: - PendingLayer(const PaintChunkSubset&, - const PaintChunk& first_chunk, - wtf_size_t first_chunk_index_in_paint_artifact); gfx::RectF MapRectKnownToBeOpaque(const PropertyTreeState&) const; bool MergeInternal(const PendingLayer& guest, const PropertyTreeState& guest_state,
diff --git a/third_party/blink/renderer/platform/graphics/compositing/pending_layer_test.cc b/third_party/blink/renderer/platform/graphics/compositing/pending_layer_test.cc index 9bc7e15e..87139fe 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/pending_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/pending_layer_test.cc
@@ -27,33 +27,35 @@ } TEST(PendingLayerTest, Merge) { - TestPaintArtifact artifact; - artifact.Chunk() - .Bounds(gfx::Rect(0, 0, 30, 40)) - .RectKnownToBeOpaque(gfx::Rect(0, 0, 30, 40)); - artifact.Chunk() - .Bounds(gfx::Rect(10, 20, 30, 40)) - .RectKnownToBeOpaque(gfx::Rect(10, 20, 30, 40)); - artifact.Chunk() - .Bounds(gfx::Rect(-5, -25, 20, 20)) - .RectKnownToBeOpaque(gfx::Rect(-5, -25, 20, 20)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk() + .Bounds(gfx::Rect(0, 0, 30, 40)) + .RectKnownToBeOpaque(gfx::Rect(0, 0, 30, 40)) + .Chunk() + .Bounds(gfx::Rect(10, 20, 30, 40)) + .RectKnownToBeOpaque(gfx::Rect(10, 20, 30, 40)) + .Chunk() + .Bounds(gfx::Rect(-5, -25, 20, 20)) + .RectKnownToBeOpaque(gfx::Rect(-5, -25, 20, 20)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); EXPECT_EQ(gfx::RectF(0, 0, 30, 40), pending_layer.BoundsForTesting()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0)); EXPECT_EQ(pending_layer.BoundsForTesting(), pending_layer.RectKnownToBeOpaque()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); // Bounds not equal to one PaintChunk. EXPECT_EQ(gfx::RectF(0, 0, 40, 60), pending_layer.BoundsForTesting()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0, 1)); EXPECT_EQ(gfx::RectF(0, 0, 30, 40), pending_layer.RectKnownToBeOpaque()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 2))); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[2]))); EXPECT_EQ(gfx::RectF(-5, -25, 45, 85), pending_layer.BoundsForTesting()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0, 1, 2)); @@ -61,144 +63,170 @@ } TEST(PendingLayerTest, MergeWithGuestTransform) { - TestPaintArtifact artifact; - artifact.Chunk().Bounds(gfx::Rect(0, 0, 30, 40)); auto transform = Create2DTranslation(t0(), 20, 25); - artifact.Chunk(*transform, c0(), e0()).Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk() + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk(*transform, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 70, 85), pending_layer.BoundsForTesting()); EXPECT_EQ(PropertyTreeState::Root(), pending_layer.GetPropertyTreeState()); } TEST(PendingLayerTest, MergeWithHomeTransform) { - TestPaintArtifact artifact; auto transform = Create2DTranslation(t0(), 20, 25); - artifact.Chunk(*transform, c0(), e0()).Bounds(gfx::Rect(0, 0, 30, 40)); - artifact.Chunk().Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk(*transform, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk() + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 50, 65), pending_layer.BoundsForTesting()); EXPECT_EQ(PropertyTreeState::Root(), pending_layer.GetPropertyTreeState()); } TEST(PendingLayerTest, MergeWithBothTransforms) { - TestPaintArtifact artifact; auto t1 = Create2DTranslation(t0(), 20, 25); - artifact.Chunk(*t1, c0(), e0()).Bounds(gfx::Rect(0, 0, 30, 40)); auto t2 = Create2DTranslation(t0(), -20, -25); - artifact.Chunk(*t2, c0(), e0()).Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk(*t1, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk(*t2, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(-20, -25, 70, 90), pending_layer.BoundsForTesting()); EXPECT_EQ(PropertyTreeState::Root(), pending_layer.GetPropertyTreeState()); } TEST(PendingLayerTest, MergeSparseTinyLayers) { - TestPaintArtifact artifact; - artifact.Chunk() - .Bounds(gfx::Rect(0, 0, 3, 4)) - .RectKnownToBeOpaque(gfx::Rect(0, 0, 3, 4)); - artifact.Chunk() - .Bounds(gfx::Rect(20, 20, 3, 4)) - .RectKnownToBeOpaque(gfx::Rect(20, 20, 3, 4)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk() + .Bounds(gfx::Rect(0, 0, 3, 4)) + .RectKnownToBeOpaque(gfx::Rect(0, 0, 3, 4)) + .Chunk() + .Bounds(gfx::Rect(20, 20, 3, 4)) + .RectKnownToBeOpaque(gfx::Rect(20, 20, 3, 4)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 23, 24), pending_layer.BoundsForTesting()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0, 1)); } TEST(PendingLayerTest, DontMergeSparse) { - TestPaintArtifact artifact; - artifact.Chunk() - .Bounds(gfx::Rect(0, 0, 30, 40)) - .RectKnownToBeOpaque(gfx::Rect(0, 0, 30, 40)); - artifact.Chunk() - .Bounds(gfx::Rect(200, 200, 30, 40)) - .RectKnownToBeOpaque(gfx::Rect(200, 200, 30, 40)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk() + .Bounds(gfx::Rect(0, 0, 30, 40)) + .RectKnownToBeOpaque(gfx::Rect(0, 0, 30, 40)) + .Chunk() + .Bounds(gfx::Rect(200, 200, 30, 40)) + .RectKnownToBeOpaque(gfx::Rect(200, 200, 30, 40)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_FALSE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_FALSE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 30, 40), pending_layer.BoundsForTesting()); - EXPECT_EQ(chunks.begin()->properties, pending_layer.GetPropertyTreeState()); + EXPECT_EQ(artifact->PaintChunks()[0].properties, + pending_layer.GetPropertyTreeState()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0)); } TEST(PendingLayerTest, PendingLayerDontMergeSparseWithTransforms) { - TestPaintArtifact artifact; auto t1 = Create2DTranslation(t0(), 20, 25); - artifact.Chunk(*t1, c0(), e0()).Bounds(gfx::Rect(0, 0, 30, 40)); auto t2 = Create2DTranslation(t0(), 1000, 1000); - artifact.Chunk(*t2, c0(), e0()).Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk(*t1, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk(*t2, c0(), e0()) + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_FALSE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_FALSE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 30, 40), pending_layer.BoundsForTesting()); - EXPECT_EQ(chunks.begin()->properties, pending_layer.GetPropertyTreeState()); + EXPECT_EQ(artifact->PaintChunks()[0].properties, + pending_layer.GetPropertyTreeState()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0)); } TEST(PendingLayerTest, DontMergeSparseInCompositedEffect) { - TestPaintArtifact artifact; auto t1 = Create2DTranslation(t0(), 20, 25); auto e1 = CreateOpacityEffect(e0(), 1.0f, CompositingReason::kWillChangeOpacity); - artifact.Chunk(*t1, c0(), *e1).Bounds(gfx::Rect(0, 0, 30, 40)); auto t2 = Create2DTranslation(t0(), 1000, 1000); - artifact.Chunk(*t2, c0(), *e1).Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk(*t1, c0(), *e1) + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk(*t2, c0(), *e1) + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - ASSERT_FALSE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + ASSERT_FALSE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); EXPECT_EQ(gfx::RectF(0, 0, 30, 40), pending_layer.BoundsForTesting()); - EXPECT_EQ(chunks.begin()->properties, pending_layer.GetPropertyTreeState()); + EXPECT_EQ(artifact->PaintChunks()[0].properties, + pending_layer.GetPropertyTreeState()); EXPECT_THAT(ChunkIndices(pending_layer), ElementsAre(0)); } TEST(PendingLayerTest, MergeSparseInNonCompositedEffect) { - TestPaintArtifact artifact; auto t1 = Create2DTranslation(t0(), 20, 25); auto t2 = Create2DTranslation(t0(), 1000, 1000); auto e1 = CreateOpacityEffect(e0(), 1.0f, CompositingReason::kNone); - artifact.Chunk(*t1, c0(), *e1).Bounds(gfx::Rect(0, 0, 30, 40)); - artifact.Chunk(*t2, c0(), *e1).Bounds(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk(*t1, c0(), *e1) + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk(*t2, c0(), *e1) + .Bounds(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); - EXPECT_FALSE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); + EXPECT_FALSE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); } TEST(PendingLayerTest, KnownOpaque) { - TestPaintArtifact artifact; - artifact.Chunk().Bounds(gfx::Rect(0, 0, 30, 40)); - artifact.Chunk() - .Bounds(gfx::Rect(0, 0, 25, 35)) - .RectKnownToBeOpaque(gfx::Rect(0, 0, 25, 35)); - artifact.Chunk() - .Bounds(gfx::Rect(0, 0, 50, 60)) - .RectKnownToBeOpaque(gfx::Rect(0, 0, 50, 60)); - PaintChunkSubset chunks(artifact.Build()); + auto artifact = TestPaintArtifact() + .Chunk() + .Bounds(gfx::Rect(0, 0, 30, 40)) + .Chunk() + .Bounds(gfx::Rect(0, 0, 25, 35)) + .RectKnownToBeOpaque(gfx::Rect(0, 0, 25, 35)) + .Chunk() + .Bounds(gfx::Rect(0, 0, 50, 60)) + .RectKnownToBeOpaque(gfx::Rect(0, 0, 50, 60)) + .Build(); - PendingLayer pending_layer(chunks, chunks.begin()); + PendingLayer pending_layer(artifact, artifact->PaintChunks()[0]); EXPECT_TRUE(pending_layer.RectKnownToBeOpaque().IsEmpty()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 1))); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[1]))); // Chunk 2 doesn't cover the entire layer, so not opaque. EXPECT_EQ(gfx::RectF(0, 0, 25, 35), pending_layer.RectKnownToBeOpaque()); EXPECT_NE(pending_layer.BoundsForTesting(), pending_layer.RectKnownToBeOpaque()); - ASSERT_TRUE(pending_layer.Merge(PendingLayer(chunks, chunks.begin() + 2))); + ASSERT_TRUE( + pending_layer.Merge(PendingLayer(artifact, artifact->PaintChunks()[2]))); // Chunk 3 covers the entire layer, so now it's opaque. EXPECT_EQ(gfx::RectF(0, 0, 50, 60), pending_layer.BoundsForTesting()); EXPECT_EQ(pending_layer.BoundsForTesting(), @@ -217,35 +245,35 @@ ::testing::Values(false, true)); TEST_P(PendingLayerTextOpaquenessTest, OpaqueTextAndOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .HasText() - .TextKnownToBeOnOpaqueBackground() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText() - .TextKnownToBeOnOpaqueBackground(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 400, 400), layer_a.BoundsForTesting()); EXPECT_TRUE(layer_a.TextKnownToBeOnOpaqueBackground()); } TEST_P(PendingLayerTextOpaquenessTest, NonOpaqueTextAndOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .HasText() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText() - .TextKnownToBeOnOpaqueBackground(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .HasText() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); bool merged = layer_a.Merge(layer_b, PrefersLCDText()); if (PrefersLCDText()) { // Not merged because merging would lose TextKnownToBeOnOpaqueBackground(). @@ -258,17 +286,17 @@ } TEST_P(PendingLayerTextOpaquenessTest, OpaqueTextAndNonOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .HasText() - .TextKnownToBeOnOpaqueBackground() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); bool merged = layer_a.Merge(layer_b, PrefersLCDText()); if (PrefersLCDText()) { // Not merged because merging would lose TextKnownToBeOnOpaqueBackground(). @@ -281,18 +309,18 @@ } TEST_P(PendingLayerTextOpaquenessTest, NonOpaqueTextAndOpaqueTextCovered) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) - .HasText() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 300, 300), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(200, 200, 100, 100)) - .HasText() - .TextKnownToBeOnOpaqueBackground(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) + .HasText() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 300, 300), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(200, 200, 100, 100)) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 300, 300), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(200, 200, 100, 100), layer_a.RectKnownToBeOpaque()); @@ -300,18 +328,18 @@ } TEST_P(PendingLayerTextOpaquenessTest, OpaqueTextAndNonOpaqueTextCovered) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) - .HasText() - .TextKnownToBeOnOpaqueBackground() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) - .HasText(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) + .HasText() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 250, 250), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque()); @@ -319,17 +347,17 @@ } TEST_P(PendingLayerTextOpaquenessTest, NoTextAndOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText() - .TextKnownToBeOnOpaqueBackground(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 400, 400), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque()); @@ -337,17 +365,17 @@ } TEST_P(PendingLayerTextOpaquenessTest, OpaqueTextAndNoText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) - .HasText() - .TextKnownToBeOnOpaqueBackground() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 400, 400), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque()); @@ -355,46 +383,46 @@ } TEST_P(PendingLayerTextOpaquenessTest, NonOpaqueNoTextAndNonOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 400, 400), layer_a.BoundsForTesting()); EXPECT_FALSE(layer_a.TextKnownToBeOnOpaqueBackground()); } TEST_P(PendingLayerTextOpaquenessTest, NonOpaqueTextAndNonOpaqueNoText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .HasText() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .HasText() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 400, 400), layer_a.BoundsForTesting()); EXPECT_FALSE(layer_a.TextKnownToBeOnOpaqueBackground()); } TEST_P(PendingLayerTextOpaquenessTest, OpaqueNoTextAndNonOpaqueText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) - .HasText(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) + .HasText() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 250, 250), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque()); @@ -402,16 +430,16 @@ } TEST_P(PendingLayerTextOpaquenessTest, NonOpaqueTextAndOpaqueNoText) { - TestPaintArtifact artifact; - artifact.Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) - .HasText() - .Chunk(t0(), c0(), e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(200, 200, 100, 100), Color::kBlack) + .HasText() + .Chunk(t0(), c0(), e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(100, 100, 250, 250), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque()); @@ -423,18 +451,18 @@ // fully covered by the opaque rect of the first chunk, the non-opaque area // is not visible in the final layer, so we still allow the merge. auto clip1 = CreateClip(c0(), t0(), FloatRoundedRect(175, 175, 100, 100)); - TestPaintArtifact artifact; - artifact.Chunk(t0(), *clip1, e0()) - .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) - .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) - .HasText() - .TextKnownToBeOnOpaqueBackground() - .Chunk(t0(), *clip1, e0()) - .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) - .HasText(); - PaintChunkSubset chunks(artifact.Build()); - PendingLayer layer_a(chunks, chunks.begin()); - PendingLayer layer_b(chunks, chunks.begin() + 1); + auto artifact = TestPaintArtifact() + .Chunk(t0(), *clip1, e0()) + .RectDrawing(gfx::Rect(100, 100, 250, 250), Color::kBlack) + .RectKnownToBeOpaque(gfx::Rect(100, 100, 210, 210)) + .HasText() + .TextKnownToBeOnOpaqueBackground() + .Chunk(t0(), *clip1, e0()) + .RectDrawing(gfx::Rect(200, 200, 300, 300), Color::kBlack) + .HasText() + .Build(); + PendingLayer layer_a(artifact, artifact->PaintChunks()[0]); + PendingLayer layer_b(artifact, artifact->PaintChunks()[1]); ASSERT_TRUE(layer_a.Merge(layer_b, PrefersLCDText())); EXPECT_EQ(gfx::RectF(175, 175, 100, 100), layer_a.BoundsForTesting()); EXPECT_EQ(gfx::RectF(100, 100, 210, 210), layer_a.RectKnownToBeOpaque());
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunk_subset.h b/third_party/blink/renderer/platform/graphics/paint/paint_chunk_subset.h index dc2a7ec..8723730 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunk_subset.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunk_subset.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_PAINT_PAINT_CHUNK_SUBSET_H_ #include "base/check_op.h" +#include "base/numerics/safe_conversions.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_artifact.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -22,30 +23,23 @@ // A subset containing a single paint chunk initially. PaintChunkSubset(scoped_refptr<const PaintArtifact> paint_artifact, - wtf_size_t chunk_index) + const PaintChunk& chunk) : paint_artifact_(std::move(paint_artifact)) { DCHECK(paint_artifact_); - DCHECK(UsesSubsetIndices()); + wtf_size_t chunk_index = base::checked_cast<wtf_size_t>( + &chunk - &paint_artifact_->PaintChunks().front()); + CHECK_LT(chunk_index, paint_artifact_->PaintChunks().size()); subset_indices_.push_back(chunk_index); } - // A subset containing the whole PaintArtifact. - PaintChunkSubset(scoped_refptr<const PaintArtifact> paint_artifact) - : PaintChunkSubset(paint_artifact, - 0, - paint_artifact->PaintChunks().size()) {} - - // A subset defined by a range of segments. |end_segment_index| is not - // inclusive. - PaintChunkSubset(scoped_refptr<const PaintArtifact> paint_artifact, - wtf_size_t begin_index, - wtf_size_t end_index) - : paint_artifact_(std::move(paint_artifact)), - begin_index_(begin_index), - end_index_(end_index) { - DCHECK(paint_artifact_); - DCHECK_LE(begin_index_, end_index_); - DCHECK(!UsesSubsetIndices()); + // A subset containing the whole PaintArtifact. This is less efficient than + // directly iterating paint_artifact->PaintChunks(), so should be rarely used + // in production code. + explicit PaintChunkSubset(scoped_refptr<const PaintArtifact> paint_artifact) + : paint_artifact_(std::move(paint_artifact)) { + for (wtf_size_t i = 0; i < paint_artifact_->PaintChunks().size(); ++i) { + subset_indices_.push_back(i); + } } class Iterator { @@ -56,34 +50,30 @@ const PaintChunk* operator->() const { return &GetChunk(); } bool operator==(const Iterator& other) const { DCHECK_EQ(subset_, other.subset_); - return subset_or_chunk_index_ == other.subset_or_chunk_index_; + return subset_index_ == other.subset_index_; } bool operator!=(const Iterator& other) const { return !(*this == other); } const Iterator& operator++() { - ++subset_or_chunk_index_; + ++subset_index_; return *this; } const Iterator& operator--() { - --subset_or_chunk_index_; + --subset_index_; return *this; } Iterator operator+(wtf_size_t offset) const { - DCHECK_LE(subset_or_chunk_index_ + offset, - subset_->end().subset_or_chunk_index_); - return Iterator(*subset_, subset_or_chunk_index_ + offset); + DCHECK_LE(subset_index_ + offset, subset_->end().subset_index_); + return Iterator(*subset_, subset_index_ + offset); } Iterator& operator+=(wtf_size_t offset) { - DCHECK_LE(subset_or_chunk_index_ + offset, - subset_->end().subset_or_chunk_index_); - subset_or_chunk_index_ += offset; + DCHECK_LE(subset_index_ + offset, subset_->end().subset_index_); + subset_index_ += offset; return *this; } // Returns the index of the current PaintChunk in the PaintArtifact. wtf_size_t IndexInPaintArtifact() const { - if (subset_->UsesSubsetIndices()) - return subset_->subset_indices_[subset_or_chunk_index_]; - return subset_or_chunk_index_; + return subset_->subset_indices_[subset_index_]; } DisplayItemRange DisplayItems() const { @@ -95,39 +85,27 @@ private: friend class PaintChunkSubset; - Iterator(const PaintChunkSubset& subset, wtf_size_t subset_or_chunk_index) - : subset_(&subset), subset_or_chunk_index_(subset_or_chunk_index) {} + Iterator(const PaintChunkSubset& subset, wtf_size_t subset_index) + : subset_(&subset), subset_index_(subset_index) {} const PaintChunk& GetChunk() const { - DCHECK_LT(subset_or_chunk_index_, subset_->end().subset_or_chunk_index_); + DCHECK_LT(subset_index_, subset_->end().subset_index_); return subset_->paint_artifact_->PaintChunks()[IndexInPaintArtifact()]; } const PaintChunkSubset* subset_; - wtf_size_t subset_or_chunk_index_; + wtf_size_t subset_index_; }; using value_type = PaintChunk; using const_iterator = Iterator; - Iterator begin() const { - return Iterator(*this, UsesSubsetIndices() ? 0 : begin_index_); - } + Iterator begin() const { return Iterator(*this, 0); } + Iterator end() const { return Iterator(*this, subset_indices_.size()); } - Iterator end() const { - return Iterator(*this, - UsesSubsetIndices() ? subset_indices_.size() : end_index_); - } + bool IsEmpty() const { return subset_indices_.empty(); } - bool IsEmpty() const { - return UsesSubsetIndices() ? subset_indices_.empty() - : begin_index_ == end_index_; - } - - wtf_size_t size() const { - return UsesSubsetIndices() ? subset_indices_.size() - : end_index_ - begin_index_; - } + wtf_size_t size() const { return subset_indices_.size(); } const PaintArtifact& GetPaintArtifact() const { return *paint_artifact_; } @@ -142,8 +120,6 @@ void Merge(const PaintChunkSubset& other) { DCHECK_EQ(paint_artifact_.get(), other.paint_artifact_.get()); - DCHECK(UsesSubsetIndices()); - DCHECK(other.UsesSubsetIndices()); subset_indices_.AppendVector(other.subset_indices_); } @@ -154,14 +130,8 @@ std::unique_ptr<JSONArray> ToJSON() const; private: - bool UsesSubsetIndices() const { return begin_index_ == kNotFound; } - scoped_refptr<const PaintArtifact> paint_artifact_; - // This is used when UsesSubsetIndices() is true. Vector<wtf_size_t> subset_indices_; - // These are used when UsesSubsetIndices() is false. - wtf_size_t begin_index_ = kNotFound; - wtf_size_t end_index_ = kNotFound; }; using PaintChunkIterator = PaintChunkSubset::Iterator;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index d88f7b6..31834d9 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -1999,6 +1999,8 @@ CreateTracedValueForUnusedPreload( resource->Url(), Resource::MatchStatus::kOk, resource->GetResourceRequest().GetDevToolsId().value_or(String()))); + UMA_HISTOGRAM_COUNTS_100("Renderer.Preload.UnusedResource", + static_cast<int>(resource->GetType())); } for (auto& pair : early_hints_preloaded_resources_) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc index 952fd9a2..005dbb74 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.cc
@@ -41,7 +41,6 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" #include "third_party/blink/public/platform/web_request_peer.h" -#include "third_party/blink/public/platform/web_resource_request_sender_delegate.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request_util.h" @@ -131,8 +130,7 @@ } // namespace -ResourceRequestSender::ResourceRequestSender() - : delegate_(Platform::Current()->GetResourceRequestSenderDelegate()) {} +ResourceRequestSender::ResourceRequestSender() = default; ResourceRequestSender::~ResourceRequestSender() = default; @@ -421,14 +419,6 @@ request_info_->local_response_start - remote_response_start); } request_info_->load_timing_info = response_head->load_timing; - if (delegate_) { - scoped_refptr<WebRequestPeer> new_peer = delegate_->OnReceivedResponse( - std::move(request_info_->peer), - WebString::FromUTF8(response_head->mime_type), - KURL(request_info_->url)); - DCHECK(new_peer); - request_info_->peer = std::move(new_peer); - } request_info_->peer->OnReceivedResponse(response_head.Clone(), response_arrival); @@ -538,10 +528,6 @@ WebRequestPeer* peer = request_info_->peer.get(); - if (delegate_) { - delegate_->OnRequestComplete(); - } - network::URLLoaderCompletionStatus renderer_status(status); if (status.completion_time.is_null()) { // No completion timestamp is provided, leave it as is.
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h index efbbe36..9e5b4d2 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h
@@ -53,7 +53,6 @@ class ThrottlingURLLoader; class MojoURLLoaderClient; class WebRequestPeer; -class WebResourceRequestSenderDelegate; struct SyncLoadResponse; // This class creates a PendingRequestInfo object and handles sending a resource @@ -209,9 +208,6 @@ const PendingRequestInfo& request_info, network::mojom::URLResponseHead& response_head) const; - // `delegate_` is expected to live longer than `this`. - WebResourceRequestSenderDelegate* delegate_; - // The instance is created on StartAsync() or StartSync(), and it's deleted // when the response has finished, or when the request is canceled. std::unique_ptr<PendingRequestInfo> request_info_;
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender_unittest.cc index ce821eb5..58f2c3b 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender_unittest.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender_unittest.cc
@@ -34,7 +34,6 @@ #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" #include "third_party/blink/public/platform/web_request_peer.h" -#include "third_party/blink/public/platform/web_resource_request_sender_delegate.h" #include "third_party/blink/public/platform/web_url_request_extra_data.h" #include "third_party/blink/public/platform/web_url_request_util.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support.h" @@ -45,13 +44,6 @@ namespace { static constexpr char kTestPageUrl[] = "http://www.google.com/"; -static constexpr char kTestPageHeaders[] = - "HTTP/1.1 200 OK\nContent-Type:text/html\n\n"; -static constexpr char kTestPageMimeType[] = "text/html"; -static constexpr char kTestPageCharset[] = ""; -static constexpr char kTestPageContents[] = - "<html><head><title>Google</title></head><body><h1>Google</h1></body></" - "html>"; constexpr size_t kDataPipeCapacity = 4096; @@ -73,67 +65,10 @@ } // namespace -class TestResourceRequestSenderDelegate - : public WebResourceRequestSenderDelegate { - public: - TestResourceRequestSenderDelegate() = default; - TestResourceRequestSenderDelegate(const TestResourceRequestSenderDelegate&) = - delete; - TestResourceRequestSenderDelegate& operator=( - const TestResourceRequestSenderDelegate&) = delete; - ~TestResourceRequestSenderDelegate() override = default; - - void OnRequestComplete() override {} - - scoped_refptr<WebRequestPeer> OnReceivedResponse( - scoped_refptr<WebRequestPeer> current_peer, - const WebString& mime_type, - const WebURL& url) override { - return base::MakeRefCounted<WrapperPeer>(std::move(current_peer)); - } - - class WrapperPeer : public WebRequestPeer { - public: - explicit WrapperPeer(scoped_refptr<WebRequestPeer> original_peer) - : original_peer_(std::move(original_peer)) {} - WrapperPeer(const WrapperPeer&) = delete; - WrapperPeer& operator=(const WrapperPeer&) = delete; - - // WebRequestPeer overrides: - void OnUploadProgress(uint64_t position, uint64_t size) override {} - bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, - network::mojom::URLResponseHeadPtr head, - std::vector<std::string>*) override { - return false; - } - void OnReceivedResponse(network::mojom::URLResponseHeadPtr head, - base::TimeTicks response_arrival) override { - response_head_ = std::move(head); - } - void OnStartLoadingResponseBody( - mojo::ScopedDataPipeConsumerHandle body) override { - body_handle_ = std::move(body); - } - void OnTransferSizeUpdated(int transfer_size_diff) override {} - void OnCompletedRequest( - const network::URLLoaderCompletionStatus& status) override { - original_peer_->OnReceivedResponse(std::move(response_head_)); - original_peer_->OnStartLoadingResponseBody(std::move(body_handle_)); - original_peer_->OnCompletedRequest(status); - } - - private: - scoped_refptr<WebRequestPeer> original_peer_; - network::mojom::URLResponseHeadPtr response_head_; - mojo::ScopedDataPipeConsumerHandle body_handle_; - }; -}; - // A mock WebRequestPeer to receive messages from the ResourceRequestSender. class MockRequestPeer : public WebRequestPeer { public: - explicit MockRequestPeer(ResourceRequestSender* resource_request_sender) - : resource_request_sender_(resource_request_sender) {} + MockRequestPeer() = default; // WebRequestPeer overrides: void OnUploadProgress(uint64_t position, uint64_t size) override {} @@ -147,16 +82,9 @@ base::TimeTicks response_arrival) override { last_load_timing_ = head->load_timing; received_response_ = true; - if (cancel_on_receive_response_) { - resource_request_sender_->Cancel( - scheduler::GetSingleThreadTaskRunnerForTesting()); - } } void OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle body) override { - if (cancel_on_receive_response_) { - return; - } if (body) { data_ += ReadOneChunk(&body); } @@ -165,9 +93,6 @@ void OnReceivedCachedMetadata(mojo_base::BigBuffer data) override {} void OnCompletedRequest( const network::URLLoaderCompletionStatus& status) override { - if (cancel_on_receive_response_) { - return; - } completion_status_ = status; complete_ = true; } @@ -180,20 +105,14 @@ return completion_status_; } - void SetCancelOnReceiveResponse(bool cancel_on_receive_response) { - cancel_on_receive_response_ = cancel_on_receive_response; - } - private: // Data received. If downloading to file, remains empty. std::string data_; bool received_response_ = false; bool complete_ = false; - bool cancel_on_receive_response_ = false; net::LoadTimingInfo last_load_timing_; network::URLLoaderCompletionStatus completion_status_; - ResourceRequestSender* resource_request_sender_ = nullptr; }; // namespace blink // Sets up the message sender override for the unit test. @@ -201,8 +120,7 @@ public network::mojom::URLLoaderFactory { public: explicit ResourceRequestSenderTest() - : platform_(&delegate_), - resource_request_sender_(new ResourceRequestSender()) {} + : resource_request_sender_(new ResourceRequestSender()) {} ~ResourceRequestSenderTest() override { resource_request_sender_.reset(); @@ -224,17 +142,6 @@ NOTREACHED(); } - void CallOnReceiveResponse(network::mojom::URLLoaderClient* client, - mojo::ScopedDataPipeConsumerHandle body) { - auto head = network::mojom::URLResponseHead::New(); - std::string raw_headers(kTestPageHeaders); - std::replace(raw_headers.begin(), raw_headers.end(), '\n', '\0'); - head->headers = new net::HttpResponseHeaders(raw_headers); - head->mime_type = kTestPageMimeType; - head->charset = kTestPageCharset; - client->OnReceiveResponse(std::move(head), std::move(body), absl::nullopt); - } - std::unique_ptr<network::ResourceRequest> CreateResourceRequest() { std::unique_ptr<network::ResourceRequest> request( new network::ResourceRequest()); @@ -271,36 +178,12 @@ /*back_forward_cache_loader_helper=*/nullptr); } - static MojoCreateDataPipeOptions DataPipeOptions() { - MojoCreateDataPipeOptions options; - options.struct_size = sizeof(MojoCreateDataPipeOptions); - options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE; - options.element_num_bytes = 1; - options.capacity_num_bytes = kDataPipeCapacity; - return options; - } - - class TestPlatform final : public TestingPlatformSupport { - public: - explicit TestPlatform(WebResourceRequestSenderDelegate* delegate) - : delegate_(delegate) {} - WebResourceRequestSenderDelegate* GetResourceRequestSenderDelegate() - override { - return delegate_; - } - - private: - WebResourceRequestSenderDelegate* delegate_; - }; - protected: std::vector<std::pair<mojo::PendingReceiver<network::mojom::URLLoader>, mojo::PendingRemote<network::mojom::URLLoaderClient>>> loader_and_clients_; - TestResourceRequestSenderDelegate delegate_; base::test::SingleThreadTaskEnvironment task_environment_; - ScopedTestingPlatformSupport<TestPlatform, WebResourceRequestSenderDelegate*> - platform_; + ScopedTestingPlatformSupport<TestingPlatformSupport> platform_; std::unique_ptr<ResourceRequestSender> resource_request_sender_; scoped_refptr<MockRequestPeer> mock_peer_; @@ -316,101 +199,6 @@ EXPECT_GE(first_id, 0); } -TEST_F(ResourceRequestSenderTest, DelegateTest) { - std::unique_ptr<network::ResourceRequest> request(CreateResourceRequest()); - mock_peer_ = - base::MakeRefCounted<MockRequestPeer>(resource_request_sender_.get()); - StartAsync(std::move(request), mock_peer_); - - ASSERT_EQ(1u, loader_and_clients_.size()); - mojo::Remote<network::mojom::URLLoaderClient> client( - std::move(loader_and_clients_[0].second)); - loader_and_clients_.clear(); - - mojo::ScopedDataPipeProducerHandle producer_handle; - mojo::ScopedDataPipeConsumerHandle consumer_handle; - auto options = DataPipeOptions(); - ASSERT_EQ(mojo::CreateDataPipe(&options, producer_handle, consumer_handle), - MOJO_RESULT_OK); - - // The wrapper eats all messages until RequestComplete message is sent. - CallOnReceiveResponse(client.get(), std::move(consumer_handle)); - - uint32_t size = static_cast<uint32_t>(strlen(kTestPageContents)); - auto result = producer_handle->WriteData(kTestPageContents, &size, - MOJO_WRITE_DATA_FLAG_NONE); - ASSERT_EQ(result, MOJO_RESULT_OK); - ASSERT_EQ(size, strlen(kTestPageContents)); - - producer_handle.reset(); - - base::RunLoop().RunUntilIdle(); - - EXPECT_FALSE(mock_peer_->received_response()); - - // This lets the wrapper peer pass all the messages to the original - // peer at once. - network::URLLoaderCompletionStatus status; - status.error_code = net::OK; - status.exists_in_cache = false; - status.encoded_data_length = strlen(kTestPageContents); - client->OnComplete(status); - - base::RunLoop().RunUntilIdle(); - - EXPECT_TRUE(mock_peer_->received_response()); - EXPECT_EQ(kTestPageContents, mock_peer_->data()); - EXPECT_TRUE(mock_peer_->complete()); -} - -TEST_F(ResourceRequestSenderTest, CancelDuringCallbackWithWrapperPeer) { - std::unique_ptr<network::ResourceRequest> request(CreateResourceRequest()); - mock_peer_ = - base::MakeRefCounted<MockRequestPeer>(resource_request_sender_.get()); - mock_peer_->SetCancelOnReceiveResponse(true); - StartAsync(std::move(request), mock_peer_); - - ASSERT_EQ(1u, loader_and_clients_.size()); - mojo::Remote<network::mojom::URLLoaderClient> client( - std::move(loader_and_clients_[0].second)); - loader_and_clients_.clear(); - - mojo::ScopedDataPipeProducerHandle producer_handle; - mojo::ScopedDataPipeConsumerHandle consumer_handle; - auto options = DataPipeOptions(); - ASSERT_EQ(mojo::CreateDataPipe(&options, producer_handle, consumer_handle), - MOJO_RESULT_OK); - - CallOnReceiveResponse(client.get(), std::move(consumer_handle)); - uint32_t size = static_cast<uint32_t>(strlen(kTestPageContents)); - auto result = producer_handle->WriteData(kTestPageContents, &size, - MOJO_WRITE_DATA_FLAG_NONE); - ASSERT_EQ(result, MOJO_RESULT_OK); - ASSERT_EQ(size, strlen(kTestPageContents)); - producer_handle.reset(); - - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(mock_peer_->received_response()); - - // This lets the wrapper peer pass all the messages to the original - // peer at once, but the original peer cancels right after it receives - // the response. (This will remove pending request info from - // ResourceRequestSender while the wrapper peer is still running - // OnCompletedRequest, but it should not lead to crashes.) - network::URLLoaderCompletionStatus status; - status.error_code = net::OK; - status.exists_in_cache = false; - status.encoded_data_length = strlen(kTestPageContents); - client->OnComplete(status); - - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(mock_peer_->received_response()); - // Request should have been cancelled with no additional messages. - // EXPECT_TRUE(peer_context.cancelled); - EXPECT_EQ("", mock_peer_->data()); - EXPECT_FALSE(mock_peer_->complete()); -} - class TimeConversionTest : public ResourceRequestSenderTest { public: void PerformTest(network::mojom::URLResponseHeadPtr response_head) { @@ -483,8 +271,7 @@ base::TimeTicks completion_time, base::TimeDelta delay) { std::unique_ptr<network::ResourceRequest> request(CreateResourceRequest()); - mock_peer_ = - base::MakeRefCounted<MockRequestPeer>(resource_request_sender_.get()); + mock_peer_ = base::MakeRefCounted<MockRequestPeer>(); StartAsync(std::move(request), mock_peer_); ASSERT_EQ(1u, loader_and_clients_.size());
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index e65b6fe..e6827da 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -436,7 +436,7 @@ }, { name: "BeforeunloadEventCancelByPreventDefault", - status: "experimental", + status: "stable", }, { name: "BidiCaretAffinity", @@ -2395,6 +2395,14 @@ status: "experimental", base_feature: "none", }, + // Desktop only, if enabled PaymentHandler will use the new minimal header UX. + // See https://crbug.com/1385136. + { + name: "PaymentHandlerMinimalHeaderUX", + origin_trial_feature_name: "PaymentHandlerMinimalHeaderUX", + origin_trial_allows_third_party: true, + origin_trial_os: ["win", "mac", "linux", "fuchsia", "chromeos"], + }, { name: "PaymentInstruments", depends_on: ["PaymentApp"],
diff --git a/third_party/blink/renderer/platform/storage/blink_storage_key_fuzzer.cc b/third_party/blink/renderer/platform/storage/blink_storage_key_fuzzer.cc index bb06c25..f4ad8668 100644 --- a/third_party/blink/renderer/platform/storage/blink_storage_key_fuzzer.cc +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_fuzzer.cc
@@ -5,6 +5,7 @@ #include "base/at_exit.h" #include "base/i18n/icu_util.h" #include "base/test/scoped_feature_list.h" +#include "mojo/core/embedder/embedder.h" #include "mojo/public/cpp/bindings/message.h" #include "net/base/features.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -13,13 +14,16 @@ #include "third_party/blink/renderer/platform/storage/blink_storage_key.h" #include "third_party/blink/renderer/platform/storage/blink_storage_key_mojom_traits.h" -struct IcuEnvironment { - IcuEnvironment() { CHECK(base::i18n::InitializeICU()); } +struct Environment { + Environment() { + CHECK(base::i18n::InitializeICU()); + mojo::core::Init(); + } // used by ICU integration. base::AtExitManager at_exit_manager; }; -IcuEnvironment* env = new IcuEnvironment(); +Environment* env = new Environment(); extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { std::string serialized_storage_key(reinterpret_cast<const char*>(data), size);
diff --git a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py index accf197..68770ce6 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py +++ b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py
@@ -2,17 +2,18 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import functools import logging import optparse from blinkpy.common.checkout.baseline_optimizer import BaselineOptimizer -from blinkpy.tool.commands.rebaseline import AbstractRebaseliningCommand +from blinkpy.tool.commands.rebaseline import AbstractParallelRebaselineCommand from blinkpy.web_tests.models.test_expectations import TestExpectationsCache _log = logging.getLogger(__name__) -class OptimizeBaselines(AbstractRebaseliningCommand): +class OptimizeBaselines(AbstractParallelRebaselineCommand): name = 'optimize-baselines' help_text = ('Reshuffles the baselines for the given tests to use ' 'as little space on disk as possible.') @@ -34,32 +35,58 @@ ] + self.platform_options + self.wpt_options) self._exp_cache = TestExpectationsCache() - def _optimize_baseline(self, optimizer, test_name): - for suffix in self._baseline_suffix_list: - optimizer.optimize(test_name, suffix) - def execute(self, options, args, tool): if not args != options.all_tests: _log.error('Must provide one of --all or TEST_NAMES') return self._tool = tool - self._baseline_suffix_list = options.suffixes.split(',') port_names = tool.port_factory.all_port_names(options.platform) if not port_names: _log.error("No port names match '%s'", options.platform) return - port = tool.port_factory.get(port_names[0], options) - optimizer = BaselineOptimizer(tool, port, port_names, self._exp_cache) + + port = tool.port_factory.get(options=options) + test_set = self._get_test_set(port, options, args) + if not test_set: + _log.error('No tests to optimize. Ensure all listed tests exist.') + return 1 + + worker_factory = functools.partial(Worker, + port_names=port_names, + options=options) + baseline_suffix_list = options.suffixes.split(',') + with self._message_pool(worker_factory) as pool: + tasks = [(self.name, test_name, suffix) for test_name in test_set + for suffix in baseline_suffix_list] + pool.run(tasks) + + def _get_test_set(self, port, options, args): test_set = set(port.tests() if options.all_tests else port.tests(args)) virtual_tests_to_exclude = set([ test for test in test_set if port.lookup_virtual_test_base(test) in test_set ]) test_set -= virtual_tests_to_exclude + return test_set - if not test_set: - _log.error('No tests to optimize. Ensure all listed tests exist.') - return 1 - for test_name in test_set: - self._optimize_baseline(optimizer, test_name) + +class Worker: + def __init__(self, connection, port_names, options): + self._connection = connection + self._options = options + self._port_names = port_names + + def start(self): + # Workers should never update the manifest, as this could cause a race. + # The manifest should already be updated by `optimize-baselines` or + # `rebaseline-cl`. + self._options.manifest_update = False + self._optimizer = BaselineOptimizer( + self._connection.host, + self._connection.host.port_factory.get(options=self._options), + self._port_names) + + def handle(self, name: str, source: str, test_name: str, suffix: str): + self._optimizer.optimize(test_name, suffix) + self._connection.post(name)
diff --git a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py index 5135131b..21b4642 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py
@@ -2,7 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import contextlib import optparse +from unittest import mock from blinkpy.tool.commands.optimize_baselines import OptimizeBaselines from blinkpy.tool.commands.rebaseline_unittest import BaseTestCase @@ -15,8 +17,20 @@ abs_path = self.tool.filesystem.join(port.web_tests_dir(), path) self.tool.filesystem.write_text_file(abs_path, contents) - def setUp(self): - super(TestOptimizeBaselines, self).setUp() + def _get_mock_pool(self, caller, worker_factory, num_workers): + worker_process = mock.Mock() + worker_process.host = self.tool + worker = worker_factory(worker_process) + message_pool = mock.Mock() + + def run(tasks): + worker.start() + for message_name, *args in tasks: + worker.handle(message_name, 'manager', *args) + + message_pool.run = run + message_pool = contextlib.nullcontext(message_pool) + return message_pool def test_optimize_all_suffixes_by_default(self): test_port = self.tool.port_factory.get('test')
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py index 7ea77e34..f852edd 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py
@@ -48,10 +48,6 @@ # the leading dot. # TODO(robertma): Investigate changing the CLI. BASELINE_SUFFIX_LIST = tuple(ext[1:] for ext in base.Port.BASELINE_EXTENSIONS) -# When large number of tests need to be optimized, limit the length of the commandline to 128 tests -# to not run into issues with any commandline size limitations with popen. In windows CreateProcess() -# arg length limit is 32768. With 250 chars in test path length, choosing a chunk size of 128. -MAX_TESTS_IN_OPTIMIZE_CMDLINE = 128 class AbstractRebaseliningCommand(Command): @@ -461,7 +457,7 @@ return copy_baseline_commands, rebaseline_commands, lines_to_remove - def _optimize_commands(self, test_baseline_set, verbose=False): + def _optimize_command(self, test_baseline_set, verbose=False): """Returns a list of commands to run in parallel to de-duplicate baselines.""" test_set = set() baseline_subset = self._filter_baseline_set_builders(test_baseline_set) @@ -483,35 +479,16 @@ ]) test_set -= virtual_tests_to_exclude - # Process the test_list so that each list caps at MAX_TESTS_IN_OPTIMIZE_CMDLINE tests - capped_test_list = [] - test_list = list(test_set) - for i in range(0, len(test_set), MAX_TESTS_IN_OPTIMIZE_CMDLINE): - capped_test_list.append(test_list[i:i + - MAX_TESTS_IN_OPTIMIZE_CMDLINE]) - - optimize_commands = [] - path_to_blink_tool = self._tool.path() - - # Build one optimize-baselines invocation command for each flag_spec. - # All the tests in the test list will be optimized iteratively. - for test_list in capped_test_list: - command = [ - self._tool.executable, - path_to_blink_tool, - 'optimize-baselines', - # FIXME: We should propagate the platform options as well. - # Prevent multiple baseline optimizer to race updating the manifest. - # The manifest has already been updated when listing tests. - '--no-manifest-update', - ] - if verbose: - command.append('--verbose') - - command.extend(test_list) - optimize_commands.append(command) - - return optimize_commands + command = [ + self._tool.path(), + 'optimize-baselines', + # The manifest has already been updated when listing tests. + '--no-manifest-update', + ] + if verbose: + command.append('--verbose') + command.extend(sorted(test_set)) + return command def _update_expectations_files(self, lines_to_remove): tests = list(lines_to_remove.keys()) @@ -558,9 +535,9 @@ system_remover.remove_os_versions(test, versions) system_remover.update_expectations() - def _message_pool(self): + def _message_pool(self, worker_factory): num_workers = min(self.MAX_WORKERS, self._tool.executive.cpu_count()) - return message_pool.get(self, self._worker_factory, num_workers) + return message_pool.get(self, worker_factory, num_workers) def _worker_factory(self, worker_connection): return Worker(worker_connection, @@ -595,30 +572,30 @@ # lines_to_remove are unexpected passes. copy_baseline_commands, rebaseline_commands, lines_to_remove = self._rebaseline_commands( test_baseline_set, options) - with self._message_pool() as pool: + with self._message_pool(self._worker_factory) as pool: pool.run([('copy_existing_baselines', command) for command in copy_baseline_commands]) - with self._message_pool() as pool: + with self._message_pool(self._worker_factory) as pool: pool.run([('rebaseline', command) for command in rebaseline_commands]) if lines_to_remove: self._update_expectations_files(lines_to_remove) + exit_code = 0 if options.optimize: # No point in optimizing during a dry run where no files were # downloaded. if self._dry_run: _log.info('Skipping optimization during dry run.') else: - optimize_commands = self._optimize_commands( + optimize_command = self._optimize_command( test_baseline_set, options.verbose) - with self._message_pool() as pool: - pool.run([('optimize_baselines', command) - for command in optimize_commands]) + exit_code = exit_code or self._tool.main(optimize_command) if not self._dry_run: self._tool.git().add_list(self.unstaged_baselines()) + return exit_code def unstaged_baselines(self): """Returns absolute paths for unstaged (including untracked) baselines."""
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py index ed1d4843..7f06327 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
@@ -671,14 +671,13 @@ '5000', '--step-name', 'blink_web_tests (with patch)', - ]], - [[ - 'python', - 'echo', - 'optimize-baselines', - '--no-manifest-update', - 'one/flaky-fail.html', ]]]) + self.tool.main.assert_called_once_with([ + 'echo', + 'optimize-baselines', + '--no-manifest-update', + 'one/flaky-fail.html', + ]) def test_rebaseline_command_invocations_multiple_steps(self): """Test the rebaseline tool handles multiple steps on the same builder. @@ -744,10 +743,12 @@ 'not_site_per_process_blink_web_tests (with patch)' ], ]) - self.assertEqual(self.tool.executive.calls[2], [[ - 'python', 'echo', 'optimize-baselines', '--no-manifest-update', - 'one/text-fail.html' - ]]) + self.tool.main.assert_called_once_with([ + 'echo', + 'optimize-baselines', + '--no-manifest-update', + 'one/text-fail.html', + ]) def test_execute_missing_results_with_no_fill_missing_prompts(self): self.tool.results_fetcher.set_results(
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py index 4818a398..938c770 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
@@ -144,12 +144,13 @@ self._mocks = contextlib.ExitStack() self._mocks.enter_context( - mock.patch('blinkpy.common.message_pool.get', - return_value=self._pool_mock())) + mock.patch.object(self.tool, 'main', create=True)) + self._mocks.enter_context( + mock.patch('blinkpy.common.message_pool.get', self._get_mock_pool)) self._mocks.enter_context( mock.patch.object(self.tool.port_factory, 'get', get_test_port)) - def _pool_mock(self): + def _get_mock_pool(self, caller, worker_factory, num_workers): message_pool = mock.Mock() message_pool.run = self._pool_run message_pool = contextlib.nullcontext(message_pool) @@ -408,15 +409,14 @@ 'MOCK Win7', '--step-name', 'blink_web_tests (with patch)', - ]], - [[ - 'python', - 'echo', - 'optimize-baselines', - '--no-manifest-update', - '--verbose', - 'userscripts/first-test.html', ]]]) + self.tool.main.assert_called_once_with([ + 'echo', + 'optimize-baselines', + '--no-manifest-update', + '--verbose', + 'userscripts/first-test.html', + ]) def test_rebaseline_debug(self): test_baseline_set = TestBaselineSet(self.tool) @@ -453,15 +453,14 @@ 'MOCK Win7 (dbg)', '--step-name', 'blink_web_tests (with patch)', - ]], - [[ - 'python', - 'echo', - 'optimize-baselines', - '--no-manifest-update', - '--verbose', - 'userscripts/first-test.html', ]]]) + self.tool.main.assert_called_once_with([ + 'echo', + 'optimize-baselines', + '--no-manifest-update', + '--verbose', + 'userscripts/first-test.html', + ]) def test_no_optimize(self): test_baseline_set = TestBaselineSet(self.tool) @@ -578,15 +577,14 @@ 'MOCK Win7', '--step-name', 'blink_web_tests (with patch)', - ]], - [[ - 'python', - 'echo', - 'optimize-baselines', - '--no-manifest-update', - '--verbose', - 'userscripts/first-test.html', ]]]) + self.tool.main.assert_called_once_with([ + 'echo', + 'optimize-baselines', + '--no-manifest-update', + '--verbose', + 'userscripts/first-test.html', + ]) @unittest.skip('Disabled because this does not reflect the behavior of '
diff --git a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/OWNERS b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/OWNERS new file mode 100644 index 0000000..5a20c0d5 --- /dev/null +++ b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/OWNERS
@@ -0,0 +1,3 @@ +jiesheng@chromium.org +weizhong@chromium.org +bsheedy@chromium.org
diff --git a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/__init__.py b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/__init__.py new file mode 100644 index 0000000..ef65bee5 --- /dev/null +++ b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/__init__.py
@@ -0,0 +1 @@ +# Required for Python to search this directory for module files
diff --git a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/fuzzy_diff_analyzer.py b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/fuzzy_diff_analyzer.py new file mode 100644 index 0000000..5db5820 --- /dev/null +++ b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/fuzzy_diff_analyzer.py
@@ -0,0 +1,43 @@ +# Copyright 2023 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Script to fuzzy diff analyzer for flaky image comparison web +tests. + +Example usage, which finds all failures for image comparison web tests in the +past 3 days. Any tests that both failed and passed more than twice on a +configuration is considered as a flaky test. The script will provide a +recommended fuzzy fixable range for the test: + +third_party/blink/tools/run_fuzzy_diff_analyzer.py \ + --project chrome-unexpected-pass-data \ + --sample-period 3 +""" + +import argparse + + +def ParseArgs() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=( + 'Script to fuzzy diff analyzer for flaky image comparison web tests')) + parser.add_argument( + '--project', + required=True, + help=('The billing project to use for BigQuery queries. ' + 'Must have access to the ResultDB BQ tables, e.g. ' + '"luci-resultdb.chromium.web_tests_ci_test_results".')) + parser.add_argument('--sample-period', + type=int, + default=1, + help='The number of days to sample data from.') + parser.add_argument( + '--test-path', + help='The test path that contains the tests to do fuzzy diff analyzer.' + ) + args = parser.parse_args() + return args + + +def main() -> int: + args = ParseArgs() + return 0
diff --git a/third_party/blink/tools/run_fuzzy_diff_analyzer.py b/third_party/blink/tools/run_fuzzy_diff_analyzer.py new file mode 100755 index 0000000..70ce660 --- /dev/null +++ b/third_party/blink/tools/run_fuzzy_diff_analyzer.py
@@ -0,0 +1,12 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +from blinkpy.web_tests.fuzzy_diff_analyzer import (fuzzy_diff_analyzer) + +import sys + +if __name__ == '__main__': + rc = fuzzy_diff_analyzer.main() + sys.exit(rc)
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 22a116d..a6e514c 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2954,6 +2954,8 @@ crbug.com/webrtc/10567 external/wpt/webrtc/RTCRtpParameters-encodings.html [ Failure Pass ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/source-registration.sub.https.html?method=open&eligible [ Failure Timeout ] +crbug.com/626703 [ Mac12 ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/source-registration.sub.https.html?method=open&eligible [ Failure Timeout ] crbug.com/626703 [ Linux ] virtual/pna-allow-secure-same-origin/external/wpt/fetch/private-network-access/iframe.tentative.https.window.html [ Timeout ] crbug.com/626703 [ Linux ] virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/iframe.tentative.https.window.html [ Timeout ] crbug.com/626703 external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html [ Failure ] @@ -6265,7 +6267,6 @@ crbug.com/1410530 [ Mac10.15 ] external/wpt/performance-timeline/tentative/include-frames-originA-B-A.html [ Failure ] crbug.com/1410530 [ Mac10.15 ] external/wpt/performance-timeline/tentative/include-frames-originA-B-B.html [ Failure ] crbug.com/1410530 [ Mac11-arm64 ] external/wpt/performance-timeline/tentative/include-frames-originA-B-A.html [ Failure ] -crbug.com/1411486 external/wpt/storage-access-api/storage-access-permission.sub.https.window.html [ Failure Pass ] crbug.com/1229708 [ Debug Linux ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Failure ] crbug.com/1412477 [ Mac ] editing/spelling/cold_mode_no_leak_detached_node.html [ Failure ] crbug.com/1412469 [ Mac ] http/tests/serviceworker/navigation_preload/navigation-preload-resource-timing.html [ Failure ] @@ -6740,10 +6741,6 @@ crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.html [ Failure Pass ] crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.html [ Failure Pass ] -# Test is not yet supported in Chrome. -crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.html [ Failure Pass ] -crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.html [ Failure Pass ] - # Missing priority hints interfaces. crbug.com/1345601 external/wpt/priority-hints/iframe-attr-fetchpriority.tentative.html [ Failure ] @@ -6916,3 +6913,12 @@ # Temporarily disabled to roll change of error message in V8. # TODO(crbug.com/v8/13743): Re-enable tests after V8 roll. crbug.com/v8/13743 fast/forms/ValidityState-patternMismatch.html [ Failure Pass ] + +# To land rename CL in devtools repo +crbug.com/1418045 http/tests/devtools/portals/portals-console.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/portals/portals-elements-activate.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/components/cookies-table.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/oopif/oopif-elements-inspect.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/network/request-name-path.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/inspector-backend-commands.js [ Failure Pass ] +crbug.com/1418045 http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index f04f83e8..846d0f24 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -135482,12 +135482,12 @@ ] ], "image-set-type-unsupported-rendering-2.html": [ - "ea2dd6f9795da60c0161ac0161c9d64e3bdbee21", + "bebc32d87d389a0d19e061eac31f96731f2aa042", [ null, [ [ - "/css/css-images/image-set/reference/image-set-rendering-ref.html", + "/css/reference/blank.html", "==" ] ], @@ -135495,12 +135495,12 @@ ] ], "image-set-type-unsupported-rendering.html": [ - "ef7c4a20efba60babec0f0bd08b772e684524d7e", + "486fcb3a8e04e216ef074b5c63db7d9639bb740b", [ null, [ [ - "/css/css-images/image-set/reference/image-set-rendering-ref.html", + "/css/reference/blank.html", "==" ] ], @@ -265445,11 +265445,11 @@ "support": { ".cache": { "gitignore2.json": [ - "373c372c67409347e5df3295bfd8b054cb3b09a6", + "52428f89bf9da0399896e975262b067012439831", [] ], "mtime.json": [ - "6d3a50900c8ebd14e5ad0372fa3d806f48592f54", + "72e6c5c0d50388b9da0ec6945e3d8cb40f89ab3a", [] ] }, @@ -272142,6 +272142,10 @@ "80dac74846b590570cf7becd21759bc8da6d7ee4", [] ], + "cookieStore_subscribe_arguments.https.any.js.ini": [ + "d6d51e42861896dcae11c745e63931b39f60c27e", + [] + ], "resources": { "always_changing_sw.sub.js": [ "9fdf99848fa50316e275cd6636a5755270a9bb1e", @@ -283687,6 +283691,10 @@ [] ] }, + "hit-test-transformed-inline.html.ini": [ + "c1620d0a9a04ea6c2c3dc6621e6fbfc91b098200", + [] + ], "inheritance-expected.txt": [ "738ea649f554f91280becd58a760fdd07827a9b1", [] @@ -300117,7 +300125,7 @@ [] ], "image-set-parsing-expected.txt": [ - "6d416df85fbeb249587f948ec97540c14f80d24f", + "97514f09ce091a2ab5cfb233f403b488590cc06a", [] ], "image-set-parsing.html.ini": [ @@ -302635,11 +302643,11 @@ [] ], "mask-image-interpolation-expected.txt": [ - "2ac1de9809a44d666fc616aee622bba3414acccc", + "2f4ae2af23315afaf6da75a0ec1edbfec33b1f91", [] ], "mask-image-interpolation.html.ini": [ - "08c3435f180e17ad94e0340dc76b9e6bc30d8ce6", + "cc6d9c58e1dc89b5d67a4e4cfaf89f9b4683853f", [] ], "mask-position-interpolation-expected.txt": [ @@ -320522,6 +320530,10 @@ [] ], "compute-kind-widget-generated": { + "kind-of-widget-fallback-color-input-background-attachment-001.html.ini": [ + "af8320f8847d4948398b722cc08cff19e152181b", + [] + ], "kind-of-widget-fallback-color-input-border-bottom-style-001.html.ini": [ "781e3a390720e3062919d91b8b872054bbd0548f", [] @@ -320546,6 +320558,10 @@ "7f0c55c56c12ea30869cc5b0b212ebfbaa31640f", [] ], + "kind-of-widget-fallback-input-search-border-left-style-001.html.ini": [ + "0a8d9de411e0bbb86ed17cfb635a7c6d532d2765", + [] + ], "kind-of-widget-fallback-input-search-text-border-block-end-style-001.html.ini": [ "bf85076c27628a5885b91254e618404c279873a7", [] @@ -320562,6 +320578,10 @@ "0a103751c35f49aefdaf0284d14ae70ecf9c3907", [] ], + "kind-of-widget-fallback-input-submit-border-image-source-001.html.ini": [ + "b73f367d4b01e102866bb57c8226b0d4685824c6", + [] + ], "kind-of-widget-fallback-input-submit-border-inline-end-style-001.html.ini": [ "f51d4a9c07c6dc242a4d336871bf2cd0303ebceb", [] @@ -328472,7 +328492,7 @@ ] }, "test_media_queries-expected.txt": [ - "c45b834da22892bb819dc75757aca50074c46a3b", + "0baac7d12c7ddbfb6e3bdf86ea5ddecc8447ab46", [] ], "test_media_queries.html.ini": [ @@ -334903,7 +334923,7 @@ [] ], "event-click-visibilitychange.html.ini": [ - "9b83651c171ae6c2864f6f033bfad584c60b498e", + "89fce3af5f45a24479e5d44a20acf97bb5d594b2", [] ], "first-input-interactionid-tap.html.ini": [ @@ -337634,6 +337654,10 @@ "30bde1e0542d144f9b5b0e47824802df13556ee2", [] ], + "shared-worker-blob-fetcher.html": [ + "a79869b2f96249969d44e5f18341fa1cbd094f4d", + [] + ], "shared-worker-fetcher.html": [ "4af4b1f23959e00c50d48a926f24d97edb8edb90", [] @@ -337643,7 +337667,7 @@ [] ], "support.sub.js": [ - "a104021d158d93288ae5ad5e3f1674d304b0e875", + "29942a2111f616b22b37935be82573a053fe5fc5", [] ], "worker-blob-fetcher.html": [ @@ -337691,6 +337715,22 @@ "2dbdad597586b04e19e6f05bc960aedea31cc120", [] ], + "shared-worker-blob-fetch.https.window-expected.txt": [ + "81f6d8aac3a8a7057b3b91cbcb1ff3b5b07eb774", + [] + ], + "shared-worker-blob-fetch.https.window.js.ini": [ + "43bc496ad9364b1ec1fe3715752b566ae4d0f290", + [] + ], + "shared-worker-blob-fetch.window-expected.txt": [ + "c6368e6354de6f00438e758b290621add7be3f78", + [] + ], + "shared-worker-blob-fetch.window.js.ini": [ + "b48d5d48ea420bcb120b1948ade50e9c1002f2ca", + [] + ], "shared-worker-fetch.https.window-expected.txt": [ "0dc5268932503b1922bc3e69b523c6d78d7c29b6", [] @@ -342888,7 +342928,7 @@ ] }, "open-features-is-popup-condition.html.ini": [ - "410b1a64465b5abfffba709f4b0fb1bfa2e2d559", + "526cf3d770453a60f4f3287b0c57fc5dee9b3f1b", [] ], "open-features-negative-innerwidth-innerheight.html.ini": [ @@ -344098,7 +344138,7 @@ }, "layers": { "2d.layer.endlayer.alone-expected.html": [ - "32e52ae93a777a8f6140b34db9087414966b5ba6", + "607526e4376282dcb4b8a359ada7a23a5fdb3286", [] ], "2d.layer.endlayer.unmatched-expected.html": [ @@ -344150,15 +344190,15 @@ [] ], "2d.layer.nested-expected.html": [ - "906db7003b5622be43e490e2b5e675fcdaed4422", + "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], "2d.layer.restore-style-expected.html": [ - "4893ecdf087a56346cfa4e9600c0c7c399dc6414", + "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] ], "2d.layer.several-complex-expected.html": [ - "afd03e26283720901d040d125cabe20b5c7d10ee", + "1944ea6d2ac8f11f3c17d4114070547c5c8ccb73", [] ] }, @@ -345090,7 +345130,7 @@ }, "layers": { "2d.layer.endlayer.alone-expected.html": [ - "32e52ae93a777a8f6140b34db9087414966b5ba6", + "607526e4376282dcb4b8a359ada7a23a5fdb3286", [] ], "2d.layer.endlayer.unmatched-expected.html": [ @@ -345142,15 +345182,15 @@ [] ], "2d.layer.nested-expected.html": [ - "906db7003b5622be43e490e2b5e675fcdaed4422", + "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], "2d.layer.restore-style-expected.html": [ - "4893ecdf087a56346cfa4e9600c0c7c399dc6414", + "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] ], "2d.layer.several-complex-expected.html": [ - "afd03e26283720901d040d125cabe20b5c7d10ee", + "1944ea6d2ac8f11f3c17d4114070547c5c8ccb73", [] ] }, @@ -345586,7 +345626,7 @@ [] ], "layers.yaml": [ - "204fc431a5603a0fb6cb7ee536a0b0319ce2afe9", + "6889e164bfb32d860deadde3b4b3e6a3e3dc2352", [] ], "line-styles.yaml": [ @@ -346226,7 +346266,7 @@ [] ], "iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini": [ - "66106c48202baa605600a290703de178002eb4d8", + "ec24744d088bd757f0a006d1500cd3b028c43531", [] ], "iframe-popup-same-origin-allow-popups-to-unsafe-none.https.html.headers": [ @@ -346427,6 +346467,10 @@ "9f55b4b24e1ba80dd6f40992de31a40bd97bb264", [] ], + "property-opener-set.https.html.ini": [ + "0e1bb44f93b2c2021362dc2e31a288e8e24644c8", + [] + ], "property-postmessage-1.https.html.ini": [ "d77f418e1fab843ec644eafdf2332b3d61e444da", [] @@ -354772,7 +354816,7 @@ [] ], "select-event.html.ini": [ - "a77aa7f66f53d285575319a1a3889136c65ddee6", + "6b0b8cd3008950f19e4e014aaa58f91e79267e69", [] ] }, @@ -362045,7 +362089,7 @@ [] ], "cross-origin-iframe.sub.html.ini": [ - "d78d0c90a2ba706d18fae6e62152b661a258e156", + "ab342f88a8b46d36df9f6a2b8ee910c10c45293e", [] ], "idlharness.window-expected.txt": [ @@ -362366,6 +362410,10 @@ "aa1921a72fc90346d33624a48f77e0ec51733ec2", [] ], + "non-tao-image-load-after-fcp.tentative.html.ini": [ + "a5de6ce745fa9a6719bbce50d1779137d9f8dc7e", + [] + ], "non-tao-image-load-before-fcp-render-after.tentative.html.ini": [ "5cec90b70b6f916c87569ed721fba09a761fa484", [] @@ -364751,7 +364799,7 @@ [] ], "mediasource-remove-expected.txt": [ - "2f1b1789fab83469dc5eb7133084d8be5c1baef4", + "384c1de4ac9f089115fd26fb42811738cf08c21f", [] ], "mediasource-remove.html.ini": [ @@ -368273,7 +368321,7 @@ [] ], "pointerevent_contextmenu_is_a_pointerevent.html.ini": [ - "a2c6066fd08feca5b04cde504552a920df0e42e6", + "8b54c2e03bcc4ddd143a8ca30188cbfbfb1a0c89", [] ], "pointerevent_fractional_coordinates.html.ini": [ @@ -377541,7 +377589,7 @@ [] ], "helpers.js": [ - "bb8f1e7c5cebd4389d3a0766fb6d94159a46fc6d", + "5728d0690d778b666ff661362855b8ca23b73f67", [] ], "requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.js.ini": [ @@ -377549,31 +377597,23 @@ [] ], "requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini": [ - "4aee41911ccc47963724a60c92453358bb59dcd1", + "9338e277c5e3acc519e00d0e07c910be491c624d", [] ], "requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.js.ini": [ - "f5f6fcdca475ac06fc8845b27adeb0766529e25e", - [] - ], - "requestStorageAccess-cross-site-iframe.sub.https.window-expected.txt": [ - "604680550963971a44606bd6c73bbcfcaf774dd4", + "f0612e5ada98307caea31e123c22ad664888f97e", [] ], "requestStorageAccess-cross-site-iframe.sub.https.window.js.ini": [ - "d0aab336c602f1e0be96311955e0b10d3f319195", + "aa17501c514b2960953b0eab40a9639e9529b650", [] ], "requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js.ini": [ - "38e40dbe5032987bf5b3c3011c78836de9afd4e5", - [] - ], - "requestStorageAccess-nested-cross-site-iframe.sub.https.window-expected.txt": [ - "dd76957fe72413cfd5960a7ba42ceb0f4f6ee9e9", + "2c7ca81c4f6de2259926175d94159f88372afcfc", [] ], "requestStorageAccess-nested-cross-site-iframe.sub.https.window.js.ini": [ - "883dd2e83ac46067ad6f940d43ce4a91e07315bc", + "9e18caa7b4a53402ed0ec15c1ebaeab7a69e01b1", [] ], "resources": { @@ -383319,6 +383359,12 @@ [] ] }, + "the-analysernode-interface": { + "test-analyser-output.html.ini": [ + "95b34fc8ee255b3912122717b6579c285581e594", + [] + ] + }, "the-audiobuffer-interface": { "acquire-the-content-expected.txt": [ "74faed557c78367661d2024d85dc5ec4b5c36c85", @@ -385266,6 +385312,10 @@ "6ca951c118305f5a9afe98f550755f7f744555dd", [] ], + "RTCPeerConnection-GC.https.html.ini": [ + "1bad8149ecbd0f469e2e0b68d47807921b16ff89", + [] + ], "RTCPeerConnection-addIceCandidate-expected.txt": [ "864ee7ec848a5eb6f84d54c6989bfe3824c3000f", [] @@ -427512,6 +427562,13 @@ ] ] }, + "sample-on-last-keyframe.html": [ + "d9dde2e87b997682060a1dbc226f6409ba48623b", + [ + null, + {} + ] + ], "style-animation-parsing.html": [ "792fda33ed8b0bacf355e62066ec05d54cc5c729", [ @@ -438230,7 +438287,7 @@ ] ], "image-set-parsing.html": [ - "961684e8281c7f8b762024886c875db8fd2a00ed", + "477a3f81215c67daeacab8520d79250e5edfd565", [ null, {} @@ -439499,7 +439556,7 @@ ] ], "mask-image-interpolation.html": [ - "beb9c9eaab0344cfdbb61700f52d9ff1f033e148", + "ac6b266992d5eafffa8a1195abe8aae0403819b2", [ null, {} @@ -441726,6 +441783,13 @@ {} ] ], + "custom-property-animation-used-in-shorthand.html": [ + "63f7fd3fe79bd3f95efe1dc717f0ac5418ad509f", + [ + null, + {} + ] + ], "custom-property-transition-angle.html": [ "974fc6c0db78f6413ef46c7695a33c0ce5e7bc7c", [ @@ -457760,6 +457824,13 @@ {} ] ], + "overflow-media-features.html": [ + "fb983318427f33bd8eb5a69f8b7fafeac9874515", + [ + null, + {} + ] + ], "prefers-color-scheme.html": [ "87c5add67ff96dd421b792b4b9b0f10d663b55b7", [ @@ -457796,7 +457867,7 @@ ] ], "test_media_queries.html": [ - "6a91c1119ddf7aeccab82bd4dd5c1031c880f896", + "fe3ba8195f981572aca7e7f08733d69a5151a7f0", [ null, {} @@ -494370,6 +494441,42 @@ } ] ], + "shared-worker-blob-fetch.https.window.js": [ + "ad9cd09c31b0a7aa83501f44a9e63455696ab9c2", + [ + "fetch/private-network-access/shared-worker-blob-fetch.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/support.sub.js" + ] + ] + } + ] + ], + "shared-worker-blob-fetch.window.js": [ + "d430ea7383771844bb8955e4c6be23c63e6adc59", + [ + "fetch/private-network-access/shared-worker-blob-fetch.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/support.sub.js" + ] + ] + } + ] + ], "shared-worker-fetch.https.window.js": [ "7066b359caa2ddb173a02a359d012456dd7a43a2", [ @@ -494470,24 +494577,6 @@ } ] ], - "worker-blob-fetch.https.window.js": [ - "3b811f2862b275bd04eb49e74e8d606b33a36c26", - [ - "fetch/private-network-access/worker-blob-fetch.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/utils.js" - ], - [ - "script", - "resources/support.sub.js" - ] - ] - } - ] - ], "worker-blob-fetch.window.js": [ "27cfa155c14cacfd0f25538bf6c25ecef67775b7", [ @@ -557020,7 +557109,7 @@ ] ], "mediasource-remove.html": [ - "6fea5a3e2e5366da0953d1348ab13a7d06e25877", + "64d5a31488b45c2b96b892e5599940fd236f60dc", [ null, {} @@ -568605,7 +568694,7 @@ ] ], "modulepreload.html": [ - "8902d67b7937e1a4e0cbea68883cc9045cae7b5f", + "58830fe064b5dfaa25e39d3982723a430dea6f0e", [ null, {} @@ -594965,7 +595054,7 @@ }, "storage-access-api": { "hasStorageAccess-insecure.sub.window.js": [ - "334d1d62aa0eaf0c000ae9e674c2f056e8b077a2", + "2f9f9f4f3890b133bf6a5722035fd58ff5a279e9", [ "storage-access-api/hasStorageAccess-insecure.sub.window.html", { @@ -594979,7 +595068,7 @@ ] ], "hasStorageAccess.sub.https.window.js": [ - "f7796c5250c14741312c25afb7610601f042606c", + "6cba6f0980a3c5b9cc186a1ee53743327fd4b381", [ "storage-access-api/hasStorageAccess.sub.https.window.html", { @@ -595041,7 +595130,7 @@ ] ], "requestStorageAccess-cross-origin-iframe.sub.https.window.js": [ - "2367afd003da375e6fa9c975b254412ec0012cd0", + "9183832957a76703a57eca28c4c18c7bf730112d", [ "storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.html", { @@ -595089,7 +595178,7 @@ ] ], "requestStorageAccess-cross-site-iframe.sub.https.window.js": [ - "f7c35ca25ed901c7dd5542bee84690ed80884d0d", + "53f90de75d06f6bbf95e99bd5ae7da7cd06f7830", [ "storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.html", { @@ -595111,7 +595200,7 @@ ] ], "requestStorageAccess-insecure.sub.window.js": [ - "f845f0647ca001e7a5fe304816a055e2d70c28df", + "34d275b5ae88b3017c775a62a03aae16bdc0d18b", [ "storage-access-api/requestStorageAccess-insecure.sub.window.html", { @@ -595133,7 +595222,7 @@ ] ], "requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js": [ - "e79148b4c44eed5e9b2062998a50c8750399a085", + "eeac9c2a401722732d819e6732f2bd5022a37096", [ "storage-access-api/requestStorageAccess-nested-cross-origin-iframe.sub.https.window.html", { @@ -595155,7 +595244,7 @@ ] ], "requestStorageAccess-nested-cross-site-iframe.sub.https.window.js": [ - "f3ac0e8558b5cc6a8a7bd01fc9f3cbedebb5bcde", + "59442d97c9385269a2cbf44af88abbd2708ca777", [ "storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.html", { @@ -595177,7 +595266,7 @@ ] ], "requestStorageAccess-nested-same-origin-iframe.sub.https.window.js": [ - "b3847bbc94722cd916a5c2c9aaa25702905da853", + "24d82c487f9544f269726899191d5be4d54517eb", [ "storage-access-api/requestStorageAccess-nested-same-origin-iframe.sub.https.window.html", { @@ -595221,7 +595310,7 @@ ] ], "requestStorageAccess-same-origin-iframe.sub.https.window.js": [ - "9c41d6cbbe439b70334a69cc8c747aa3f94536d9", + "f406ea1643d9adf4cd14f557703d08600a75c275", [ "storage-access-api/requestStorageAccess-same-origin-iframe.sub.https.window.html", { @@ -595243,7 +595332,7 @@ ] ], "requestStorageAccess.sub.https.window.js": [ - "061c87f76adb40bf5a004d67ef9563513884a573", + "6a9d5f4e57720c2309bd33db48918b77188b6627", [ "storage-access-api/requestStorageAccess.sub.https.window.html", { @@ -595272,7 +595361,7 @@ ] ], "storage-access-permission.sub.https.window.js": [ - "de85a140446366bae17aa941487dc1213a114db5", + "4222051c10bdc1c2ad060d7da1abec0ba6ea2f25", [ "storage-access-api/storage-access-permission.sub.https.window.html", { @@ -606730,7 +606819,7 @@ ] ], "urlsearchparams-size.any.js": [ - "eaf6d5e69b5face4ab46bf087180c640a4d355eb", + "7b3abc7c0b421cdb327921712a965aaaa03278b2", [ "url/urlsearchparams-size.any.html", {}
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini new file mode 100644 index 0000000..d6d51e4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.js.ini
@@ -0,0 +1,10 @@ +[cookieStore_subscribe_arguments.https.any.html] + expected: [ERROR, OK] + [CookieStore.unsubscribe is idempotent] + expected: [NOTRUN, PASS] + + [cookieStore.subscribe is idempotent] + expected: [PASS, NOTRUN] + + [cookieStore.subscribe with invalid url path in option] + expected: [PASS, NOTRUN]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/hit-test-transformed-inline.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/hit-test-transformed-inline.html.ini new file mode 100644 index 0000000..c1620d0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/hit-test-transformed-inline.html.ini
@@ -0,0 +1,12 @@ +[hit-test-transformed-inline.html] + [First child] + expected: FAIL + + [First x] + expected: FAIL + + [Last x] + expected: FAIL + + [Second child] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt index 6d416df8..97514f0 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 104 tests; 86 PASS, 18 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 114 tests; 96 PASS, 18 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS e.style['background-image'] = "image-set(url(example.png) 1x)" should set the property value PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x)" should set the property value PASS e.style['background-image'] = "image-set('example.jpg' 1x)" should set the property value @@ -10,6 +10,14 @@ PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1dpcm, 'example.png' 2x)" should set the property value PASS e.style['background-image'] = "image-set('example.jpeg' 222dpi, url(example.png) 3.5x)" should set the property value PASS e.style['background-image'] = "-webkit-image-set('example.jpeg' 222dpi, url(example.png) 3.5x)" should set the property value +PASS e.style['content'] = "image-set(url(\"example.png\") 1x)" should set the property value +PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1x)" should set the property value +PASS e.style['content'] = "image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value +PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value +PASS e.style['border-image-source'] = "image-set(url(\"example.png\") 1x)" should set the property value +PASS e.style['border-image-source'] = "-webkit-image-set(url(\"example.png\") 1x)" should set the property value +PASS e.style['border-image-source'] = "image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value +PASS e.style['border-image-source'] = "-webkit-image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value PASS e.style['background-image'] = "image-set(none, url(example.png) 1x)" should not set the property value PASS e.style['background-image'] = "-webkit-image-set(none, url(example.png) 1x)" should not set the property value PASS e.style['background-image'] = "image-set()" should not set the property value @@ -50,6 +58,8 @@ PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1dpcm)" should set the property value FAIL e.style['background-image'] = "image-set(url(\"example.png\") calc(1dpcm * 96/2.54))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dpcm * 96/2.54))" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['background-image'] = "image-set(url(\"example.png\") 1x, url(\"example.png\") 2dppx, \"example.png\" 250dpi, \"example.png\" 1dpcm)" should set the property value +PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1x, url(\"example.png\") 2dppx, \"example.png\" 250dpi, \"example.png\" 1dpcm)" should set the property value PASS e.style['content'] = "image-set(url(\"example.png\") 1dpi)" should set the property value PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1dpi)" should set the property value FAIL e.style['content'] = "image-set(url(\"example.png\") calc(1 * 96dpi))" should set the property value assert_not_equals: property should be set got disallowed value ""
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html index 961684e..477a3f81 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html
@@ -106,6 +106,11 @@ 'image-set(url("example.png") calc(1dppx))' ); test_valid_value_variants( + 'background-image', + 'image-set(url("example.png") 1x, url("example.png") 2dppx, "example.png" 250dpi, "example.png" 1dpcm)', + 'image-set(url("example.png") 1x, url("example.png") 2dppx, url("example.png") 250dpi, url("example.png") 1dpcm)' + ); + test_valid_value_variants( 'content', 'image-set(url("example.png") 1dpi)' ); @@ -245,6 +250,11 @@ test_valid_value_variants('background-image', "image-set(url(example.png) 1dpcm, 'example.png' 2x)", 'image-set(url("example.png") 1dpcm, url("example.png") 2x)'); test_valid_value_variants('background-image', "image-set('example.jpeg' 222dpi, url(example.png) 3.5x)", 'image-set(url("example.jpeg") 222dpi, url("example.png") 3.5x)'); + test_valid_value_variants('content', 'image-set(url("example.png") 1x)', 'image-set(url("example.png") 1x)'); + test_valid_value_variants('content', 'image-set(url("example.png") 1x, "example.png" 3x)', 'image-set(url("example.png") 1x, url("example.png") 3x)'); + test_valid_value_variants('border-image-source', 'image-set(url("example.png") 1x)', 'image-set(url("example.png") 1x)'); + test_valid_value_variants('border-image-source', 'image-set(url("example.png") 1x, "example.png" 3x)', 'image-set(url("example.png") 1x, url("example.png") 3x)'); + test_invalid_value_variants('background-image', "image-set(none, url(example.png) 1x)"); test_invalid_value_variants('background-image', "image-set()"); test_invalid_value_variants('background-image', "image-set(url(example.png) 0x)");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering-2.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering-2.html index ea2dd6f9..bebc32d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering-2.html +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering-2.html
@@ -3,7 +3,7 @@ <link rel="author" title="Noam Rosenthal" href="mailto:noam@webkit.org"> <link rel="author" title="Traian Captan" href="mailto:tcaptan@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-images-4/#image-set-notation"> -<link rel="match" href="reference/image-set-rendering-ref.html"> +<link rel="match" href="/css/reference/blank.html"> <meta name="assert" content="image-set rendering with all unsupported types"> <!-- Spec definition: @@ -16,9 +16,6 @@ the set should be empty. "This has no effect on the validity of the image-set() function" - -https://github.com/w3c/csswg-drafts/issues/8266 to define what the result -should be here, maybe an alternative would be to not render an image at all. --> <style> #test {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering.html index ef7c4a2..486fcb3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering.html +++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering.html
@@ -3,7 +3,7 @@ <link rel="author" title="Noam Rosenthal" href="mailto:noam@webkit.org"> <link rel="author" title="Traian Captan" href="mailto:tcaptan@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-images-4/#image-set-notation"> -<link rel="match" href="reference/image-set-rendering-ref.html"> +<link rel="match" href="/css/reference/blank.html"> <meta name="assert" content="image-set rendering with unsupported type"> <!-- Spec definition: @@ -12,10 +12,10 @@ First, remove any <image-set-option>s from the list that specify an unknown or unsupported MIME type in their type() value." -"This has no effect on the validity of the image-set() function" +If all the values in the image set are of an unsupported type, +the set should be empty. -https://github.com/w3c/csswg-drafts/issues/8266 to define what the result -should be here, maybe an alternative would be to not render an image at all. +"This has no effect on the validity of the image-set() function" --> <style> #test {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation-expected.txt index 2ac1de9..2f4ae2af 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation-expected.txt
@@ -1,242 +1,276 @@ This is a testharness.js-based test. -Found 240 tests; 0 PASS, 240 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false +Found 274 tests; 0 PASS, 274 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'to' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false FAIL Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'to' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (-0.3) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.3) should be [initial] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [initial] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (-0.3) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.3) should be [inherit] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [inherit] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (-0.3) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.3) should be [unset] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [unset] to [url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.6) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.6) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.6) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (0.6) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [url(../resources/blue-20.png)] at (1.5) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.6) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.6) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.6) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (-0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.3) should be [url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (0.6) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png)] to [linear-gradient(45deg, blue, transparent)] at (1.5) should be [linear-gradient(45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (-0.3) should be [none] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0) should be [none] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.3) should be [none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (0.6) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [none] to [url(../resources/green-20.png)] at (1.5) should be [url(../resources/green-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png)] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false -FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (-0.3) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.3) should be [url(../resources/blue-20.png), none] assert_true: 'from' value should be supported expected true got false +FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false FAIL Web Animations: property <mask-image> from [url(../resources/blue-20.png), none] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)] assert_true: 'from' value should be supported expected true got false
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html index beb9c9e..ac6b266 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html
@@ -28,102 +28,53 @@ <body> <script> // neutral -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: neutralKeyframe, to: 'url(../resources/green-20.png)', -}, [ - {at: -0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.6, expect: 'url(../resources/green-20.png)'}, - {at: 1, expect: 'url(../resources/green-20.png)'}, - {at: 1.5, expect: 'url(../resources/green-20.png)'}, -]); +}); // initial -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'initial', to: 'url(../resources/green-20.png)', -}, [ - {at: -0.3, expect: 'none'}, - {at: 0, expect: 'none'}, - {at: 0.3, expect: 'none'}, - {at: 0.6, expect: 'url(../resources/green-20.png)'}, - {at: 1, expect: 'url(../resources/green-20.png)'}, - {at: 1.5, expect: 'url(../resources/green-20.png)'}, -]); +}); // inherit -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'inherit', to: 'url(../resources/green-20.png)', -}, [ - {at: -0.3, expect: 'url(../resources/blue-20.png)'}, - {at: 0, expect: 'url(../resources/blue-20.png)'}, - {at: 0.3, expect: 'url(../resources/blue-20.png)'}, - {at: 0.6, expect: 'url(../resources/green-20.png)'}, - {at: 1, expect: 'url(../resources/green-20.png)'}, - {at: 1.5, expect: 'url(../resources/green-20.png)'}, -]); +}); // unset -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'unset', to: 'url(../resources/stripes-20.png)', -}, [ - {at: -0.3, expect: 'none'}, - {at: 0, expect: 'none'}, - {at: 0.3, expect: 'none'}, - {at: 0.6, expect: 'url(../resources/stripes-20.png)'}, - {at: 1, expect: 'url(../resources/stripes-20.png)'}, - {at: 1.5, expect: 'url(../resources/stripes-20.png)'}, -]); +}); // Image to image -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'url(../resources/stripes-20.png)', to: 'url(../resources/blue-20.png)', -}, [ - {at: -0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.6, expect: 'url(../resources/blue-20.png)'}, - {at: 1, expect: 'url(../resources/blue-20.png)'}, - {at: 1.5, expect: 'url(../resources/blue-20.png)'}, -]); +}); //Image to gradient -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'url(../resources/stripes-20.png)', to: 'linear-gradient(45deg, blue, transparent)' -}, [ - {at: -0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.3, expect: 'url(../resources/stripes-20.png)'}, - {at: 0.6, expect: 'linear-gradient(45deg, blue, transparent)'}, - {at: 1, expect: 'linear-gradient(45deg, blue, transparent)'}, - {at: 1.5, expect: 'linear-gradient(45deg, blue, transparent)'}, -]); +}); // Keyword to image -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'none', to: 'url(../resources/green-20.png)', -}, [ - {at: -0.3, expect: 'none'}, - {at: 0, expect: 'none'}, - {at: 0.3, expect: 'none'}, - {at: 0.6, expect: 'url(../resources/green-20.png)'}, - {at: 1, expect: 'url(../resources/green-20.png)'}, - {at: 1.5, expect: 'url(../resources/green-20.png)'}, -]); +}); // Multiple to multiple var fromA = 'url(../resources/stripes-20.png)'; @@ -132,49 +83,28 @@ var toB = 'url(../resources/stripes-20.png)'; var from = fromA + ', ' + fromB; var to = toA + ', ' + toB; -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: from, to: to, -}, [ - {at: -0.3, expect: from}, - {at: 0, expect: from}, - {at: 0.3, expect: from}, - {at: 0.6, expect: to}, - {at: 1, expect: to}, - {at: 1.5, expect: to}, -]); +}); // Single to multiple from = 'url(../resources/blue-20.png)'; toA = 'url(../resources/stripes-20.png)'; toB = 'url(../resources/blue-20.png)'; to = toA + ', ' + toB; -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: from, to: to, -}, [ - {at: -0.3, expect: from}, - {at: 0, expect: from}, - {at: 0.3, expect: from}, - {at: 0.6, expect: to}, - {at: 1, expect: to}, - {at: 1.5, expect: to}, -]); +}); // Multiple mismatched types -test_interpolation({ +test_no_interpolation({ property: 'mask-image', from: 'url(../resources/blue-20.png), none', to: 'url(../resources/stripes-20.png), url(../resources/blue-20.png)', -}, [ - {at: -0.3, expect: from}, - {at: 0, expect: from}, - {at: 0.3, expect: from}, - {at: 0.6, expect: to}, - {at: 1, expect: to}, - {at: 1.5, expect: to}, -]); +}); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html.ini b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html.ini index 08c3435..cc6d9c58 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/animations/mask-image-interpolation.html.ini
@@ -1,193 +1,25 @@ [mask-image-interpolation.html] - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [inherit\]] expected: FAIL [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [inherit\]] + expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [inherit\]] + expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] expected: FAIL @@ -197,274 +29,34 @@ [CSS Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [initial\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [initial\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [initial\]] expected: FAIL - [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] expected: FAIL - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] expected: FAIL [CSS Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] @@ -476,6 +68,9 @@ [CSS Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] expected: FAIL + [CSS Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + [CSS Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] expected: FAIL @@ -485,213 +80,57 @@ [CSS Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [unset\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [unset\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] expected: FAIL - [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [unset\]] expected: FAIL - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/stripes-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + [CSS Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] expected: FAIL - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] - expected: FAIL - - [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png), none\]] expected: FAIL [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png), none\]] + expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png), none\]] + expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] expected: FAIL @@ -701,15 +140,843 @@ [CSS Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] expected: FAIL + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions with transition: all: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [CSS Transitions: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [inherit\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [inherit\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [inherit\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [inherit\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [initial\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [initial\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [initial\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [initial\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [none\] to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (-0.3) should be [unset\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0) should be [unset\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [none\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.3) should be [unset\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [unset\] to [url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png), none\]] + expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png), none\]] + expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png), none\]] + expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] expected: FAIL @@ -718,3 +985,108 @@ [Web Animations: property <mask-image> from [url(../resources/blue-20.png), none\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/blue-20.png)\] to [url(../resources/stripes-20.png), url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/stripes-20.png), url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.3) should be [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (0.6) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png), linear-gradient(-45deg, blue, transparent)\] to [url(../resources/blue-20.png), url(../resources/stripes-20.png)\] at (1.5) should be [url(../resources/blue-20.png), url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (0.6) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [linear-gradient(45deg, blue, transparent)\] at (1.5) should be [linear-gradient(45deg, blue, transparent)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (0.6) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from [url(../resources/stripes-20.png)\] to [url(../resources/blue-20.png)\] at (1.5) should be [url(../resources/blue-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (-0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.3) should be [url(../resources/stripes-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.5) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (0.6) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1) should be [url(../resources/green-20.png)\]] + expected: FAIL + + [Web Animations: property <mask-image> from neutral to [url(../resources/green-20.png)\] at (1.5) should be [url(../resources/green-20.png)\]] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/animation/custom-property-animation-used-in-shorthand.html b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/animation/custom-property-animation-used-in-shorthand.html new file mode 100644 index 0000000..63f7fd3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/animation/custom-property-animation-used-in-shorthand.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<style> + +@property --angle { + syntax: "<angle>"; + inherits: false; + initial-value: 0deg; +} + +@keyframes angle-animation { + from { --angle: 0deg } + to { --angle: 180deg } +} + +#target { + animation: angle-animation 1000s linear -500s; + background: linear-gradient(var(--angle), black, white); +} + +</style> + +<div id="target"></div> + +<script> + +test(() => { + assert_equals(getComputedStyle(target).backgroundImage, 'linear-gradient(90deg, rgb(0, 0, 0), rgb(255, 255, 255))') +}, "Animated custom property is applied in a shorthand property."); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-background-attachment-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-background-attachment-001.html.ini new file mode 100644 index 0000000..af8320f8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-background-attachment-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-color-input-background-attachment-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-left-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-left-style-001.html.ini new file mode 100644 index 0000000..0a8d9de4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-left-style-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-input-search-border-left-style-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-image-source-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-image-source-001.html.ini new file mode 100644 index 0000000..b73f367 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-image-source-001.html.ini
@@ -0,0 +1,2 @@ +[kind-of-widget-fallback-input-submit-border-image-source-001.html] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/event-click-visibilitychange.html.ini b/third_party/blink/web_tests/external/wpt/event-timing/event-click-visibilitychange.html.ini index 9b83651c..89fce3a 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/event-click-visibilitychange.html.ini +++ b/third_party/blink/web_tests/external/wpt/event-timing/event-click-visibilitychange.html.ini
@@ -1,6 +1,4 @@ [event-click-visibilitychange.html] - expected: - if product == "chrome": [CRASH, ERROR] - TIMEOUT + expected: TIMEOUT [Event handlers which change visibility should not measure next paint.] expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/shared-worker-blob-fetcher.html b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/shared-worker-blob-fetcher.html new file mode 100644 index 0000000..a79869b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/shared-worker-blob-fetcher.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>SharedWorker Blob Fetcher</title> +<script> + window.addEventListener("message", function (evt) { + let { url } = evt.data; + + const workerScriptContent = ` + async function doFetch(url) { + const response = await fetch(url); + const body = await response.text(); + return { + status: response.status, + body, + }; + } + + async function fetchAndPost(url, port) { + try { + const message = await doFetch(url); + port.postMessage(message); + } catch(e) { + port.postMessage({ error: e.name }); + } + } + + const url = "${url}"; + + self.addEventListener("connect", async (evt) => { + await fetchAndPost(url, evt.ports[0]); + }); + `; + const blob = + new Blob([workerScriptContent], {type: 'application/javascript'}); + const workerScriptUrl = URL.createObjectURL(blob); + + const worker = new SharedWorker(workerScriptUrl); + + URL.revokeObjectURL(workerScriptUrl); + + worker.onerror = (evt) => { + parent.postMessage({ error: evt.message || "unknown error" }, "*"); + }; + + worker.port.addEventListener("message", (evt) => { + parent.postMessage(evt.data, "*"); + }); + worker.port.start(); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/support.sub.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/support.sub.js index a104021d..29942a2 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/support.sub.js +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/resources/support.sub.js
@@ -671,3 +671,21 @@ assert_equals(status, expected.status, "response status"); assert_equals(message, expected.message, "response body"); } + +async function sharedWorkerBlobFetchTest(t, { source, target, expected }) { + const targetUrl = preflightUrl(target); + + const fetcherUrl = resolveUrl( + 'resources/shared-worker-blob-fetcher.html', + sourceResolveOptions(source)); + + const reply = futureMessage(); + const iframe = await appendIframe(t, document, fetcherUrl); + + iframe.contentWindow.postMessage({ url: targetUrl.href }, "*"); + + const { error, status, message } = await reply; + assert_equals(error, expected.error, "fetch error"); + assert_equals(status, expected.status, "response status"); + assert_equals(message, expected.message, "response body"); +}
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt new file mode 100644 index 0000000..81f6d8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt
@@ -0,0 +1,17 @@ +This is a testharness.js-based test. +PASS local to local: success. +FAIL private to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS private to local: success. +PASS private to private: success. +FAIL public to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS public to local: success. +FAIL public to private: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS public to private: success. +PASS public to public: success. +FAIL treat-as-public to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS treat-as-public to local: success. +FAIL treat-as-public to private: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS treat-as-public to private: success. +PASS treat-as-public to public: success. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js similarity index 76% rename from third_party/blink/web_tests/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window.js rename to third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js index 3b811f28..ad9cd09 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window.js +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js
@@ -3,20 +3,20 @@ // // Spec: https://wicg.github.io/private-network-access/#integration-fetch // -// These tests check that fetches from within `Worker` scripts loaded from blob -// URLs are subject to Private Network Access checks, just like fetches from -// within documents. +// These tests check that fetches from within `SharedWorker` scripts that are +// loaded from blob URLs are subject to Private Network Access checks, just like +// fetches from within documents. // -// This file covers only those tests that must execute in a secure context. -// Other tests are defined in: worker-blob-fetch.window.js +// This file covers only those tests that must execute in a non-secure context. +// Other tests are defined in: shared-worker-blob-fetch.https.window.js -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL }, target: { server: Server.HTTPS_LOCAL }, expected: WorkerFetchTestResult.SUCCESS, }), "local to local: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PRIVATE }, target: { server: Server.HTTPS_LOCAL, @@ -25,7 +25,7 @@ expected: WorkerFetchTestResult.FAILURE, }), "private to local: failed preflight."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PRIVATE }, target: { server: Server.HTTPS_LOCAL, @@ -37,13 +37,13 @@ expected: WorkerFetchTestResult.SUCCESS, }), "private to local: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PRIVATE }, target: { server: Server.HTTPS_PRIVATE }, expected: WorkerFetchTestResult.SUCCESS, }), "private to private: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PUBLIC }, target: { server: Server.HTTPS_LOCAL, @@ -52,7 +52,7 @@ expected: WorkerFetchTestResult.FAILURE, }), "public to local: failed preflight."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PUBLIC }, target: { server: Server.HTTPS_LOCAL, @@ -64,7 +64,7 @@ expected: WorkerFetchTestResult.SUCCESS, }), "public to local: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PUBLIC }, target: { server: Server.HTTPS_PRIVATE, @@ -73,7 +73,7 @@ expected: WorkerFetchTestResult.FAILURE, }), "public to private: failed preflight."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PUBLIC }, target: { server: Server.HTTPS_PRIVATE, @@ -85,13 +85,13 @@ expected: WorkerFetchTestResult.SUCCESS, }), "public to private: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_PUBLIC }, target: { server: Server.HTTPS_PUBLIC }, expected: WorkerFetchTestResult.SUCCESS, }), "public to public: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL, treatAsPublic: true, @@ -100,19 +100,19 @@ expected: WorkerFetchTestResult.FAILURE, }), "treat-as-public to local: failed preflight."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL, treatAsPublic: true, }, target: { server: Server.HTTPS_LOCAL, - behavior: { preflight: PreflightBehavior.optionalSuccess(token()) }, + behavior: { preflight: PreflightBehavior.success(token()) }, }, expected: WorkerFetchTestResult.SUCCESS, }), "treat-as-public to local: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL, treatAsPublic: true, @@ -124,7 +124,7 @@ expected: WorkerFetchTestResult.FAILURE, }), "treat-as-public to private: failed preflight."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL, treatAsPublic: true, @@ -139,7 +139,7 @@ expected: WorkerFetchTestResult.SUCCESS, }), "treat-as-public to private: success."); -promise_test(t => workerBlobFetchTest(t, { +promise_test(t => sharedWorkerBlobFetchTest(t, { source: { server: Server.HTTPS_LOCAL, treatAsPublic: true, @@ -150,3 +150,4 @@ }, expected: WorkerFetchTestResult.SUCCESS, }), "treat-as-public to public: success."); +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js.ini new file mode 100644 index 0000000..43bc496 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window.js.ini
@@ -0,0 +1,15 @@ +[shared-worker-blob-fetch.https.window.html] + [private to local: failed preflight.] + expected: FAIL + + [public to local: failed preflight.] + expected: FAIL + + [public to private: failed preflight.] + expected: FAIL + + [treat-as-public to local: failed preflight.] + expected: FAIL + + [treat-as-public to private: failed preflight.] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt new file mode 100644 index 0000000..c6368e6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt
@@ -0,0 +1,18 @@ +This is a testharness.js-based test. +PASS local to local: success. +FAIL private to local: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS private to private: success. +FAIL public to local: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL public to private: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS public to public: success. +FAIL treat-as-public to local: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL treat-as-public to private: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS treat-as-public to public: success. +PASS local https to local: success. +FAIL private https to local: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL public https to local: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS local https to local https: success. +FAIL private https to local https: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL public https to local https: failure. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js new file mode 100644 index 0000000..d430ea73 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js
@@ -0,0 +1,173 @@ +// META: script=/common/utils.js +// META: script=resources/support.sub.js +// +// Spec: https://wicg.github.io/private-network-access/#integration-fetch +// +// These tests check that fetches from within `SharedWorker` scripts that are +// loaded from blob URLs are subject to Private Network Access checks, just like +// fetches from within documents. +// +// This file covers only those tests that must execute in a non-secure context. +// Other tests are defined in: shared-worker-blob-fetch.https.window.js + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_LOCAL }, + target: { server: Server.HTTP_LOCAL }, + expected: WorkerFetchTestResult.SUCCESS, +}), "local to local: success."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_PRIVATE }, + target: { + server: Server.HTTP_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "private to local: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_PRIVATE }, + target: { server: Server.HTTP_PRIVATE }, + expected: WorkerFetchTestResult.SUCCESS, +}), "private to private: success."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_PUBLIC }, + target: { + server: Server.HTTP_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "public to local: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_PUBLIC }, + target: { + server: Server.HTTP_PRIVATE, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "public to private: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTP_PUBLIC }, + target: { server: Server.HTTP_PUBLIC }, + expected: WorkerFetchTestResult.SUCCESS, +}), "public to public: success."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { + server: Server.HTTP_LOCAL, + treatAsPublic: true, + }, + target: { + server: Server.HTTP_LOCAL, + behavior: { preflight: PreflightBehavior.optionalSuccess(token()) }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "treat-as-public to local: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { + server: Server.HTTP_LOCAL, + treatAsPublic: true, + }, + target: { + server: Server.HTTP_PRIVATE, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "treat-as-public to private: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { + server: Server.HTTP_LOCAL, + treatAsPublic: true, + }, + target: { + server: Server.HTTP_PUBLIC, + behavior: { response: ResponseBehavior.allowCrossOrigin() }, + }, + expected: WorkerFetchTestResult.SUCCESS, +}), "treat-as-public to public: success."); + +// The following tests verify that workers served over HTTPS are not allowed to +// make private network requests because they are not secure contexts. + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_LOCAL }, + target: { + server: Server.HTTP_LOCAL, + behavior: { response: ResponseBehavior.allowCrossOrigin() }, + }, + expected: WorkerFetchTestResult.SUCCESS, +}), "local https to local: success."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_PUBLIC }, + target: { + server: Server.HTTP_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "private https to local: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_PUBLIC }, + target: { + server: Server.HTTP_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "public https to local: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_LOCAL }, + target: { + server: Server.HTTPS_LOCAL, + behavior: { response: ResponseBehavior.allowCrossOrigin() }, + }, + expected: WorkerFetchTestResult.SUCCESS, +}), "local https to local https: success."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_PRIVATE }, + target: { + server: Server.HTTPS_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "private https to local https: failure."); + +promise_test(t => sharedWorkerBlobFetchTest(t, { + source: { server: Server.HTTPS_PUBLIC }, + target: { + server: Server.HTTPS_LOCAL, + behavior: { + preflight: PreflightBehavior.optionalSuccess(token()), + response: ResponseBehavior.allowCrossOrigin(), + }, + }, + expected: WorkerFetchTestResult.FAILURE, +}), "public https to local https: failure.");
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js.ini new file mode 100644 index 0000000..b48d5d48 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window.js.ini
@@ -0,0 +1,27 @@ +[shared-worker-blob-fetch.window.html] + [private https to local https: failure.] + expected: FAIL + + [private https to local: failure.] + expected: FAIL + + [private to local: failure.] + expected: FAIL + + [public https to local https: failure.] + expected: FAIL + + [public https to local: failure.] + expected: FAIL + + [public to local: failure.] + expected: FAIL + + [public to private: failure.] + expected: FAIL + + [treat-as-public to local: failure.] + expected: FAIL + + [treat-as-public to private: failure.] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini index 410b1a644..526cf3d7 100644 --- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/open-close/open-features-is-popup-condition.html.ini
@@ -1,2 +1,5 @@ +[open-features-is-popup-condition.html?single-1] + expected: [TIMEOUT, ERROR] + [open-features-is-popup-condition.html?single-2] expected: [TIMEOUT, ERROR]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini index 66106c4..ec24744 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-allow-popups-to-same-origin.https.html.ini
@@ -9,3 +9,6 @@ [iframe-popup-same-origin-allow-popups-to-same-origin.https.html?7-8] expected: ERROR + +[iframe-popup-same-origin-allow-popups-to-same-origin.https.html?9-last] + expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini new file mode 100644 index 0000000..0e1bb44 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html.ini
@@ -0,0 +1,2 @@ +[property-opener-set.https.html] + expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini index a77aa7f6..6b0b8cd 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini
@@ -4,25 +4,26 @@ [input type password: select() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if product == "chrome": [PASS, FAIL] FAIL [input type password: select() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS - if product == "chrome": FAIL - [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [input type password: selectionDirection a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [PASS, FAIL] + FAIL [input type password: selectionDirection disconnected node] expected: FAIL [input type password: selectionDirection event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type password: selectionDirection twice in disconnected node (must fire select only once)] @@ -30,6 +31,7 @@ [input type password: selectionEnd a second time (must not fire select)] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] if product == "chrome": [FAIL, PASS] FAIL @@ -38,27 +40,32 @@ [input type password: selectionEnd event queue] expected: - if product == "chrome": FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [input type password: selectionEnd out of range a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type password: selectionEnd out of range disconnected node] expected: FAIL [input type password: selectionEnd out of range event queue] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] [input type password: selectionEnd out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type password: selectionEnd twice in disconnected node (must fire select only once)] expected: FAIL [input type password: selectionStart a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] FAIL [input type password: selectionStart disconnected node] @@ -66,43 +73,48 @@ [input type password: selectionStart event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type password: selectionStart out of range a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type password: selectionStart out of range disconnected node] expected: FAIL [input type password: selectionStart out of range event queue] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": FAIL [input type password: selectionStart out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type password: selectionStart twice in disconnected node (must fire select only once)] expected: FAIL [input type password: setRangeText() a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type password: setRangeText() disconnected node] expected: FAIL [input type password: setRangeText() event queue] expected: - if product == "chrome": FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [PASS, FAIL] [input type password: setRangeText() twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type password: setSelectionRange out of range a second time (must not fire select)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type password: setSelectionRange out of range disconnected node] expected: FAIL @@ -116,7 +128,7 @@ [input type password: setSelectionRange() a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] FAIL [input type password: setSelectionRange() disconnected node] @@ -124,49 +136,52 @@ [input type password: setSelectionRange() event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": [FAIL, PASS] [input type password: setSelectionRange() twice in disconnected node (must fire select only once)] expected: FAIL [input type search: select() disconnected node] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type search: select() event queue] - expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] - FAIL + expected: FAIL [input type search: select() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type search: selectionDirection a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] + FAIL [input type search: selectionDirection disconnected node] expected: FAIL [input type search: selectionDirection event queue] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": FAIL [input type search: selectionDirection twice in disconnected node (must fire select only once)] expected: FAIL [input type search: selectionEnd a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] + FAIL [input type search: selectionEnd disconnected node] expected: FAIL [input type search: selectionEnd event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type search: selectionEnd out of range a second time (must not fire select)] @@ -185,19 +200,21 @@ expected: FAIL [input type search: selectionEnd twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type search: selectionStart a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [PASS, FAIL] + FAIL [input type search: selectionStart disconnected node] expected: FAIL [input type search: selectionStart event queue] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": FAIL [input type search: selectionStart out of range a second time (must not fire select)] expected: @@ -209,80 +226,80 @@ [input type search: selectionStart out of range event queue] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": FAIL [input type search: selectionStart out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type search: selectionStart twice in disconnected node (must fire select only once)] expected: FAIL [input type search: setRangeText() a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [PASS, FAIL] + FAIL [input type search: setRangeText() disconnected node] expected: FAIL [input type search: setRangeText() event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type search: setRangeText() twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type search: setSelectionRange out of range a second time (must not fire select)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type search: setSelectionRange out of range disconnected node] expected: FAIL [input type search: setSelectionRange out of range event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [input type search: setSelectionRange out of range twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type search: setSelectionRange() a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type search: setSelectionRange() disconnected node] expected: FAIL [input type search: setSelectionRange() event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type search: setSelectionRange() twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type tel: select() disconnected node] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type tel: select() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] FAIL [input type tel: select() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type tel: selectionDirection a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] FAIL [input type tel: selectionDirection disconnected node] @@ -290,15 +307,15 @@ [input type tel: selectionDirection event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if product == "chrome": FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [input type tel: selectionDirection twice in disconnected node (must fire select only once)] expected: FAIL [input type tel: selectionEnd a second time (must not fire select)] expected: - if product == "chrome": [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] FAIL [input type tel: selectionEnd disconnected node] @@ -306,7 +323,8 @@ [input type tel: selectionEnd event queue] expected: - if product == "chrome": FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [input type tel: selectionEnd out of range a second time (must not fire select)] expected: FAIL @@ -316,16 +334,19 @@ [input type tel: selectionEnd out of range event queue] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": FAIL [input type tel: selectionEnd out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type tel: selectionEnd twice in disconnected node (must fire select only once)] expected: FAIL [input type tel: selectionStart a second time (must not fire select)] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": [FAIL, PASS] FAIL @@ -334,10 +355,13 @@ [input type tel: selectionStart event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type tel: selectionStart out of range a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type tel: selectionStart out of range disconnected node] expected: FAIL @@ -347,31 +371,30 @@ if product == "chrome": [FAIL, PASS] [input type tel: selectionStart out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [PASS, FAIL] + FAIL [input type tel: selectionStart twice in disconnected node (must fire select only once)] expected: FAIL [input type tel: setRangeText() a second time (must not fire select)] - expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] - FAIL + expected: FAIL [input type tel: setRangeText() disconnected node] expected: FAIL [input type tel: setRangeText() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] [input type tel: setRangeText() twice in disconnected node (must fire select only once)] - expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] - FAIL + expected: FAIL [input type tel: setSelectionRange out of range a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type tel: setSelectionRange out of range disconnected node] expected: FAIL @@ -385,7 +408,8 @@ [input type tel: setSelectionRange() a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] FAIL [input type tel: setSelectionRange() disconnected node] @@ -393,12 +417,13 @@ [input type tel: setSelectionRange() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": [FAIL, PASS] [input type tel: setSelectionRange() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] FAIL [input type text: select() disconnected node] @@ -406,32 +431,39 @@ [input type text: select() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] FAIL [input type text: select() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] if product == "chrome": [FAIL, PASS] [input type text: selectionDirection a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + FAIL [input type text: selectionDirection disconnected node] expected: FAIL [input type text: selectionDirection event queue] expected: - if product == "chrome": FAIL + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [input type text: selectionDirection twice in disconnected node (must fire select only once)] expected: FAIL [input type text: selectionEnd a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": [FAIL, PASS] FAIL [input type text: selectionEnd disconnected node] @@ -439,13 +471,13 @@ [input type text: selectionEnd event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL + if product == "chrome": [PASS, FAIL] [input type text: selectionEnd out of range a second time (must not fire select)] expected: - if product == "chrome": [PASS, FAIL] + if product == "chrome": [FAIL, PASS] FAIL [input type text: selectionEnd out of range disconnected node] @@ -462,31 +494,29 @@ [input type text: selectionEnd twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] - if product == "chrome": [PASS, FAIL] FAIL [input type text: selectionStart a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == "highdpi"): FAIL + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] if product == "chrome": [FAIL, PASS] - FAIL [input type text: selectionStart disconnected node] expected: FAIL [input type text: selectionStart event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL + if product == "chrome": [PASS, FAIL] [input type text: selectionStart out of range a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] - if product == "chrome": [PASS, FAIL] + if product == "chrome": [FAIL, PASS] FAIL [input type text: selectionStart out of range disconnected node] @@ -494,7 +524,7 @@ [input type text: selectionStart out of range event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [input type text: selectionStart out of range twice in disconnected node (must fire select only once)] expected: FAIL @@ -506,22 +536,22 @@ FAIL [input type text: setRangeText() a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type text: setRangeText() disconnected node] expected: FAIL [input type text: setRangeText() event queue] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] [input type text: setRangeText() twice in disconnected node (must fire select only once)] expected: FAIL [input type text: setSelectionRange out of range a second time (must not fire select)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type text: setSelectionRange out of range disconnected node] expected: FAIL @@ -531,51 +561,64 @@ if product == "chrome": [FAIL, PASS] [input type text: setSelectionRange out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type text: setSelectionRange() a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS + FAIL [input type text: setSelectionRange() disconnected node] expected: FAIL [input type text: setSelectionRange() event queue] expected: - if product == "chrome": [PASS, FAIL] + if product == "chrome": [FAIL, PASS] + [PASS, FAIL] [input type text: setSelectionRange() twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + FAIL [input type url: select() disconnected node] expected: FAIL [input type url: select() event queue] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): FAIL - if product == "chrome": FAIL - [FAIL, PASS] + if product == "chrome": [FAIL, PASS] + FAIL [input type url: select() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL - [PASS, FAIL] [input type url: selectionDirection a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] + FAIL [input type url: selectionDirection disconnected node] expected: FAIL [input type url: selectionDirection event queue] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if product == "chrome": FAIL [input type url: selectionDirection twice in disconnected node (must fire select only once)] expected: FAIL [input type url: selectionEnd a second time (must not fire select)] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] if product == "chrome": [FAIL, PASS] FAIL @@ -584,11 +627,13 @@ [input type url: selectionEnd event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] if product == "chrome": FAIL [input type url: selectionEnd out of range a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] FAIL [input type url: selectionEnd out of range disconnected node] @@ -596,20 +641,23 @@ [input type url: selectionEnd out of range event queue] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [input type url: selectionEnd out of range twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] FAIL [input type url: selectionEnd twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + FAIL [input type url: selectionStart a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if product == "chrome": [PASS, FAIL] FAIL [input type url: selectionStart disconnected node] @@ -617,23 +665,31 @@ [input type url: selectionStart event queue] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if product == "chrome": FAIL [input type url: selectionStart out of range a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type url: selectionStart out of range disconnected node] expected: FAIL [input type url: selectionStart out of range event queue] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] [input type url: selectionStart out of range twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [input type url: selectionStart twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + FAIL [input type url: setRangeText() a second time (must not fire select)] expected: FAIL @@ -643,47 +699,51 @@ [input type url: setRangeText() event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [input type url: setRangeText() twice in disconnected node (must fire select only once)] - expected: FAIL - - [input type url: setSelectionRange out of range a second time (must not fire select)] expected: if product == "chrome": [FAIL, PASS] FAIL + [input type url: setSelectionRange out of range a second time (must not fire select)] + expected: FAIL + [input type url: setSelectionRange out of range disconnected node] expected: FAIL [input type url: setSelectionRange out of range event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [input type url: setSelectionRange out of range twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [input type url: setSelectionRange() a second time (must not fire select)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + FAIL [input type url: setSelectionRange() disconnected node] expected: FAIL [input type url: setSelectionRange() event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] if product == "chrome": FAIL [input type url: setSelectionRange() twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] + FAIL [textarea: select() disconnected node] - expected: - if product == "chrome": [PASS, FAIL] + expected: [PASS, FAIL] [textarea: select() event queue] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] if product == "chrome": [FAIL, PASS] FAIL @@ -693,21 +753,25 @@ FAIL [textarea: selectionDirection a second time (must not fire select)] - expected: FAIL + expected: + if product == "chrome": [PASS, FAIL] + FAIL [textarea: selectionDirection disconnected node] expected: FAIL [textarea: selectionDirection event queue] expected: - if product == "chrome": [PASS, FAIL] + if product == "chrome": [FAIL, PASS] [textarea: selectionDirection twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL [textarea: selectionEnd a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] FAIL [textarea: selectionEnd disconnected node] @@ -715,7 +779,7 @@ [textarea: selectionEnd event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [PASS, FAIL] [textarea: selectionEnd out of range a second time (must not fire select)] expected: @@ -733,20 +797,19 @@ expected: FAIL [textarea: selectionEnd twice in disconnected node (must fire select only once)] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [textarea: selectionStart a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if product == "chrome": [PASS, FAIL] [textarea: selectionStart disconnected node] expected: FAIL [textarea: selectionStart event queue] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] FAIL [textarea: selectionStart out of range a second time (must not fire select)] @@ -766,33 +829,29 @@ [textarea: selectionStart twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] if product == "chrome": [FAIL, PASS] [textarea: setRangeText() a second time (must not fire select)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] if product == "chrome": [FAIL, PASS] FAIL [textarea: setRangeText() disconnected node] - expected: - if product == "chrome": [FAIL, PASS] - FAIL + expected: FAIL [textarea: setRangeText() event queue] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [textarea: setRangeText() twice in disconnected node (must fire select only once)] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] + if product == "chrome": [FAIL, PASS] FAIL [textarea: setSelectionRange out of range a second time (must not fire select)] expected: - if product == "chrome": [FAIL, PASS] + if product == "chrome": [PASS, FAIL] FAIL [textarea: setSelectionRange out of range disconnected node] @@ -800,22 +859,24 @@ [textarea: setSelectionRange out of range event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [textarea: setSelectionRange out of range twice in disconnected node (must fire select only once)] - expected: FAIL - - [textarea: setSelectionRange() a second time (must not fire select)] expected: if product == "chrome": [FAIL, PASS] FAIL + [textarea: setSelectionRange() a second time (must not fire select)] + expected: FAIL + [textarea: setSelectionRange() disconnected node] expected: FAIL [textarea: setSelectionRange() event queue] expected: - if product == "chrome": FAIL + if product == "chrome": [FAIL, PASS] [textarea: setSelectionRange() twice in disconnected node (must fire select only once)] - expected: FAIL + expected: + if product == "chrome": [FAIL, PASS] + FAIL
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini index d78d0c9..ab342f8 100644 --- a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini +++ b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
@@ -1,13 +1,15 @@ [cross-origin-iframe.sub.html] [iframeDocument.scrollingElement.scrollTop = 250] expected: + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS] if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL [topDocument.scrollingElement.scrollTop = 100] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL] [topDocument.scrollingElement.scrollTop = 200] expected: - if (product == "content_shell") and (os == "win"): PASS + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS] + if (product == "content_shell") and (os == "win") and (port == "win11"): PASS FAIL
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini new file mode 100644 index 0000000..a5de6ce --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/non-tao-image-load-after-fcp.tentative.html.ini
@@ -0,0 +1,3 @@ +[non-tao-image-load-after-fcp.tentative.html] + [Non-Tao Image Load and Render After FCP.] + expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html.ini index a2c6066f..8b54c2e 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html.ini +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html.ini
@@ -1,6 +1,4 @@ [pointerevent_contextmenu_is_a_pointerevent.html?touch] - expected: - if product == "chrome": CRASH - TIMEOUT + expected: TIMEOUT [contextmenu is a PointerEvent] expected: NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/preload/modulepreload.html b/third_party/blink/web_tests/external/wpt/preload/modulepreload.html index 8902d67..58830fe0 100644 --- a/third_party/blink/web_tests/external/wpt/preload/modulepreload.html +++ b/third_party/blink/web_tests/external/wpt/preload/modulepreload.html
@@ -163,18 +163,18 @@ promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; - link.href = 'resources/module1.js'; + link.href = 'resources/module1.js?submodule'; return attachAndWaitForLoad(link).then(() => { - verifyNumberOfDownloads('resources/module1.js', 1); + verifyNumberOfDownloads('resources/module1.js?submodule', 1); // The load event fires before (optional) submodules fetch. verifyNumberOfDownloads('resources/module2.js', 0); var script = document.createElement('script'); script.type = 'module'; - script.src = 'resources/module1.js'; + script.src = 'resources/module1.js?submodule'; return attachAndWaitForLoad(script); }).then(() => { - verifyNumberOfDownloads('resources/module1.js', 1); + verifyNumberOfDownloads('resources/module1.js?submodule', 1); verifyNumberOfDownloads('resources/module2.js', 1); }); }, 'link rel=modulepreload with submodules');
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/hasStorageAccess.sub.https.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/hasStorageAccess.sub.https.window.js index d2345b7b..6cba6f0 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/hasStorageAccess.sub.https.window.js +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/hasStorageAccess.sub.https.window.js
@@ -1,7 +1,7 @@ // META: script=helpers.js 'use strict'; -const {secure, testPrefix, topLevelDocument} = processQueryParams(); +const {testPrefix, topLevelDocument} = processQueryParams(); // Common tests to run in all frames. test(() => { @@ -10,12 +10,12 @@ promise_test(async () => { const hasAccess = await document.hasStorageAccess(); - if (secure) { - assert_true(hasAccess, "Access should be granted by default."); + if (topLevelDocument || testPrefix.includes('same-origin')) { + assert_true(hasAccess, "Access should be granted in top-level frame or same-origin iframe by default."); } else { - assert_false(hasAccess, "Access should not be granted in insecure contexts."); + assert_false(hasAccess, "Access should not be granted in secure cross-origin iframes."); } -}, `[${testPrefix}] document.hasStorageAccess() should be ${secure ? "allowed" : "disallowed"} by default.`); +}, "[" + testPrefix + "] document.hasStorageAccess() should not be allowed by default unless in top-level frame or same-origin iframe."); promise_test(async (t) => { const description = "Promise should reject when called on a generated document not part of the DOM.";
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js b/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js index 4df0b4a..5728d06 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/helpers.js
@@ -4,7 +4,6 @@ const url = new URL(window.location); const queryParams = url.searchParams; return { - secure: url.protocol === "https:", topLevelDocument: window === window.top, testPrefix: queryParams.get("testCase") || "top-level-context", };
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini index 4aee419..9338e27 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini
@@ -1,4 +1,9 @@ [requestStorageAccess-cross-origin-iframe.sub.https.window.html] + [[cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission] + expected: + if product == "chrome": PASS + FAIL + [[cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant] expected: if product == "chrome": PASS @@ -6,3 +11,7 @@ [[cross-origin-frame\] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access] expected: FAIL + + [[cross-origin-frame\] document.requestStorageAccess() should be resolved with no user gesture when a permission grant exists, and should allow cookie access] + expected: + if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.js.ini index f5f6fcd..f0612e5a 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.js.ini
@@ -1,3 +1,4 @@ [requestStorageAccess-cross-origin-sibling-iframes.sub.https.window.html] [Grants have per-frame scope] - expected: FAIL + expected: + if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window-expected.txt deleted file mode 100644 index 6046805..0000000 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -PASS [cross-site-frame] document.requestStorageAccess() should exist on the document interface -PASS [cross-site-frame] document.requestStorageAccess() should resolve in top-level frame or otherwise reject with a NotAllowedError with no user gesture -FAIL [cross-site-frame] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access assert_true: After obtaining storage access, subresource requests from the frame should send and set cookies. expected true got false -FAIL [cross-site-frame] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant assert_unreached: Should have rejected: document.requestStorageAccess() call without permission Reached unreachable code -PASS [cross-site-frame] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.js.ini index d0aab33..aa17501c 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.js.ini
@@ -1,9 +1,14 @@ [requestStorageAccess-cross-site-iframe.sub.https.window.html] + [[cross-site-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission] + expected: + if product == "chrome": PASS + FAIL + [[cross-site-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant] expected: if product == "chrome": PASS FAIL - [[cross-site-frame\] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access] + [[cross-site-frame\] document.requestStorageAccess() should be resolved with no user gesture when a permission grant exists, and should allow cookie access] expected: if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js.ini index 38e40db..2c7ca81 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-origin-iframe.sub.https.window.js.ini
@@ -1,4 +1,9 @@ [requestStorageAccess-nested-cross-origin-iframe.sub.https.window.html] + [[nested-cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission] + expected: + if product == "chrome": PASS + FAIL + [[nested-cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant] expected: if product == "chrome": PASS @@ -6,3 +11,7 @@ [[nested-cross-origin-frame\] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access] expected: FAIL + + [[nested-cross-origin-frame\] document.requestStorageAccess() should be resolved with no user gesture when a permission grant exists, and should allow cookie access] + expected: + if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window-expected.txt deleted file mode 100644 index dd76957..0000000 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -PASS [nested-cross-site-frame] document.requestStorageAccess() should exist on the document interface -PASS [nested-cross-site-frame] document.requestStorageAccess() should resolve in top-level frame or otherwise reject with a NotAllowedError with no user gesture -FAIL [nested-cross-site-frame] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access assert_true: After obtaining storage access, subresource requests from the frame should send and set cookies. expected true got false -FAIL [nested-cross-site-frame] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant assert_unreached: Should have rejected: document.requestStorageAccess() call without permission Reached unreachable code -PASS [nested-cross-site-frame] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.js.ini index 883dd2e..9e18caa 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.js.ini +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.js.ini
@@ -1,9 +1,14 @@ [requestStorageAccess-nested-cross-site-iframe.sub.https.window.html] + [[nested-cross-site-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission] + expected: + if product == "chrome": PASS + FAIL + [[nested-cross-site-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant] expected: if product == "chrome": PASS FAIL - [[nested-cross-site-frame\] document.requestStorageAccess() should be resolved when called properly with a user gesture, and should allow cookie access] + [[nested-cross-site-frame\] document.requestStorageAccess() should be resolved with no user gesture when a permission grant exists, and should allow cookie access] expected: if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.https.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.https.window.js index 08eef37..6a9d5f4e 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.https.window.js +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess.sub.https.window.js
@@ -30,14 +30,14 @@ }); promise_test(async t => { - if (topLevelDocument) { + if (topLevelDocument || testPrefix.includes('same-origin')) { await document.requestStorageAccess() - .catch(t.unreached_func("document.requestStorageAccess() call should resolve in top-level frame")); + .catch(t.unreached_func("document.requestStorageAccess() call should resolve in top-level frame or same-origin iframe.")); } else { return promise_rejects_dom(t, "NotAllowedError", document.requestStorageAccess(), - "document.requestStorageAccess() call without user gesture"); + "document.requestStorageAccess() call without user gesture."); } -}, "[" + testPrefix + "] document.requestStorageAccess() should resolve in top-level frame or otherwise reject with a NotAllowedError with no user gesture"); +}, "[" + testPrefix + "] document.requestStorageAccess() should resolve in top-level frame or same-origin iframe, otherwise reject with a NotAllowedError with no user gesture."); promise_test( async (t) => { @@ -47,7 +47,7 @@ await test_driver.delete_all_cookies(); }); - await RunCallbackWithGesture(() => document.requestStorageAccess()); + await document.requestStorageAccess(); await fetch(`${window.location.origin}/cookies/resources/set-cookie.py?name=cookie&path=/&samesite=None&secure=`) .then((resp) => resp.text()); @@ -57,7 +57,7 @@ 'After obtaining storage access, subresource requests from the frame should send and set cookies.'); }, '[' + testPrefix + - '] document.requestStorageAccess() should be resolved when called properly with a user gesture, and ' + + '] document.requestStorageAccess() should be resolved with no user gesture when a permission grant exists, and ' + 'should allow cookie access'); if (!topLevelDocument && !testPrefix.includes('same-origin')) {
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js index 278ece21..4222051c 100644 --- a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js +++ b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js
@@ -34,7 +34,7 @@ return; } - // We're in an iframe test now. + // We're in a cross-origin, same-site iframe test now. test_driver.set_test_context(window.top); promise_test(async t => { @@ -79,7 +79,7 @@ }); await test_driver.set_permission({ name: 'storage-access' }, 'granted'); - await RunCallbackWithGesture(() => document.requestStorageAccess()); + await document.requestStorageAccess(); const event = await p;
diff --git a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-size.any.js b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-size.any.js index eaf6d5e6..7b3abc7 100644 --- a/third_party/blink/web_tests/external/wpt/url/urlsearchparams-size.any.js +++ b/third_party/blink/web_tests/external/wpt/url/urlsearchparams-size.any.js
@@ -18,10 +18,10 @@ const url = new URL("http://localhost/query?a=1&b=2&a=3"); assert_equals(url.searchParams.size, 3); - params.delete("a"); + url.searchParams.delete("a"); assert_equals(url.searchParams.size, 1); - params.append("b", 4); + url.searchParams.append("b", 4); assert_equals(url.searchParams.size, 2); }, "URLSearchParams's size when obtained from a URL");
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini new file mode 100644 index 0000000..95b34fc8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-analysernode-interface/test-analyser-output.html.ini
@@ -0,0 +1,3 @@ +[test-analyser-output.html] + [AnalyserNode output] + expected: [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-GC.https.html.ini b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-GC.https.html.ini new file mode 100644 index 0000000..1bad8149 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-GC.https.html.ini
@@ -0,0 +1,3 @@ +[RTCPeerConnection-GC.https.html] + [GC does not collect a peer connection pipe rendering to a video element] + expected: FAIL
diff --git a/third_party/blink/web_tests/fast/spatial-navigation/snav-page-scrolling-key-events.html b/third_party/blink/web_tests/fast/spatial-navigation/snav-page-scrolling-key-events.html new file mode 100644 index 0000000..7ed41979 --- /dev/null +++ b/third_party/blink/web_tests/fast/spatial-navigation/snav-page-scrolling-key-events.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> + +<style> + a {font-size: 200px;} +</style> + +<a href="#" id="a">a</a><br> +<a href="#" id="b">b</a><br> +<a href="#" id="c">c</a><br> +<a href="#" id="d">d</a><br> +<a href="#" id="e">e</a><br> +<a href="#" id="f">f</a><br> +<a href="#" id="g">g</a><br> +<a href="#" id="h">h</a><br> +<a href="#" id="i">i</a><br> + +<script> + if (window.testRunner) { + testRunner.overridePreference('WebKitTabToLinksPreferenceKey', 1); + testRunner.overridePreference('WebKitSpatialNavigationEnabled', 1); + testRunner.waitUntilDone(); + } + + test(() => { + assert_equals(document.activeElement, document.body); + eventSender.keyDown('ArrowDown'); + assert_equals(document.activeElement, a); + eventSender.keyDown('ArrowDown'); + assert_equals(document.activeElement, b); + eventSender.keyDown('ArrowDown', ['altKey']); + assert_equals(document.activeElement, b); + eventSender.keyDown('ArrowDown'); + assert_equals(document.activeElement, c); + eventSender.keyDown('ArrowUp'); + assert_equals(document.activeElement, b); + eventSender.keyDown('ArrowUp', ['altKey']); + assert_equals(document.activeElement, b); + eventSender.keyDown('ArrowUp'); + assert_equals(document.activeElement, a); + }, "Alt + up/down key scrolls (page up/down) instead of changing the active element. Up and down keys alone still select a new element."); +</script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/components/cookies-table.js b/third_party/blink/web_tests/http/tests/devtools/components/cookies-table.js index df2501a..12fd73c 100644 --- a/third_party/blink/web_tests/http/tests/devtools/components/cookies-table.js +++ b/third_party/blink/web_tests/http/tests/devtools/components/cookies-table.js
@@ -88,7 +88,7 @@ } function createSortAndDumpCookies(cookieData, sortColumn, isAsc) { - const table = new CookieTable.CookiesTable(SDK.targetManager.mainTarget(), true); + const table = new CookieTable.CookiesTable(SDK.targetManager.rootTarget(), true); const cookies = cookieData.map(createCookie); table.dataGrid = mockDataGrid({sortColumn, isAsc}); table.sortCookies(cookies); @@ -97,7 +97,7 @@ } function createBuildAndDumpTable(cookieData, selectedNode, isAsc, lastEditedColumn) { - const table = new CookieTable.CookiesTable(SDK.targetManager.mainTarget(), true); + const table = new CookieTable.CookiesTable(SDK.targetManager.rootTarget(), true); const cookies = cookieData && cookieData.map(createCookie); const rootNode = mockNode({}); table.lastEditedColumnId = lastEditedColumn || null;
diff --git a/third_party/blink/web_tests/http/tests/devtools/inspector-backend-commands.js b/third_party/blink/web_tests/http/tests/devtools/inspector-backend-commands.js index 74cc69f..d5b631f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/inspector-backend-commands.js +++ b/third_party/blink/web_tests/http/tests/devtools/inspector-backend-commands.js
@@ -65,7 +65,7 @@ var sendMessageToBackendOriginal = InspectorFrontendHost.sendMessageToBackend; InspectorFrontendHost.sendMessageToBackend = sendMessageToBackendLoopback; - var agent = SDK.targetManager.mainTarget().profilerAgent(); + var agent = SDK.targetManager.rootTarget().profilerAgent(); await processResult( 'commandError', agent.commandError({'message': 'this is the error message'})); // Error: error in the protocol response
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/request-name-path.js b/third_party/blink/web_tests/http/tests/devtools/network/request-name-path.js index 5c27e7a..1ba8ffc 100644 --- a/third_party/blink/web_tests/http/tests/devtools/network/request-name-path.js +++ b/third_party/blink/web_tests/http/tests/devtools/network/request-name-path.js
@@ -11,24 +11,24 @@ * @param {string=} targetUrl */ function createNetworkRequestForURLAndDumpNameAndPath(url, targetUrl) { - var mainTarget = SDK.targetManager.mainTarget(); - var currentTargetURL = mainTarget.inspectedURL(); + var rootTarget = SDK.targetManager.rootTarget(); + var currentTargetURL = rootTarget.inspectedURL(); var dispatcher = TestRunner.networkManager.dispatcher; if (targetUrl) - mainTarget.setInspectedURL(targetUrl); + rootTarget.setInspectedURL(targetUrl); TestRunner.addResult('Dumping request name and path for url: ' + url); var request = dispatcher.createNetworkRequest(0, '', '', url); TestRunner.addResult(' name = ' + request.name()); TestRunner.addResult(' path = ' + request.path()); TestRunner.addResult(' targetUrl = ' + (targetUrl ? targetUrl : currentTargetURL)); if (targetUrl !== currentTargetURL) - mainTarget.setInspectedURL(currentTargetURL); + rootTarget.setInspectedURL(currentTargetURL); } // Save the target URL to ensure test works well with other tests. - var mainTarget = SDK.targetManager.mainTarget(); - var originalTargetURL = mainTarget.inspectedURL(); - mainTarget.setInspectedURL('http://127.0.0.1/aFolder/aTest.html'); + var rootTarget = SDK.targetManager.rootTarget(); + var originalTargetURL = rootTarget.inspectedURL(); + rootTarget.setInspectedURL('http://127.0.0.1/aFolder/aTest.html'); createNetworkRequestForURLAndDumpNameAndPath('http://www.example.com/foo/bar/baz?key=value'); createNetworkRequestForURLAndDumpNameAndPath('http://www.example.com/foo/bar/?key=value'); @@ -58,7 +58,7 @@ 'data:text/html,<html><body><img src="data:,foobar" /></body></html>', 'http://127.0.0.1/'); // Restore the target URL to ensure test works well with other tests. - mainTarget.setInspectedURL(originalTargetURL); + rootTarget.setInspectedURL(originalTargetURL); TestRunner.completeTest(); })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-cookies-refresh.js b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-cookies-refresh.js index 6e31a8a..f7dbd2a 100644 --- a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-cookies-refresh.js +++ b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-cookies-refresh.js
@@ -13,7 +13,7 @@ await TestRunner.showPanel('console'); await TestRunner.showPanel('resources'); - UI.panels.resources.showCookies(SDK.targetManager.mainTarget(), 'http://127.0.0.1:8000'); + UI.panels.resources.showCookies(SDK.targetManager.rootTarget(), 'http://127.0.0.1:8000'); await ApplicationTestRunner.waitForCookies(); await TestRunner.navigatePromise('resources/page-out.html'); @@ -26,4 +26,4 @@ ApplicationTestRunner.dumpCookieDomains(); ApplicationTestRunner.dumpCookies(); TestRunner.completeTest(); -})(); \ No newline at end of file +})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-inspect.js b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-inspect.js index 12b202b8..9c5916e 100644 --- a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-inspect.js +++ b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-inspect.js
@@ -14,7 +14,7 @@ SDK.targetManager.observeTargets({ targetAdded: async function(target) { - if (target === SDK.targetManager.mainTarget() || target === SDK.targetManager.mainFrameTarget()) + if (target === SDK.targetManager.rootTarget() || target === SDK.targetManager.mainFrameTarget()) return; let complete = false; target.pageAgent().setLifecycleEventsEnabled(true);
diff --git a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-navigate-in.js b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-navigate-in.js index 6a47da1..6a4e31b 100644 --- a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-navigate-in.js +++ b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-elements-navigate-in.js
@@ -25,10 +25,10 @@ await ElementsTestRunner.expandAndDump(); // Navigate iframe to in-process - let mainTarget = SDK.targetManager.mainTarget(); - await mainTarget.model(SDK.ResourceTreeModel)._agent.setLifecycleEventsEnabled(true); + let rootTarget = SDK.targetManager.rootTarget(); + await rootTarget.model(SDK.ResourceTreeModel)._agent.setLifecycleEventsEnabled(true); TestRunner.evaluateInPagePromise(`document.getElementById('page-iframe').src = 'http://127.0.0.1:8000/devtools/oopif/resources/inner-iframe.html';`); - mainTarget.model(SDK.ResourceTreeModel).addEventListener(SDK.ResourceTreeModel.Events.LifecycleEvent, async (event) => { + rootTarget.model(SDK.ResourceTreeModel).addEventListener(SDK.ResourceTreeModel.Events.LifecycleEvent, async (event) => { if (event.data.name === 'load') { await ElementsTestRunner.expandAndDump(); TestRunner.completeTest();
diff --git a/third_party/blink/web_tests/http/tests/devtools/portals/portals-console.js b/third_party/blink/web_tests/http/tests/devtools/portals/portals-console.js index 790d4216..60ed3bf 100644 --- a/third_party/blink/web_tests/http/tests/devtools/portals/portals-console.js +++ b/third_party/blink/web_tests/http/tests/devtools/portals/portals-console.js
@@ -49,9 +49,9 @@ async function activate(next) { TestRunner.evaluateInPage('activate()'); - await TestRunner.waitForTargetRemoved(SDK.targetManager.mainTarget()); + await TestRunner.waitForTargetRemoved(SDK.targetManager.rootTarget()); await TestRunner.waitForTarget(); - await TestRunner.waitForTarget(target => target != SDK.targetManager.mainTarget()); + await TestRunner.waitForTarget(target => target != SDK.targetManager.rootTarget()); await TestRunner.waitForExecutionContext(TestRunner.runtimeModel); targets = SDK.targetManager.targets(); next();
diff --git a/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-activate.js b/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-activate.js index 1c0b206..05213880 100644 --- a/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-activate.js +++ b/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-activate.js
@@ -25,9 +25,9 @@ async function testActivate(next) { TestRunner.evaluateInPage( 'setTimeout(() => {document.querySelector(\'portal\').activate();})'); - const mainTarget = SDK.targetManager.mainTarget(); + const rootTarget = SDK.targetManager.rootTarget(); await TestRunner.waitForEvent( - Host.InspectorFrontendHostAPI.Events.ReattachMainTarget, + Host.InspectorFrontendHostAPI.Events.ReattachRootTarget, Host.InspectorFrontendHost.events); next(); },
diff --git a/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-nesting-after-adoption.js b/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-nesting-after-adoption.js index 760dfb3..d66f311 100644 --- a/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-nesting-after-adoption.js +++ b/third_party/blink/web_tests/http/tests/devtools/portals/portals-elements-nesting-after-adoption.js
@@ -20,7 +20,7 @@ TestRunner.evaluateInPage('activate()'); TestRunner .waitForEvent( - Host.InspectorFrontendHostAPI.Events.ReattachMainTarget, + Host.InspectorFrontendHostAPI.Events.ReattachRootTarget, Host.InspectorFrontendHost.events) .then(next); });
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js index f5a6da2..8f6ed735 100644 --- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js +++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js
@@ -8,10 +8,10 @@ await TestRunner.loadTestModule('sdk_test_runner'); await TestRunner.showPanel('sources'); - SDK.targetManager.mainTarget().markAsNodeJSForTest(); + SDK.targetManager.rootTarget().markAsNodeJSForTest(); SourcesTestRunner.startDebuggerTest(); - var debuggerModel = SDK.targetManager.mainTarget().model(SDK.DebuggerModel); + var debuggerModel = SDK.targetManager.rootTarget().model(SDK.DebuggerModel); var functionText = 'function foobar() { \nconsole.log(\'foobar execute!\');\n}'; var sourceURL = Host.isWin() ? '\n//# sourceURL=c:\\prog\\foobar.js' : '\n//# sourceURL=/usr/local/home/prog/foobar.js'; await TestRunner.evaluateInPageAnonymously(functionText + sourceURL);
diff --git a/third_party/blink/web_tests/platform/win10/external/wpt/webrtc/RTCRtpReceiver-getStats.https-expected.txt b/third_party/blink/web_tests/platform/win10/external/wpt/webrtc/RTCRtpReceiver-getStats.https-expected.txt deleted file mode 100644 index f168452..0000000 --- a/third_party/blink/web_tests/platform/win10/external/wpt/webrtc/RTCRtpReceiver-getStats.https-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL receiver.getStats() via addTransceiver should return stats report containing inbound-rtp stats assert_equals: Expect dictionary.codecId to be string expected "string" but got "undefined" -FAIL receiver.getStats() via addTrack should return stats report containing inbound-rtp stats assert_equals: Expect dictionary.codecId to be string expected "string" but got "undefined" -FAIL receiver.getStats() should work on a stopped transceiver assert_equals: Expect dictionary.codecId to be string expected "string" but got "undefined" -FAIL receiver.getStats() should work with a closed PeerConnection assert_equals: Expect dictionary.codecId to be string expected "string" but got "undefined" -PASS receiver.getStats() should return stats report containing ICE candidate stats -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt b/third_party/blink/web_tests/virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt new file mode 100644 index 0000000..84aa738 --- /dev/null +++ b/third_party/blink/web_tests/virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt
@@ -0,0 +1,17 @@ +This is a testharness.js-based test. +PASS local to local: success. +FAIL private to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL private to local: success. assert_equals: fetch error expected (undefined) undefined but got (string) "TypeError" +PASS private to private: success. +FAIL public to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL public to local: success. assert_equals: fetch error expected (undefined) undefined but got (string) "TypeError" +FAIL public to private: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL public to private: success. assert_equals: fetch error expected (undefined) undefined but got (string) "TypeError" +PASS public to public: success. +FAIL treat-as-public to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL treat-as-public to local: success. assert_equals: response status expected 200 but got 405 +FAIL treat-as-public to private: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +FAIL treat-as-public to private: success. assert_equals: fetch error expected (undefined) undefined but got (string) "TypeError" +PASS treat-as-public to public: success. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/pna-allow-secure-same-origin/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window-expected.txt b/third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt similarity index 80% rename from third_party/blink/web_tests/virtual/pna-allow-secure-same-origin/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window-expected.txt rename to third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt index 36f8fb7..995bfcc5 100644 --- a/third_party/blink/web_tests/virtual/pna-allow-secure-same-origin/external/wpt/fetch/private-network-access/worker-blob-fetch.https.window-expected.txt +++ b/third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.https.window-expected.txt
@@ -8,7 +8,7 @@ PASS public to private: failed preflight. PASS public to private: success. PASS public to public: success. -FAIL treat-as-public to local: failed preflight. assert_equals: fetch error expected (string) "TypeError" but got (undefined) undefined +PASS treat-as-public to local: failed preflight. PASS treat-as-public to local: success. PASS treat-as-public to private: failed preflight. PASS treat-as-public to private: success.
diff --git a/third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt b/third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt new file mode 100644 index 0000000..26a1871 --- /dev/null +++ b/third_party/blink/web_tests/virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.window-expected.txt
@@ -0,0 +1,18 @@ +This is a testharness.js-based test. +PASS local to local: success. +PASS private to local: failure. +PASS private to private: success. +PASS public to local: failure. +PASS public to private: failure. +PASS public to public: success. +PASS treat-as-public to local: failure. +PASS treat-as-public to private: failure. +PASS treat-as-public to public: success. +PASS local https to local: success. +PASS private https to local: failure. +PASS public https to local: failure. +PASS local https to local https: success. +PASS private https to local https: failure. +PASS public https to local https: failure. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/visual-viewport.https.html.ini b/third_party/blink/web_tests/wpt_internal/fenced_frame/visual-viewport.https.html.ini index 1b2ee8a..abd881b 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/visual-viewport.https.html.ini +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/visual-viewport.https.html.ini
@@ -1,6 +1,4 @@ [visual-viewport.https.html] - expected: - if product == "chrome": ERROR - TIMEOUT + expected: TIMEOUT [visualViewport values inside fenced frame] expected: TIMEOUT
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js index fec757c..057870c 100644 --- a/third_party/closure_compiler/externs/accessibility_private.js +++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -1,4 +1,4 @@ -// Copyright 2022 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. @@ -333,17 +333,39 @@ * @enum {string} */ chrome.accessibilityPrivate.DlcType = { + TTS_BN_BD: 'ttsBnBd', + TTS_CS_CZ: 'ttsCsCz', + TTS_DA_DK: 'ttsDaDk', + TTS_DE_DE: 'ttsDeDe', + TTS_EL_GR: 'ttsElGr', + TTS_EN_AU: 'ttsEnAu', + TTS_EN_GB: 'ttsEnGb', + TTS_EN_US: 'ttsEnUs', TTS_ES_ES: 'ttsEsEs', TTS_ES_US: 'ttsEsUs', + TTS_FI_FI: 'ttsFiFi', + TTS_FIL_PH: 'ttsFilPh', TTS_FR_FR: 'ttsFrFr', TTS_HI_IN: 'ttsHiIn', - TTS_NL_NL: 'ttsNlNl', - TTS_PT_BR: 'ttsPtBr', - TTS_SV_SE: 'ttsSvSe', - TTS_EN_US: 'ttsEnUs', - TTS_JA_JP: 'ttsJaJp', - TTS_DE_DE: 'ttsDeDe', + TTS_HU_HU: 'ttsHuHu', + TTS_ID_ID: 'ttsIdId', TTS_IT_IT: 'ttsItIt', + TTS_JA_JP: 'ttsJaJp', + TTS_KM_KH: 'ttsKmKh', + TTS_KO_KR: 'ttsKoKr', + TTS_NB_NO: 'ttsNbNo', + TTS_NE_NP: 'ttsNeNp', + TTS_NL_NL: 'ttsNlNl', + TTS_PL_PL: 'ttsPlPl', + TTS_PT_BR: 'ttsPtBr', + TTS_SI_LK: 'ttsSiLk', + TTS_SK_SK: 'ttsSkSk', + TTS_SV_SE: 'ttsSvSe', + TTS_TH_TH: 'ttsThTh', + TTS_TR_TR: 'ttsTrTr', + TTS_UK_UA: 'ttsUkUa', + TTS_VI_VN: 'ttsViVn', + TTS_YUE_HK: 'ttsYueHk', }; /**
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium index 0de97fe..6d0a1fa 100644 --- a/third_party/libxml/README.chromium +++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@ Name: libxml URL: http://xmlsoft.org -Version: f67dc6189fce50aec9c1446cbe8c55268564485b +Version: 1eb2ca9f471909bae931aa09b257ac0dd41a30f5 CPEPrefix: cpe:/a:xmlsoft:libxml2:2.11.0 License: MIT License File: src/Copyright @@ -12,15 +12,9 @@ Modifications: -- chromium-issue-628581.patch: See https://crbug.com/628581#c18 - chromium-issue-894933.patch: Use ptrdiff_t instead of unsigned long for pointer differences in parser.c -- libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch: - See https://crbug.com/708433 - libxml2-2.9.4-security-xpath-nodetab-uaf.patch: See https://crbug.com/705445 -- chromium-issue-708434.patch: Guard against input counter overflow. -- chromium-issue-1138555.patch: Change TRUE to 1 for ICU68 which remove the - #define of TRUE. - undo-sax-deprecation.patch: Un-deprecate xmlSAXParseMemory because it is used in chromium's copy of maldoca. See https://github.com/google/maldoca/issues/87 - Add helper classes in the chromium/ subdirectory.
diff --git a/third_party/libxml/chromium/chromium-issue-628581.patch b/third_party/libxml/chromium/chromium-issue-628581.patch deleted file mode 100644 index a4bb714..0000000 --- a/third_party/libxml/chromium/chromium-issue-628581.patch +++ /dev/null
@@ -1,178 +0,0 @@ -diff --git a/entities.c b/entities.c -index 43549bc5..e4a09d62 100644 ---- a/entities.c -+++ b/entities.c -@@ -164,6 +164,7 @@ xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, - memset(ret, 0, sizeof(xmlEntity)); - ret->type = XML_ENTITY_DECL; - ret->checked = 0; -+ ret->guard = XML_ENTITY_NOT_BEING_CHECKED; - - /* - * fill the structure. -@@ -936,6 +937,7 @@ xmlCopyEntity(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) { - cur->orig = xmlStrdup(ent->orig); - if (ent->URI != NULL) - cur->URI = xmlStrdup(ent->URI); -+ cur->guard = 0; - return(cur); - } - -diff --git a/include/libxml/entities.h b/include/libxml/entities.h -index 47b4573e..012efab2 100644 ---- a/include/libxml/entities.h -+++ b/include/libxml/entities.h -@@ -35,8 +35,13 @@ typedef enum { - * and the linkind data needed for the linking in the hash table. - */ - -+typedef enum { -+ XML_ENTITY_NOT_BEING_CHECKED, -+ XML_ENTITY_BEING_CHECKED /* entity check is in progress */ -+} xmlEntityRecursionGuard; -+ - struct _xmlEntity { -- void *_private; /* application data */ -+ void *_private; /* application data */ - xmlElementType type; /* XML_ENTITY_DECL, must be second ! */ - const xmlChar *name; /* Entity name */ - struct _xmlNode *children; /* First child link */ -@@ -56,10 +61,11 @@ struct _xmlEntity { - struct _xmlEntity *nexte; /* unused */ - const xmlChar *URI; /* the full URI as computed */ - int owner; /* does the entity own the childrens */ -- int checked; /* was the entity content checked */ -- /* this is also used to count entities -- * references done from that entity -- * and if it contains '<' */ -+ int checked; /* was the entity content checked and */ -+ /* l.o. bit: replacement contains '<' */ -+ /* remaining bits: one plus count of */ -+ /* entity references from this entity */ -+ xmlEntityRecursionGuard guard; - }; - - /* -diff --git a/parser.c b/parser.c -index ca9fde2c..4264445a 100644 ---- a/parser.c -+++ b/parser.c -@@ -143,18 +143,25 @@ xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, - * This may look absurd but is needed to detect - * entities problems - */ -+ if ((ent != NULL) && (ent->guard == XML_ENTITY_BEING_CHECKED)) { -+ xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); -+ return (1); -+ } -+ - if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && - (ent->content != NULL) && (ent->checked == 0) && - (ctxt->errNo != XML_ERR_ENTITY_LOOP)) { - unsigned long oldnbent = ctxt->nbentities, diff; - xmlChar *rep; - -+ ent->guard = XML_ENTITY_BEING_CHECKED; - ent->checked = 1; - - ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); - --ctxt->depth; -+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED; - if ((rep == NULL) || (ctxt->errNo == XML_ERR_ENTITY_LOOP)) { - ent->content[0] = 0; - } -@@ -7116,23 +7123,28 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { - * if its replacement text matches the production labeled - * content. - */ -- if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { -- ctxt->depth++; -- ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content, -- user_data, &list); -- ctxt->depth--; -- -- } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) { -- ctxt->depth++; -- ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax, -- user_data, ctxt->depth, ent->URI, -- ent->ExternalID, &list); -- ctxt->depth--; -- } else { -- ret = XML_ERR_ENTITY_PE_INTERNAL; -- xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, -- "invalid entity type found\n", NULL); -- } -+ if (ent->guard == XML_ENTITY_BEING_CHECKED) { -+ ret = XML_ERR_ENTITY_LOOP; -+ } else { -+ ent->guard = XML_ENTITY_BEING_CHECKED; -+ if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { -+ ctxt->depth++; -+ ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content, -+ user_data, &list); -+ ctxt->depth--; -+ } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) { -+ ctxt->depth++; -+ ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax, -+ user_data, ctxt->depth, ent->URI, -+ ent->ExternalID, &list); -+ ctxt->depth--; -+ } else { -+ ret = XML_ERR_ENTITY_PE_INTERNAL; -+ xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, -+ "invalid entity type found\n", NULL); -+ } -+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED; -+ } - - /* - * Store the number of entities needing parsing for this entity -@@ -7239,23 +7251,29 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { - else - user_data = ctxt->userData; - -- if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { -- ctxt->depth++; -- ret = xmlParseBalancedChunkMemoryInternal(ctxt, -- ent->content, user_data, NULL); -- ctxt->depth--; -- } else if (ent->etype == -- XML_EXTERNAL_GENERAL_PARSED_ENTITY) { -- ctxt->depth++; -- ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, -- ctxt->sax, user_data, ctxt->depth, -- ent->URI, ent->ExternalID, NULL); -- ctxt->depth--; -- } else { -- ret = XML_ERR_ENTITY_PE_INTERNAL; -- xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, -- "invalid entity type found\n", NULL); -- } -+ if (ent->guard == XML_ENTITY_BEING_CHECKED) { -+ ret = XML_ERR_ENTITY_LOOP; -+ } else { -+ ent->guard = XML_ENTITY_BEING_CHECKED; -+ if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { -+ ctxt->depth++; -+ ret = xmlParseBalancedChunkMemoryInternal(ctxt, -+ ent->content, user_data, NULL); -+ ctxt->depth--; -+ } else if (ent->etype == -+ XML_EXTERNAL_GENERAL_PARSED_ENTITY) { -+ ctxt->depth++; -+ ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, -+ ctxt->sax, user_data, ctxt->depth, -+ ent->URI, ent->ExternalID, NULL); -+ ctxt->depth--; -+ } else { -+ ret = XML_ERR_ENTITY_PE_INTERNAL; -+ xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, -+ "invalid entity type found\n", NULL); -+ } -+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED; -+ } - if (ret == XML_ERR_ENTITY_LOOP) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return;
diff --git a/third_party/libxml/chromium/chromium-issue-708434.patch b/third_party/libxml/chromium/chromium-issue-708434.patch deleted file mode 100644 index bd8e1a6..0000000 --- a/third_party/libxml/chromium/chromium-issue-708434.patch +++ /dev/null
@@ -1,19 +0,0 @@ -diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c -index bfc778ac1f77..286fdcea9760 100644 ---- src/parserInternals.c -+++ src/parserInternals.c -@@ -1369,8 +1369,13 @@ xmlNewInputStream(xmlParserCtxtPtr ctxt) { - * should not happen while parsing which is the situation where - * the id is actually needed. - */ -- if (ctxt != NULL) -+ if (ctxt != NULL) { -+ if (ctxt->input_id >= INT_MAX) { -+ xmlErrMemory(ctxt, "Input ID overflow\n"); -+ return(NULL); -+ } - input->id = ctxt->input_id++; -+ } - - return(input); - }
diff --git a/third_party/libxml/chromium/roll.py b/third_party/libxml/chromium/roll.py index b0d1951..78181e4d 100755 --- a/third_party/libxml/chromium/roll.py +++ b/third_party/libxml/chromium/roll.py
@@ -66,9 +66,7 @@ # e. Complete the review as usual PATCHES = [ - 'chromium-issue-628581.patch', 'libxml2-2.9.4-security-xpath-nodetab-uaf.patch', - 'chromium-issue-708434.patch', 'undo-sax-deprecation.patch', ]
diff --git a/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo b/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo b/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo b/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo b/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-buf.Plo b/third_party/libxml/linux/.deps/libxml2_la-buf.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-buf.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo b/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo b/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo b/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo b/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-dict.Plo b/third_party/libxml/linux/.deps/libxml2_la-dict.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-dict.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo b/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-entities.Plo b/third_party/libxml/linux/.deps/libxml2_la-entities.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-entities.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-error.Plo b/third_party/libxml/linux/.deps/libxml2_la-error.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-error.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-globals.Plo b/third_party/libxml/linux/.deps/libxml2_la-globals.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-globals.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-hash.Plo b/third_party/libxml/linux/.deps/libxml2_la-hash.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-hash.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo b/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-list.Plo b/third_party/libxml/linux/.deps/libxml2_la-list.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-list.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo b/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo b/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-parser.Plo b/third_party/libxml/linux/.deps/libxml2_la-parser.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-parser.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo b/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo b/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo b/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo b/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-threads.Plo b/third_party/libxml/linux/.deps/libxml2_la-threads.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-threads.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-tree.Plo b/third_party/libxml/linux/.deps/libxml2_la-tree.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-tree.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-trio.Plo b/third_party/libxml/linux/.deps/libxml2_la-trio.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-trio.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo b/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-uri.Plo b/third_party/libxml/linux/.deps/libxml2_la-uri.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-uri.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-valid.Plo b/third_party/libxml/linux/.deps/libxml2_la-valid.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-valid.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo b/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo b/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo b/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo b/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo b/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/runsuite.Po b/third_party/libxml/linux/.deps/runsuite.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/runsuite.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/runtest-runtest.Po b/third_party/libxml/linux/.deps/runtest-runtest.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/runtest-runtest.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/runxmlconf.Po b/third_party/libxml/linux/.deps/runxmlconf.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/runxmlconf.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testModule.Po b/third_party/libxml/linux/.deps/testModule.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testModule.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testThreads-testThreads.Po b/third_party/libxml/linux/.deps/testThreads-testThreads.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testThreads-testThreads.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testapi.Po b/third_party/libxml/linux/.deps/testapi.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testapi.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testchar.Po b/third_party/libxml/linux/.deps/testchar.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testchar.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testdict.Po b/third_party/libxml/linux/.deps/testdict.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testdict.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testdso.Plo b/third_party/libxml/linux/.deps/testdso.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testdso.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testlimits.Po b/third_party/libxml/linux/.deps/testlimits.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testlimits.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/testrecurse.Po b/third_party/libxml/linux/.deps/testrecurse.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/testrecurse.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/xmlcatalog.Po b/third_party/libxml/linux/.deps/xmlcatalog.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/xmlcatalog.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/.deps/xmllint-xmllint.Po b/third_party/libxml/linux/.deps/xmllint-xmllint.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/.deps/xmllint-xmllint.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/Makefile b/third_party/libxml/linux/doc/Makefile new file mode 100644 index 0000000..4ab8a0e --- /dev/null +++ b/third_party/libxml/linux/doc/Makefile
@@ -0,0 +1,886 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# doc/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(nobase_dist_doc_DATA) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" +NROFF = nroff +MANS = $(dist_man_MANS) +DATA = $(nobase_dist_doc_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +SUBDIRS = . devhelp examples +nobase_dist_doc_DATA = \ + tutorial/apa.html \ + tutorial/apb.html \ + tutorial/apc.html \ + tutorial/apd.html \ + tutorial/ape.html \ + tutorial/apf.html \ + tutorial/apg.html \ + tutorial/aph.html \ + tutorial/api.html \ + tutorial/ar01s02.html \ + tutorial/ar01s03.html \ + tutorial/ar01s04.html \ + tutorial/ar01s05.html \ + tutorial/ar01s06.html \ + tutorial/ar01s07.html \ + tutorial/ar01s08.html \ + tutorial/ar01s09.html \ + tutorial/images/blank.png \ + tutorial/images/callouts/1.png \ + tutorial/images/callouts/10.png \ + tutorial/images/callouts/2.png \ + tutorial/images/callouts/3.png \ + tutorial/images/callouts/4.png \ + tutorial/images/callouts/5.png \ + tutorial/images/callouts/6.png \ + tutorial/images/callouts/7.png \ + tutorial/images/callouts/8.png \ + tutorial/images/callouts/9.png \ + tutorial/images/caution.png \ + tutorial/images/draft.png \ + tutorial/images/home.png \ + tutorial/images/important.png \ + tutorial/images/next.png \ + tutorial/images/note.png \ + tutorial/images/prev.png \ + tutorial/images/tip.png \ + tutorial/images/toc-blank.png \ + tutorial/images/toc-minus.png \ + tutorial/images/toc-plus.png \ + tutorial/images/up.png \ + tutorial/images/warning.png \ + tutorial/includeaddattribute.c \ + tutorial/includeaddkeyword.c \ + tutorial/includeconvert.c \ + tutorial/includegetattribute.c \ + tutorial/includekeyword.c \ + tutorial/includexpath.c \ + tutorial/index.html \ + tutorial/ix01.html \ + xmlcatalog.html \ + xmllint.html + +dist_man_MANS = xml2-config.1 xmllint.1 xmlcatalog.1 +EXTRA_DIST = \ + apibuild.py \ + libxml2-api.xml \ + xmlcatalog.xml \ + xmllint.xml + +DOCBOOK_HTML = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-nobase_dist_docDATA: $(nobase_dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + $(am__nobase_list) | while read dir files; do \ + xfiles=; for file in $$files; do \ + if test -f "$$file"; then xfiles="$$xfiles $$file"; \ + else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ + test -z "$$xfiles" || { \ + test "x$$dir" = x. || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)/$$dir'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)/$$dir"; }; \ + echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(docdir)/$$dir'"; \ + $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(docdir)/$$dir" || exit $$?; }; \ + done + +uninstall-nobase_dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(MANS) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-man install-nobase_dist_docDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-man uninstall-nobase_dist_docDATA + +uninstall-man: uninstall-man1 + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-nobase_dist_docDATA install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-man \ + uninstall-man1 uninstall-nobase_dist_docDATA + +.PRECIOUS: Makefile + + +rebuild: + cd $(srcdir) && ./apibuild.py + cd $(srcdir) && $(XSLTPROC) -o ../win32/libxml2.def.src ../win32/defgen.xsl libxml2-api.xml + cd $(srcdir) && $(XSLTPROC) --nonet xmllint.xml + cd $(srcdir) && $(XSLTPROC) --nonet -o xmllint.html $(DOCBOOK_HTML) xmllint.xml + cd $(srcdir) && $(XSLTPROC) --nonet xmlcatalog.xml + cd $(srcdir) && $(XSLTPROC) --nonet -o xmlcatalog.html $(DOCBOOK_HTML) xmlcatalog.xml + cd devhelp && $(MAKE) rebuild + cd examples && $(MAKE) rebuild + cd .. && $(MAKE) rebuild_testapi + +.PHONY: rebuild + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/doc/devhelp/Makefile b/third_party/libxml/linux/doc/devhelp/Makefile new file mode 100644 index 0000000..09140c4c --- /dev/null +++ b/third_party/libxml/linux/doc/devhelp/Makefile
@@ -0,0 +1,651 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# doc/devhelp/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = doc/devhelp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_devhelp_DATA) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(devhelpdir)" +DATA = $(dist_devhelp_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc/devhelp +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../../ +top_builddir = ../.. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +devhelpdir = $(datadir)/gtk-doc/html/libxml2 +dist_devhelp_DATA = \ + libxml2.devhelp2 \ + $(HTML_FILES) \ + $(EXTRA_FORMAT) + +HTML_FILES = \ + general.html \ + index.html \ + $(HTML_MODULES) + +HTML_MODULES = \ + libxml2-c14n.html \ + libxml2-catalog.html \ + libxml2-chvalid.html \ + libxml2-debugXML.html \ + libxml2-dict.html \ + libxml2-encoding.html \ + libxml2-entities.html \ + libxml2-globals.html \ + libxml2-hash.html \ + libxml2-HTMLparser.html \ + libxml2-HTMLtree.html \ + libxml2-list.html \ + libxml2-nanoftp.html \ + libxml2-nanohttp.html \ + libxml2-parser.html \ + libxml2-parserInternals.html \ + libxml2-pattern.html \ + libxml2-relaxng.html \ + libxml2-SAX2.html \ + libxml2-SAX.html \ + libxml2-schemasInternals.html \ + libxml2-schematron.html \ + libxml2-threads.html \ + libxml2-tree.html \ + libxml2-uri.html \ + libxml2-valid.html \ + libxml2-xinclude.html \ + libxml2-xlink.html \ + libxml2-xmlautomata.html \ + libxml2-xmlerror.html \ + libxml2-xmlexports.html \ + libxml2-xmlIO.html \ + libxml2-xmlmemory.html \ + libxml2-xmlmodule.html \ + libxml2-xmlreader.html \ + libxml2-xmlregexp.html \ + libxml2-xmlsave.html \ + libxml2-xmlschemas.html \ + libxml2-xmlschemastypes.html \ + libxml2-xmlstring.html \ + libxml2-xmlunicode.html \ + libxml2-xmlversion.html \ + libxml2-xmlwriter.html \ + libxml2-xpath.html \ + libxml2-xpathInternals.html \ + libxml2-xpointer.html + +EXTRA_FORMAT = \ + home.png \ + left.png \ + right.png \ + up.png \ + style.css + +EXTRA_DIST = devhelp2.xsl html.xsl +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/devhelp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/devhelp/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-dist_devhelpDATA: $(dist_devhelp_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(devhelpdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(devhelpdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devhelpdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(devhelpdir)" || exit $$?; \ + done + +uninstall-dist_devhelpDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(devhelpdir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(devhelpdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_devhelpDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_devhelpDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_devhelpDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-dist_devhelpDATA + +.PRECIOUS: Makefile + + +rebuild: + (cd $(srcdir) && $(XSLTPROC) -o libxml2.devhelp2 devhelp2.xsl ../libxml2-api.xml) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/doc/examples/.deps/io1.Po b/third_party/libxml/linux/doc/examples/.deps/io1.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/io1.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/io2.Po b/third_party/libxml/linux/doc/examples/.deps/io2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/io2.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse1.Po b/third_party/libxml/linux/doc/examples/.deps/parse1.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/parse1.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse2.Po b/third_party/libxml/linux/doc/examples/.deps/parse2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/parse2.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse3.Po b/third_party/libxml/linux/doc/examples/.deps/parse3.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/parse3.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse4.Po b/third_party/libxml/linux/doc/examples/.deps/parse4.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/parse4.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader1.Po b/third_party/libxml/linux/doc/examples/.deps/reader1.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/reader1.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader2.Po b/third_party/libxml/linux/doc/examples/.deps/reader2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/reader2.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader3.Po b/third_party/libxml/linux/doc/examples/.deps/reader3.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/reader3.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader4.Po b/third_party/libxml/linux/doc/examples/.deps/reader4.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/reader4.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/testWriter.Po b/third_party/libxml/linux/doc/examples/.deps/testWriter.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/testWriter.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/tree1.Po b/third_party/libxml/linux/doc/examples/.deps/tree1.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/tree1.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/tree2.Po b/third_party/libxml/linux/doc/examples/.deps/tree2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/tree2.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/xpath1.Po b/third_party/libxml/linux/doc/examples/.deps/xpath1.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/xpath1.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/xpath2.Po b/third_party/libxml/linux/doc/examples/.deps/xpath2.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/doc/examples/.deps/xpath2.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/doc/examples/Makefile b/third_party/libxml/linux/doc/examples/Makefile new file mode 100644 index 0000000..de49a6e --- /dev/null +++ b/third_party/libxml/linux/doc/examples/Makefile
@@ -0,0 +1,939 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# doc/examples/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +check_PROGRAMS = io1$(EXEEXT) io2$(EXEEXT) parse1$(EXEEXT) \ + parse2$(EXEEXT) parse3$(EXEEXT) parse4$(EXEEXT) \ + reader1$(EXEEXT) reader2$(EXEEXT) reader3$(EXEEXT) \ + reader4$(EXEEXT) testWriter$(EXEEXT) tree1$(EXEEXT) \ + tree2$(EXEEXT) xpath1$(EXEEXT) xpath2$(EXEEXT) +subdir = doc/examples +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_io1_OBJECTS = io1.$(OBJEXT) +io1_OBJECTS = $(am_io1_OBJECTS) +io1_LDADD = $(LDADD) +io1_DEPENDENCIES = $(top_builddir)/libxml2.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +am_io2_OBJECTS = io2.$(OBJEXT) +io2_OBJECTS = $(am_io2_OBJECTS) +io2_LDADD = $(LDADD) +io2_DEPENDENCIES = $(top_builddir)/libxml2.la +am_parse1_OBJECTS = parse1.$(OBJEXT) +parse1_OBJECTS = $(am_parse1_OBJECTS) +parse1_LDADD = $(LDADD) +parse1_DEPENDENCIES = $(top_builddir)/libxml2.la +am_parse2_OBJECTS = parse2.$(OBJEXT) +parse2_OBJECTS = $(am_parse2_OBJECTS) +parse2_LDADD = $(LDADD) +parse2_DEPENDENCIES = $(top_builddir)/libxml2.la +am_parse3_OBJECTS = parse3.$(OBJEXT) +parse3_OBJECTS = $(am_parse3_OBJECTS) +parse3_LDADD = $(LDADD) +parse3_DEPENDENCIES = $(top_builddir)/libxml2.la +am_parse4_OBJECTS = parse4.$(OBJEXT) +parse4_OBJECTS = $(am_parse4_OBJECTS) +parse4_LDADD = $(LDADD) +parse4_DEPENDENCIES = $(top_builddir)/libxml2.la +am_reader1_OBJECTS = reader1.$(OBJEXT) +reader1_OBJECTS = $(am_reader1_OBJECTS) +reader1_LDADD = $(LDADD) +reader1_DEPENDENCIES = $(top_builddir)/libxml2.la +am_reader2_OBJECTS = reader2.$(OBJEXT) +reader2_OBJECTS = $(am_reader2_OBJECTS) +reader2_LDADD = $(LDADD) +reader2_DEPENDENCIES = $(top_builddir)/libxml2.la +am_reader3_OBJECTS = reader3.$(OBJEXT) +reader3_OBJECTS = $(am_reader3_OBJECTS) +reader3_LDADD = $(LDADD) +reader3_DEPENDENCIES = $(top_builddir)/libxml2.la +am_reader4_OBJECTS = reader4.$(OBJEXT) +reader4_OBJECTS = $(am_reader4_OBJECTS) +reader4_LDADD = $(LDADD) +reader4_DEPENDENCIES = $(top_builddir)/libxml2.la +am_testWriter_OBJECTS = testWriter.$(OBJEXT) +testWriter_OBJECTS = $(am_testWriter_OBJECTS) +testWriter_LDADD = $(LDADD) +testWriter_DEPENDENCIES = $(top_builddir)/libxml2.la +am_tree1_OBJECTS = tree1.$(OBJEXT) +tree1_OBJECTS = $(am_tree1_OBJECTS) +tree1_LDADD = $(LDADD) +tree1_DEPENDENCIES = $(top_builddir)/libxml2.la +am_tree2_OBJECTS = tree2.$(OBJEXT) +tree2_OBJECTS = $(am_tree2_OBJECTS) +tree2_LDADD = $(LDADD) +tree2_DEPENDENCIES = $(top_builddir)/libxml2.la +am_xpath1_OBJECTS = xpath1.$(OBJEXT) +xpath1_OBJECTS = $(am_xpath1_OBJECTS) +xpath1_LDADD = $(LDADD) +xpath1_DEPENDENCIES = $(top_builddir)/libxml2.la +am_xpath2_OBJECTS = xpath2.$(OBJEXT) +xpath2_OBJECTS = $(am_xpath2_OBJECTS) +xpath2_LDADD = $(LDADD) +xpath2_DEPENDENCIES = $(top_builddir)/libxml2.la +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/io1.Po ./$(DEPDIR)/io2.Po \ + ./$(DEPDIR)/parse1.Po ./$(DEPDIR)/parse2.Po \ + ./$(DEPDIR)/parse3.Po ./$(DEPDIR)/parse4.Po \ + ./$(DEPDIR)/reader1.Po ./$(DEPDIR)/reader2.Po \ + ./$(DEPDIR)/reader3.Po ./$(DEPDIR)/reader4.Po \ + ./$(DEPDIR)/testWriter.Po ./$(DEPDIR)/tree1.Po \ + ./$(DEPDIR)/tree2.Po ./$(DEPDIR)/xpath1.Po \ + ./$(DEPDIR)/xpath2.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \ + $(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \ + $(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \ + $(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \ + $(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES) +DIST_SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \ + $(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \ + $(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \ + $(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \ + $(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc/examples +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../../ +top_builddir = ../.. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include +LDADD = $(top_builddir)/libxml2.la +CLEANFILES = *.tmp +EXTRA_DIST = \ + examples.xml \ + examples.xsl \ + index.html \ + index.py \ + test1.xml \ + test2.xml \ + test3.xml + +io1_SOURCES = io1.c +io2_SOURCES = io2.c +parse1_SOURCES = parse1.c +parse2_SOURCES = parse2.c +parse3_SOURCES = parse3.c +parse4_SOURCES = parse4.c +reader1_SOURCES = reader1.c +reader2_SOURCES = reader2.c +reader3_SOURCES = reader3.c +reader4_SOURCES = reader4.c +testWriter_SOURCES = testWriter.c +tree1_SOURCES = tree1.c +tree2_SOURCES = tree2.c +xpath1_SOURCES = xpath1.c +xpath2_SOURCES = xpath2.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/examples/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +io1$(EXEEXT): $(io1_OBJECTS) $(io1_DEPENDENCIES) $(EXTRA_io1_DEPENDENCIES) + @rm -f io1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(io1_OBJECTS) $(io1_LDADD) $(LIBS) + +io2$(EXEEXT): $(io2_OBJECTS) $(io2_DEPENDENCIES) $(EXTRA_io2_DEPENDENCIES) + @rm -f io2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(io2_OBJECTS) $(io2_LDADD) $(LIBS) + +parse1$(EXEEXT): $(parse1_OBJECTS) $(parse1_DEPENDENCIES) $(EXTRA_parse1_DEPENDENCIES) + @rm -f parse1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(parse1_OBJECTS) $(parse1_LDADD) $(LIBS) + +parse2$(EXEEXT): $(parse2_OBJECTS) $(parse2_DEPENDENCIES) $(EXTRA_parse2_DEPENDENCIES) + @rm -f parse2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(parse2_OBJECTS) $(parse2_LDADD) $(LIBS) + +parse3$(EXEEXT): $(parse3_OBJECTS) $(parse3_DEPENDENCIES) $(EXTRA_parse3_DEPENDENCIES) + @rm -f parse3$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(parse3_OBJECTS) $(parse3_LDADD) $(LIBS) + +parse4$(EXEEXT): $(parse4_OBJECTS) $(parse4_DEPENDENCIES) $(EXTRA_parse4_DEPENDENCIES) + @rm -f parse4$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(parse4_OBJECTS) $(parse4_LDADD) $(LIBS) + +reader1$(EXEEXT): $(reader1_OBJECTS) $(reader1_DEPENDENCIES) $(EXTRA_reader1_DEPENDENCIES) + @rm -f reader1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(reader1_OBJECTS) $(reader1_LDADD) $(LIBS) + +reader2$(EXEEXT): $(reader2_OBJECTS) $(reader2_DEPENDENCIES) $(EXTRA_reader2_DEPENDENCIES) + @rm -f reader2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(reader2_OBJECTS) $(reader2_LDADD) $(LIBS) + +reader3$(EXEEXT): $(reader3_OBJECTS) $(reader3_DEPENDENCIES) $(EXTRA_reader3_DEPENDENCIES) + @rm -f reader3$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(reader3_OBJECTS) $(reader3_LDADD) $(LIBS) + +reader4$(EXEEXT): $(reader4_OBJECTS) $(reader4_DEPENDENCIES) $(EXTRA_reader4_DEPENDENCIES) + @rm -f reader4$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(reader4_OBJECTS) $(reader4_LDADD) $(LIBS) + +testWriter$(EXEEXT): $(testWriter_OBJECTS) $(testWriter_DEPENDENCIES) $(EXTRA_testWriter_DEPENDENCIES) + @rm -f testWriter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testWriter_OBJECTS) $(testWriter_LDADD) $(LIBS) + +tree1$(EXEEXT): $(tree1_OBJECTS) $(tree1_DEPENDENCIES) $(EXTRA_tree1_DEPENDENCIES) + @rm -f tree1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tree1_OBJECTS) $(tree1_LDADD) $(LIBS) + +tree2$(EXEEXT): $(tree2_OBJECTS) $(tree2_DEPENDENCIES) $(EXTRA_tree2_DEPENDENCIES) + @rm -f tree2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tree2_OBJECTS) $(tree2_LDADD) $(LIBS) + +xpath1$(EXEEXT): $(xpath1_OBJECTS) $(xpath1_DEPENDENCIES) $(EXTRA_xpath1_DEPENDENCIES) + @rm -f xpath1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(xpath1_OBJECTS) $(xpath1_LDADD) $(LIBS) + +xpath2$(EXEEXT): $(xpath2_OBJECTS) $(xpath2_DEPENDENCIES) $(EXTRA_xpath2_DEPENDENCIES) + @rm -f xpath2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(xpath2_OBJECTS) $(xpath2_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/io1.Po # am--include-marker +include ./$(DEPDIR)/io2.Po # am--include-marker +include ./$(DEPDIR)/parse1.Po # am--include-marker +include ./$(DEPDIR)/parse2.Po # am--include-marker +include ./$(DEPDIR)/parse3.Po # am--include-marker +include ./$(DEPDIR)/parse4.Po # am--include-marker +include ./$(DEPDIR)/reader1.Po # am--include-marker +include ./$(DEPDIR)/reader2.Po # am--include-marker +include ./$(DEPDIR)/reader3.Po # am--include-marker +include ./$(DEPDIR)/reader4.Po # am--include-marker +include ./$(DEPDIR)/testWriter.Po # am--include-marker +include ./$(DEPDIR)/tree1.Po # am--include-marker +include ./$(DEPDIR)/tree2.Po # am--include-marker +include ./$(DEPDIR)/xpath1.Po # am--include-marker +include ./$(DEPDIR)/xpath2.Po # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/io1.Po + -rm -f ./$(DEPDIR)/io2.Po + -rm -f ./$(DEPDIR)/parse1.Po + -rm -f ./$(DEPDIR)/parse2.Po + -rm -f ./$(DEPDIR)/parse3.Po + -rm -f ./$(DEPDIR)/parse4.Po + -rm -f ./$(DEPDIR)/reader1.Po + -rm -f ./$(DEPDIR)/reader2.Po + -rm -f ./$(DEPDIR)/reader3.Po + -rm -f ./$(DEPDIR)/reader4.Po + -rm -f ./$(DEPDIR)/testWriter.Po + -rm -f ./$(DEPDIR)/tree1.Po + -rm -f ./$(DEPDIR)/tree2.Po + -rm -f ./$(DEPDIR)/xpath1.Po + -rm -f ./$(DEPDIR)/xpath2.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/io1.Po + -rm -f ./$(DEPDIR)/io2.Po + -rm -f ./$(DEPDIR)/parse1.Po + -rm -f ./$(DEPDIR)/parse2.Po + -rm -f ./$(DEPDIR)/parse3.Po + -rm -f ./$(DEPDIR)/parse4.Po + -rm -f ./$(DEPDIR)/reader1.Po + -rm -f ./$(DEPDIR)/reader2.Po + -rm -f ./$(DEPDIR)/reader3.Po + -rm -f ./$(DEPDIR)/reader4.Po + -rm -f ./$(DEPDIR)/testWriter.Po + -rm -f ./$(DEPDIR)/tree1.Po + -rm -f ./$(DEPDIR)/tree2.Po + -rm -f ./$(DEPDIR)/xpath1.Po + -rm -f ./$(DEPDIR)/xpath2.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \ + check-local clean clean-checkPROGRAMS clean-generic \ + clean-libtool clean-local cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-local + +.PRECIOUS: Makefile + + +rebuild: + cd $(srcdir) && $(PYTHON) index.py + $(MAKE) Makefile + cd $(srcdir) && xsltproc examples.xsl examples.xml + -cd $(srcdir) && xmllint --valid --noout index.html + +.PHONY: rebuild + +install-data-local: + $(MKDIR_P) $(DESTDIR)$(docdir)/examples + -$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/ + +uninstall-local: + rm -f $(DESTDIR)$(docdir)/examples/*.c + rm -f $(DESTDIR)$(docdir)/examples/*.html + -rmdir $(DESTDIR)$(docdir)/examples + +clean-local: + test -f Makefile.am || rm -f test?.xml + rm -f .memdump + +valgrind: + $(MAKE) CHECKER='valgrind' check + +check-local: + @test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml . + @(echo '## examples regression tests') + @(echo > .memdump) + @$(CHECKER) ./io1 >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./io2 >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./parse1 test1.xml + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./parse2 test2.xml + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./parse3 + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./parse4 test3.xml + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./reader1 test2.xml >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./reader2 test2.xml >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./reader3 >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./reader4 test1.xml test2.xml test3.xml >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./testWriter + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./tree1 test2.xml >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./tree2 >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./xpath1 test3.xml '//child2' >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @$(CHECKER) ./xpath2 test3.xml '//discarded' discarded >/dev/null + @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 + @rm -f *.tmp + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/example/.deps/gjobread.Po b/third_party/libxml/linux/example/.deps/gjobread.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/example/.deps/gjobread.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/example/Makefile b/third_party/libxml/linux/example/Makefile new file mode 100644 index 0000000..64704cce --- /dev/null +++ b/third_party/libxml/linux/example/Makefile
@@ -0,0 +1,679 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# example/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +check_PROGRAMS = gjobread$(EXEEXT) +subdir = example +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_gjobread_OBJECTS = gjobread.$(OBJEXT) +gjobread_OBJECTS = $(am_gjobread_OBJECTS) +gjobread_LDADD = $(LDADD) +gjobread_DEPENDENCIES = $(top_builddir)/libxml2.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/gjobread.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(gjobread_SOURCES) +DIST_SOURCES = $(gjobread_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/example +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include +LDADD = $(top_builddir)/libxml2.la +gjobread_SOURCES = gjobread.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign example/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign example/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +gjobread$(EXEEXT): $(gjobread_OBJECTS) $(gjobread_DEPENDENCIES) $(EXTRA_gjobread_DEPENDENCIES) + @rm -f gjobread$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gjobread_OBJECTS) $(gjobread_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/gjobread.Po # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/gjobread.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/gjobread.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/fuzz/.deps/fuzz.Po b/third_party/libxml/linux/fuzz/.deps/fuzz.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/fuzz.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/genSeed.Po b/third_party/libxml/linux/fuzz/.deps/genSeed.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/genSeed.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/html.Po b/third_party/libxml/linux/fuzz/.deps/html.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/html.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/regexp.Po b/third_party/libxml/linux/fuzz/.deps/regexp.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/regexp.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/schema.Po b/third_party/libxml/linux/fuzz/.deps/schema.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/schema.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po b/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/uri.Po b/third_party/libxml/linux/fuzz/.deps/uri.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/uri.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xinclude.Po b/third_party/libxml/linux/fuzz/.deps/xinclude.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/xinclude.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xml.Po b/third_party/libxml/linux/fuzz/.deps/xml.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/xml.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xpath.Po b/third_party/libxml/linux/fuzz/.deps/xpath.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/fuzz/.deps/xpath.Po
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/fuzz/Makefile b/third_party/libxml/linux/fuzz/Makefile new file mode 100644 index 0000000..1a2b430 --- /dev/null +++ b/third_party/libxml/linux/fuzz/Makefile
@@ -0,0 +1,959 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# fuzz/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +EXTRA_PROGRAMS = genSeed$(EXEEXT) html$(EXEEXT) regexp$(EXEEXT) \ + schema$(EXEEXT) uri$(EXEEXT) xinclude$(EXEEXT) xml$(EXEEXT) \ + xpath$(EXEEXT) +check_PROGRAMS = testFuzzer$(EXEEXT) +subdir = fuzz +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_genSeed_OBJECTS = genSeed.$(OBJEXT) fuzz.$(OBJEXT) +genSeed_OBJECTS = $(am_genSeed_OBJECTS) +genSeed_LDADD = $(LDADD) +genSeed_DEPENDENCIES = $(top_builddir)/libxml2.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +am_html_OBJECTS = html.$(OBJEXT) fuzz.$(OBJEXT) +html_OBJECTS = $(am_html_OBJECTS) +html_LDADD = $(LDADD) +html_DEPENDENCIES = $(top_builddir)/libxml2.la +html_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(html_LDFLAGS) $(LDFLAGS) -o $@ +am_regexp_OBJECTS = regexp.$(OBJEXT) fuzz.$(OBJEXT) +regexp_OBJECTS = $(am_regexp_OBJECTS) +regexp_LDADD = $(LDADD) +regexp_DEPENDENCIES = $(top_builddir)/libxml2.la +regexp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(regexp_LDFLAGS) $(LDFLAGS) -o $@ +am_schema_OBJECTS = schema.$(OBJEXT) fuzz.$(OBJEXT) +schema_OBJECTS = $(am_schema_OBJECTS) +schema_LDADD = $(LDADD) +schema_DEPENDENCIES = $(top_builddir)/libxml2.la +schema_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(schema_LDFLAGS) $(LDFLAGS) -o $@ +am_testFuzzer_OBJECTS = testFuzzer.$(OBJEXT) fuzz.$(OBJEXT) +testFuzzer_OBJECTS = $(am_testFuzzer_OBJECTS) +testFuzzer_LDADD = $(LDADD) +testFuzzer_DEPENDENCIES = $(top_builddir)/libxml2.la +am_uri_OBJECTS = uri.$(OBJEXT) fuzz.$(OBJEXT) +uri_OBJECTS = $(am_uri_OBJECTS) +uri_LDADD = $(LDADD) +uri_DEPENDENCIES = $(top_builddir)/libxml2.la +uri_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(uri_LDFLAGS) $(LDFLAGS) -o $@ +am_xinclude_OBJECTS = xinclude.$(OBJEXT) fuzz.$(OBJEXT) +xinclude_OBJECTS = $(am_xinclude_OBJECTS) +xinclude_LDADD = $(LDADD) +xinclude_DEPENDENCIES = $(top_builddir)/libxml2.la +xinclude_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(xinclude_LDFLAGS) $(LDFLAGS) -o $@ +am_xml_OBJECTS = xml.$(OBJEXT) fuzz.$(OBJEXT) +xml_OBJECTS = $(am_xml_OBJECTS) +xml_LDADD = $(LDADD) +xml_DEPENDENCIES = $(top_builddir)/libxml2.la +xml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(xml_LDFLAGS) $(LDFLAGS) -o $@ +am_xpath_OBJECTS = xpath.$(OBJEXT) fuzz.$(OBJEXT) +xpath_OBJECTS = $(am_xpath_OBJECTS) +xpath_LDADD = $(LDADD) +xpath_DEPENDENCIES = $(top_builddir)/libxml2.la +xpath_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(xpath_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/fuzz.Po ./$(DEPDIR)/genSeed.Po \ + ./$(DEPDIR)/html.Po ./$(DEPDIR)/regexp.Po \ + ./$(DEPDIR)/schema.Po ./$(DEPDIR)/testFuzzer.Po \ + ./$(DEPDIR)/uri.Po ./$(DEPDIR)/xinclude.Po ./$(DEPDIR)/xml.Po \ + ./$(DEPDIR)/xpath.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \ + $(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \ + $(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES) +DIST_SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \ + $(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \ + $(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/fuzz +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +AUTOMAKE_OPTIONS = -Wno-syntax +EXTRA_DIST = html.dict regexp.dict schema.dict xml.dict xpath.dict \ + static_seed/uri static_seed/regexp fuzz.h + +CLEANFILES = $(EXTRA_PROGRAMS) +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include +DEPENDENCIES = $(top_builddir)/libxml2.la +LDADD = $(top_builddir)/libxml2.la +XML_MAX_LEN = 80000 +# Single quotes to avoid wildcard expansion by the shell +XML_SEED_CORPUS_SRC = \ + '$(top_srcdir)/test/*' \ + '$(top_srcdir)/test/errors/*.xml' \ + '$(top_srcdir)/test/errors10/*.xml' \ + '$(top_srcdir)/test/namespaces/*' \ + '$(top_srcdir)/test/recurse/*.xml' \ + '$(top_srcdir)/test/SVG/*.xml' \ + '$(top_srcdir)/test/valid/*.xml' \ + '$(top_srcdir)/test/VC/*' \ + '$(top_srcdir)/test/VCM/*' \ + '$(top_srcdir)/test/xmlid/*' + +testFuzzer_SOURCES = testFuzzer.c fuzz.c + +# Seed corpus +genSeed_SOURCES = genSeed.c fuzz.c +xml_SOURCES = xml.c fuzz.c +xml_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +xinclude_SOURCES = xinclude.c fuzz.c +xinclude_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +html_SOURCES = html.c fuzz.c +html_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +regexp_SOURCES = regexp.c fuzz.c +regexp_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +uri_SOURCES = uri.c fuzz.c +uri_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +schema_SOURCES = schema.c fuzz.c +schema_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +xpath_SOURCES = xpath.c fuzz.c +xpath_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fuzz/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign fuzz/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +genSeed$(EXEEXT): $(genSeed_OBJECTS) $(genSeed_DEPENDENCIES) $(EXTRA_genSeed_DEPENDENCIES) + @rm -f genSeed$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(genSeed_OBJECTS) $(genSeed_LDADD) $(LIBS) + +html$(EXEEXT): $(html_OBJECTS) $(html_DEPENDENCIES) $(EXTRA_html_DEPENDENCIES) + @rm -f html$(EXEEXT) + $(AM_V_CCLD)$(html_LINK) $(html_OBJECTS) $(html_LDADD) $(LIBS) + +regexp$(EXEEXT): $(regexp_OBJECTS) $(regexp_DEPENDENCIES) $(EXTRA_regexp_DEPENDENCIES) + @rm -f regexp$(EXEEXT) + $(AM_V_CCLD)$(regexp_LINK) $(regexp_OBJECTS) $(regexp_LDADD) $(LIBS) + +schema$(EXEEXT): $(schema_OBJECTS) $(schema_DEPENDENCIES) $(EXTRA_schema_DEPENDENCIES) + @rm -f schema$(EXEEXT) + $(AM_V_CCLD)$(schema_LINK) $(schema_OBJECTS) $(schema_LDADD) $(LIBS) + +testFuzzer$(EXEEXT): $(testFuzzer_OBJECTS) $(testFuzzer_DEPENDENCIES) $(EXTRA_testFuzzer_DEPENDENCIES) + @rm -f testFuzzer$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testFuzzer_OBJECTS) $(testFuzzer_LDADD) $(LIBS) + +uri$(EXEEXT): $(uri_OBJECTS) $(uri_DEPENDENCIES) $(EXTRA_uri_DEPENDENCIES) + @rm -f uri$(EXEEXT) + $(AM_V_CCLD)$(uri_LINK) $(uri_OBJECTS) $(uri_LDADD) $(LIBS) + +xinclude$(EXEEXT): $(xinclude_OBJECTS) $(xinclude_DEPENDENCIES) $(EXTRA_xinclude_DEPENDENCIES) + @rm -f xinclude$(EXEEXT) + $(AM_V_CCLD)$(xinclude_LINK) $(xinclude_OBJECTS) $(xinclude_LDADD) $(LIBS) + +xml$(EXEEXT): $(xml_OBJECTS) $(xml_DEPENDENCIES) $(EXTRA_xml_DEPENDENCIES) + @rm -f xml$(EXEEXT) + $(AM_V_CCLD)$(xml_LINK) $(xml_OBJECTS) $(xml_LDADD) $(LIBS) + +xpath$(EXEEXT): $(xpath_OBJECTS) $(xpath_DEPENDENCIES) $(EXTRA_xpath_DEPENDENCIES) + @rm -f xpath$(EXEEXT) + $(AM_V_CCLD)$(xpath_LINK) $(xpath_OBJECTS) $(xpath_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/fuzz.Po # am--include-marker +include ./$(DEPDIR)/genSeed.Po # am--include-marker +include ./$(DEPDIR)/html.Po # am--include-marker +include ./$(DEPDIR)/regexp.Po # am--include-marker +include ./$(DEPDIR)/schema.Po # am--include-marker +include ./$(DEPDIR)/testFuzzer.Po # am--include-marker +include ./$(DEPDIR)/uri.Po # am--include-marker +include ./$(DEPDIR)/xinclude.Po # am--include-marker +include ./$(DEPDIR)/xml.Po # am--include-marker +include ./$(DEPDIR)/xpath.Po # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/fuzz.Po + -rm -f ./$(DEPDIR)/genSeed.Po + -rm -f ./$(DEPDIR)/html.Po + -rm -f ./$(DEPDIR)/regexp.Po + -rm -f ./$(DEPDIR)/schema.Po + -rm -f ./$(DEPDIR)/testFuzzer.Po + -rm -f ./$(DEPDIR)/uri.Po + -rm -f ./$(DEPDIR)/xinclude.Po + -rm -f ./$(DEPDIR)/xml.Po + -rm -f ./$(DEPDIR)/xpath.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/fuzz.Po + -rm -f ./$(DEPDIR)/genSeed.Po + -rm -f ./$(DEPDIR)/html.Po + -rm -f ./$(DEPDIR)/regexp.Po + -rm -f ./$(DEPDIR)/schema.Po + -rm -f ./$(DEPDIR)/testFuzzer.Po + -rm -f ./$(DEPDIR)/uri.Po + -rm -f ./$(DEPDIR)/xinclude.Po + -rm -f ./$(DEPDIR)/xml.Po + -rm -f ./$(DEPDIR)/xpath.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \ + check-local clean clean-checkPROGRAMS clean-generic \ + clean-libtool clean-local cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +.PHONY: corpus clean-corpus + +corpus: seed/html.stamp seed/regexp.stamp seed/schema.stamp seed/uri.stamp \ + seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp + +check-local: corpus + ./testFuzzer$(EXEEXT) + +clean-corpus: + rm -rf seed + +clean-local: clean-corpus + +# XML fuzzer + +seed/xml.stamp: genSeed$(EXEEXT) + @mkdir -p seed/xml + ./genSeed$(EXEEXT) xml $(XML_SEED_CORPUS_SRC) + @touch seed/xml.stamp + +fuzz-xml: xml$(EXEEXT) seed/xml.stamp + @mkdir -p corpus/xml + ./xml$(EXEEXT) \ + -dict=xml.dict \ + -max_len=$(XML_MAX_LEN) \ + -timeout=20 \ + corpus/xml seed/xml + +# XInclude fuzzer + +seed/xinclude.stamp: genSeed$(EXEEXT) + @mkdir -p seed/xinclude + ./genSeed$(EXEEXT) xinclude \ + '$(top_srcdir)/test/XInclude/docs/*' \ + '$(top_srcdir)/test/XInclude/without-reader/*' + @touch seed/xinclude.stamp + +fuzz-xinclude: xinclude$(EXEEXT) seed/xinclude.stamp + @mkdir -p corpus/xinclude + ./xinclude$(EXEEXT) \ + -dict=xml.dict \ + -max_len=$(XML_MAX_LEN) \ + -timeout=20 \ + corpus/xinclude seed/xinclude + +# HTML fuzzer + +seed/html.stamp: genSeed$(EXEEXT) + @mkdir -p seed/html + ./genSeed$(EXEEXT) html '$(top_srcdir)/test/HTML/*' + @touch seed/html.stamp + +fuzz-html: html$(EXEEXT) seed/html.stamp + @mkdir -p corpus/html + ./html$(EXEEXT) \ + -dict=html.dict \ + -max_len=1000000 \ + -timeout=10 \ + corpus/html seed/html + +# Regexp fuzzer + +seed/regexp.stamp: + @mkdir -p seed/regexp + cp -r $(srcdir)/static_seed/regexp seed + @touch seed/regexp.stamp + +fuzz-regexp: regexp$(EXEEXT) + @mkdir -p corpus/regexp + ./regexp$(EXEEXT) \ + -dict=regexp.dict \ + -max_len=200 \ + -timeout=5 \ + corpus/regexp seed/regexp + +# URI fuzzer + +seed/uri.stamp: + @mkdir -p seed/uri + cp -r $(srcdir)/static_seed/uri seed + @touch seed/uri.stamp + +fuzz-uri: uri$(EXEEXT) + @mkdir -p corpus/uri + ./uri$(EXEEXT) \ + -max_len=10000 \ + -timeout=2 \ + corpus/uri seed/uri + +# XML Schema fuzzer + +seed/schema.stamp: genSeed$(EXEEXT) + @mkdir -p seed/schema + ./genSeed$(EXEEXT) schema '$(top_srcdir)/test/schemas/*.xsd' + @touch seed/schema.stamp + +fuzz-schema: schema$(EXEEXT) seed/schema.stamp + @mkdir -p corpus/schema + ./schema$(EXEEXT) \ + -dict=schema.dict \ + -max_len=$(XML_MAX_LEN) \ + -timeout=20 \ + corpus/schema seed/schema + +# XPath fuzzer + +seed/xpath.stamp: genSeed$(EXEEXT) + @mkdir -p seed/xpath + ./genSeed$(EXEEXT) xpath '$(top_srcdir)/test/XPath' + @touch seed/xpath.stamp + +fuzz-xpath: xpath$(EXEEXT) seed/xpath.stamp + @mkdir -p corpus/xpath + ./xpath$(EXEEXT) \ + -dict=xpath.dict \ + -max_len=10000 \ + -timeout=20 \ + corpus/xpath seed/xpath + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/include/private/Makefile b/third_party/libxml/linux/include/private/Makefile new file mode 100644 index 0000000..f510bae4 --- /dev/null +++ b/third_party/libxml/linux/include/private/Makefile
@@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# include/private/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/include/private +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = include/private +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/include/private +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/include/private +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/include/private +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../../ +top_builddir = ../.. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +EXTRA_DIST = \ + buf.h \ + dict.h \ + enc.h \ + entities.h \ + error.h \ + globals.h \ + html.h \ + io.h \ + memory.h \ + parser.h \ + regexp.h \ + save.h \ + string.h \ + threads.h \ + tree.h \ + xinclude.h \ + xpath.h \ + xzlib.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/private/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/private/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/python/.deps/libxml.Plo b/third_party/libxml/linux/python/.deps/libxml.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/python/.deps/libxml.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/python/.deps/libxml2-py.Plo b/third_party/libxml/linux/python/.deps/libxml2-py.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/python/.deps/libxml2-py.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/python/.deps/types.Plo b/third_party/libxml/linux/python/.deps/types.Plo new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/third_party/libxml/linux/python/.deps/types.Plo
@@ -0,0 +1 @@ +# dummy
diff --git a/third_party/libxml/linux/python/Makefile b/third_party/libxml/linux/python/Makefile new file mode 100644 index 0000000..e8a0aa0 --- /dev/null +++ b/third_party/libxml/linux/python/Makefile
@@ -0,0 +1,1015 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# python/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +# Makefile for libxml2 python library + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = python +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__python_PYTHON_DIST) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = setup.py +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)" \ + "$(DESTDIR)$(pythondir)" +LTLIBRARIES = $(pyexec_LTLIBRARIES) +am__DEPENDENCIES_1 = +libxml2mod_la_DEPENDENCIES = \ + $(top_builddir)/libxml2.la \ + $(am__DEPENDENCIES_1) +am__libxml2mod_la_SOURCES_DIST = libxml.c libxml_wrap.h types.c +am_libxml2mod_la_OBJECTS = libxml.lo types.lo +nodist_libxml2mod_la_OBJECTS = libxml2-py.lo +libxml2mod_la_OBJECTS = $(am_libxml2mod_la_OBJECTS) \ + $(nodist_libxml2mod_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +libxml2mod_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libxml2mod_la_LDFLAGS) $(LDFLAGS) -o $@ +am_libxml2mod_la_rpath = -rpath $(pyexecdir) +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/libxml.Plo \ + ./$(DEPDIR)/libxml2-py.Plo ./$(DEPDIR)/types.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libxml2mod_la_SOURCES) $(nodist_libxml2mod_la_SOURCES) +DIST_SOURCES = $(am__libxml2mod_la_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) +am__pep3147_tweak = \ + sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.pyc __pycache__/&.*.pyo|' +am__python_PYTHON_DIST = drv_libxml2.py +py_compile = $(top_srcdir)/py-compile +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/setup.py.in \ + $(top_srcdir)/depcomp $(top_srcdir)/py-compile README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/python +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +SUBDIRS = . tests +EXTRA_DIST = \ + generator.py \ + libxml.py \ + libxml2-python-api.xml + +AM_CPPFLAGS = \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + $(PYTHON_CFLAGS) + +pyexec_LTLIBRARIES = libxml2mod.la +libxml2mod_la_SOURCES = libxml.c libxml_wrap.h types.c +nodist_libxml2mod_la_SOURCES = libxml2-py.h libxml2-py.c +libxml2mod_la_LDFLAGS = $(AM_LDFLAGS) $(PYTHON_LDFLAGS) -module -avoid-version +libxml2mod_la_LIBADD = $(top_builddir)/libxml2.la $(PYTHON_LIBS) +BUILT_SOURCES = libxml2-export.c libxml2-py.h libxml2-py.c +python_PYTHON = drv_libxml2.py +nodist_python_PYTHON = libxml2.py +API_DESC = $(top_srcdir)/doc/libxml2-api.xml $(srcdir)/libxml2-python-api.xml +GENERATED = libxml2class.py libxml2class.txt $(BUILT_SOURCES) +CLEANFILES = libxml2.py $(GENERATED) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign python/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +setup.py: $(top_builddir)/config.status $(srcdir)/setup.py.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +install-pyexecLTLIBRARIES: $(pyexec_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(pyexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pyexecdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pyexecdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pyexecdir)"; \ + } + +uninstall-pyexecLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pyexecdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pyexecdir)/$$f"; \ + done + +clean-pyexecLTLIBRARIES: + -test -z "$(pyexec_LTLIBRARIES)" || rm -f $(pyexec_LTLIBRARIES) + @list='$(pyexec_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libxml2mod.la: $(libxml2mod_la_OBJECTS) $(libxml2mod_la_DEPENDENCIES) $(EXTRA_libxml2mod_la_DEPENDENCIES) + $(AM_V_CCLD)$(libxml2mod_la_LINK) $(am_libxml2mod_la_rpath) $(libxml2mod_la_OBJECTS) $(libxml2mod_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/libxml.Plo # am--include-marker +include ./$(DEPDIR)/libxml2-py.Plo # am--include-marker +include ./$(DEPDIR)/types.Plo # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_pythonPYTHON: $(nodist_python_PYTHON) + @$(NORMAL_INSTALL) + @list='$(nodist_python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ + if test -f $$b$$p; then \ + $(am__strip_dir) \ + dlist="$$dlist $$f"; \ + list2="$$list2 $$b$$p"; \ + else :; fi; \ + done; \ + for file in $$list2; do echo $$file; done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \ + done || exit $$?; \ + if test -n "$$dlist"; then \ + $(am__py_compile) --destdir "$(DESTDIR)" \ + --basedir "$(pythondir)" $$dlist; \ + else :; fi + +uninstall-nodist_pythonPYTHON: + @$(NORMAL_UNINSTALL) + @list='$(nodist_python_PYTHON)'; test -n "$(pythondir)" || list=; \ + py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$py_files" || exit 0; \ + dir='$(DESTDIR)$(pythondir)'; \ + pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ + pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ + st=0; \ + for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done; \ + dir='$(DESTDIR)$(pythondir)'; \ + echo "$$py_files" | $(am__pep3147_tweak) | $(am__base_list) | \ + while read files; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done || exit $$?; \ + exit $$st +install-pythonPYTHON: $(python_PYTHON) + @$(NORMAL_INSTALL) + @list='$(python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ + if test -f $$b$$p; then \ + $(am__strip_dir) \ + dlist="$$dlist $$f"; \ + list2="$$list2 $$b$$p"; \ + else :; fi; \ + done; \ + for file in $$list2; do echo $$file; done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \ + done || exit $$?; \ + if test -n "$$dlist"; then \ + $(am__py_compile) --destdir "$(DESTDIR)" \ + --basedir "$(pythondir)" $$dlist; \ + else :; fi + +uninstall-pythonPYTHON: + @$(NORMAL_UNINSTALL) + @list='$(python_PYTHON)'; test -n "$(pythondir)" || list=; \ + py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$py_files" || exit 0; \ + dir='$(DESTDIR)$(pythondir)'; \ + pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ + pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ + st=0; \ + for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done; \ + dir='$(DESTDIR)$(pythondir)'; \ + echo "$$py_files" | $(am__pep3147_tweak) | $(am__base_list) | \ + while read files; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done || exit $$?; \ + exit $$st + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +#all-local: +all-am: Makefile $(LTLIBRARIES) all-local +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)" "$(DESTDIR)$(pythondir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +#clean-local: +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-local \ + clean-pyexecLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -f ./$(DEPDIR)/libxml.Plo + -rm -f ./$(DEPDIR)/libxml2-py.Plo + -rm -f ./$(DEPDIR)/types.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-nodist_pythonPYTHON install-pythonPYTHON + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-pyexecLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f ./$(DEPDIR)/libxml.Plo + -rm -f ./$(DEPDIR)/libxml2-py.Plo + -rm -f ./$(DEPDIR)/types.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-nodist_pythonPYTHON \ + uninstall-pyexecLTLIBRARIES uninstall-pythonPYTHON + +.MAKE: $(am__recursive_targets) all check install install-am \ + install-exec install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + am--depfiles check check-am clean clean-generic clean-libtool \ + clean-local clean-pyexecLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-nodist_pythonPYTHON \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-pyexecLTLIBRARIES install-pythonPYTHON install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-nodist_pythonPYTHON uninstall-pyexecLTLIBRARIES \ + uninstall-pythonPYTHON + +.PRECIOUS: Makefile + + +# We use a rule with multiple output files which creates problems with +# parallel builds. +.NOTPARALLEL: + +all-local: libxml2.py + +$(GENERATED): $(srcdir)/generator.py $(API_DESC) + $(PYTHON) $(srcdir)/generator.py $(srcdir) + +# libxml.c #includes libxml2-export.c +libxml.$(OBJEXT): libxml2-export.c + +libxml2.py: $(srcdir)/libxml.py libxml2class.py + cat $(srcdir)/libxml.py `test -f libxml2class.py || echo $(srcdir)/`libxml2class.py > $@ + +clean-local: + rm -rf __pycache__ *.pyc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/python/setup.py b/third_party/libxml/linux/python/setup.py new file mode 100755 index 0000000..88800e15 --- /dev/null +++ b/third_party/libxml/linux/python/setup.py
@@ -0,0 +1,270 @@ +#!/usr/bin/env python3 +# +# Setup script for libxml2 and libxslt if found +# +import sys, os + +try: + import setuptools +except ImportError: + pass + +from distutils.core import setup, Extension + +# Below ROOT, we expect to find include, include/libxml2, lib and bin. +# On *nix, it is not needed (but should not harm), +# on Windows, it is set by configure.js. +ROOT = r'/usr/local' + +# Thread-enabled libxml2 +with_threads = 1 + +# Features of libxml2 requiring external DLLs +with_iconv = 0 +with_zlib = 0 +with_lzma = 0 +with_icu = 1 + +icu_series = 69 + +if icu_series is not None: + icu_series_s = str(icu_series) +else: + icu_series_s = '' + +# If bundling DLLs, check the following to ensure things are correct +# (Check the value of `icu_series` above as well) +iconv_dll = 'iconv.dll' +zlib_dll = 'zlib1.dll' +lzma_dll = 'liblzma.dll' +icu_dlls = ['icuuc%s.dll' % icu_series_s, 'icudt%s.dll' % icu_series_s] + +# If this flag is set (windows only), +# a private copy of the dlls are included in the package. +# If this flag is not set, the libxml2 and libxslt +# dlls must be found somewhere in the PATH at runtime. +WITHDLLS = 1 and sys.platform.startswith('win') + +if WITHDLLS: + def altImport(s): + s = s.replace("import libxml2mod","from libxmlmods import libxml2mod") + return s + +def missing(file): + if os.access(file, os.R_OK) == 0: + return 1 + return 0 + +try: + HOME = os.environ['HOME'] +except: + HOME="C:" + +if sys.platform.startswith('win'): + libraryPrefix = 'lib' + platformLibs = [] +else: + libraryPrefix = '' + platformLibs = ["m","z"] + +# those are examined to find +# - libxml2/libxml/tree.h +# - libxslt/xsltconfig.h +includes_dir = [ +"/usr/include", +"/usr/local/include", +"/opt/include", +os.path.join(ROOT,'include'), +HOME +]; + +xml_includes="" +for dir in includes_dir: + if not missing(dir + "/libxml2/libxml/tree.h"): + xml_includes=dir + "/libxml2" + break; + +if xml_includes == "": + print("failed to find headers for libxml2: update includes_dir") + sys.exit(1) + +# those are added in the linker search path for libraries +libdirs = [ +os.path.join(ROOT,'lib'), +] + +xml_files = ["libxml2-api.xml", "libxml2-python-api.xml", + "libxml.c", "libxml.py", "libxml_wrap.h", "types.c", + "xmlgenerator.py", "README", "TODO", "drv_libxml2.py"] + +xslt_files = ["libxslt-api.xml", "libxslt-python-api.xml", + "libxslt.c", "libxsl.py", "libxslt_wrap.h", + "xsltgenerator.py"] + +if missing("libxml2-py.c") or missing("libxml2.py"): + try: + try: + import xmlgenerator + except: + import generator + except: + print("failed to find and generate stubs for libxml2, aborting ...") + print(sys.exc_info()[0], sys.exc_info()[1]) + sys.exit(1) + + head = open("libxml.py", "r") + generated = open("libxml2class.py", "r") + result = open("libxml2.py", "w") + for line in head.readlines(): + if WITHDLLS: + result.write(altImport(line)) + else: + result.write(line) + for line in generated.readlines(): + result.write(line) + head.close() + generated.close() + result.close() + +with_xslt=0 +if missing("libxslt-py.c") or missing("libxslt.py"): + if missing("xsltgenerator.py") or missing("libxslt-api.xml"): + print("libxslt stub generator not found, libxslt not built") + else: + try: + import xsltgenerator + except: + print("failed to generate stubs for libxslt, aborting ...") + print(sys.exc_info()[0], sys.exc_info()[1]) + else: + head = open("libxsl.py", "r") + generated = open("libxsltclass.py", "r") + result = open("libxslt.py", "w") + for line in head.readlines(): + if WITHDLLS: + result.write(altImport(line)) + else: + result.write(line) + for line in generated.readlines(): + result.write(line) + head.close() + generated.close() + result.close() + with_xslt=1 +else: + with_xslt=1 + +if with_xslt == 1: + xslt_includes="" + for dir in includes_dir: + if not missing(dir + "/libxslt/xsltconfig.h"): + xslt_includes=dir + "/libxslt" + break; + + if xslt_includes == "": + print("failed to find headers for libxslt: update includes_dir") + with_xslt = 0 + +if WITHDLLS: + # libxml dlls (expected in ROOT/bin) + dlls = [ 'libxml2.dll' ] + + if with_zlib == 1: + dlls.append(zlib_dll) + if with_lzma == 1: + dlls.append(lzma_dll) + if with_iconv == 1: + dlls.append(iconv_dll) + if with_icu == 1: + dlls += icu_dlls + if with_xslt == 1: + dlls += ['libxslt.dll','libexslt.dll'] + + packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls] + + # create __init__.py for the libxmlmods package + if not os.path.exists("libxmlmods"): + os.mkdir("libxmlmods") + open("libxmlmods/__init__.py","w").close() + + packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls] + +descr = "libxml2 package" +modules = [ 'libxml2', 'drv_libxml2' ] +if WITHDLLS: + modules.append('libxmlmods.__init__') +c_files = ['libxml2-py.c', 'libxml.c', 'types.c' ] +includes= [xml_includes] +libs = [libraryPrefix + "xml2"] + platformLibs +macros = [] +if with_threads: + macros.append(('_REENTRANT','1')) +if with_xslt == 1: + descr = "libxml2 and libxslt package" + if not sys.platform.startswith('win'): + # + # We are gonna build 2 identical shared libs with merge initializing + # both libxml2mod and libxsltmod + # + c_files = c_files + ['libxslt-py.c', 'libxslt.c'] + xslt_c_files = c_files + macros.append(('MERGED_MODULES', '1')) + else: + # + # On windows the MERGED_MODULE option is not needed + # (and does not work) + # + xslt_c_files = ['libxslt-py.c', 'libxslt.c', 'types.c'] + libs.insert(0, libraryPrefix + 'exslt') + libs.insert(0, libraryPrefix + 'xslt') + includes.append(xslt_includes) + modules.append('libxslt') + + +extens=[Extension('libxml2mod', c_files, include_dirs=includes, + library_dirs=libdirs, + libraries=libs, define_macros=macros)] +if with_xslt == 1: + extens.append(Extension('libxsltmod', xslt_c_files, include_dirs=includes, + library_dirs=libdirs, + libraries=libs, define_macros=macros)) + +if missing("MANIFEST"): + + manifest = open("MANIFEST", "w") + manifest.write("setup.py\n") + for file in xml_files: + manifest.write(file + "\n") + if with_xslt == 1: + for file in xslt_files: + manifest.write(file + "\n") + manifest.close() + +if WITHDLLS: + ext_package = "libxmlmods" + if sys.version >= "2.2": + base = "lib/site-packages/" + else: + base = "" + data_files = [(base+"libxmlmods",packaged_dlls)] +else: + ext_package = None + data_files = [] + +setup (name = "libxml2-python", + # On *nix, the version number is created from setup.py.in + # On windows, it is set by configure.js + version = "2.11.0", + description = descr, + author = "Daniel Veillard", + author_email = "veillard@redhat.com", + url = "https://gitlab.gnome.org/GNOME/libxml2", + licence="MIT Licence", + py_modules=modules, + ext_modules=extens, + ext_package=ext_package, + data_files=data_files, + ) + +sys.exit(0) +
diff --git a/third_party/libxml/linux/python/tests/Makefile b/third_party/libxml/linux/python/tests/Makefile new file mode 100644 index 0000000..fe38ee49 --- /dev/null +++ b/third_party/libxml/linux/python/tests/Makefile
@@ -0,0 +1,658 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# python/tests/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = python/tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_example_DATA) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(exampledir)" +DATA = $(dist_example_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/python/tests +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../../ +top_builddir = ../.. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +exampledir = $(docdir)/python/examples +dist_example_DATA = $(PYTESTS) $(XMLS) +PYTESTS = \ + build.py \ + attribs.py \ + tst.py \ + tstxpath.py \ + xpathext.py \ + push.py \ + pushSAX.py \ + pushSAXhtml.py \ + error.py \ + serialize.py\ + validate.py \ + tstURI.py \ + cutnpaste.py\ + xpathret.py \ + xpath.py \ + outbuf.py \ + inbuf.py \ + input_callback.py \ + resolver.py \ + regexp.py \ + reader.py \ + reader2.py \ + reader3.py \ + reader4.py \ + reader5.py \ + reader6.py \ + reader7.py \ + reader8.py \ + readernext.py \ + walker.py \ + nsdel.py \ + ctxterror.py\ + readererr.py\ + relaxng.py \ + schema.py \ + thread2.py \ + sync.py \ + tstLastError.py \ + indexes.py \ + dtdvalid.py \ + tstmem.py \ + validDTD.py \ + validSchemas.py \ + validRNG.py \ + compareNodes.py \ + xpathns.py \ + xpathleak.py + +XMLS = \ + tst.xml \ + valid.xml \ + invalid.xml \ + test.dtd + +CLEANFILES = core tmp.xml *.pyc +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign python/tests/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-dist_exampleDATA: $(dist_example_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_example_DATA)'; test -n "$(exampledir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(exampledir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(exampledir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(exampledir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(exampledir)" || exit $$?; \ + done + +uninstall-dist_exampleDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_example_DATA)'; test -n "$(exampledir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(exampledir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +#check-local: +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(exampledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_exampleDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_exampleDATA + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-am check-local clean clean-generic \ + clean-libtool cscopelist-am ctags-am distclean \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dist_exampleDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-dist_exampleDATA + +.PRECIOUS: Makefile + + +check-local: + @for f in $(XMLS) ; do test -f $$f || $(LN_S) $(srcdir)/$$f . ; done + @echo "## running Python regression tests" + @(export PYTHONPATH="..:../.libs:$(srcdir)/..:$$PYTHONPATH" ; \ + export LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export DYLD_LIBRARY_PATH="$(top_builddir)/.libs:$$DYLD_LIBRARY_PATH" ; \ + export PATH="$(top_builddir)/.libs:$$PATH" ; \ + for test in $(PYTESTS) ; do \ + log=`$(PYTHON) $(srcdir)/$$test` ; \ + if [ "$$?" -ne 0 ] ; then \ + echo "-- $$test" ; \ + echo "$$log" ; \ + exit 1 ; \ + fi ; \ + done) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/linux/xstc/Makefile b/third_party/libxml/linux/xstc/Makefile new file mode 100644 index 0000000..ccb07dc --- /dev/null +++ b/third_party/libxml/linux/xstc/Makefile
@@ -0,0 +1,657 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# xstc/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/xstc +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libxml2 +pkgincludedir = $(includedir)/libxml2 +pkglibdir = $(libdir)/libxml2 +pkglibexecdir = $(libexecdir)/libxml2 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = xstc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16 +AMTAR = $${TAR-tar} +AM_CFLAGS = -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args +AM_DEFAULT_VERBOSITY = 0 +AM_LDFLAGS = +AR = ar +AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf +AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader +AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16 +AWK = gawk +BASE_THREAD_LIBS = +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPPFLAGS = +CSCOPE = cscope +CTAGS = ctags +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +ETAGS = etags +EXEEXT = +FGREP = /usr/bin/grep -F +FILECMD = file +GREP = /usr/bin/grep +ICU_CFLAGS = +ICU_DEFS = +ICU_LIBS = -licui18n -licuuc -licudata +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld -m elf_x86_64 +LDFLAGS = +LIBM = -lm +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIBXML_MAJOR_VERSION = 2 +LIBXML_MICRO_VERSION = 0 +LIBXML_MINOR_VERSION = 11 +LIBXML_VERSION = 2.11.0 +LIBXML_VERSION_EXTRA = +LIBXML_VERSION_INFO = 13:0:11 +LIBXML_VERSION_NUMBER = 21100 +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +LZMA_CFLAGS = +LZMA_LIBS = +MAINT = +MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +MODULE_EXTENSION = +MODULE_PLATFORM_LIBS = +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OTOOL = +OTOOL64 = +PACKAGE = libxml2 +PACKAGE_BUGREPORT = +PACKAGE_NAME = libxml2 +PACKAGE_STRING = libxml2 2.11.0 +PACKAGE_TARNAME = libxml2 +PACKAGE_URL = +PACKAGE_VERSION = 2.11.0 +PATH_SEPARATOR = : +PERL = /usr/bin/perl +PKG_CONFIG = /usr/bin/pkg-config +PKG_CONFIG_LIBDIR = +PKG_CONFIG_PATH = +PYTHON = /usr/bin/python +PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10 +PYTHON_EXEC_PREFIX = ${exec_prefix} +PYTHON_LDFLAGS = +PYTHON_LIBS = +PYTHON_PLATFORM = linux +PYTHON_PREFIX = ${prefix} +PYTHON_VERSION = 3.10 +RANLIB = ranlib +RDL_CFLAGS = +RDL_LIBS = +RELDATE = Wed Feb 22 2023 +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TAR = /usr/bin/tar +THREAD_CFLAGS = -D_REENTRANT +THREAD_LIBS = +VERSION = 2.11.0 +VERSION_SCRIPT_FLAGS = -Wl,--version-script= +WGET = /usr/bin/wget +WITH_C14N = 0 +WITH_CATALOG = 0 +WITH_DEBUG = 0 +WITH_FTP = 0 +WITH_HTML = 1 +WITH_HTTP = 0 +WITH_ICONV = 0 +WITH_ICU = 1 +WITH_ISO8859X = 0 +WITH_LEGACY = 0 +WITH_LZMA = 0 +WITH_MEM_DEBUG = 0 +WITH_MODULES = 0 +WITH_OUTPUT = 1 +WITH_PATTERN = 0 +WITH_PUSH = 1 +WITH_READER = 1 +WITH_REGEXPS = 0 +WITH_SAX1 = 1 +WITH_SCHEMAS = 0 +WITH_SCHEMATRON = 0 +WITH_THREADS = 1 +WITH_THREAD_ALLOC = 0 +WITH_TREE = 1 +WITH_TRIO = 0 +WITH_VALID = 0 +WITH_WRITER = 1 +WITH_XINCLUDE = 0 +WITH_XPATH = 1 +WITH_XPTR = 0 +WITH_XPTR_LOCS = 0 +WITH_ZLIB = 0 +XML_CFLAGS = +XML_INCLUDEDIR = -I${includedir}/libxml2 +XML_LIBDIR = -L${libdir} +XML_LIBS = -lxml2 +XML_LIBTOOLLIBS = libxml2.la +XML_PRIVATE_CFLAGS = -D_REENTRANT +XML_PRIVATE_LIBS = -licui18n -licuuc -licudata -lm +XSLTPROC = /usr/bin/xsltproc +Z_CFLAGS = +Z_LIBS = +abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/xstc +abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/xstc +abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux +abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +pkgpyexecdir = ${pyexecdir}/libxml2 +pkgpythondir = ${pythondir}/libxml2 +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages +pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/xstc +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src + +# +# Definition for the tests from W3C +# +PYSCRIPTS = nist-test.py ms-test.py sun-test.py +TESTDIR = Tests +TESTDIRS = $(TESTDIR)/msxsdtest $(TESTDIR)/suntest $(TESTDIR)/Datatypes +TARBALL = xsts-2002-01-16.tar.gz +TARBALL_2 = xsts-2004-01-14.tar.gz +TSNAME = xmlschema2002-01-16 +TSNAME_2 = xmlschema2004-01-14 +TARBALLURL = http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME)/$(TARBALL) +TARBALLURL_2 = http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME_2)/$(TARBALL_2) +MSTESTDEF = MSXMLSchema1-0-20020116.testSet +SUNTESTDEF = SunXMLSchema1-0-20020116.testSet +NISTTESTDEF = NISTXMLSchema1-0-20020116.testSet +NISTTESTDEF_2 = NISTXMLSchemaDatatypes.testSet + +# +# The local data and scripts +# +EXTRA_DIST = xstc.py xstc-to-python.xsl +CLEANFILES = $(PYSCRIPTS) test.log +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign xstc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign xstc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + +# +# Nothing is done by make, only make tests and +# only if Python and Schemas are enabled. +# +all: + +# +# Rule to load the test description and extract the information +# +$(TESTDIRS) Tests/Metadata/$(NISTTESTDEF_2) Tests/Metadata/$(MSTTESTDEF) Tests/Metadata/$(SUNTESTDEF): + -@(if [ ! -d Tests ] ; then \ + mkdir Tests ; \ + fi) + -@(if [ ! -f $(TARBALL_2) ] ; then \ + if [ -f $(srcdir)/$(TARBALL_2) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL_2) $(TARBALL_2) ; else \ + echo "Missing the test suite description (2004-01-14), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL_2) ; \ + else echo "Dont' know how to fetch $(TARBALLURL_2)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL_2) ] ; then \ + echo -n "extracting test data (NIST)..." ; \ + $(TAR) -xzf $(TARBALL_2) --wildcards '*/Datatypes' '*/Metadata/$(NISTTESTDEF_2)' ; \ + echo "done" ; \ + fi) + -@(if [ ! -f $(TARBALL) ] ; then \ + if [ -f $(srcdir)/$(TARBALL) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL) $(TARBALL) ; else \ + echo "Missing the test suite description (2002-01-16), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL) ; \ + else echo "Dont' know how to fetch $(TARBALLURL)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL) ] ; then \ + echo -n "extracting test data (Sun, Microsoft)..." ; \ + $(TAR) -C Tests -xzf $(TARBALL) --wildcards '*/suntest' '*/msxsdtest' '*/$(MSTESTDEF)' '*/$(SUNTESTDEF)' ; \ + if [ -d Tests/suntest ] ; then rm -r Tests/suntest ; fi ; \ + if [ -d Tests/msxsdtest ] ; then rm -r Tests/msxsdtest ; fi ; \ + mv Tests/xmlschema2002-01-16/* Tests ; \ + mv Tests/*.testSet Tests/Metadata ; \ + rm -r Tests/xmlschema2002-01-16 ; \ + echo "done" ; \ + fi) + +# +# The python tests are generated via XSLT +# +nist-test.py: Tests/Metadata/$(NISTTESTDEF_2) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (NIST)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor NIST-2 \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(NISTTESTDEF_2) > $@ ; \ + chmod +x $@ ; fi ) + +ms-test.py: Tests/Metadata/$(MSTTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Microsoft)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor MS \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(MSTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +sun-test.py: Tests/Metadata/$(SUNTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Sun)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor SUN \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(SUNTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +# +# The actual test run if present. PYTHONPATH is updated to make sure +# we run the version from the loacl build and not preinstalled bindings +# +pytests: $(PYSCRIPTS) $(TESTDIRS) + -@(if [ -x nist-test.py -a -d $(TESTDIR)/Datatypes ] ; then \ + echo "## Running XML Schema tests (NIST)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) nist-test.py -s -b $(srcdir) ; fi) + -@(if [ -x sun-test.py -a -d $(TESTDIR)/suntest ] ; then \ + echo "## Running Schema tests (Sun)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) sun-test.py -s -b $(srcdir) ; fi) + -@(if [ -x ms-test.py -a -d $(TESTDIR)/msxsdtest ] ; then \ + echo "## Running Schema tests (Microsoft)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) ms-test.py -s -b $(srcdir) ; fi) + +tests: + -@(if [ -x $(PYTHON) ] ; then \ + $(MAKE) pytests ; fi); + +# +# Heavy, works well only on RHEL3 +# +valgrind: + -@(if [ -x $(PYTHON) ] ; then \ + echo '## Running the regression tests under Valgrind' ; \ + $(MAKE) CHECKER='valgrind -q' pytests ; fi); + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c index b716f63c..7e91384b 100644 --- a/third_party/libxml/src/HTMLparser.c +++ b/third_party/libxml/src/HTMLparser.c
@@ -149,7 +149,7 @@ * * Pushes a new element name on top of the name stack * - * Returns 0 in case of error, the index in the stack otherwise + * Returns -1 in case of error, the index in the stack otherwise */ static int htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) @@ -159,15 +159,17 @@ if ((ctxt->html < 10) && (xmlStrEqual(value, BAD_CAST "body"))) ctxt->html = 10; if (ctxt->nameNr >= ctxt->nameMax) { - ctxt->nameMax *= 2; - ctxt->nameTab = (const xmlChar * *) - xmlRealloc((xmlChar * *)ctxt->nameTab, - ctxt->nameMax * - sizeof(ctxt->nameTab[0])); - if (ctxt->nameTab == NULL) { + size_t newSize = ctxt->nameMax * 2; + const xmlChar **tmp; + + tmp = xmlRealloc((xmlChar **) ctxt->nameTab, + newSize * sizeof(ctxt->nameTab[0])); + if (tmp == NULL) { htmlErrMemory(ctxt, NULL); - return (0); + return (-1); } + ctxt->nameTab = tmp; + ctxt->nameMax = newSize; } ctxt->nameTab[ctxt->nameNr] = value; ctxt->name = value; @@ -2566,6 +2568,7 @@ static const xmlChar * htmlParseHTMLName(htmlParserCtxtPtr ctxt) { + const xmlChar *ret; int i = 0; xmlChar loc[HTML_PARSER_BUFFER_SIZE]; @@ -2583,7 +2586,11 @@ NEXT; } - return(xmlDictLookup(ctxt->dict, loc, i)); + ret = xmlDictLookup(ctxt->dict, loc, i); + if (ret == NULL) + htmlErrMemory(ctxt, NULL); + + return(ret); } @@ -3699,7 +3706,8 @@ htmlParseErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, "DOCTYPE improperly terminated\n", NULL, NULL); /* Ignore bogus content */ - while ((CUR != 0) && (CUR != '>')) + while ((CUR != 0) && (CUR != '>') && + (ctxt->instate != XML_PARSER_EOF)) NEXT; } if (CUR == '>') @@ -4031,7 +4039,8 @@ SKIP_BLANKS; while ((CUR != 0) && (CUR != '>') && - ((CUR != '/') || (NXT(1) != '>'))) { + ((CUR != '/') || (NXT(1) != '>')) && + (ctxt->instate != XML_PARSER_EOF)) { GROW; attname = htmlParseAttribute(ctxt, &attvalue); if (attname != NULL) { @@ -4092,7 +4101,8 @@ * the end of the tag. */ while ((CUR != 0) && !(IS_BLANK_CH(CUR)) && (CUR != '>') && - ((CUR != '/') || (NXT(1) != '>'))) + ((CUR != '/') || (NXT(1) != '>')) && + (ctxt->instate != XML_PARSER_EOF)) NEXT; } @@ -4727,8 +4737,16 @@ int depth; const xmlChar *name; - currentNode = xmlStrdup(ctxt->name); depth = ctxt->nameNr; + if (depth <= 0) { + currentNode = NULL; + } else { + currentNode = xmlStrdup(ctxt->name); + if (currentNode == NULL) { + htmlErrMemory(ctxt, NULL); + return; + } + } while (1) { GROW; @@ -4744,8 +4762,16 @@ if (currentNode != NULL) xmlFree(currentNode); - currentNode = xmlStrdup(ctxt->name); depth = ctxt->nameNr; + if (depth <= 0) { + currentNode = NULL; + } else { + currentNode = xmlStrdup(ctxt->name); + if (currentNode == NULL) { + htmlErrMemory(ctxt, NULL); + break; + } + } } continue; /* while */ } @@ -4767,6 +4793,10 @@ xmlFree(currentNode); currentNode = xmlStrdup(ctxt->name); + if (currentNode == NULL) { + htmlErrMemory(ctxt, NULL); + break; + } depth = ctxt->nameNr; continue; } @@ -4790,6 +4820,10 @@ if (currentNode != NULL) xmlFree(currentNode); currentNode = xmlStrdup(ctxt->name); + if (currentNode == NULL) { + htmlErrMemory(ctxt, NULL); + break; + } depth = ctxt->nameNr; continue; } @@ -4841,6 +4875,10 @@ if (currentNode != NULL) xmlFree(currentNode); currentNode = xmlStrdup(ctxt->name); + if (currentNode == NULL) { + htmlErrMemory(ctxt, NULL); + break; + } depth = ctxt->nameNr; } else if (CUR == '<') { @@ -5221,7 +5259,10 @@ return(NULL); buf = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); - if (buf == NULL) return(NULL); + if (buf == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } input = xmlNewInputStream(ctxt); if (input == NULL) { @@ -6239,9 +6280,8 @@ res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); if (res < 0) { - ctxt->errNo = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return (XML_PARSER_EOF); + htmlErrMemory(ctxt, NULL); + return (ctxt->errNo); } #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); @@ -6337,7 +6377,7 @@ inputStream = htmlNewInputStream(ctxt); if (inputStream == NULL) { xmlFreeParserCtxt(ctxt); - xmlFree(buf); + xmlFreeParserInputBuffer(buf); return(NULL); } @@ -6790,6 +6830,11 @@ xmlHashFree(ctxt->attsSpecial, NULL); ctxt->attsSpecial = NULL; } + + ctxt->nbErrors = 0; + ctxt->nbWarnings = 0; + if (ctxt->lastError.code != XML_ERR_OK) + xmlResetError(&ctxt->lastError); } /**
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am index a3dd1358..a562728 100644 --- a/third_party/libxml/src/Makefile.am +++ b/third_party/libxml/src/Makefile.am
@@ -402,22 +402,7 @@ dist-hook: cleanup (cd $(srcdir) ; tar -cf - --exclude .git win32 os400 vms test result) | (cd $(distdir); tar xf -) -dist-source: distdir - $(AMTAR) -chof - --exclude Tests --exclude test --exclude result $(distdir) | GZIP=$(GZIP_ENV) gzip -c >`echo "$(distdir)" | sed "s+libxml2+libxml2-sources+"`.tar.gz - -dist-test: distdir - (mkdir -p $(distdir)) - (cd $(srcdir) ; tar -cf - --exclude .git xstc/Tests) | (cd $(distdir); tar xf -) - tar -cf - $(distdir)/test $(distdir)/result $(distdir)/xstc/Tests $(distdir)/Makefile.tests $(distdir)/README.md $(distdir)/README.tests $(distdir)/testapi.c $(distdir)/runtest.c $(distdir)/runsuite.c | GZIP=$(GZIP_ENV) gzip -c >`echo "$(distdir)" | sed "s+libxml2+libxml2-tests+"`.tar.gz - @(rm -rf $(distdir)/xstc/Test) - -cleantar: - @(rm -f libxml*.tar.gz COPYING.LIB) - -rpm: cleanup cleantar - @(unset CDPATH ; $(MAKE) dist-source dist && rpmbuild -ta $(distdir).tar.gz) - -CLEANFILES = runxmlconf.log test.out *.gcda *.gcno *.res +CLEANFILES = runsuite.log runxmlconf.log test.out *.gcda *.gcno *.res DISTCLEANFILES = COPYING missing.lst EXTRA_DIST = Copyright check-xml-test-suite.py gentest.py \ @@ -427,9 +412,9 @@ libxml2-config.cmake.in autogen.sh \ trionan.c trionan.h triostr.c triostr.h trio.c trio.h \ triop.h triodef.h libxml.h \ - genUnicode.py TODO_SCHEMAS \ + genUnicode.py \ dbgen.pl dbgenattr.pl \ - README.tests Makefile.tests libxml2.syms timsort.h \ + libxml2.syms timsort.h \ README.zOS README.md \ CMakeLists.txt config.h.cmake.in libxml2-config.cmake.cmake.in
diff --git a/third_party/libxml/src/Makefile.tests b/third_party/libxml/src/Makefile.tests deleted file mode 100644 index 9f08dcf..0000000 --- a/third_party/libxml/src/Makefile.tests +++ /dev/null
@@ -1,41 +0,0 @@ -# -# You may have to adjust to call the right compiler, or other options -# for compiling and linking -# - -CFLAGS=`xml2-config --cflags` -LIBS=`xml2-config --libs` -THREADLIB= -lpthread -EXEEXT= - -all: runtest$(EXEEXT) runsuite$(EXEEXT) testapi$(EXEEXT) testchar$(EXEEXT) - -clean: - $(RM) runtest$(EXEEXT) runsuite$(EXEEXT) testapi$(EXEEXT) - -check: do_runtest do_testchar do_testapi do_runsuite - -runtest$(EXEEXT): runtest.c - $(CC) -o runtest$(EXEEXT) $(CFLAGS) runtest.c $(LIBS) $(THREADLIB) - -do_runtest: runtest$(EXEEXT) - ./runtest - -runsuite$(EXEEXT): runsuite.c - $(CC) -o runsuite$(EXEEXT) $(CFLAGS) runsuite.c $(LIBS) - -do_runsuite: runsuite$(EXEEXT) - ./runsuite - -testapi$(EXEEXT): testapi.c - $(CC) -o testapi$(EXEEXT) $(CFLAGS) testapi.c $(LIBS) - -do_testapi: testapi$(EXEEXT) - ./testapi - -testchar$(EXEEXT): testchar.c - $(CC) -o testchar$(EXEEXT) $(CFLAGS) testchar.c $(LIBS) - -do_testchar: testchar$(EXEEXT) - ./testchar -
diff --git a/third_party/libxml/src/README.tests b/third_party/libxml/src/README.tests deleted file mode 100644 index 8d86f2a1..0000000 --- a/third_party/libxml/src/README.tests +++ /dev/null
@@ -1,39 +0,0 @@ - README.tests - - Instructions for standalone test regressions of libxml2 - -libxml2-tests-$version.tar.gz contains 3 standalone C programs as well -as a large amount of tests and results coming from libxml2 itself and -from W3C, NIST, Sun Microsystems, Microsoft and James Clark. Each C -program has a different testing purpose: - - runtest.c : runs libxml2 basic internal regression tests - runsuite.c: runs libxml2 against external regression tests - testapi.c : exercises the library public entry points - testchar.c: exercise the check of character ranges and UTF-8 validation - -The command: - - make check -or - make -f Makefile.tests check - -should be sufficient on an Unix system to build and exercise the tests -for the version of the library installed on the system. Note however -that there isn't backward compatibility provided so if the installed -version is older than the testsuite one, failing to compile or run the tests -is likely. In any event this won't work with an installed libxml2 older -than 2.6.20. - -Building on other platforms should be a matter of compiling the C files -like any other program using libxml2, running the test should be done -simply by launching the resulting executables. - -Also note the availability of a "make valgrind" target which will run the -above tests under valgrind to check for memory errors (but this relies -on the availability of the valgrind command and take far more time to -complete). - -Daniel Veillard -Mon May 7 2012 -
diff --git a/third_party/libxml/src/SAX2.c b/third_party/libxml/src/SAX2.c index c825f73..b3dd89b1 100644 --- a/third_party/libxml/src/SAX2.c +++ b/third_party/libxml/src/SAX2.c
@@ -388,6 +388,8 @@ int oldcharset; const xmlChar *oldencoding; int oldprogressive; + unsigned long consumed; + size_t buffered; /* * Ask the Entity resolver to load the damn thing @@ -460,6 +462,18 @@ while (ctxt->inputNr > 1) xmlPopInput(ctxt); + + consumed = ctxt->input->consumed; + buffered = ctxt->input->cur - ctxt->input->base; + if (buffered > ULONG_MAX - consumed) + consumed = ULONG_MAX; + else + consumed += buffered; + if (consumed > ULONG_MAX - ctxt->sizeentities) + ctxt->sizeentities = ULONG_MAX; + else + ctxt->sizeentities += consumed; + xmlFreeInputStream(ctxt->input); xmlFree(ctxt->inputTab); @@ -1321,25 +1335,25 @@ /* !!!!!! <a toto:arg="" xmlns:toto="http://toto.com"> */ ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL); + if (ret == NULL) + goto error; - if (ret != NULL) { - if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { - xmlNodePtr tmp; + if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { + xmlNodePtr tmp; - ret->children = xmlStringGetNodeList(ctxt->myDoc, value); - tmp = ret->children; - while (tmp != NULL) { - tmp->parent = (xmlNodePtr) ret; - if (tmp->next == NULL) - ret->last = tmp; - tmp = tmp->next; - } - } else if (value != NULL) { - ret->children = xmlNewDocText(ctxt->myDoc, value); - ret->last = ret->children; - if (ret->children != NULL) - ret->children->parent = (xmlNodePtr) ret; - } + ret->children = xmlStringGetNodeList(ctxt->myDoc, value); + tmp = ret->children; + while (tmp != NULL) { + tmp->parent = (xmlNodePtr) ret; + if (tmp->next == NULL) + ret->last = tmp; + tmp = tmp->next; + } + } else if (value != NULL) { + ret->children = xmlNewDocText(ctxt->myDoc, value); + ret->last = ret->children; + if (ret->children != NULL) + ret->children->parent = (xmlNodePtr) ret; } #ifdef LIBXML_VALID_ENABLED @@ -2270,6 +2284,7 @@ ret->name = lname; if (ret->name == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); + xmlFree(ret); return; } } @@ -2641,7 +2656,8 @@ /* Mixed content, first time */ if (type == XML_TEXT_NODE) { lastChild = xmlSAX2TextNode(ctxt, ch, len); - lastChild->doc = ctxt->myDoc; + if (lastChild != NULL) + lastChild->doc = ctxt->myDoc; } else lastChild = xmlNewCDataBlock(ctxt->myDoc, ch, len); if (lastChild != NULL) {
diff --git a/third_party/libxml/src/TODO b/third_party/libxml/src/TODO deleted file mode 100644 index 95e1c34..0000000 --- a/third_party/libxml/src/TODO +++ /dev/null
@@ -1,276 +0,0 @@ -124907 HTML parse buffer problem when parsing larse in-memory docs -124110 DTD validation && wrong namespace -123564 xmllint --html --format - - TODO for the XML parser and stuff: - ================================== - - this tend to be outdated :-\ ... - -DOCS: -===== - -- use case of using XInclude to load for example a description. - order document + product base -(XSLT)-> quote with XIncludes - | - HTML output with description of parts <---(XSLT)-- - -TODO: -===== -- XInclude at the SAX level (libSRVG) -- fix the C code prototype to bring back doc/libxml-undocumented.txt - to a reasonable level -- Computation of base when HTTP redirect occurs, might affect HTTP - interfaces. -- Computation of base in XInclude. Relativization of URIs. -- listing all attributes in a node. -- Better checking of external parsed entities TAG 1234 -- Go through erratas and do the cleanup. - http://www.w3.org/XML/xml-19980210-errata ... started ... -- jamesh suggestion: SAX like functions to save a document ie. call a - function to open a new element with given attributes, write character - data, close last element, etc - + inversted SAX, initial patch in April 2002 archives. -- htmlParseDoc has parameter encoding which is not used. - Function htmlCreateDocParserCtxt ignore it. -- fix realloc() usage. -- Stricten the UTF8 conformance (Martin Duerst): - http://www.w3.org/2001/06/utf-8-test/. - The bad files are in http://www.w3.org/2001/06/utf-8-wrong/. -- xml:id normalized value - -TODO: -===== - -- move all string manipulation functions (xmlStrdup, xmlStrlen, etc.) to - global.c. Bjorn noted that the following files depends on parser.o solely - because of these string functions: entities.o, global.o, hash.o, tree.o, - xmlIO.o, and xpath.o. - -- Optimization of tag strings allocation ? - -- maintain coherency of namespace when doing cut'n paste operations - => the functions are coded, but need testing - -- function to rebuild the ID table -- functions to rebuild the DTD hash tables (after DTD changes). - - -EXTENSIONS: -=========== - -- Tools to produce man pages from the SGML docs. - -- Add Xpointer recognition/API - -- Add Xlink recognition/API - => started adding an xlink.[ch] with a unified API for XML and HTML. - it's crap :-( - -- Implement XSchemas - => Really need to be done <grin/> - - datatype are complete, but structure support is very limited. - -- extend the shell with: - - edit - - load/save - - mv (yum, yum, but it's harder because directories are ordered in - our case, mvup and mvdown would be required) - - -Done: -===== - -- Add HTML validation using the XHTML DTD - - problem: do we want to keep and maintain the code for handling - DTD/System ID cache directly in libxml ? - => not really done that way, but there are new APIs to check elements - or attributes. Otherwise XHTML validation directly ... - -- XML Schemas datatypes except Base64 and BinHex - -- Relax NG validation - -- XmlTextReader streaming API + validation - -- Add a DTD cache prefilled with xhtml DTDs and entities and a program to - manage them -> like the /usr/bin/install-catalog from SGML - right place seems $datadir/xmldtds - Maybe this is better left to user apps - => use a catalog instead , and xhtml1-dtd package - -- Add output to XHTML - => XML serializer automatically recognize the DTd and apply the specific - rules. - -- Fix output of <tst val="x
y"/> - -- compliance to XML-Namespace checking, see section 6 of - http://www.w3.org/TR/REC-xml-names/ - -- Correct standalone checking/emitting (hard) - 2.9 Standalone Document Declaration - -- Implement OASIS XML Catalog support - http://www.oasis-open.org/committees/entity/ - -- Get OASIS testsuite to a more friendly result, check all the results - once stable. the check-xml-test-suite.py script does this - -- Implement XSLT - => libxslt - -- Finish XPath - => attributes addressing troubles - => defaulted attributes handling - => namespace axis ? - done as XSLT got debugged - -- bug reported by Michael Meallin on validation problems - => Actually means I need to add support (and warn) for non-deterministic - content model. -- Handle undefined namespaces in entity contents better ... at least - issue a warning -- DOM needs - int xmlPruneProp(xmlNodePtr node, xmlAtttrPtr attr); - => done it's actually xmlRemoveProp xmlUnsetProp xmlUnsetNsProp - -- HTML: handling of Script and style data elements, need special code in - the parser and saving functions (handling of < > " ' ...): - http://www.w3.org/TR/html4/types.html#type-script - Attributes are no problems since entities are accepted. -- DOM needs - xmlAttrPtr xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) -- problem when parsing hrefs with & with the HTML parser (IRC ac) -- If the internal encoding is not UTF8 saving to a given encoding doesn't - work => fix to force UTF8 encoding ... - done, added documentation too -- Add an ASCII I/O encoder (asciiToUTF8 and UTF8Toascii) -- Issue warning when using non-absolute namespaces URI. -- the html parser should add <head> and <body> if they don't exist - started, not finished. - Done, the automatic closing is added and 3 testcases were inserted -- Command to force the parser to stop parsing and ignore the rest of the file. - xmlStopParser() should allow this, mostly untested -- support for HTML empty attributes like <hr noshade> -- plugged iconv() in for support of a large set of encodings. -- xmlSwitchToEncoding() rewrite done -- URI checkings (no fragments) rfc2396.txt -- Added a clean mechanism for overload or added input methods: - xmlRegisterInputCallbacks() -- dynamically adapt the alloc entry point to use g_alloc()/g_free() - if the programmer wants it: - - use xmlMemSetup() to reset the routines used. -- Check attribute normalization especially xmlGetProp() -- Validity checking problems for NOTATIONS attributes -- Validity checking problems for ENTITY ENTITIES attributes -- Parsing of a well balanced chunk xmlParseBalancedChunkMemory() -- URI module: validation, base, etc ... see uri.[ch] -- turn tester into a generic program xmllint installed with libxml -- extend validity checks to go through entities content instead of - just labelling them PCDATA -- Save Dtds using the children list instead of dumping the tables, - order is preserved as well as comments and PIs -- Wrote a notice of changes requires to go from 1.x to 2.x -- make sure that all SAX callbacks are disabled if a WF error is detected -- checking/handling of newline normalization - http://localhost/www.xml.com/axml/target.html#sec-line-ends -- correct checking of '&' '%' on entities content. -- checking of PE/Nesting on entities declaration -- checking/handling of xml:space - - checking done. - - handling done, not well tested -- Language identification code, productions [33] to [38] - => done, the check has been added and report WFness errors -- Conditional sections in DTDs [61] to [65] - => should this crap be really implemented ??? - => Yep OASIS testsuite uses them -- Allow parsed entities defined in the internal subset to override - the ones defined in the external subset (DtD customization). - => This mean that the entity content should be computed only at - use time, i.e. keep the orig string only at parse time and expand - only when referenced from the external subset :-( - Needed for complete use of most DTD from Eve Maler -- Add regression tests for all WFC errors - => did some in test/WFC - => added OASIS testsuite routines - http://xmlsoft.org/conf/result.html - -- I18N: http://wap.trondheim.com/vaer/index.phtml is not XML and accepted - by the XML parser, UTF-8 should be checked when there is no "encoding" - declared ! -- Support for UTF-8 and UTF-16 encoding - => added some conversion routines provided by Martin Durst - patched them, got fixes from @@@ - I plan to keep everything internally as UTF-8 (or ISO-Latin-X) - this is slightly more costly but more compact, and recent processors - efficiency is cache related. The key for good performances is keeping - the data set small, so will I. - => the new progressive reading routines call the detection code - is enabled, tested the ISO->UTF-8 stuff -- External entities loading: - - allow override by client code - - make sure it is called for all external entities referenced - Done, client code should use xmlSetExternalEntityLoader() to set - the default loading routine. It will be called each time an external - entity entity resolution is triggered. -- maintain ID coherency when removing/changing attributes - The function used to deallocate attributes now check for it being an - ID and removes it from the table. -- push mode parsing i.e. non-blocking state based parser - done, both for XML and HTML parsers. Use xmlCreatePushParserCtxt() - and xmlParseChunk() and html counterparts. - The tester program now has a --push option to select that parser - front-end. Douplicated tests to use both and check results are similar. - -- Most of XPath, still see some troubles and occasionnal memleaks. -- an XML shell, allowing to traverse/manipulate an XML document with - a shell like interface, and using XPath for the anming syntax - - use of readline and history added when available - - the shell interface has been cleanly separated and moved to debugXML.c -- HTML parser, should be fairly stable now -- API to search the lang of an attribute -- Collect IDs at parsing and maintain a table. - PBM: maintain the table coherency - PBM: how to detect ID types in absence of DtD ! -- Use it for XPath ID support -- Add validity checking - Should be finished now ! -- Add regression tests with entity substitutions - -- External Parsed entities, either XML or external Subset [78] and [79] - parsing the xmllang DtD now works, so it should be sufficient for - most cases ! - -- progressive reading. The entity support is a first step toward - abstraction of an input stream. A large part of the context is still - located on the stack, moving to a state machine and putting everything - in the parsing context should provide an adequate solution. - => Rather than progressive parsing, give more power to the SAX-like - interface. Currently the DOM-like representation is built but - => it should be possible to define that only as a set of SAX callbacks - and remove the tree creation from the parser code. - DONE - -- DOM support, instead of using a proprietary in memory - format for the document representation, the parser should - call a DOM API to actually build the resulting document. - Then the parser becomes independent of the in-memory - representation of the document. Even better using RPC's - the parser can actually build the document in another - program. - => Work started, now the internal representation is by default - very near a direct DOM implementation. The DOM glue is implemented - as a separate module. See the GNOME gdome module. - -- C++ support : John Ehresman <jehresma@dsg.harvard.edu> -- Updated code to follow more recent specs, added compatibility flag -- Better error handling, use a dedicated, overridable error - handling function. -- Support for CDATA. -- Keep track of line numbers for better error reporting. -- Support for PI (SAX one). -- Support for Comments (bad, should be in ASAP, they are parsed - but not stored), should be configurable. -- Improve the support of entities on save (+SAX). -
diff --git a/third_party/libxml/src/TODO_SCHEMAS b/third_party/libxml/src/TODO_SCHEMAS deleted file mode 100644 index 145a4ed..0000000 --- a/third_party/libxml/src/TODO_SCHEMAS +++ /dev/null
@@ -1,31 +0,0 @@ -- implement counted transitions at the automata level - -- Unicode: - + upgrade to 3.2 - + improve the python script to generate better test - expressions to check the list of ranges. - -- Implement the interface at the SAX level - -- Implement the missing parts in the Structure part - + all content model - + enumerations - + countless others c.f. the TODO scattered in the code - -- Complete the Built-In datatype collections and Facets implementations - -- Regression tests based on - + the primer: - http://www.w3.org/TR/xmlschema-0/ - + the Schemas Test Collection: - http://www.w3.org/2001/05/xmlschema-test-collection/ - + archives of the schemas-dev list - -- Integrity constraints: - + what's that ? How need to read about it - -- "formal" checking, i.e. go through the full Structure spec and - bind code and associated parts of the Schemas spec - -- go though the erratas - http://www.w3.org/2001/05/xmlschema-errata
diff --git a/third_party/libxml/src/buf.c b/third_party/libxml/src/buf.c index 7fb75c3b..f876ea99 100644 --- a/third_party/libxml/src/buf.c +++ b/third_party/libxml/src/buf.c
@@ -735,7 +735,8 @@ if (buf->content == NULL) { rebuf = (xmlChar *) xmlMallocAtomic(newSize); buf->use = 0; - rebuf[buf->use] = 0; + if (rebuf != NULL) + rebuf[buf->use] = 0; } else if (buf->size - buf->use < 100) { rebuf = (xmlChar *) xmlRealloc(buf->content, newSize); } else { @@ -1068,7 +1069,7 @@ size_t base; if ((input == NULL) || (buf == NULL) || (buf->error)) - return(-1); + return(0); CHECK_COMPAT(buf) base = input->base - buf->content; /*
diff --git a/third_party/libxml/src/configure.ac b/third_party/libxml/src/configure.ac index 13f7a1e7..fa24ca6 100644 --- a/third_party/libxml/src/configure.ac +++ b/third_party/libxml/src/configure.ac
@@ -1136,7 +1136,7 @@ AC_SUBST(RELDATE) # keep on one line for cygwin c.f. #130896 -AC_CONFIG_FILES([libxml2.spec:libxml.spec.in Makefile include/Makefile include/libxml/Makefile include/private/Makefile doc/Makefile doc/examples/Makefile doc/devhelp/Makefile example/Makefile fuzz/Makefile python/Makefile python/tests/Makefile xstc/Makefile include/libxml/xmlversion.h libxml-2.0.pc libxml-2.0-uninstalled.pc libxml2-config.cmake]) +AC_CONFIG_FILES([Makefile include/Makefile include/libxml/Makefile include/private/Makefile doc/Makefile doc/examples/Makefile doc/devhelp/Makefile example/Makefile fuzz/Makefile python/Makefile python/tests/Makefile xstc/Makefile include/libxml/xmlversion.h libxml-2.0.pc libxml-2.0-uninstalled.pc libxml2-config.cmake]) AC_CONFIG_FILES([python/setup.py], [chmod +x python/setup.py]) AC_CONFIG_FILES([xml2-config], [chmod +x xml2-config]) AC_OUTPUT
diff --git a/third_party/libxml/src/encoding.c b/third_party/libxml/src/encoding.c index 634349a..101eba9 100644 --- a/third_party/libxml/src/encoding.c +++ b/third_party/libxml/src/encoding.c
@@ -1042,7 +1042,7 @@ return(NULL); for (i = 0;i < 99;i++) { - upper[i] = toupper(alias[i]); + upper[i] = (char) toupper((unsigned char) alias[i]); if (upper[i] == 0) break; } upper[i] = 0; @@ -1077,7 +1077,7 @@ return(-1); for (i = 0;i < 99;i++) { - upper[i] = toupper(alias[i]); + upper[i] = (char) toupper((unsigned char) alias[i]); if (upper[i] == 0) break; } upper[i] = 0; @@ -1179,7 +1179,7 @@ name = alias; for (i = 0;i < 499;i++) { - upper[i] = toupper(name[i]); + upper[i] = (char) toupper((unsigned char) name[i]); if (upper[i] == 0) break; } upper[i] = 0; @@ -1436,7 +1436,7 @@ return(NULL); } for (i = 0;i < 499;i++) { - upper[i] = toupper(name[i]); + upper[i] = (char) toupper((unsigned char) name[i]); if (upper[i] == 0) break; } upper[i] = 0; @@ -1751,7 +1751,7 @@ * Check first for directly registered encoding names */ for (i = 0;i < 99;i++) { - upper[i] = toupper(name[i]); + upper[i] = (char) toupper((unsigned char) name[i]); if (upper[i] == 0) break; } upper[i] = 0; @@ -1793,6 +1793,12 @@ } memset(enc, 0, sizeof(xmlCharEncodingHandler)); enc->name = xmlMemStrdup(name); + if (enc->name == NULL) { + xmlFree(enc); + iconv_close(icv_in); + iconv_close(icv_out); + return(NULL); + } enc->input = NULL; enc->output = NULL; enc->iconv_in = icv_in; @@ -1825,6 +1831,12 @@ } memset(encu, 0, sizeof(xmlCharEncodingHandler)); encu->name = xmlMemStrdup(name); + if (encu->name == NULL) { + xmlFree(encu); + closeIcuConverter(ucv_in); + closeIcuConverter(ucv_out); + return(NULL); + } encu->input = NULL; encu->output = NULL; encu->uconv_in = ucv_in; @@ -2332,7 +2344,8 @@ toconv = 64 * 1024; written = xmlBufAvail(out); if (toconv * 2 >= written) { - xmlBufGrow(out, toconv * 2); + if (xmlBufGrow(out, toconv * 2) < 0) + return (-1); written = xmlBufAvail(out); } if ((written > 128 * 1024) && (flush == 0)) @@ -2821,7 +2834,6 @@ int i = 0; if (handler == NULL) return(-1); - if (handler->name == NULL) return(-1); for (i = 0; i < (int) NUM_DEFAULT_HANDLERS; i++) { if (handler == &defaultHandlers[i])
diff --git a/third_party/libxml/src/entities.c b/third_party/libxml/src/entities.c index b8db4db..52eb9d5 100644 --- a/third_party/libxml/src/entities.c +++ b/third_party/libxml/src/entities.c
@@ -38,35 +38,35 @@ NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "<", BAD_CAST "<", 1, XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 + NULL, NULL, NULL, NULL, 0, 0, 0 }; static xmlEntity xmlEntityGt = { NULL, XML_ENTITY_DECL, BAD_CAST "gt", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST ">", BAD_CAST ">", 1, XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 + NULL, NULL, NULL, NULL, 0, 0, 0 }; static xmlEntity xmlEntityAmp = { NULL, XML_ENTITY_DECL, BAD_CAST "amp", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "&", BAD_CAST "&", 1, XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 + NULL, NULL, NULL, NULL, 0, 0, 0 }; static xmlEntity xmlEntityQuot = { NULL, XML_ENTITY_DECL, BAD_CAST "quot", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "\"", BAD_CAST "\"", 1, XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 + NULL, NULL, NULL, NULL, 0, 0, 0 }; static xmlEntity xmlEntityApos = { NULL, XML_ENTITY_DECL, BAD_CAST "apos", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "'", BAD_CAST "'", 1, XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 + NULL, NULL, NULL, NULL, 0, 0, 0 }; /** @@ -163,8 +163,6 @@ } memset(ret, 0, sizeof(xmlEntity)); ret->type = XML_ENTITY_DECL; - ret->checked = 0; - ret->guard = XML_ENTITY_NOT_BEING_CHECKED; /* * fill the structure. @@ -983,7 +981,6 @@ cur->orig = xmlStrdup(ent->orig); if (ent->URI != NULL) cur->URI = xmlStrdup(ent->URI); - cur->guard = 0; return(cur); }
diff --git a/third_party/libxml/src/error.c b/third_party/libxml/src/error.c index c67e429..4de1418 100644 --- a/third_party/libxml/src/error.c +++ b/third_party/libxml/src/error.c
@@ -18,6 +18,8 @@ #include "private/error.h" +#define XML_MAX_ERRORS 100 + #define XML_GET_VAR_STR(msg, str) { \ int size, prev_size = -1; \ int chars; \ @@ -188,10 +190,12 @@ } n = 0; /* search backwards for beginning-of-line (to max buff size) */ - while ((n++ < (sizeof(content)-1)) && (cur > base) && - (*(cur) != '\n') && (*(cur) != '\r')) + while ((n < sizeof(content) - 1) && (cur > base) && + (*cur != '\n') && (*cur != '\r')) { cur--; - if ((*(cur) == '\n') || (*(cur) == '\r')) { + n++; + } + if ((n > 0) && ((*cur == '\n') || (*cur == '\r'))) { cur++; } else { /* skip over continuation bytes */ @@ -485,12 +489,25 @@ (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { ctxt = (xmlParserCtxtPtr) ctx; - if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && - (ctxt->sax->initialized == XML_SAX2_MAGIC) && - (ctxt->sax->serror != NULL)) { - schannel = ctxt->sax->serror; - data = ctxt->userData; - } + + if (ctxt != NULL) { + if (level == XML_ERR_WARNING) { + if (ctxt->nbWarnings >= XML_MAX_ERRORS) + return; + ctxt->nbWarnings += 1; + } else { + if (ctxt->nbErrors >= XML_MAX_ERRORS) + return; + ctxt->nbErrors += 1; + } + + if ((schannel == NULL) && (ctxt->sax != NULL) && + (ctxt->sax->initialized == XML_SAX2_MAGIC) && + (ctxt->sax->serror != NULL)) { + schannel = ctxt->sax->serror; + data = ctxt->userData; + } + } } /* * Check if structured error handler set
diff --git a/third_party/libxml/src/fuzz/Makefile.am b/third_party/libxml/src/fuzz/Makefile.am index bc5ee9a..f9f3e98 100644 --- a/third_party/libxml/src/fuzz/Makefile.am +++ b/third_party/libxml/src/fuzz/Makefile.am
@@ -1,5 +1,5 @@ AUTOMAKE_OPTIONS = -Wno-syntax -EXTRA_PROGRAMS = genSeed html regexp schema uri xml xpath +EXTRA_PROGRAMS = genSeed html regexp schema uri xinclude xml xpath check_PROGRAMS = testFuzzer EXTRA_DIST = html.dict regexp.dict schema.dict xml.dict xpath.dict \ static_seed/uri static_seed/regexp fuzz.h @@ -15,12 +15,11 @@ '$(top_srcdir)/test/errors/*.xml' \ '$(top_srcdir)/test/errors10/*.xml' \ '$(top_srcdir)/test/namespaces/*' \ + '$(top_srcdir)/test/recurse/*.xml' \ '$(top_srcdir)/test/SVG/*.xml' \ '$(top_srcdir)/test/valid/*.xml' \ '$(top_srcdir)/test/VC/*' \ '$(top_srcdir)/test/VCM/*' \ - '$(top_srcdir)/test/XInclude/docs/*' \ - '$(top_srcdir)/test/XInclude/without-reader/*' \ '$(top_srcdir)/test/xmlid/*' testFuzzer_SOURCES = testFuzzer.c fuzz.c @@ -28,7 +27,7 @@ .PHONY: corpus clean-corpus corpus: seed/html.stamp seed/regexp.stamp seed/schema.stamp seed/uri.stamp \ - seed/xml.stamp seed/xpath.stamp + seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp check-local: corpus ./testFuzzer$(EXEEXT) @@ -60,6 +59,26 @@ -timeout=20 \ corpus/xml seed/xml +# XInclude fuzzer + +seed/xinclude.stamp: genSeed$(EXEEXT) + @mkdir -p seed/xinclude + ./genSeed$(EXEEXT) xinclude \ + '$(top_srcdir)/test/XInclude/docs/*' \ + '$(top_srcdir)/test/XInclude/without-reader/*' + @touch seed/xinclude.stamp + +xinclude_SOURCES = xinclude.c fuzz.c +xinclude_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer + +fuzz-xinclude: xinclude$(EXEEXT) seed/xinclude.stamp + @mkdir -p corpus/xinclude + ./xinclude$(EXEEXT) \ + -dict=xml.dict \ + -max_len=$(XML_MAX_LEN) \ + -timeout=20 \ + corpus/xinclude seed/xinclude + # HTML fuzzer seed/html.stamp: genSeed$(EXEEXT)
diff --git a/third_party/libxml/src/fuzz/Makefile.in b/third_party/libxml/src/fuzz/Makefile.in index a6da7bae..7a3ca65f 100644 --- a/third_party/libxml/src/fuzz/Makefile.in +++ b/third_party/libxml/src/fuzz/Makefile.in
@@ -88,7 +88,8 @@ build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = genSeed$(EXEEXT) html$(EXEEXT) regexp$(EXEEXT) \ - schema$(EXEEXT) uri$(EXEEXT) xml$(EXEEXT) xpath$(EXEEXT) + schema$(EXEEXT) uri$(EXEEXT) xinclude$(EXEEXT) xml$(EXEEXT) \ + xpath$(EXEEXT) check_PROGRAMS = testFuzzer$(EXEEXT) subdir = fuzz ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -143,6 +144,13 @@ uri_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(uri_LDFLAGS) $(LDFLAGS) -o $@ +am_xinclude_OBJECTS = xinclude.$(OBJEXT) fuzz.$(OBJEXT) +xinclude_OBJECTS = $(am_xinclude_OBJECTS) +xinclude_LDADD = $(LDADD) +xinclude_DEPENDENCIES = $(top_builddir)/libxml2.la +xinclude_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(xinclude_LDFLAGS) $(LDFLAGS) -o $@ am_xml_OBJECTS = xml.$(OBJEXT) fuzz.$(OBJEXT) xml_OBJECTS = $(am_xml_OBJECTS) xml_LDADD = $(LDADD) @@ -175,7 +183,8 @@ am__depfiles_remade = ./$(DEPDIR)/fuzz.Po ./$(DEPDIR)/genSeed.Po \ ./$(DEPDIR)/html.Po ./$(DEPDIR)/regexp.Po \ ./$(DEPDIR)/schema.Po ./$(DEPDIR)/testFuzzer.Po \ - ./$(DEPDIR)/uri.Po ./$(DEPDIR)/xml.Po ./$(DEPDIR)/xpath.Po + ./$(DEPDIR)/uri.Po ./$(DEPDIR)/xinclude.Po ./$(DEPDIR)/xml.Po \ + ./$(DEPDIR)/xpath.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -197,10 +206,10 @@ am__v_CCLD_1 = SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \ $(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \ - $(xml_SOURCES) $(xpath_SOURCES) + $(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES) DIST_SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \ $(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \ - $(xml_SOURCES) $(xpath_SOURCES) + $(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -444,12 +453,11 @@ '$(top_srcdir)/test/errors/*.xml' \ '$(top_srcdir)/test/errors10/*.xml' \ '$(top_srcdir)/test/namespaces/*' \ + '$(top_srcdir)/test/recurse/*.xml' \ '$(top_srcdir)/test/SVG/*.xml' \ '$(top_srcdir)/test/valid/*.xml' \ '$(top_srcdir)/test/VC/*' \ '$(top_srcdir)/test/VCM/*' \ - '$(top_srcdir)/test/XInclude/docs/*' \ - '$(top_srcdir)/test/XInclude/without-reader/*' \ '$(top_srcdir)/test/xmlid/*' testFuzzer_SOURCES = testFuzzer.c fuzz.c @@ -458,6 +466,8 @@ genSeed_SOURCES = genSeed.c fuzz.c xml_SOURCES = xml.c fuzz.c xml_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer +xinclude_SOURCES = xinclude.c fuzz.c +xinclude_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer html_SOURCES = html.c fuzz.c html_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer regexp_SOURCES = regexp.c fuzz.c @@ -535,6 +545,10 @@ @rm -f uri$(EXEEXT) $(AM_V_CCLD)$(uri_LINK) $(uri_OBJECTS) $(uri_LDADD) $(LIBS) +xinclude$(EXEEXT): $(xinclude_OBJECTS) $(xinclude_DEPENDENCIES) $(EXTRA_xinclude_DEPENDENCIES) + @rm -f xinclude$(EXEEXT) + $(AM_V_CCLD)$(xinclude_LINK) $(xinclude_OBJECTS) $(xinclude_LDADD) $(LIBS) + xml$(EXEEXT): $(xml_OBJECTS) $(xml_DEPENDENCIES) $(EXTRA_xml_DEPENDENCIES) @rm -f xml$(EXEEXT) $(AM_V_CCLD)$(xml_LINK) $(xml_OBJECTS) $(xml_LDADD) $(LIBS) @@ -556,6 +570,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schema.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uri.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xinclude.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath.Po@am__quote@ # am--include-marker @@ -726,6 +741,7 @@ -rm -f ./$(DEPDIR)/schema.Po -rm -f ./$(DEPDIR)/testFuzzer.Po -rm -f ./$(DEPDIR)/uri.Po + -rm -f ./$(DEPDIR)/xinclude.Po -rm -f ./$(DEPDIR)/xml.Po -rm -f ./$(DEPDIR)/xpath.Po -rm -f Makefile @@ -778,6 +794,7 @@ -rm -f ./$(DEPDIR)/schema.Po -rm -f ./$(DEPDIR)/testFuzzer.Po -rm -f ./$(DEPDIR)/uri.Po + -rm -f ./$(DEPDIR)/xinclude.Po -rm -f ./$(DEPDIR)/xml.Po -rm -f ./$(DEPDIR)/xpath.Po -rm -f Makefile @@ -821,7 +838,7 @@ .PHONY: corpus clean-corpus corpus: seed/html.stamp seed/regexp.stamp seed/schema.stamp seed/uri.stamp \ - seed/xml.stamp seed/xpath.stamp + seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp check-local: corpus ./testFuzzer$(EXEEXT) @@ -846,6 +863,23 @@ -timeout=20 \ corpus/xml seed/xml +# XInclude fuzzer + +seed/xinclude.stamp: genSeed$(EXEEXT) + @mkdir -p seed/xinclude + ./genSeed$(EXEEXT) xinclude \ + '$(top_srcdir)/test/XInclude/docs/*' \ + '$(top_srcdir)/test/XInclude/without-reader/*' + @touch seed/xinclude.stamp + +fuzz-xinclude: xinclude$(EXEEXT) seed/xinclude.stamp + @mkdir -p corpus/xinclude + ./xinclude$(EXEEXT) \ + -dict=xml.dict \ + -max_len=$(XML_MAX_LEN) \ + -timeout=20 \ + corpus/xinclude seed/xinclude + # HTML fuzzer seed/html.stamp: genSeed$(EXEEXT)
diff --git a/third_party/libxml/src/fuzz/fuzz.h b/third_party/libxml/src/fuzz/fuzz.h index a51b398..e51dc7a9 100644 --- a/third_party/libxml/src/fuzz/fuzz.h +++ b/third_party/libxml/src/fuzz/fuzz.h
@@ -27,9 +27,12 @@ #if 1 #define HAVE_URI_FUZZER #endif +#if defined(LIBXML_XINCLUDE_ENABLED) && \ + defined(LIBXML_READER_ENABLED) + #define HAVE_XINCLUDE_FUZZER +#endif #if defined(LIBXML_OUTPUT_ENABLED) && \ - defined(LIBXML_READER_ENABLED) && \ - defined(LIBXML_XINCLUDE_ENABLED) + defined(LIBXML_READER_ENABLED) #define HAVE_XML_FUZZER #endif #if defined(LIBXML_XPATH_ENABLED)
diff --git a/third_party/libxml/src/fuzz/genSeed.c b/third_party/libxml/src/fuzz/genSeed.c index dc1c144..0a78fdf5 100644 --- a/third_party/libxml/src/fuzz/genSeed.c +++ b/third_party/libxml/src/fuzz/genSeed.c
@@ -407,6 +407,11 @@ processArg = processPattern; globalData.processFile = processSchema; #endif + } else if (strcmp(fuzzer, "xinclude") == 0) { +#ifdef HAVE_XINCLUDE_FUZZER + processArg = processPattern; + globalData.processFile = processXml; +#endif } else if (strcmp(fuzzer, "xml") == 0) { #ifdef HAVE_XML_FUZZER processArg = processPattern;
diff --git a/third_party/libxml/src/fuzz/testFuzzer.c b/third_party/libxml/src/fuzz/testFuzzer.c index d14b29b..fb791d9 100644 --- a/third_party/libxml/src/fuzz/testFuzzer.c +++ b/third_party/libxml/src/fuzz/testFuzzer.c
@@ -52,6 +52,16 @@ #undef LLVMFuzzerTestOneInput #endif +#ifdef HAVE_XINCLUDE_FUZZER +int fuzzXIncludeInit(int *argc, char ***argv); +int fuzzXInclude(const char *data, size_t size); +#define LLVMFuzzerInitialize fuzzXIncludeInit +#define LLVMFuzzerTestOneInput fuzzXInclude +#include "xinclude.c" +#undef LLVMFuzzerInitialize +#undef LLVMFuzzerTestOneInput +#endif + #ifdef HAVE_XML_FUZZER int fuzzXmlInit(int *argc, char ***argv); int fuzzXml(const char *data, size_t size); @@ -183,6 +193,10 @@ if (testFuzzer(NULL, fuzzUri, "seed/uri/*") != 0) ret = 1; #endif +#ifdef HAVE_XINCLUDE_FUZZER + if (testFuzzer(fuzzXIncludeInit, fuzzXInclude, "seed/xinclude/*") != 0) + ret = 1; +#endif #ifdef HAVE_XML_FUZZER if (testFuzzer(fuzzXmlInit, fuzzXml, "seed/xml/*") != 0) ret = 1;
diff --git a/third_party/libxml/src/fuzz/xinclude.c b/third_party/libxml/src/fuzz/xinclude.c new file mode 100644 index 0000000..b86e21b --- /dev/null +++ b/third_party/libxml/src/fuzz/xinclude.c
@@ -0,0 +1,73 @@ +/* + * xinclude.c: a libFuzzer target to test the XInclude engine. + * + * See Copyright for the status of this software. + */ + +#include <libxml/catalog.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <libxml/xmlerror.h> +#include <libxml/xinclude.h> +#include <libxml/xmlreader.h> +#include "fuzz.h" + +int +LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED, + char ***argv ATTRIBUTE_UNUSED) { + xmlInitParser(); +#ifdef LIBXML_CATALOG_ENABLED + xmlInitializeCatalog(); +#endif + xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc); + xmlSetExternalEntityLoader(xmlFuzzEntityLoader); + + return 0; +} + +int +LLVMFuzzerTestOneInput(const char *data, size_t size) { + xmlDocPtr doc; + xmlTextReaderPtr reader; + const char *docBuffer, *docUrl; + size_t docSize; + int opts; + + xmlFuzzDataInit(data, size); + opts = xmlFuzzReadInt(); + opts |= XML_PARSE_XINCLUDE; + + xmlFuzzReadEntities(); + docBuffer = xmlFuzzMainEntity(&docSize); + docUrl = xmlFuzzMainUrl(); + if (docBuffer == NULL) + goto exit; + + /* Pull parser */ + + doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts); + xmlXIncludeProcessFlags(doc, opts); + xmlFreeDoc(doc); + + /* Reader */ + + reader = xmlReaderForMemory(docBuffer, docSize, NULL, NULL, opts); + if (reader == NULL) + goto exit; + while (xmlTextReaderRead(reader) == 1) { + if (xmlTextReaderNodeType(reader) == XML_ELEMENT_NODE) { + int i, n = xmlTextReaderAttributeCount(reader); + for (i=0; i<n; i++) { + xmlTextReaderMoveToAttributeNo(reader, i); + while (xmlTextReaderReadAttributeValue(reader) == 1); + } + } + } + xmlFreeTextReader(reader); + +exit: + xmlFuzzDataCleanup(); + xmlResetLastError(); + return(0); +} +
diff --git a/third_party/libxml/src/fuzz/xml.c b/third_party/libxml/src/fuzz/xml.c index 8b4c4ef..7ff9bb8 100644 --- a/third_party/libxml/src/fuzz/xml.c +++ b/third_party/libxml/src/fuzz/xml.c
@@ -8,7 +8,6 @@ #include <libxml/parser.h> #include <libxml/tree.h> #include <libxml/xmlerror.h> -#include <libxml/xinclude.h> #include <libxml/xmlreader.h> #include "fuzz.h" @@ -33,16 +32,12 @@ xmlTextReaderPtr reader; xmlChar *out; const char *docBuffer, *docUrl; - size_t maxSize, docSize, consumed, chunkSize; + size_t docSize, consumed, chunkSize; int opts, outSize; xmlFuzzDataInit(data, size); opts = xmlFuzzReadInt(); - - /* Lower maximum size when processing entities for now. */ - maxSize = opts & XML_PARSE_NOENT ? 50000 : 500000; - if (size > maxSize) - goto exit; + opts &= ~XML_PARSE_XINCLUDE; xmlFuzzReadEntities(); docBuffer = xmlFuzzMainEntity(&docSize); @@ -53,8 +48,6 @@ /* Pull parser */ doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts); - if (opts & XML_PARSE_XINCLUDE) - xmlXIncludeProcessFlags(doc, opts); /* Also test the serializer. */ xmlDocDumpMemory(doc, &out, &outSize); xmlFree(out); @@ -75,8 +68,6 @@ } xmlParseChunk(ctxt, NULL, 0, 1); - if (opts & XML_PARSE_XINCLUDE) - xmlXIncludeProcessFlags(ctxt->myDoc, opts); xmlFreeDoc(ctxt->myDoc); xmlFreeParserCtxt(ctxt);
diff --git a/third_party/libxml/src/include/libxml/entities.h b/third_party/libxml/src/include/libxml/entities.h index bf463cc..2c69514c 100644 --- a/third_party/libxml/src/include/libxml/entities.h +++ b/third_party/libxml/src/include/libxml/entities.h
@@ -35,13 +35,8 @@ * and the linkind data needed for the linking in the hash table. */ -typedef enum { - XML_ENTITY_NOT_BEING_CHECKED, - XML_ENTITY_BEING_CHECKED /* entity check is in progress */ -} xmlEntityRecursionGuard; - struct _xmlEntity { - void *_private; /* application data */ + void *_private; /* application data */ xmlElementType type; /* XML_ENTITY_DECL, must be second ! */ const xmlChar *name; /* Entity name */ struct _xmlNode *children; /* First child link */ @@ -61,11 +56,8 @@ struct _xmlEntity *nexte; /* unused */ const xmlChar *URI; /* the full URI as computed */ int owner; /* does the entity own the childrens */ - int checked; /* was the entity content checked and */ - /* l.o. bit: replacement contains '<' */ - /* remaining bits: one plus count of */ - /* entity references from this entity */ - xmlEntityRecursionGuard guard; + int flags; /* various flags */ + unsigned long expandedSize; /* expanded size */ }; /*
diff --git a/third_party/libxml/src/include/libxml/parser.h b/third_party/libxml/src/include/libxml/parser.h index 6dc4ca9b..0bc34691 100644 --- a/third_party/libxml/src/include/libxml/parser.h +++ b/third_party/libxml/src/include/libxml/parser.h
@@ -61,17 +61,14 @@ int length; /* length if known */ int line; /* Current line */ int col; /* Current column */ - /* - * NOTE: consumed is only tested for equality in the parser code, - * so even if there is an overflow this should not give troubles - * for parsing very large instances. - */ unsigned long consumed; /* How many xmlChars already consumed */ xmlParserInputDeallocate free; /* function to deallocate the base */ const xmlChar *encoding; /* the encoding string for entity */ const xmlChar *version; /* the version string for entity */ int standalone; /* Was that entity marked standalone */ int id; /* an unique identifier for the entity */ + unsigned long parentConsumed; /* consumed bytes from parents */ + xmlEntityPtr entity; /* entity, if any */ }; /** @@ -300,7 +297,7 @@ */ xmlError lastError; xmlParserMode parseMode; /* the parser mode */ - unsigned long nbentities; /* number of entities references */ + unsigned long nbentities; /* unused */ unsigned long sizeentities; /* size of parsed entities */ /* for use by HTML non-recursive parser */ @@ -313,6 +310,8 @@ unsigned long sizeentcopy; /* volume of entity copy */ int endCheckState; /* quote state for push parser */ + unsigned short nbErrors; /* number of errors */ + unsigned short nbWarnings; /* number of warnings */ }; /**
diff --git a/third_party/libxml/src/include/libxml/parserInternals.h b/third_party/libxml/src/include/libxml/parserInternals.h index b6b2313..55d6527 100644 --- a/third_party/libxml/src/include/libxml/parserInternals.h +++ b/third_party/libxml/src/include/libxml/parserInternals.h
@@ -523,6 +523,7 @@ */ #define XML_SUBSTITUTE_BOTH 3 +XML_DEPRECATED XMLPUBFUN xmlChar * xmlStringDecodeEntities (xmlParserCtxtPtr ctxt, const xmlChar *str, @@ -530,6 +531,7 @@ xmlChar end, xmlChar end2, xmlChar end3); +XML_DEPRECATED XMLPUBFUN xmlChar * xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt, const xmlChar *str,
diff --git a/third_party/libxml/src/include/libxml/xpathInternals.h b/third_party/libxml/src/include/libxml/xpathInternals.h index cb0991d7..57ff7a8d 100644 --- a/third_party/libxml/src/include/libxml/xpathInternals.h +++ b/third_party/libxml/src/include/libxml/xpathInternals.h
@@ -273,7 +273,8 @@ * type. */ #define CHECK_TYPE(typeval) \ - if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ + if ((ctxt->error != 0) || \ + (ctxt->value == NULL) || (ctxt->value->type != typeval)) \ XP_ERROR(XPATH_INVALID_TYPE) /**
diff --git a/third_party/libxml/src/include/private/Makefile.am b/third_party/libxml/src/include/private/Makefile.am index 7df47219..29c0bdd 100644 --- a/third_party/libxml/src/include/private/Makefile.am +++ b/third_party/libxml/src/include/private/Makefile.am
@@ -14,5 +14,6 @@ string.h \ threads.h \ tree.h \ + xinclude.h \ xpath.h \ xzlib.h
diff --git a/third_party/libxml/src/include/private/Makefile.in b/third_party/libxml/src/include/private/Makefile.in index d761277..0e6bad5 100644 --- a/third_party/libxml/src/include/private/Makefile.in +++ b/third_party/libxml/src/include/private/Makefile.in
@@ -342,6 +342,7 @@ string.h \ threads.h \ tree.h \ + xinclude.h \ xpath.h \ xzlib.h
diff --git a/third_party/libxml/src/include/private/entities.h b/third_party/libxml/src/include/private/entities.h index 1118c6d0..c3f15e68 100644 --- a/third_party/libxml/src/include/private/entities.h +++ b/third_party/libxml/src/include/private/entities.h
@@ -4,6 +4,19 @@ #include <libxml/tree.h> #include <libxml/xmlstring.h> +/* + * Entity flags + * + * XML_ENT_PARSED: The entity was parsed and `children` points to the + * content. + * XML_ENT_CHECKED: The entity was checked for loops. + */ +#define XML_ENT_PARSED (1<<0) +#define XML_ENT_CHECKED (1<<1) +#define XML_ENT_EXPANDING (1<<2) +#define XML_ENT_CHECKED_LT (1<<3) +#define XML_ENT_CONTAINS_LT (1<<4) + XML_HIDDEN xmlChar * xmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input);
diff --git a/third_party/libxml/src/include/private/xinclude.h b/third_party/libxml/src/include/private/xinclude.h new file mode 100644 index 0000000..abd0dc015 --- /dev/null +++ b/third_party/libxml/src/include/private/xinclude.h
@@ -0,0 +1,9 @@ +#ifndef XML_IO_H_PRIVATE__ +#define XML_IO_H_PRIVATE__ + +#include <libxml/xinclude.h> + +XML_HIDDEN int +xmlXIncludeSetStreamingMode(xmlXIncludeCtxtPtr ctxt, int mode); + +#endif /* XML_IO_H_PRIVATE__ */
diff --git a/third_party/libxml/src/libxml.spec.in b/third_party/libxml/src/libxml.spec.in deleted file mode 100644 index 45083de..0000000 --- a/third_party/libxml/src/libxml.spec.in +++ /dev/null
@@ -1,208 +0,0 @@ -%global with_python3 1 - -Summary: Library providing XML and HTML support -Name: libxml2 -Version: @VERSION@ -Release: 1%{?dist}%{?extra_release} -License: MIT -Group: Development/Libraries -Source: https://download.gnome.org/sources/libxml2/@LIBXML_MAJOR_VERSION@.@LIBXML_MINOR_VERSION@/libxml2-%{version}.tar.xz -BuildRoot: %{_tmppath}/%{name}-%{version}-root -BuildRequires: python-devel -%if 0%{?with_python3} -BuildRequires: python3-devel -%endif # with_python3 -BuildRequires: zlib-devel -BuildRequires: pkgconfig -BuildRequires: xz-devel -URL: https://gitlab.gnome.org/GNOME/libxml2 - -%description -This library allows to manipulate XML files. It includes support -to read, modify and write XML and HTML files. There is DTDs support -this includes parsing and validation even with complex DtDs, either -at parse time or later once the document has been modified. The output -can be a simple SAX stream or and in-memory DOM like representations. -In this case one can use the built-in XPath and XPointer implementation -to select sub nodes or ranges. A flexible Input/Output mechanism is -available, with existing HTTP and FTP modules and combined to an -URI library. - -%package devel -Summary: Libraries, includes, etc. to develop XML and HTML applications -Group: Development/Libraries -Requires: libxml2 = %{version}-%{release} -Requires: zlib-devel -Requires: xz-devel -Requires: pkgconfig - -%description devel -Libraries, include files, etc you can use to develop XML applications. -This library allows to manipulate XML files. It includes support -to read, modify and write XML and HTML files. There is DTDs support -this includes parsing and validation even with complex DtDs, either -at parse time or later once the document has been modified. The output -can be a simple SAX stream or and in-memory DOM like representations. -In this case one can use the built-in XPath and XPointer implementation -to select sub nodes or ranges. A flexible Input/Output mechanism is -available, with existing HTTP and FTP modules and combined to an -URI library. - -%package static -Summary: Static library for libxml2 -Group: Development/Libraries -Requires: libxml2 = %{version}-%{release} - -%description static -Static library for libxml2 provided for specific uses or shaving a few -microseconds when parsing, do not link to them for generic purpose packages. - -%package -n python-%{name} -%{?python_provide:%python_provide python-%{name}} -Summary: Python bindings for the libxml2 library -Group: Development/Libraries -Requires: libxml2 = %{version}-%{release} -Obsoletes: %{name}-python < %{version}-%{release} -Provides: %{name}-python = %{version}-%{release} - -%description -n python-%{name} -The libxml2-python package contains a Python 2 module that permits applications -written in the Python programming language, version 2, to use the interface -supplied by the libxml2 library to manipulate XML files. - -This library allows to manipulate XML files. It includes support -to read, modify and write XML and HTML files. There is DTDs support -this includes parsing and validation even with complex DTDs, either -at parse time or later once the document has been modified. - -%if 0%{?with_python3} -%package -n python3-%{name} -Summary: Python 3 bindings for the libxml2 library -Group: Development/Libraries -Requires: libxml2 = %{version}-%{release} -Obsoletes: %{name}-python3 < %{version}-%{release} -Provides: %{name}-python3 = %{version}-%{release} - -%description -n python3-%{name} -The libxml2-python3 package contains a Python 3 module that permits -applications written in the Python programming language, version 3, to use the -interface supplied by the libxml2 library to manipulate XML files. - -This library allows to manipulate XML files. It includes support -to read, modify and write XML and HTML files. There is DTDs support -this includes parsing and validation even with complex DTDs, either -at parse time or later once the document has been modified. -%endif # with_python3 - -%prep -%setup -q - -mkdir py3doc -cp doc/*.py py3doc -sed -i 's|#!/usr/bin/env python|#!/usr/bin/env %{__python3}|' py3doc/*.py - -%build -%configure -make %{_smp_mflags} - -find doc -type f -exec chmod 0644 \{\} \; - -%install -rm -fr %{buildroot} - -make install DESTDIR=%{buildroot} - -%if 0%{?with_python3} -make clean -%configure --with-python=%{__python3} -make install DESTDIR=%{buildroot} -%endif # with_python3 - - -rm -f $RPM_BUILD_ROOT%{_libdir}/*.la -rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a -rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la -rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-%{version}/* -rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-python-%{version}/* -(cd doc/examples ; make clean ; rm -rf .deps Makefile) -gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz - -%check -#disabling python tests from rpm build as broken in Fedora 30 -make PYTHON_SUBDIR="" runtests - -%clean -rm -fr %{buildroot} - -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig - -%files -%defattr(-, root, root) - -%doc NEWS README.md Copyright TODO -%doc %{_mandir}/man1/xmllint.1* -%doc %{_mandir}/man1/xmlcatalog.1* - -%{_libdir}/lib*.so.* -%{_bindir}/xmllint -%{_bindir}/xmlcatalog - -%files devel -%defattr(-, root, root) - -%doc %{_mandir}/man1/xml2-config.1* -%doc NEWS README.md Copyright -%doc doc/*.html doc/html doc/*.gif doc/*.png -%doc doc/tutorial doc/libxml2-api.xml.gz -%doc doc/examples -%doc %dir %{_datadir}/gtk-doc/html/libxml2 -%doc %{_datadir}/gtk-doc/html/libxml2/*.devhelp -%doc %{_datadir}/gtk-doc/html/libxml2/*.html -%doc %{_datadir}/gtk-doc/html/libxml2/*.png -%doc %{_datadir}/gtk-doc/html/libxml2/*.css - -%{_libdir}/lib*.so -%{_libdir}/*.sh -%{_includedir}/* -%{_bindir}/xml2-config -%{_datadir}/aclocal/libxml.m4 -%{_libdir}/pkgconfig/libxml-2.0.pc -%{_libdir}/cmake/libxml2/libxml2-config.cmake - -%files static -%defattr(-, root, root) - -%{_libdir}/*a - -%files -n python-%{name} -%defattr(-, root, root) - -%{_libdir}/python2*/site-packages/libxml2.py* -%{_libdir}/python2*/site-packages/drv_libxml2.py* -%{_libdir}/python2*/site-packages/libxml2mod* -%doc python/TODO -%doc python/libxml2class.txt -%doc python/tests/*.py -%doc doc/*.py -%doc doc/python.html - -%if 0%{?with_python3} -%files -n python3-%{name} -%defattr(-, root, root) - -%{_libdir}/python3*/site-packages/libxml2.py* -%{_libdir}/python3*/site-packages/drv_libxml2.py* -%{_libdir}/python3*/site-packages/__pycache__/*py* -%{_libdir}/python3*/site-packages/libxml2mod* -%doc python/TODO -%doc python/libxml2class.txt -%doc py3doc/*.py -%doc doc/python.html -%endif # with_python3 - -%changelog -* @RELDATE@ Daniel Veillard <veillard@redhat.com> -- upstream release @VERSION@ -
diff --git a/third_party/libxml/src/libxml2.syms b/third_party/libxml/src/libxml2.syms index 878cd11..7794596e 100644 --- a/third_party/libxml/src/libxml2.syms +++ b/third_party/libxml/src/libxml2.syms
@@ -1,2300 +1,52 @@ # -# Officially exported symbols, for which header -# file definitions are installed in /usr/include/libxml2 +# Retained for backward compatibility. # -# Automatically generated from symbols.xml and syms.xsl -# -# Versions here are *fixed* to match the libxml2 version -# at which the symbol was introduced. This ensures that -# a new client app requiring symbol foo() can't accidentally -# run with old libxml2.so not providing foo() - the global -# soname version info can't enforce this since we never -# change the soname +# The original version script didn't account for configuration options. +# Since libxml2 never made use of symbol versioning, all symbols were +# removed in version 2.11.0. Only the version nodes are kept to avoid +# errors when running binaries linked against older versions. # -LIBXML2_2.4.30 { - global: - -# debugXML - xmlBoolToText; - xmlDebugDumpAttr; - xmlDebugDumpAttrList; - xmlDebugDumpDTD; - xmlDebugDumpDocument; - xmlDebugDumpDocumentHead; - xmlDebugDumpEntities; - xmlDebugDumpNode; - xmlDebugDumpNodeList; - xmlDebugDumpOneNode; - xmlDebugDumpString; - xmlLsCountNode; - xmlLsOneNode; - xmlShell; - xmlShellBase; - xmlShellCat; - xmlShellDir; - xmlShellDu; - xmlShellList; - xmlShellLoad; - xmlShellPrintNode; - xmlShellPrintXPathError; - xmlShellPrintXPathResult; - xmlShellPwd; - xmlShellSave; - xmlShellValidate; - xmlShellWrite; - -# xpointer - xmlXPtrBuildNodeList; - xmlXPtrEval; - xmlXPtrEvalRangePredicate; - xmlXPtrFreeLocationSet; - xmlXPtrLocationSetAdd; - xmlXPtrLocationSetCreate; - xmlXPtrLocationSetDel; - xmlXPtrLocationSetMerge; - xmlXPtrLocationSetRemove; - xmlXPtrNewCollapsedRange; - xmlXPtrNewContext; - xmlXPtrNewLocationSetNodeSet; - xmlXPtrNewLocationSetNodes; - xmlXPtrNewRange; - xmlXPtrNewRangeNodeObject; - xmlXPtrNewRangeNodePoint; - xmlXPtrNewRangeNodes; - xmlXPtrNewRangePointNode; - xmlXPtrNewRangePoints; - xmlXPtrRangeToFunction; - xmlXPtrWrapLocationSet; - -# SAX - attribute; - attributeDecl; - cdataBlock; - characters; - checkNamespace; - comment; - -# SAX2 -# docbDefaultSAXHandlerInit; removed in 2.10.0 - -# SAX - elementDecl; - endDocument; - endElement; - entityDecl; - externalSubset; - getColumnNumber; - getEntity; - getLineNumber; - getNamespace; - getParameterEntity; - getPublicId; - getSystemId; - globalNamespace; - hasExternalSubset; - hasInternalSubset; - -# SAX2 - htmlDefaultSAXHandlerInit; - -# SAX - ignorableWhitespace; -# initdocbDefaultSAXHandler; removed in 2.10.0 - inithtmlDefaultSAXHandler; - initxmlDefaultSAXHandler; - internalSubset; - isStandalone; - namespaceDecl; - notationDecl; - processingInstruction; - reference; - resolveEntity; - setDocumentLocator; - setNamespace; - startDocument; - startElement; - unparsedEntityDecl; - -# SAX2 - xmlDefaultSAXHandlerInit; - -# HTMLparser - htmlCreateFileParserCtxt; - htmlInitAutoClose; - -# parserInternals - inputPop; - inputPush; - namePop; - namePush; - nodePop; - nodePush; - xmlCheckLanguageID; - xmlCopyChar; - xmlCopyCharMultiByte; - xmlCreateEntityParserCtxt; - xmlCreateFileParserCtxt; - xmlCreateMemoryParserCtxt; - xmlCurrentChar; - xmlDecodeEntities; - xmlFreeInputStream; - xmlHandleEntity; - -# chvalid - xmlIsBaseChar; - xmlIsBlank; - xmlIsChar; - xmlIsCombining; - xmlIsDigit; - xmlIsExtender; - xmlIsIdeographic; - -# parserInternals - xmlIsLetter; - -# chvalid - xmlIsPubidChar; - -# parserInternals - xmlNamespaceParseNCName; - xmlNamespaceParseNSDef; - xmlNamespaceParseQName; - xmlNewEntityInputStream; - xmlNewInputFromFile; - xmlNewInputStream; - -# parser - xmlNewParserCtxt; - -# parserInternals - xmlNewStringInputStream; - xmlNextChar; - xmlParseAttValue; - xmlParseAttribute; - xmlParseAttributeListDecl; - xmlParseAttributeType; - xmlParseCDSect; - xmlParseCharData; - xmlParseCharRef; - xmlParseComment; - xmlParseContent; - xmlParseDefaultDecl; - xmlParseDocTypeDecl; - xmlParseElement; - xmlParseElementChildrenContentDecl; - xmlParseElementContentDecl; - xmlParseElementDecl; - xmlParseElementMixedContentDecl; - xmlParseEncName; - xmlParseEncodingDecl; - xmlParseEndTag; - xmlParseEntityDecl; - xmlParseEntityRef; - xmlParseEntityValue; - xmlParseEnumeratedType; - xmlParseEnumerationType; - xmlParseExternalID; - xmlParseExternalSubset; - xmlParseMarkupDecl; - xmlParseMisc; - xmlParseName; - xmlParseNamespace; - xmlParseNmtoken; - xmlParseNotationDecl; - xmlParseNotationType; - xmlParsePEReference; - xmlParsePI; - xmlParsePITarget; - xmlParsePubidLiteral; - xmlParseQuotedString; - xmlParseReference; - xmlParseSDDecl; - xmlParseStartTag; - xmlParseSystemLiteral; - xmlParseTextDecl; - xmlParseVersionInfo; - xmlParseVersionNum; - xmlParseXMLDecl; - xmlParserHandlePEReference; - xmlParserHandleReference; - xmlParserInputShrink; - xmlPopInput; - xmlPushInput; - xmlScanName; - xmlSetEntityReferenceFunc; - xmlSkipBlankChars; - xmlSplitQName; - xmlStringComment; # variable - xmlStringCurrentChar; - xmlStringDecodeEntities; - xmlStringText; # variable - xmlStringTextNoenc; # variable - xmlSwitchEncoding; - xmlSwitchToEncoding; - -# c14n - xmlC14NDocDumpMemory; - xmlC14NDocSave; - xmlC14NDocSaveTo; - xmlC14NExecute; - -# catalog - xmlACatalogAdd; - xmlACatalogDump; - xmlACatalogRemove; - xmlACatalogResolve; - xmlACatalogResolvePublic; - xmlACatalogResolveSystem; - xmlACatalogResolveURI; - xmlCatalogAdd; - xmlCatalogAddLocal; - xmlCatalogCleanup; - xmlCatalogConvert; - xmlCatalogDump; - xmlCatalogFreeLocal; - xmlCatalogGetDefaults; - xmlCatalogGetPublic; - xmlCatalogGetSystem; - xmlCatalogIsEmpty; - xmlCatalogLocalResolve; - xmlCatalogLocalResolveURI; - xmlCatalogRemove; - xmlCatalogResolve; - xmlCatalogResolvePublic; - xmlCatalogResolveSystem; - xmlCatalogResolveURI; - xmlCatalogSetDebug; - xmlCatalogSetDefaultPrefer; - xmlCatalogSetDefaults; - xmlConvertSGMLCatalog; - xmlFreeCatalog; - xmlInitializeCatalog; - xmlLoadACatalog; - xmlLoadCatalog; - xmlLoadCatalogs; - xmlLoadSGMLSuperCatalog; - xmlNewCatalog; - xmlParseCatalogFile; - -# xpathInternals - valuePop; - valuePush; - xmlXPathAddValues; - xmlXPathBooleanFunction; - xmlXPathCeilingFunction; - xmlXPathCompareValues; - xmlXPathConcatFunction; - xmlXPathContainsFunction; - xmlXPathCountFunction; - xmlXPathDebugDumpCompExpr; - xmlXPathDebugDumpObject; - xmlXPathDifference; - xmlXPathDistinct; - xmlXPathDistinctSorted; - xmlXPathDivValues; - xmlXPathEqualValues; - xmlXPathEvalExpr; - xmlXPathEvaluatePredicateResult; - xmlXPathFalseFunction; - xmlXPathFloorFunction; - xmlXPathFreeParserContext; - xmlXPathFunctionLookup; - xmlXPathFunctionLookupNS; - xmlXPathHasSameNodes; - xmlXPathIdFunction; - xmlXPathIntersection; - xmlXPathIsNodeType; - xmlXPathLangFunction; - xmlXPathLastFunction; - xmlXPathLeading; - xmlXPathLeadingSorted; - xmlXPathLocalNameFunction; - xmlXPathModValues; - xmlXPathMultValues; - xmlXPathNamespaceURIFunction; - xmlXPathNewBoolean; - xmlXPathNewCString; - xmlXPathNewFloat; - xmlXPathNewNodeSet; - xmlXPathNewNodeSetList; - xmlXPathNewParserContext; - xmlXPathNewString; - xmlXPathNewValueTree; - xmlXPathNextAncestor; - xmlXPathNextAncestorOrSelf; - xmlXPathNextAttribute; - xmlXPathNextChild; - xmlXPathNextDescendant; - xmlXPathNextDescendantOrSelf; - xmlXPathNextFollowing; - xmlXPathNextFollowingSibling; - xmlXPathNextNamespace; - xmlXPathNextParent; - xmlXPathNextPreceding; - xmlXPathNextPrecedingSibling; - xmlXPathNextSelf; - xmlXPathNodeLeading; - xmlXPathNodeLeadingSorted; - xmlXPathNodeSetAdd; - xmlXPathNodeSetAddNs; - xmlXPathNodeSetAddUnique; - xmlXPathNodeSetContains; - xmlXPathNodeSetDel; - xmlXPathNodeSetFreeNs; - xmlXPathNodeSetMerge; - xmlXPathNodeSetRemove; - xmlXPathNodeSetSort; - xmlXPathNodeTrailing; - xmlXPathNodeTrailingSorted; - xmlXPathNormalizeFunction; - xmlXPathNotEqualValues; - xmlXPathNotFunction; - xmlXPathNsLookup; - xmlXPathNumberFunction; - xmlXPathParseNCName; - xmlXPathParseName; - xmlXPathPopBoolean; - xmlXPathPopExternal; - xmlXPathPopNodeSet; - xmlXPathPopNumber; - xmlXPathPopString; - xmlXPathPositionFunction; - xmlXPathRegisterAllFunctions; - xmlXPathRegisterFunc; - xmlXPathRegisterFuncLookup; - xmlXPathRegisterFuncNS; - xmlXPathRegisterNs; - xmlXPathRegisterVariable; - xmlXPathRegisterVariableLookup; - xmlXPathRegisterVariableNS; - xmlXPathRegisteredFuncsCleanup; - xmlXPathRegisteredNsCleanup; - xmlXPathRegisteredVariablesCleanup; - xmlXPathRoot; - xmlXPathRoundFunction; - xmlXPathStartsWithFunction; - xmlXPathStringEvalNumber; - xmlXPathStringFunction; - xmlXPathStringLengthFunction; - xmlXPathSubValues; - xmlXPathSubstringAfterFunction; - xmlXPathSubstringBeforeFunction; - xmlXPathSubstringFunction; - xmlXPathSumFunction; - xmlXPathTrailing; - xmlXPathTrailingSorted; - xmlXPathTranslateFunction; - xmlXPathTrueFunction; - xmlXPathValueFlipSign; - xmlXPathVariableLookup; - xmlXPathVariableLookupNS; - xmlXPathWrapCString; - xmlXPathWrapExternal; - xmlXPathWrapNodeSet; - xmlXPathWrapString; - xmlXPatherror; - -# xmlautomata - xmlAutomataCompile; - xmlAutomataGetInitState; - xmlAutomataIsDeterminist; - xmlAutomataNewAllTrans; - xmlAutomataNewCountTrans; - xmlAutomataNewCountedTrans; - xmlAutomataNewCounter; - xmlAutomataNewCounterTrans; - xmlAutomataNewEpsilon; - xmlAutomataNewOnceTrans; - xmlAutomataNewState; - xmlAutomataNewTransition; - xmlAutomataSetFinalState; - xmlFreeAutomata; - xmlNewAutomata; - -# HTMLtree - htmlDocContentDumpFormatOutput; - htmlDocContentDumpOutput; - htmlDocDump; - htmlDocDumpMemory; - htmlGetMetaEncoding; - htmlIsBooleanAttr; - htmlNewDoc; - htmlNewDocNoDtD; - htmlNodeDump; - htmlNodeDumpFile; - htmlNodeDumpFileFormat; - htmlNodeDumpFormatOutput; - htmlNodeDumpOutput; - htmlSaveFile; - htmlSaveFileEnc; - htmlSaveFileFormat; - htmlSetMetaEncoding; - -# nanoftp - xmlNanoFTPCheckResponse; - xmlNanoFTPCleanup; - xmlNanoFTPClose; - xmlNanoFTPCloseConnection; - xmlNanoFTPConnect; - xmlNanoFTPConnectTo; - xmlNanoFTPCwd; - xmlNanoFTPFreeCtxt; - xmlNanoFTPGet; - xmlNanoFTPGetConnection; - xmlNanoFTPGetResponse; - xmlNanoFTPGetSocket; - xmlNanoFTPInit; - xmlNanoFTPList; - xmlNanoFTPNewCtxt; - xmlNanoFTPOpen; - xmlNanoFTPProxy; - xmlNanoFTPQuit; - xmlNanoFTPRead; - xmlNanoFTPScanProxy; - xmlNanoFTPUpdateURL; - -# DOCBparser -# docbCreateFileParserCtxt; removed in 2.10.0 -# docbCreatePushParserCtxt; removed in 2.10.0 -# docbEncodeEntities; removed in 2.10.0 -# docbFreeParserCtxt; removed in 2.10.0 -# docbParseChunk; removed in 2.10.0 -# docbParseDoc; removed in 2.10.0 -# docbParseDocument; removed in 2.10.0 -# docbParseFile; removed in 2.10.0 -# docbSAXParseDoc; removed in 2.10.0 -# docbSAXParseFile; removed in 2.10.0 - -# xpath - xmlXPathCastBooleanToNumber; - xmlXPathCastBooleanToString; - xmlXPathCastNodeSetToBoolean; - xmlXPathCastNodeSetToNumber; - xmlXPathCastNodeSetToString; - xmlXPathCastNodeToNumber; - xmlXPathCastNodeToString; - xmlXPathCastNumberToBoolean; - xmlXPathCastNumberToString; - xmlXPathCastStringToBoolean; - xmlXPathCastStringToNumber; - xmlXPathCastToBoolean; - xmlXPathCastToNumber; - xmlXPathCastToString; - xmlXPathCmpNodes; - xmlXPathCompile; - xmlXPathCompiledEval; - xmlXPathConvertBoolean; - xmlXPathConvertNumber; - xmlXPathConvertString; - xmlXPathEval; - xmlXPathEvalExpression; - xmlXPathEvalPredicate; - xmlXPathFreeCompExpr; - xmlXPathFreeContext; - xmlXPathFreeNodeSet; - xmlXPathFreeNodeSetList; - xmlXPathFreeObject; - xmlXPathInit; - xmlXPathIsInf; - xmlXPathIsNaN; - xmlXPathNAN; # variable - xmlXPathNINF; # variable - xmlXPathNewContext; - xmlXPathNodeSetCreate; - xmlXPathObjectCopy; - xmlXPathPINF; # variable - -# xlink - xlinkGetDefaultDetect; - xlinkGetDefaultHandler; - xlinkIsLink; - xlinkSetDefaultDetect; - xlinkSetDefaultHandler; - -# entities - xmlAddDocEntity; - xmlAddDtdEntity; - xmlCleanupPredefinedEntities; - xmlCopyEntitiesTable; - xmlCreateEntitiesTable; - xmlDumpEntitiesTable; - xmlDumpEntityDecl; - xmlEncodeEntities; - xmlEncodeEntitiesReentrant; - xmlEncodeSpecialChars; - xmlFreeEntitiesTable; - xmlGetDocEntity; - xmlGetDtdEntity; - xmlGetParameterEntity; - xmlGetPredefinedEntity; - xmlInitializePredefinedEntities; - -# xinclude - xmlXIncludeProcess; - -# list - xmlLinkGetData; - xmlListAppend; - xmlListClear; - xmlListCopy; - xmlListCreate; - xmlListDelete; - xmlListDup; - xmlListEmpty; - xmlListEnd; - xmlListFront; - xmlListInsert; - xmlListMerge; - xmlListPopBack; - xmlListPopFront; - xmlListPushBack; - xmlListPushFront; - xmlListRemoveAll; - xmlListRemoveFirst; - xmlListRemoveLast; - xmlListReverse; - xmlListReverseSearch; - xmlListReverseWalk; - xmlListSearch; - xmlListSize; - xmlListSort; - xmlListWalk; - -# xmlmemory - xmlInitMemory; - xmlMallocLoc; - xmlMemDisplay; - xmlMemFree; - xmlMemGet; - xmlMemMalloc; - xmlMemRealloc; - xmlMemSetup; - xmlMemShow; - xmlMemStrdupLoc; - xmlMemUsed; - xmlMemoryDump; - xmlMemoryStrdup; - xmlReallocLoc; - -# xmlIO - xmlAllocOutputBuffer; - xmlAllocParserInputBuffer; - xmlCheckFilename; - xmlCleanupInputCallbacks; - xmlCleanupOutputCallbacks; - xmlFileClose; - xmlFileMatch; - xmlFileOpen; - xmlFileRead; - xmlFreeParserInputBuffer; - xmlIOFTPClose; - xmlIOFTPMatch; - xmlIOFTPOpen; - xmlIOFTPRead; - xmlIOHTTPClose; - xmlIOHTTPMatch; - xmlIOHTTPOpen; - xmlIOHTTPOpenW; - xmlIOHTTPRead; - xmlNoNetExternalEntityLoader; - xmlNormalizeWindowsPath; - xmlOutputBufferClose; - xmlOutputBufferCreateFd; - xmlOutputBufferCreateFile; - xmlOutputBufferCreateFilename; - xmlOutputBufferCreateIO; - xmlOutputBufferFlush; - xmlOutputBufferWrite; - xmlOutputBufferWriteString; - xmlParserGetDirectory; - xmlParserInputBufferCreateFd; - xmlParserInputBufferCreateFile; - xmlParserInputBufferCreateFilename; - xmlParserInputBufferCreateIO; - xmlParserInputBufferCreateMem; - xmlParserInputBufferGrow; - xmlParserInputBufferPush; - xmlParserInputBufferRead; - xmlRegisterDefaultInputCallbacks; - xmlRegisterDefaultOutputCallbacks; - xmlRegisterHTTPPostCallbacks; - xmlRegisterInputCallbacks; - xmlRegisterOutputCallbacks; - -# xmlversion - xmlCheckVersion; - -# valid - xmlAddAttributeDecl; - xmlAddElementDecl; - xmlAddID; - xmlAddNotationDecl; - xmlAddRef; - xmlCopyAttributeTable; - xmlCopyElementContent; - xmlCopyElementTable; - xmlCopyEnumeration; - xmlCopyNotationTable; - xmlCreateEnumeration; - xmlDumpAttributeDecl; - xmlDumpAttributeTable; - xmlDumpElementDecl; - xmlDumpElementTable; - xmlDumpNotationDecl; - xmlDumpNotationTable; - xmlFreeAttributeTable; - xmlFreeElementContent; - xmlFreeElementTable; - xmlFreeEnumeration; - xmlFreeIDTable; - xmlFreeNotationTable; - xmlFreeRefTable; - xmlGetDtdAttrDesc; - xmlGetDtdElementDesc; - xmlGetDtdNotationDesc; - xmlGetDtdQAttrDesc; - xmlGetDtdQElementDesc; - xmlGetID; - xmlGetRefs; - xmlIsID; - xmlIsMixedElement; - xmlIsRef; - xmlNewElementContent; - xmlRemoveID; - xmlRemoveRef; - xmlSnprintfElementContent; - -# tree - xmlSplitQName2; - -# valid - xmlSprintfElementContent; - xmlValidBuildContentModel; - xmlValidCtxtNormalizeAttributeValue; - xmlValidGetPotentialChildren; - xmlValidGetValidElements; - xmlValidNormalizeAttributeValue; - xmlValidateAttributeDecl; - xmlValidateAttributeValue; - xmlValidateDocument; - xmlValidateDocumentFinal; - xmlValidateDtd; - xmlValidateDtdFinal; - xmlValidateElement; - xmlValidateElementDecl; - xmlValidateNameValue; - xmlValidateNamesValue; - xmlValidateNmtokenValue; - xmlValidateNmtokensValue; - xmlValidateNotationDecl; - xmlValidateNotationUse; - xmlValidateOneAttribute; - xmlValidateOneElement; - xmlValidateOneNamespace; - xmlValidateRoot; - -# HTMLparser - UTF8ToHtml; - htmlAutoCloseTag; - htmlCreatePushParserCtxt; - htmlEncodeEntities; - htmlEntityLookup; - htmlEntityValueLookup; - htmlFreeParserCtxt; - htmlHandleOmittedElem; - htmlIsAutoClosed; - htmlIsScriptAttribute; - htmlParseCharRef; - htmlParseChunk; - htmlParseDoc; - htmlParseDocument; - htmlParseElement; - htmlParseEntityRef; - htmlParseFile; - htmlSAXParseDoc; - htmlSAXParseFile; - htmlTagLookup; - -# xmlstring - xmlCharStrdup; - xmlCharStrndup; - -# parser - xmlCleanupParser; - xmlClearNodeInfoSeq; - xmlClearParserCtxt; - xmlCreateDocParserCtxt; - xmlCreateIOParserCtxt; - xmlCreatePushParserCtxt; - xmlFreeParserCtxt; - xmlGetExternalEntityLoader; - xmlGetFeature; - xmlGetFeaturesList; - -# globals - xmlGetWarningsDefaultValue; # variable - -# parser - xmlIOParseDTD; - xmlInitNodeInfoSeq; - xmlInitParser; - xmlInitParserCtxt; - xmlKeepBlanksDefault; - xmlLineNumbersDefault; - xmlLoadExternalEntity; - xmlNewIOInputStream; - xmlParseBalancedChunkMemory; - xmlParseBalancedChunkMemoryRecover; - xmlParseChunk; - xmlParseCtxtExternalEntity; - xmlParseDTD; - xmlParseDoc; - xmlParseDocument; - xmlParseEntity; - xmlParseExtParsedEnt; - xmlParseExternalEntity; - xmlParseFile; - xmlParseMemory; - xmlParserAddNodeInfo; - xmlParserFindNodeInfo; - xmlParserFindNodeInfoIndex; - xmlParserInputGrow; - xmlParserInputRead; - xmlPedanticParserDefault; - xmlRecoverDoc; - xmlRecoverFile; - xmlRecoverMemory; - xmlSAXParseDTD; - xmlSAXParseDoc; - xmlSAXParseEntity; - xmlSAXParseFile; - xmlSAXParseFileWithData; - xmlSAXParseMemory; - xmlSAXParseMemoryWithData; - xmlSAXUserParseFile; - xmlSAXUserParseMemory; - xmlSetExternalEntityLoader; - xmlSetFeature; - xmlSetupParserForBuffer; - xmlStopParser; - -# xmlstring - xmlStrEqual; - xmlStrcasecmp; - xmlStrcasestr; - xmlStrcat; - xmlStrchr; - xmlStrcmp; - xmlStrdup; - xmlStrlen; - xmlStrncasecmp; - xmlStrncat; - xmlStrncmp; - xmlStrndup; - xmlStrstr; - xmlStrsub; - -# parser - xmlSubstituteEntitiesDefault; - -# xmlreader - xmlFreeTextReader; - xmlNewTextReader; - xmlNewTextReaderFilename; - xmlTextReaderAttributeCount; - xmlTextReaderBaseUri; - xmlTextReaderDepth; - xmlTextReaderHasAttributes; - xmlTextReaderHasValue; - xmlTextReaderIsDefault; - xmlTextReaderIsEmptyElement; - xmlTextReaderLocalName; - xmlTextReaderName; - xmlTextReaderNamespaceUri; - xmlTextReaderNodeType; - xmlTextReaderPrefix; - xmlTextReaderQuoteChar; - xmlTextReaderRead; - xmlTextReaderValue; - xmlTextReaderXmlLang; - -# globals -# docbDefaultSAXHandler; removed in 2.10.0 - htmlDefaultSAXHandler; # variable - xmlDefaultSAXHandler; # variable - xmlDefaultSAXLocator; # variable - xmlDoValidityCheckingDefaultValue; # variable - xmlFree; # variable - xmlGenericError; # variable - xmlGenericErrorContext; # variable - xmlInitializeGlobalState; - xmlKeepBlanksDefaultValue; # variable - xmlLineNumbersDefaultValue; # variable - xmlLoadExtDtdDefaultValue; # variable - xmlMalloc; # variable - xmlMemStrdup; # variable - xmlParserDebugEntities; # variable - xmlParserVersion; # variable - xmlPedanticParserDefaultValue; # variable - xmlRealloc; # variable - xmlSaveNoEmptyTags; # variable - xmlSubstituteEntitiesDefaultValue; # variable - xmlTreeIndentString; # variable - -# threads - xmlCleanupThreads; - xmlFreeMutex; - xmlFreeRMutex; - xmlGetGlobalState; - xmlGetThreadId; - xmlInitThreads; - xmlIsMainThread; - xmlLockLibrary; - xmlMutexLock; - xmlMutexUnlock; - xmlNewMutex; - xmlNewRMutex; - xmlRMutexLock; - xmlRMutexUnlock; - xmlUnlockLibrary; - -# hash - xmlHashAddEntry; - xmlHashAddEntry2; - xmlHashAddEntry3; - xmlHashCopy; - xmlHashCreate; - xmlHashFree; - xmlHashLookup; - xmlHashLookup2; - xmlHashLookup3; - xmlHashRemoveEntry; - xmlHashRemoveEntry2; - xmlHashRemoveEntry3; - xmlHashScan; - xmlHashScan3; - xmlHashScanFull; - xmlHashScanFull3; - xmlHashSize; - xmlHashUpdateEntry; - xmlHashUpdateEntry2; - xmlHashUpdateEntry3; - -# xmlerror - initGenericErrorDefaultFunc; - xmlParserError; - xmlParserPrintFileContext; - xmlParserPrintFileInfo; - xmlParserValidityError; - xmlParserValidityWarning; - xmlParserWarning; - xmlSetGenericErrorFunc; - -# globals - oldXMLWDcompatibility; # variable - -# tree - xmlAddChild; - xmlAddChildList; - xmlAddNextSibling; - xmlAddPrevSibling; - xmlAddSibling; - xmlBufferAdd; - xmlBufferAddHead; - -# globals - xmlBufferAllocScheme; # variable - -# tree - xmlBufferCCat; - xmlBufferCat; - xmlBufferContent; - xmlBufferCreate; - xmlBufferCreateSize; - xmlBufferDump; - xmlBufferEmpty; - xmlBufferFree; - xmlBufferGrow; - xmlBufferLength; - xmlBufferResize; - xmlBufferSetAllocationScheme; - xmlBufferShrink; - xmlBufferWriteCHAR; - xmlBufferWriteChar; - xmlBufferWriteQuotedString; - xmlCopyDoc; - xmlCopyDtd; - xmlCopyNamespace; - xmlCopyNamespaceList; - xmlCopyNode; - xmlCopyNodeList; - xmlCopyProp; - xmlCopyPropList; - xmlCreateIntSubset; - -# globals - xmlDefaultBufferSize; # variable - -# tree - xmlDocCopyNode; - xmlDocDump; - xmlDocDumpFormatMemory; - xmlDocDumpFormatMemoryEnc; - xmlDocDumpMemory; - xmlDocDumpMemoryEnc; - xmlDocFormatDump; - xmlDocGetRootElement; - xmlDocSetRootElement; - xmlElemDump; - xmlFreeDoc; - xmlFreeDtd; - xmlFreeNode; - xmlFreeNodeList; - xmlFreeNs; - xmlFreeNsList; - xmlFreeProp; - xmlFreePropList; - xmlGetBufferAllocationScheme; - xmlGetCompressMode; - xmlGetDocCompressMode; - xmlGetIntSubset; - xmlGetLastChild; - xmlGetLineNo; - xmlGetNodePath; - xmlGetNsList; - xmlGetNsProp; - xmlGetProp; - xmlHasNsProp; - xmlHasProp; - -# globals - xmlIndentTreeOutput; # variable - -# tree - xmlIsBlankNode; - xmlIsXHTML; - xmlNewCDataBlock; - xmlNewCharRef; - xmlNewChild; - xmlNewComment; - xmlNewDoc; - xmlNewDocComment; - xmlNewDocFragment; - xmlNewDocNode; - xmlNewDocNodeEatName; - xmlNewDocProp; - xmlNewDocRawNode; - xmlNewDocText; - xmlNewDocTextLen; - xmlNewDtd; - xmlNewGlobalNs; - xmlNewNode; - xmlNewNodeEatName; - xmlNewNs; - xmlNewNsProp; - xmlNewNsPropEatName; - xmlNewPI; - xmlNewProp; - xmlNewReference; - xmlNewText; - xmlNewTextChild; - xmlNewTextLen; - xmlNodeAddContent; - xmlNodeAddContentLen; - xmlNodeDump; - xmlNodeDumpOutput; - xmlNodeGetBase; - xmlNodeGetContent; - xmlNodeGetLang; - xmlNodeGetSpacePreserve; - xmlNodeIsText; - xmlNodeListGetRawString; - xmlNodeListGetString; - xmlNodeSetBase; - xmlNodeSetContent; - xmlNodeSetContentLen; - xmlNodeSetLang; - xmlNodeSetName; - xmlNodeSetSpacePreserve; - xmlReconciliateNs; - xmlRemoveProp; - xmlReplaceNode; - xmlSaveFile; - xmlSaveFileEnc; - xmlSaveFileTo; - xmlSaveFormatFile; - xmlSaveFormatFileEnc; - xmlSaveFormatFileTo; - xmlSearchNs; - xmlSearchNsByHref; - xmlSetBufferAllocationScheme; - xmlSetCompressMode; - xmlSetDocCompressMode; - xmlSetListDoc; - xmlSetNs; - xmlSetNsProp; - xmlSetProp; - xmlSetTreeDoc; - xmlStringGetNodeList; - xmlStringLenGetNodeList; - xmlTextConcat; - xmlTextMerge; - xmlUnlinkNode; - xmlUnsetNsProp; - xmlUnsetProp; - -# xmlregexp - xmlRegExecPushString; - xmlRegFreeExecCtxt; - xmlRegFreeRegexp; - xmlRegNewExecCtxt; - xmlRegexpCompile; - xmlRegexpExec; - xmlRegexpIsDeterminist; - xmlRegexpPrint; - -# nanohttp - xmlNanoHTTPAuthHeader; - xmlNanoHTTPCleanup; - xmlNanoHTTPClose; - xmlNanoHTTPFetch; - xmlNanoHTTPInit; - xmlNanoHTTPMethod; - xmlNanoHTTPMethodRedir; - xmlNanoHTTPOpen; - xmlNanoHTTPOpenRedir; - xmlNanoHTTPRead; - xmlNanoHTTPReturnCode; - xmlNanoHTTPSave; - xmlNanoHTTPScanProxy; - -# xmlunicode - xmlUCSIsAlphabeticPresentationForms; - xmlUCSIsArabic; - xmlUCSIsArabicPresentationFormsA; - xmlUCSIsArabicPresentationFormsB; - xmlUCSIsArmenian; - xmlUCSIsArrows; - xmlUCSIsBasicLatin; - xmlUCSIsBengali; - xmlUCSIsBlock; - xmlUCSIsBlockElements; - xmlUCSIsBopomofo; - xmlUCSIsBopomofoExtended; - xmlUCSIsBoxDrawing; - xmlUCSIsBraillePatterns; - xmlUCSIsByzantineMusicalSymbols; - xmlUCSIsCJKCompatibility; - xmlUCSIsCJKCompatibilityForms; - xmlUCSIsCJKCompatibilityIdeographs; - xmlUCSIsCJKCompatibilityIdeographsSupplement; - xmlUCSIsCJKRadicalsSupplement; - xmlUCSIsCJKSymbolsandPunctuation; - xmlUCSIsCJKUnifiedIdeographs; - xmlUCSIsCJKUnifiedIdeographsExtensionA; - xmlUCSIsCJKUnifiedIdeographsExtensionB; - xmlUCSIsCat; - xmlUCSIsCatC; - xmlUCSIsCatCc; - xmlUCSIsCatCf; - xmlUCSIsCatCo; - xmlUCSIsCatCs; - xmlUCSIsCatL; - xmlUCSIsCatLl; - xmlUCSIsCatLm; - xmlUCSIsCatLo; - xmlUCSIsCatLt; - xmlUCSIsCatLu; - xmlUCSIsCatM; - xmlUCSIsCatMc; - xmlUCSIsCatMe; - xmlUCSIsCatMn; - xmlUCSIsCatN; - xmlUCSIsCatNd; - xmlUCSIsCatNl; - xmlUCSIsCatNo; - xmlUCSIsCatP; - xmlUCSIsCatPc; - xmlUCSIsCatPd; - xmlUCSIsCatPe; - xmlUCSIsCatPf; - xmlUCSIsCatPi; - xmlUCSIsCatPo; - xmlUCSIsCatPs; - xmlUCSIsCatS; - xmlUCSIsCatSc; - xmlUCSIsCatSk; - xmlUCSIsCatSm; - xmlUCSIsCatSo; - xmlUCSIsCatZ; - xmlUCSIsCatZl; - xmlUCSIsCatZp; - xmlUCSIsCatZs; - xmlUCSIsCherokee; - xmlUCSIsCombiningDiacriticalMarks; - xmlUCSIsCombiningHalfMarks; - xmlUCSIsCombiningMarksforSymbols; - xmlUCSIsControlPictures; - xmlUCSIsCurrencySymbols; - xmlUCSIsCyrillic; - xmlUCSIsDeseret; - xmlUCSIsDevanagari; - xmlUCSIsDingbats; - xmlUCSIsEnclosedAlphanumerics; - xmlUCSIsEnclosedCJKLettersandMonths; - xmlUCSIsEthiopic; - xmlUCSIsGeneralPunctuation; - xmlUCSIsGeometricShapes; - xmlUCSIsGeorgian; - xmlUCSIsGothic; - xmlUCSIsGreek; - xmlUCSIsGreekExtended; - xmlUCSIsGujarati; - xmlUCSIsGurmukhi; - xmlUCSIsHalfwidthandFullwidthForms; - xmlUCSIsHangulCompatibilityJamo; - xmlUCSIsHangulJamo; - xmlUCSIsHangulSyllables; - xmlUCSIsHebrew; - xmlUCSIsHighPrivateUseSurrogates; - xmlUCSIsHighSurrogates; - xmlUCSIsHiragana; - xmlUCSIsIPAExtensions; - xmlUCSIsIdeographicDescriptionCharacters; - xmlUCSIsKanbun; - xmlUCSIsKangxiRadicals; - xmlUCSIsKannada; - xmlUCSIsKatakana; - xmlUCSIsKhmer; - xmlUCSIsLao; - xmlUCSIsLatin1Supplement; - xmlUCSIsLatinExtendedA; - xmlUCSIsLatinExtendedAdditional; - xmlUCSIsLatinExtendedB; - xmlUCSIsLetterlikeSymbols; - xmlUCSIsLowSurrogates; - xmlUCSIsMalayalam; - xmlUCSIsMathematicalAlphanumericSymbols; - xmlUCSIsMathematicalOperators; - xmlUCSIsMiscellaneousSymbols; - xmlUCSIsMiscellaneousTechnical; - xmlUCSIsMongolian; - xmlUCSIsMusicalSymbols; - xmlUCSIsMyanmar; - xmlUCSIsNumberForms; - xmlUCSIsOgham; - xmlUCSIsOldItalic; - xmlUCSIsOpticalCharacterRecognition; - xmlUCSIsOriya; - xmlUCSIsPrivateUse; - xmlUCSIsRunic; - xmlUCSIsSinhala; - xmlUCSIsSmallFormVariants; - xmlUCSIsSpacingModifierLetters; - xmlUCSIsSpecials; - xmlUCSIsSuperscriptsandSubscripts; - xmlUCSIsSyriac; - xmlUCSIsTags; - xmlUCSIsTamil; - xmlUCSIsTelugu; - xmlUCSIsThaana; - xmlUCSIsThai; - xmlUCSIsTibetan; - xmlUCSIsUnifiedCanadianAboriginalSyllabics; - xmlUCSIsYiRadicals; - xmlUCSIsYiSyllables; - -# uri - xmlBuildURI; - xmlCreateURI; - xmlFreeURI; - xmlNormalizeURIPath; - xmlParseURI; - xmlParseURIReference; - xmlPrintURI; - xmlSaveUri; - xmlURIEscape; - xmlURIEscapeStr; - xmlURIUnescapeString; - -# encoding - UTF8Toisolat1; - isolat1ToUTF8; - xmlAddEncodingAlias; - xmlCharEncCloseFunc; - xmlCharEncFirstLine; - xmlCharEncInFunc; - xmlCharEncOutFunc; - -# xmlstring - xmlCheckUTF8; - -# encoding - xmlCleanupCharEncodingHandlers; - xmlCleanupEncodingAliases; - xmlDelEncodingAlias; - xmlDetectCharEncoding; - xmlFindCharEncodingHandler; - xmlGetCharEncodingHandler; - xmlGetCharEncodingName; - xmlGetEncodingAlias; - -# xmlstring - xmlGetUTF8Char; - -# encoding - xmlInitCharEncodingHandlers; - xmlNewCharEncodingHandler; - xmlParseCharEncoding; - xmlRegisterCharEncodingHandler; - -# xmlstring - xmlUTF8Strlen; - xmlUTF8Strloc; - xmlUTF8Strndup; - xmlUTF8Strpos; - xmlUTF8Strsize; - xmlUTF8Strsub; -} ; - -LIBXML2_2.5.0 { - global: - -# globals - xmlDeregisterNodeDefault; - xmlDeregisterNodeDefaultValue; # variable - xmlRegisterNodeDefault; - xmlRegisterNodeDefaultValue; # variable - -# xmlreader - xmlTextReaderClose; - xmlTextReaderCurrentDoc; - xmlTextReaderCurrentNode; - xmlTextReaderGetAttributeNo; - xmlTextReaderGetAttributeNs; - xmlTextReaderGetAttribute; - xmlTextReaderGetParserProp; - xmlTextReaderGetRemainder; - xmlTextReaderLookupNamespace; - xmlTextReaderMoveToAttributeNo; - xmlTextReaderMoveToAttributeNs; - xmlTextReaderMoveToAttribute; - xmlTextReaderMoveToElement; - xmlTextReaderMoveToFirstAttribute; - xmlTextReaderMoveToNextAttribute; - xmlTextReaderNormalization; - xmlTextReaderReadAttributeValue; - xmlTextReaderReadInnerXml; - xmlTextReaderReadOuterXml; - xmlTextReaderReadState; - xmlTextReaderReadString; - xmlTextReaderSetParserProp; - -# valid - xmlValidatePopElement; - xmlValidatePushCData; - xmlValidatePushElement; -} LIBXML2_2.4.30; - -LIBXML2_2.5.2 { - global: - -# tree - xmlGetNoNsProp; - -# HTMLparser - htmlAttrAllowed; - htmlElementAllowedHere; - htmlElementStatusHere; - htmlNodeStatus; - -# relaxng - xmlRelaxNGCleanupTypes; - xmlRelaxNGDump; - xmlRelaxNGFreeParserCtxt; - xmlRelaxNGFree; - xmlRelaxNGFreeValidCtxt; - xmlRelaxNGNewMemParserCtxt; - xmlRelaxNGNewParserCtxt; - xmlRelaxNGNewValidCtxt; - xmlRelaxNGParse; - xmlRelaxNGSetParserErrors; - xmlRelaxNGSetValidErrors; - xmlRelaxNGValidateDoc; - -# xmlreader - xmlTextReaderGetErrorHandler; - xmlTextReaderLocatorBaseURI; - xmlTextReaderLocatorLineNumber; - xmlTextReaderSetErrorHandler; - -# relaxng -# xmlRelaxNGValidateStream; removed in 2.5.5 -} LIBXML2_2.5.0; - -LIBXML2_2.5.4 { - global: - -# uri - xmlCanonicPath; - -# relaxng - xmlRelaxNGDumpTree; - -# tree - xmlValidateName; - xmlValidateNCName; - xmlValidateNMToken; - xmlValidateQName; -} LIBXML2_2.5.2; - -LIBXML2_2.5.5 { - global: - -# nanoftp - xmlNanoFTPDele; -} LIBXML2_2.5.4; - -LIBXML2_2.5.6 { - global: - -# xpath - xmlXPathOrderDocElems; -} LIBXML2_2.5.5; - -LIBXML2_2.5.7 { - global: - -# HTMLparser - htmlCreateMemoryParserCtxt; - -# xmlautomata - xmlAutomataNewTransition2; - -# tree - xmlBuildQName; - -# xmlmemory - xmlGcMemGet; - xmlGcMemSetup; - -# globals - xmlMallocAtomic; # variable - -# xmlregexp - xmlRegExecPushString2; - -# relaxng - xmlRelaxNGNewDocParserCtxt; - xmlRelaxNGValidateFullElement; - xmlRelaxNGValidatePopElement; - xmlRelaxNGValidatePushCData; - xmlRelaxNGValidatePushElement; - -# xmlreader - xmlTextReaderExpand; - xmlTextReaderIsValid; - xmlTextReaderNext; - xmlTextReaderRelaxNGSetSchema; - xmlTextReaderRelaxNGValidate; -} LIBXML2_2.5.6; - -LIBXML2_2.5.8 { - global: - -# globals - xmlCleanupGlobals; - xmlInitGlobals; - -# valid - xmlFreeValidCtxt; - xmlNewValidCtxt; - -# schemasInternals - xmlSchemaFreeType; - -# xmlschemas - xmlSchemaDump; - xmlSchemaFreeParserCtxt; - xmlSchemaFreeValidCtxt; - xmlSchemaFree; - xmlSchemaNewMemParserCtxt; - xmlSchemaNewParserCtxt; - xmlSchemaNewValidCtxt; - xmlSchemaParse; - xmlSchemaSetParserErrors; - xmlSchemaSetValidErrors; - xmlSchemaValidateDoc; - xmlSchemaValidateStream; - -# xmlschemastypes - xmlSchemaCheckFacet; - xmlSchemaCleanupTypes; - xmlSchemaCompareValues; - xmlSchemaFreeFacet; - xmlSchemaFreeValue; - xmlSchemaGetPredefinedType; - xmlSchemaInitTypes; - xmlSchemaNewFacet; - xmlSchemaValidateFacet; - xmlSchemaValidatePredefinedType; - xmlSchemaValPredefTypeNode; - -# globals - xmlThrDefBufferAllocScheme; - xmlThrDefDefaultBufferSize; - xmlThrDefDeregisterNodeDefault; - xmlThrDefDoValidityCheckingDefaultValue; - xmlThrDefGetWarningsDefaultValue; - xmlThrDefIndentTreeOutput; - xmlThrDefKeepBlanksDefaultValue; - xmlThrDefLineNumbersDefaultValue; - xmlThrDefLoadExtDtdDefaultValue; - xmlThrDefParserDebugEntities; - xmlThrDefPedanticParserDefaultValue; - xmlThrDefRegisterNodeDefault; - xmlThrDefSaveNoEmptyTags; - xmlThrDefSetGenericErrorFunc; - xmlThrDefSubstituteEntitiesDefaultValue; - xmlThrDefTreeIndentString; -} LIBXML2_2.5.7; - -LIBXML2_2.5.9 { - global: - -# xmlmemory - xmlMallocAtomicLoc; - -# relaxng - xmlRelaxNGGetParserErrors; - xmlRelaxNGGetValidErrors; - -# tree - xmlSplitQName3; - -# xmlstring - xmlUTF8Charcmp; - xmlUTF8Size; - -# xinclude - xmlXIncludeProcessTree; -} LIBXML2_2.5.8; - -LIBXML2_2.6.0 { - global: - -# SAX2 - xmlSAX2AttributeDecl; - xmlSAX2CDataBlock; - xmlSAX2Characters; - xmlSAX2Comment; - xmlSAX2ElementDecl; - xmlSAX2EndDocument; - xmlSAX2EndElementNs; - xmlSAX2EndElement; - xmlSAX2EntityDecl; - xmlSAX2ExternalSubset; - xmlSAX2GetColumnNumber; - xmlSAX2GetEntity; - xmlSAX2GetLineNumber; - xmlSAX2GetParameterEntity; - xmlSAX2GetPublicId; - xmlSAX2GetSystemId; - xmlSAX2HasExternalSubset; - xmlSAX2HasInternalSubset; - xmlSAX2IgnorableWhitespace; - xmlSAX2InitDefaultSAXHandler; -# xmlSAX2InitDocbDefaultSAXHandler; removed in 2.10.0 - xmlSAX2InitHtmlDefaultSAXHandler; - xmlSAX2InternalSubset; - xmlSAX2IsStandalone; - xmlSAX2NotationDecl; - xmlSAX2ProcessingInstruction; - xmlSAX2Reference; - xmlSAX2ResolveEntity; - xmlSAX2SetDocumentLocator; - xmlSAX2StartDocument; - xmlSAX2StartElementNs; - xmlSAX2StartElement; - xmlSAX2UnparsedEntityDecl; - xmlSAXDefaultVersion; - xmlSAXVersion; - -# HTMLparser - htmlCtxtReadDoc; - htmlCtxtReadFd; - htmlCtxtReadFile; - htmlCtxtReadIO; - htmlCtxtReadMemory; - htmlCtxtReset; - htmlCtxtUseOptions; - htmlReadDoc; - htmlReadFd; - htmlReadFile; - htmlReadIO; - htmlReadMemory; - -# tree - xmlBufferCreateStatic; - -# chvalid - xmlCharInRange; - -# xmlIO - xmlCheckHTTPInput; - -# xmlerror - xmlCopyError; - xmlCtxtGetLastError; - xmlGetLastError; - xmlResetError; - xmlResetLastError; - xmlSetStructuredErrorFunc; - -# parser - xmlCtxtReadDoc; - xmlCtxtReadFd; - xmlCtxtReadFile; - xmlCtxtReadIO; - xmlCtxtReadMemory; - -# xmlerror - xmlCtxtResetLastError; - -# parser - xmlCtxtReset; - xmlCtxtUseOptions; - xmlReadDoc; - xmlReadFd; - xmlReadFile; - xmlReadIO; - xmlReadMemory; - -# xmlstring - xmlStrPrintf; - xmlStrQEqual; - -# dict - xmlDictCreate; - xmlDictFree; - xmlDictLookup; - xmlDictOwns; - xmlDictQLookup; - xmlDictReference; - xmlDictSize; - -# parserInternals -# xmlErrMemory; removed in 2.11.0 - xmlParserMaxDepth; # variable - xmlStringLenDecodeEntities; - xmlSwitchInputEncoding; - -# xmlwriter - xmlFreeTextWriter; - xmlNewTextWriterFilename; - xmlNewTextWriterMemory; - xmlNewTextWriter; - xmlTextWriterEndAttribute; - xmlTextWriterEndCDATA; - xmlTextWriterEndDocument; - xmlTextWriterEndDTD; - xmlTextWriterEndElement; - xmlTextWriterEndPI; - xmlTextWriterFlush; - xmlTextWriterFullEndElement; - xmlTextWriterStartAttributeNS; - xmlTextWriterStartAttribute; - xmlTextWriterStartCDATA; - xmlTextWriterStartDocument; - xmlTextWriterStartDTDAttlist; - xmlTextWriterStartDTDElement; - xmlTextWriterStartDTDEntity; - xmlTextWriterStartDTD; - xmlTextWriterStartElementNS; - xmlTextWriterStartElement; - xmlTextWriterStartPI; - xmlTextWriterWriteAttributeNS; - xmlTextWriterWriteAttribute; - xmlTextWriterWriteBase64; - xmlTextWriterWriteBinHex; - xmlTextWriterWriteCDATA; - xmlTextWriterWriteComment; - xmlTextWriterWriteDTDAttlist; - xmlTextWriterWriteDTDElement; - xmlTextWriterWriteDTDEntity; - xmlTextWriterWriteDTDExternalEntity; - xmlTextWriterWriteDTDInternalEntity; - xmlTextWriterWriteDTDNotation; - xmlTextWriterWriteDTD; - xmlTextWriterWriteElementNS; - xmlTextWriterWriteElement; - xmlTextWriterWriteFormatAttributeNS; - xmlTextWriterWriteFormatAttribute; - xmlTextWriterWriteFormatCDATA; - xmlTextWriterWriteFormatComment; - xmlTextWriterWriteFormatDTDAttlist; - xmlTextWriterWriteFormatDTDElement; - xmlTextWriterWriteFormatDTDInternalEntity; - xmlTextWriterWriteFormatDTD; - xmlTextWriterWriteFormatElementNS; - xmlTextWriterWriteFormatElement; - xmlTextWriterWriteFormatPI; - xmlTextWriterWriteFormatRaw; - xmlTextWriterWriteFormatString; - xmlTextWriterWritePI; - xmlTextWriterWriteRawLen; - xmlTextWriterWriteRaw; - xmlTextWriterWriteString; - xmlTextWriterWriteVFormatAttributeNS; - xmlTextWriterWriteVFormatAttribute; - xmlTextWriterWriteVFormatCDATA; - xmlTextWriterWriteVFormatComment; - xmlTextWriterWriteVFormatDTDAttlist; - xmlTextWriterWriteVFormatDTDElement; - xmlTextWriterWriteVFormatDTDInternalEntity; - xmlTextWriterWriteVFormatDTD; - xmlTextWriterWriteVFormatElementNS; - xmlTextWriterWriteVFormatElement; - xmlTextWriterWriteVFormatPI; - xmlTextWriterWriteVFormatRaw; - xmlTextWriterWriteVFormatString; - -# hash - xmlHashQLookup2; - xmlHashQLookup3; - xmlHashQLookup; - -# chvalid - xmlIsBaseCharGroup; # variable - xmlIsCharGroup; # variable - xmlIsCombiningGroup; # variable - xmlIsDigitGroup; # variable - xmlIsExtenderGroup; # variable - xmlIsIdeographicGroup; # variable - xmlIsPubidChar_tab; # variable - -# globals - xmlLastError; # variable - -# nanohttp - xmlNanoHTTPEncoding; - xmlNanoHTTPMimeType; - xmlNanoHTTPRedir; - -# tree - xmlNodeBufGetContent; - -# xmlIO - xmlParserInputBufferCreateStatic; - -# xmlreader - xmlReaderForDoc; - xmlReaderForFd; - xmlReaderForFile; - xmlReaderForIO; - xmlReaderForMemory; - xmlReaderNewDoc; - xmlReaderNewFd; - xmlReaderNewFile; - xmlReaderNewIO; - xmlReaderNewMemory; - xmlReaderNewWalker; - xmlReaderWalker; - xmlTextReaderConstBaseUri; - xmlTextReaderConstLocalName; - xmlTextReaderConstNamespaceUri; - xmlTextReaderConstName; - xmlTextReaderConstPrefix; - xmlTextReaderConstString; - xmlTextReaderConstValue; - xmlTextReaderConstXmlLang; - xmlTextReaderNextSibling; - xmlTextReaderPreserve; - -# globals - xmlStructuredError; # variable - xmlThrDefSetStructuredErrorFunc; - -# xpathInternals - xmlXPathErr; - -# SAX2 -# xmlSAX2CheckNamespace; removed in 2.6.10 -# xmlSAX2GetNamespace; removed in 2.6.10 -# xmlSAX2GlobalNamespace; removed in 2.6.10 -# xmlSAX2NamespaceDecl; removed in 2.6.10 -# xmlSAX2SetNamespace; removed in 2.6.10 -} LIBXML2_2.5.9; - -LIBXML2_2.6.1 { - global: - -# parser - xmlCtxtResetPush; -} LIBXML2_2.6.0; - -LIBXML2_2.6.2 { - global: - -# parserInternals - xmlCreateURLParserCtxt; - -# xmlschemas - xmlSchemaNewDocParserCtxt; - -# xmlstring - xmlStrVPrintf; - -# xinclude - xmlXIncludeFreeContext; - xmlXIncludeNewContext; - xmlXIncludeProcessNode; -} LIBXML2_2.6.1; - -LIBXML2_2.6.3 { - global: - -# pattern - xmlFreePatternList; - xmlFreePattern; - xmlPatterncompile; - xmlPatternMatch; - -# xmlwriter - xmlNewTextWriterDoc; - xmlNewTextWriterPushParser; - xmlNewTextWriterTree; - -# xmlreader - xmlTextReaderPreservePattern; - -# xmlunicode - xmlUCSIsAegeanNumbers; - xmlUCSIsBuhid; - xmlUCSIsCombiningDiacriticalMarksforSymbols; - xmlUCSIsCypriotSyllabary; - xmlUCSIsCyrillicSupplement; - xmlUCSIsGreekandCoptic; - xmlUCSIsHanunoo; - xmlUCSIsKatakanaPhoneticExtensions; - xmlUCSIsKhmerSymbols; - xmlUCSIsLimbu; - xmlUCSIsLinearBIdeograms; - xmlUCSIsLinearBSyllabary; - xmlUCSIsMiscellaneousMathematicalSymbolsA; - xmlUCSIsMiscellaneousMathematicalSymbolsB; - xmlUCSIsMiscellaneousSymbolsandArrows; - xmlUCSIsOsmanya; - xmlUCSIsPhoneticExtensions; - xmlUCSIsPrivateUseArea; - xmlUCSIsShavian; - xmlUCSIsSupplementalArrowsA; - xmlUCSIsSupplementalArrowsB; - xmlUCSIsSupplementalMathematicalOperators; - xmlUCSIsSupplementaryPrivateUseAreaA; - xmlUCSIsSupplementaryPrivateUseAreaB; - xmlUCSIsTagalog; - xmlUCSIsTagbanwa; - xmlUCSIsTaiLe; - xmlUCSIsTaiXuanJingSymbols; - xmlUCSIsUgaritic; - xmlUCSIsVariationSelectorsSupplement; - xmlUCSIsVariationSelectors; - xmlUCSIsYijingHexagramSymbols; - -# xinclude - xmlXIncludeProcessFlags; - xmlXIncludeProcessTreeFlags; - xmlXIncludeSetFlags; -} LIBXML2_2.6.2; - -LIBXML2_2.6.5 { - global: - -# xmlmemory - xmlCleanupMemory; - -# dict - xmlDictCreateSub; - -# relaxng - xmlRelaxParserSetFlag; - -# xmlstring - xmlStrncatNew; - -# xmlwriter - xmlTextWriterSetIndentString; - xmlTextWriterSetIndent; - -# xpath - xmlXPathCtxtCompile; -} LIBXML2_2.6.3; - -LIBXML2_2.6.6 { - global: - -# tree - xmlAttrSerializeTxtContent; - -# parser - xmlByteConsumed; - -# xmlreader - xmlTextReaderSetStructuredErrorHandler; -} LIBXML2_2.6.5; - -LIBXML2_2.6.7 { - global: - -# xmlwriter - xmlTextWriterEndComment; - xmlTextWriterStartComment; -} LIBXML2_2.6.6; - -LIBXML2_2.6.8 { - global: - -# xmlsave - xmlSaveClose; - xmlSaveDoc; - xmlSaveFlush; - xmlSaveToFd; - xmlSaveToFilename; - xmlSaveToIO; - xmlSaveTree; - -# xmlwriter - xmlTextWriterEndDTDAttlist; - xmlTextWriterEndDTDElement; - xmlTextWriterEndDTDEntity; - xmlTextWriterWriteDTDExternalEntityContents; -} LIBXML2_2.6.7; - -LIBXML2_2.6.10 { - global: - -# xmlIO - xmlOutputBufferWriteEscape; - xmlPopInputCallbacks; - -# xmlsave - xmlSaveSetAttrEscape; - xmlSaveSetEscape; -} LIBXML2_2.6.8; - -LIBXML2_2.6.11 { - global: - -# uri - xmlBuildRelativeURI; - -# globals - xmlOutputBufferCreateFilenameDefault; - xmlOutputBufferCreateFilenameValue; # variable - xmlParserInputBufferCreateFilenameDefault; - xmlParserInputBufferCreateFilenameValue; # variable - xmlThrDefOutputBufferCreateFilenameDefault; - xmlThrDefParserInputBufferCreateFilenameDefault; - -# schemasInternals - xmlSchemaFreeWildcard; - -# xmlschemastypes - xmlSchemaCollapseString; - xmlSchemaGetBuiltInListSimpleTypeItemType; - xmlSchemaGetBuiltInType; - xmlSchemaIsBuiltInTypeFacet; - xmlSchemaValidateListSimpleTypeFacet; -} LIBXML2_2.6.10; - -LIBXML2_2.6.12 { - global: - -# parser - xmlParseInNodeContext; - -# xmlschemastypes - xmlSchemaGetFacetValueAsULong; - xmlSchemaValidateLengthFacet; - xmlSchemaValPredefTypeNodeNoNorm; - -# xmlschemas - xmlSchemaGetParserErrors; - xmlSchemaGetValidErrors; -} LIBXML2_2.6.11; - -LIBXML2_2.6.14 { - global: - -# xmlautomata - xmlAutomataNewCountTrans2; - xmlAutomataNewOnceTrans2; - -# nanohttp - xmlNanoHTTPContentLength; - -# xmlschemas - xmlSchemaSetValidOptions; - xmlSchemaValidateOneElement; - xmlSchemaValidCtxtGetOptions; -} LIBXML2_2.6.12; - -LIBXML2_2.6.15 { - global: - -# debugXML - xmlDebugCheckDocument; - -# tree - xmlDocCopyNodeList; - xmlNewDocPI; - -# xmlreader - xmlTextReaderConstEncoding; - xmlTextReaderConstXmlVersion; - xmlTextReaderIsNamespaceDecl; - xmlTextReaderStandalone; -} LIBXML2_2.6.14; - -LIBXML2_2.6.16 { - global: - -# xmlmemory - xmlMemBlocks; - -# relaxng - xmlRelaxNGInitTypes; -} LIBXML2_2.6.15; - -LIBXML2_2.6.17 { - global: - -# dict - xmlDictExists; - -# xmlmodule - xmlModuleClose; - xmlModuleFree; - xmlModuleOpen; - xmlModuleSymbol; - -# xmlregexp - xmlRegExecErrInfo; - xmlRegExecNextValues; - -# xmlschemastypes - xmlSchemaWhiteSpaceReplace; - -# xmlreader - xmlTextReaderGetParserColumnNumber; - xmlTextReaderGetParserLineNumber; -} LIBXML2_2.6.16; - -LIBXML2_2.6.18 { - global: - -# valid - xmlCopyDocElementContent; - xmlFreeDocElementContent; - xmlNewDocElementContent; - -# dict - xmlDictCleanup; - -# hash - xmlHashCreateDict; - -# pattern - xmlFreeStreamCtxt; - xmlPatternFromRoot; - xmlPatternGetStreamCtxt; - xmlPatternMaxDepth; - xmlPatternStreamable; - xmlStreamPop; - xmlStreamPushAttr; - xmlStreamPush; - -# xmlschemastypes - xmlSchemaCompareValuesWhtsp; - xmlSchemaCopyValue; - xmlSchemaGetCanonValue; - xmlSchemaNewNOTATIONValue; - xmlSchemaNewStringValue; - -# xmlreader - xmlTextReaderByteConsumed; -} LIBXML2_2.6.17; - -LIBXML2_2.6.19 { - global: - -# xmlschemastypes - xmlSchemaGetValType; - xmlSchemaValidateFacetWhtsp; - xmlSchemaValidateLengthFacetWhtsp; -} LIBXML2_2.6.18; - -LIBXML2_2.6.20 { - global: - -# tree - xmlDOMWrapAdoptNode; - xmlDOMWrapFreeCtxt; - xmlDOMWrapNewCtxt; - xmlDOMWrapReconcileNamespaces; - xmlDOMWrapRemoveNode; - -# xmlschemastypes - xmlSchemaGetCanonValueWhtsp; - xmlSchemaNewQNameValue; - xmlSchemaValueAppend; - xmlSchemaValueGetAsBoolean; - xmlSchemaValueGetAsString; - xmlSchemaValueGetNext; - -# xmlschemas - xmlSchemaIsValid; - xmlSchemaSAXPlug; - xmlSchemaSAXUnplug; - xmlSchemaValidateFile; - -# xmlreader - xmlTextReaderSchemaValidate; - xmlTextReaderSetSchema; -} LIBXML2_2.6.19; - -LIBXML2_2.6.21 { - global: - -# xmlautomata - xmlAutomataNewNegTrans; - -# xmlregexp -# emptyExp; removed in 2.9.10 -# forbiddenExp; removed in 2.9.10 -# xmlExpCtxtNbCons; removed in 2.9.10 -# xmlExpCtxtNbNodes; removed in 2.9.10 -# xmlExpDump; removed in 2.9.10 -# xmlExpExpDerive; removed in 2.9.10 -# xmlExpFreeCtxt; removed in 2.9.10 -# xmlExpFree; removed in 2.9.10 -# xmlExpGetLanguage; removed in 2.9.10 -# xmlExpGetStart; removed in 2.9.10 -# xmlExpIsNillable; removed in 2.9.10 -# xmlExpMaxToken; removed in 2.9.10 -# xmlExpNewAtom; removed in 2.9.10 -# xmlExpNewCtxt; removed in 2.9.10 -# xmlExpNewOr; removed in 2.9.10 -# xmlExpNewRange; removed in 2.9.10 -# xmlExpNewSeq; removed in 2.9.10 -# xmlExpParse; removed in 2.9.10 -# xmlExpRef; removed in 2.9.10 -# xmlExpStringDerive; removed in 2.9.10 -# xmlExpSubsume; removed in 2.9.10 - -# parser - xmlHasFeature; - -# uri - xmlParseURIRaw; - -# pattern - xmlPatternMinDepth; - -# relaxng - xmlRelaxNGSetValidStructuredErrors; - -# xmlschemas - xmlSchemaSetValidStructuredErrors; - -# schematron - xmlSchematronFreeParserCtxt; - xmlSchematronFree; - xmlSchematronFreeValidCtxt; - xmlSchematronNewDocParserCtxt; - xmlSchematronNewMemParserCtxt; - xmlSchematronNewParserCtxt; - xmlSchematronNewValidCtxt; - xmlSchematronParse; - xmlSchematronValidateDoc; -} LIBXML2_2.6.20; - -LIBXML2_2.6.23 { - global: - -# HTMLtree - htmlDocDumpMemoryFormat; - -# xmlIO - xmlOutputBufferCreateBuffer; - -# xmlsave - xmlSaveToBuffer;# suppressed in 2.6.11, readded in 2.6.23 - - -# xmlschemas - xmlSchemaSetParserStructuredErrors; - -# pattern - xmlStreamPushNode; - xmlStreamWantsAnyNode; - -# xmlreader - xmlTextReaderSchemaValidateCtxt; -} LIBXML2_2.6.21; - -LIBXML2_2.6.24 { - global: - -# tree - xmlDOMWrapCloneNode; - -# relaxng - xmlRelaxNGSetParserStructuredErrors; -} LIBXML2_2.6.23; - -LIBXML2_2.6.25 { - global: - -# xpath - xmlXPathContextSetCache; -} LIBXML2_2.6.24; - -LIBXML2_2.6.27 { - global: - -# HTMLparser - htmlNewParserCtxt; - -# uri - xmlPathToURI; - -# xinclude - xmlXIncludeProcessFlagsData; - -# xpath - xmlXPathCompiledEvalToBoolean; -} LIBXML2_2.6.25; - -LIBXML2_2.6.28 { - global: - -# xmlreader - xmlTextReaderSetup; -} LIBXML2_2.6.27; - -LIBXML2_2.6.32 { - global: - -# schematron - xmlSchematronSetValidStructuredErrors; -} LIBXML2_2.6.28; - -LIBXML2_2.7.0 { - global: - -# xmlmemory - xmlMemDisplayLast; - -# entities - xmlNewEntity; - -# xmlschemas - xmlSchemaValidCtxtGetParserCtxt; -} LIBXML2_2.6.32; - -LIBXML2_2.7.3 { - global: - -# tree - xmlChildElementCount; - xmlFirstElementChild; - xmlLastElementChild; - xmlNextElementSibling; - xmlPreviousElementSibling; -} LIBXML2_2.7.0; - -LIBXML2_2.7.4 { - global: - -# globals - xmlStructuredErrorContext; # variable - -# xinclude - xmlXIncludeProcessTreeFlagsData; -} LIBXML2_2.7.3; - -LIBXML2_2.8.0 { - global: - -# xmlreader - xmlTextReaderRelaxNGValidateCtxt; - -# tree - xmlBufferDetach; - -# dict - xmlInitializeDict; -} LIBXML2_2.7.4; - -LIBXML2_2.9.0 { - global: - -# tree - xmlBufContent; - xmlBufEnd; - xmlBufGetNodeContent; - xmlBufNodeDump; - xmlBufShrink; - xmlBufUse; - -# dict - xmlDictGetUsage; - xmlDictSetLimit; - -# xmlschemas - xmlSchemaValidateSetFilename; - xmlSchemaValidateSetLocator; - -# xmlIO - xmlOutputBufferGetContent; - xmlOutputBufferGetSize; - -# xmlwriter - xmlTextWriterSetQuoteChar; -} LIBXML2_2.8.0; - -LIBXML2_2.9.1 { - global: - -# xpath - xmlXPathNodeEval; - xmlXPathSetContextNode; -} LIBXML2_2.9.0; - -LIBXML2_2.9.8 { - global: - -# hash - xmlHashDefaultDeallocator; -} LIBXML2_2.9.1; - -LIBXML2_2.9.11 { - global: - -# xmlIO - xmlPopOutputCallbacks; -} LIBXML2_2.9.8; - -LIBXML2_2.11.0 { - global: - -# HTMLparser - htmlNewSAXParserCtxt; - -# parser - xmlNewSAXParserCtxt; -} LIBXML2_2.9.11; - +LIBXML2_2.4.30 {}; +LIBXML2_2.5.0 {} LIBXML2_2.4.30; +LIBXML2_2.5.2 {} LIBXML2_2.5.0; +LIBXML2_2.5.4 {} LIBXML2_2.5.2; +LIBXML2_2.5.5 {} LIBXML2_2.5.4; +LIBXML2_2.5.6 {} LIBXML2_2.5.5; +LIBXML2_2.5.7 {} LIBXML2_2.5.6; +LIBXML2_2.5.8 {} LIBXML2_2.5.7; +LIBXML2_2.5.9 {} LIBXML2_2.5.8; +LIBXML2_2.6.0 {} LIBXML2_2.5.9; +LIBXML2_2.6.1 {} LIBXML2_2.6.0; +LIBXML2_2.6.2 {} LIBXML2_2.6.1; +LIBXML2_2.6.3 {} LIBXML2_2.6.2; +LIBXML2_2.6.5 {} LIBXML2_2.6.3; +LIBXML2_2.6.6 {} LIBXML2_2.6.5; +LIBXML2_2.6.7 {} LIBXML2_2.6.6; +LIBXML2_2.6.8 {} LIBXML2_2.6.7; +LIBXML2_2.6.10 {} LIBXML2_2.6.8; +LIBXML2_2.6.11 {} LIBXML2_2.6.10; +LIBXML2_2.6.12 {} LIBXML2_2.6.11; +LIBXML2_2.6.14 {} LIBXML2_2.6.12; +LIBXML2_2.6.15 {} LIBXML2_2.6.14; +LIBXML2_2.6.16 {} LIBXML2_2.6.15; +LIBXML2_2.6.17 {} LIBXML2_2.6.16; +LIBXML2_2.6.18 {} LIBXML2_2.6.17; +LIBXML2_2.6.19 {} LIBXML2_2.6.18; +LIBXML2_2.6.20 {} LIBXML2_2.6.19; +LIBXML2_2.6.21 {} LIBXML2_2.6.20; +LIBXML2_2.6.23 {} LIBXML2_2.6.21; +LIBXML2_2.6.24 {} LIBXML2_2.6.23; +LIBXML2_2.6.25 {} LIBXML2_2.6.24; +LIBXML2_2.6.27 {} LIBXML2_2.6.25; +LIBXML2_2.6.28 {} LIBXML2_2.6.27; +LIBXML2_2.6.32 {} LIBXML2_2.6.28; +LIBXML2_2.7.0 {} LIBXML2_2.6.32; +LIBXML2_2.7.3 {} LIBXML2_2.7.0; +LIBXML2_2.7.4 {} LIBXML2_2.7.3; +LIBXML2_2.8.0 {} LIBXML2_2.7.4; +LIBXML2_2.9.0 {} LIBXML2_2.8.0; +LIBXML2_2.9.1 {} LIBXML2_2.9.0; +LIBXML2_2.9.8 {} LIBXML2_2.9.1; +LIBXML2_2.9.11 {} LIBXML2_2.9.8; +LIBXML2_2.11.0 {} LIBXML2_2.9.11;
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c index e817fba2..f302f34c 100644 --- a/third_party/libxml/src/parser.c +++ b/third_party/libxml/src/parser.c
@@ -78,6 +78,7 @@ #include "private/buf.h" #include "private/dict.h" #include "private/enc.h" +#include "private/entities.h" #include "private/error.h" #include "private/globals.h" #include "private/html.h" @@ -94,9 +95,6 @@ int nsNr; }; -static void -xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info); - static xmlParserCtxtPtr xmlCreateEntityParserCtxtInternal(xmlSAXHandlerPtr sax, void *userData, const xmlChar *URL, const xmlChar *ID, const xmlChar *base, @@ -129,156 +127,7 @@ */ #define XML_PARSER_NON_LINEAR 10 -/* - * xmlParserEntityCheck - * - * Function to check non-linear entity expansion behaviour - * This is here to detect and stop exponential linear entity expansion - * This is not a limitation of the parser but a safety - * boundary feature. It can be disabled with the XML_PARSE_HUGE - * parser option. - */ -static int -xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, - xmlEntityPtr ent, size_t replacement) -{ - size_t consumed = 0; - int i; - - if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) - return (0); - if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) - return (1); - - /* - * This may look absurd but is needed to detect - * entities problems - */ - if ((ent != NULL) && (ent->guard == XML_ENTITY_BEING_CHECKED)) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return (1); - } - - if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && - (ent->content != NULL) && (ent->checked == 0) && - (ctxt->errNo != XML_ERR_ENTITY_LOOP)) { - unsigned long oldnbent = ctxt->nbentities, diff; - xmlChar *rep; - - ent->guard = XML_ENTITY_BEING_CHECKED; - ent->checked = 1; - - ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); - --ctxt->depth; - ent->guard = XML_ENTITY_NOT_BEING_CHECKED; - if ((rep == NULL) || (ctxt->errNo == XML_ERR_ENTITY_LOOP)) { - ent->content[0] = 0; - } - - diff = ctxt->nbentities - oldnbent + 1; - if (diff > INT_MAX / 2) - diff = INT_MAX / 2; - ent->checked = diff * 2; - if (rep != NULL) { - if (xmlStrchr(rep, '<')) - ent->checked |= 1; - xmlFree(rep); - rep = NULL; - } - } - - /* - * Prevent entity exponential check, not just replacement while - * parsing the DTD - * The check is potentially costly so do that only once in a thousand - */ - if ((ctxt->instate == XML_PARSER_DTD) && (ctxt->nbentities > 10000) && - (ctxt->nbentities % 1024 == 0)) { - for (i = 0;i < ctxt->inputNr;i++) { - consumed += ctxt->inputTab[i]->consumed + - (ctxt->inputTab[i]->cur - ctxt->inputTab[i]->base); - } - if (ctxt->nbentities > consumed * XML_PARSER_NON_LINEAR) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - ctxt->instate = XML_PARSER_EOF; - return (1); - } - consumed = 0; - } - - - - if (replacement != 0) { - if (replacement < XML_MAX_TEXT_LENGTH) - return(0); - - /* - * If the volume of entity copy reaches 10 times the - * amount of parsed data and over the large text threshold - * then that's very likely to be an abuse. - */ - if (ctxt->input != NULL) { - consumed = ctxt->input->consumed + - (ctxt->input->cur - ctxt->input->base); - } - consumed += ctxt->sizeentities; - - if (replacement < XML_PARSER_NON_LINEAR * consumed) - return(0); - } else if (size != 0) { - /* - * Do the check based on the replacement size of the entity - */ - if (size < XML_PARSER_BIG_ENTITY) - return(0); - - /* - * A limit on the amount of text data reasonably used - */ - if (ctxt->input != NULL) { - consumed = ctxt->input->consumed + - (ctxt->input->cur - ctxt->input->base); - } - consumed += ctxt->sizeentities; - - if ((size < XML_PARSER_NON_LINEAR * consumed) && - (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed)) - return (0); - } else if (ent != NULL) { - /* - * use the number of parsed entities in the replacement - */ - size = ent->checked / 2; - - /* - * The amount of data parsed counting entities size only once - */ - if (ctxt->input != NULL) { - consumed = ctxt->input->consumed + - (ctxt->input->cur - ctxt->input->base); - } - consumed += ctxt->sizeentities; - - /* - * Check the density of entities for the amount of data - * knowing an entity reference will take at least 3 bytes - */ - if (size * 3 < consumed * XML_PARSER_NON_LINEAR) - return (0); - } else { - /* - * strange we got no data for checking - */ - if (((ctxt->lastError.code != XML_ERR_UNDECLARED_ENTITY) && - (ctxt->lastError.code != XML_WAR_UNDECLARED_ENTITY)) || - (ctxt->nbentities <= 10000)) - return (0); - } - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return (1); -} +#define XML_ENT_FIXED_COST 50 /** * xmlParserMaxDepth: @@ -875,6 +724,89 @@ info1, info2, info3); } +static void +xmlSaturatedAdd(unsigned long *dst, unsigned long val) { + if (val > ULONG_MAX - *dst) + *dst = ULONG_MAX; + else + *dst += val; +} + +static void +xmlSaturatedAddSizeT(unsigned long *dst, unsigned long val) { + if (val > ULONG_MAX - *dst) + *dst = ULONG_MAX; + else + *dst += val; +} + +/** + * xmlParserEntityCheck: + * @ctxt: parser context + * @extra: sum of unexpanded entity sizes + * + * Check for non-linear entity expansion behaviour. + * + * In some cases like xmlStringDecodeEntities, this function is called + * for each, possibly nested entity and its unexpanded content length. + * + * In other cases like xmlParseReference, it's only called for each + * top-level entity with its unexpanded content length plus the sum of + * the unexpanded content lengths (plus fixed cost) of all nested + * entities. + * + * Summing the unexpanded lengths also adds the length of the reference. + * This is by design. Taking the length of the entity name into account + * discourages attacks that try to waste CPU time with abusively long + * entity names. See test/recurse/lol6.xml for example. Each call also + * adds some fixed cost XML_ENT_FIXED_COST to discourage attacks with + * short entities. + * + * Returns 1 on error, 0 on success. + */ +static int +xmlParserEntityCheck(xmlParserCtxtPtr ctxt, unsigned long extra) +{ + unsigned long consumed; + xmlParserInputPtr input = ctxt->input; + xmlEntityPtr entity = input->entity; + + /* + * Compute total consumed bytes so far, including input streams of + * external entities. + */ + consumed = input->parentConsumed; + if ((entity == NULL) || + ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && + ((entity->flags & XML_ENT_PARSED) == 0))) { + xmlSaturatedAdd(&consumed, input->consumed); + xmlSaturatedAddSizeT(&consumed, input->cur - input->base); + } + xmlSaturatedAdd(&consumed, ctxt->sizeentities); + + /* + * Add extra cost and some fixed cost. + */ + xmlSaturatedAdd(&ctxt->sizeentcopy, extra); + xmlSaturatedAdd(&ctxt->sizeentcopy, XML_ENT_FIXED_COST); + + /* + * It's important to always use saturation arithmetic when tracking + * entity sizes to make the size checks reliable. If "sizeentcopy" + * overflows, we have to abort. + */ + if ((ctxt->sizeentcopy > XML_MAX_TEXT_LENGTH) && + ((ctxt->sizeentcopy >= ULONG_MAX) || + (ctxt->sizeentcopy / XML_PARSER_NON_LINEAR > consumed))) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_LOOP, + "Maximum entity amplification factor exceeded"); + xmlHaltParser(ctxt); + return(1); + } + + return(0); +} + /************************************************************************ * * * Library wide options * @@ -1342,6 +1274,8 @@ /* intern the string and precompute the end */ len = xmlStrlen(value); value = xmlDictLookup(ctxt->dict, value, len); + if (value == NULL) + goto mem_error; defaults->values[5 * defaults->nbAttrs + 2] = value; defaults->values[5 * defaults->nbAttrs + 3] = value + len; if (ctxt->external) @@ -1721,25 +1655,21 @@ int *attallocs; int maxatts; - if (ctxt->atts == NULL) { - maxatts = 55; /* allow for 10 attrs by default */ - atts = (const xmlChar **) - xmlMalloc(maxatts * sizeof(xmlChar *)); - if (atts == NULL) goto mem_error; - ctxt->atts = atts; - attallocs = (int *) xmlMalloc((maxatts / 5) * sizeof(int)); - if (attallocs == NULL) goto mem_error; - ctxt->attallocs = attallocs; - ctxt->maxatts = maxatts; - } else if (nr + 5 > ctxt->maxatts) { - maxatts = (nr + 5) * 2; - atts = (const xmlChar **) xmlRealloc((void *) ctxt->atts, + if (nr + 5 > ctxt->maxatts) { + maxatts = ctxt->maxatts == 0 ? 55 : (nr + 5) * 2; + atts = (const xmlChar **) xmlMalloc( maxatts * sizeof(const xmlChar *)); if (atts == NULL) goto mem_error; - ctxt->atts = atts; attallocs = (int *) xmlRealloc((void *) ctxt->attallocs, (maxatts / 5) * sizeof(int)); - if (attallocs == NULL) goto mem_error; + if (attallocs == NULL) { + xmlFree(atts); + goto mem_error; + } + if (ctxt->maxatts > 0) + memcpy(atts, ctxt->atts, ctxt->maxatts * sizeof(const xmlChar *)); + xmlFree(ctxt->atts); + ctxt->atts = atts; ctxt->attallocs = attallocs; ctxt->maxatts = maxatts; } @@ -1764,16 +1694,17 @@ if ((ctxt == NULL) || (value == NULL)) return(-1); if (ctxt->inputNr >= ctxt->inputMax) { - ctxt->inputMax *= 2; - ctxt->inputTab = - (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, - ctxt->inputMax * - sizeof(ctxt->inputTab[0])); - if (ctxt->inputTab == NULL) { + size_t newSize = ctxt->inputMax * 2; + xmlParserInputPtr *tmp; + + tmp = (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, + newSize * sizeof(*tmp)); + if (tmp == NULL) { xmlErrMemory(ctxt, NULL); - ctxt->inputMax /= 2; return (-1); } + ctxt->inputTab = tmp; + ctxt->inputMax = newSize; } ctxt->inputTab[ctxt->inputNr] = value; ctxt->input = value; @@ -2242,8 +2173,30 @@ break; xmlParsePEReference(ctxt); } else if (CUR == 0) { + unsigned long consumed; + xmlEntityPtr ent; + if (ctxt->inputNr <= 1) break; + + consumed = ctxt->input->consumed; + xmlSaturatedAddSizeT(&consumed, + ctxt->input->cur - ctxt->input->base); + + /* + * Add to sizeentities when parsing an external entity + * for the first time. + */ + ent = ctxt->input->entity; + if ((ent->etype == XML_EXTERNAL_PARAMETER_ENTITY) && + ((ent->flags & XML_ENT_PARSED) == 0)) { + ent->flags |= XML_ENT_PARSED; + + xmlSaturatedAdd(&ctxt->sizeentities, consumed); + } + + xmlParserEntityCheck(ctxt, consumed); + xmlPopInput(ctxt); } else { break; @@ -2280,6 +2233,8 @@ */ xmlChar xmlPopInput(xmlParserCtxtPtr ctxt) { + xmlParserInputPtr input; + if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0); if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, @@ -2288,7 +2243,10 @@ (ctxt->instate != XML_PARSER_EOF)) xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Unfinished entity outside the DTD"); - xmlFreeInputStream(inputPop(ctxt)); + input = inputPop(ctxt); + if (input->entity != NULL) + input->entity->flags &= ~XML_ENT_EXPANDING; + xmlFreeInputStream(input); if (*ctxt->input->cur == 0) xmlParserInputGrow(ctxt->input, INPUT_CHUNK); return(CUR); @@ -2317,7 +2275,7 @@ "Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur); } if (((ctxt->inputNr > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || - (ctxt->inputNr > 1024)) { + (ctxt->inputNr > 100)) { xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); while (ctxt->inputNr > 1) xmlFreeInputStream(inputPop(ctxt)); @@ -2642,7 +2600,7 @@ } /** - * xmlStringLenDecodeEntities: + * xmlStringDecodeEntitiesInt: * @ctxt: the parser context * @str: the input string * @len: the string length @@ -2650,19 +2608,12 @@ * @end: an end marker xmlChar, 0 if none * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none - * - * Takes a entity string content and process to do the adequate substitutions. - * - * [67] Reference ::= EntityRef | CharRef - * - * [69] PEReference ::= '%' Name ';' - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! + * @check: whether to perform entity checks */ -xmlChar * -xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, - int what, xmlChar end, xmlChar end2, xmlChar end3) { +static xmlChar * +xmlStringDecodeEntitiesInt(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, + int what, xmlChar end, xmlChar end2, xmlChar end3, + int check) { xmlChar *buffer = NULL; size_t buffer_size = 0; size_t nbchars = 0; @@ -2673,14 +2624,15 @@ xmlEntityPtr ent; int c,l; - if ((ctxt == NULL) || (str == NULL) || (len < 0)) - return(NULL); + if (str == NULL) + return(NULL); last = str + len; if (((ctxt->depth > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || - (ctxt->depth > 1024)) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + (ctxt->depth > 100)) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_LOOP, + "Maximum entity nesting depth exceeded"); return(NULL); } @@ -2718,9 +2670,6 @@ "String decoding Entity Reference: %.30s\n", str); ent = xmlParseStringEntityRef(ctxt, &str); - xmlParserEntityCheck(ctxt, 0, ent, 0); - if (ent != NULL) - ctxt->nbentities += ent->checked / 2; if ((ent != NULL) && (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { if (ent->content != NULL) { @@ -2734,10 +2683,23 @@ goto int_error; } } else if ((ent != NULL) && (ent->content != NULL)) { + if ((check) && (xmlParserEntityCheck(ctxt, ent->length))) + goto int_error; + + if (ent->flags & XML_ENT_EXPANDING) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + xmlHaltParser(ctxt); + ent->content[0] = 0; + goto int_error; + } + + ent->flags |= XML_ENT_EXPANDING; ctxt->depth++; - rep = xmlStringDecodeEntities(ctxt, ent->content, what, - 0, 0, 0); + rep = xmlStringDecodeEntitiesInt(ctxt, ent->content, + ent->length, what, 0, 0, 0, check); ctxt->depth--; + ent->flags &= ~XML_ENT_EXPANDING; + if (rep == NULL) { ent->content[0] = 0; goto int_error; @@ -2747,8 +2709,6 @@ while (*current != 0) { /* non input consuming loop */ buffer[nbchars++] = *current++; if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { - if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) - goto int_error; growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } @@ -2771,9 +2731,6 @@ xmlGenericError(xmlGenericErrorContext, "String decoding PE Reference: %.30s\n", str); ent = xmlParseStringPEReference(ctxt, &str); - xmlParserEntityCheck(ctxt, 0, ent, 0); - if (ent != NULL) - ctxt->nbentities += ent->checked / 2; if (ent != NULL) { if (ent->content == NULL) { /* @@ -2792,10 +2749,25 @@ ent->name, NULL); } } + + if ((check) && (xmlParserEntityCheck(ctxt, ent->length))) + goto int_error; + + if (ent->flags & XML_ENT_EXPANDING) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + xmlHaltParser(ctxt); + if (ent->content != NULL) + ent->content[0] = 0; + goto int_error; + } + + ent->flags |= XML_ENT_EXPANDING; ctxt->depth++; - rep = xmlStringDecodeEntities(ctxt, ent->content, what, - 0, 0, 0); + rep = xmlStringDecodeEntitiesInt(ctxt, ent->content, + ent->length, what, 0, 0, 0, check); ctxt->depth--; + ent->flags &= ~XML_ENT_EXPANDING; + if (rep == NULL) { if (ent->content != NULL) ent->content[0] = 0; @@ -2805,8 +2777,6 @@ while (*current != 0) { /* non input consuming loop */ buffer[nbchars++] = *current++; if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { - if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) - goto int_error; growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } @@ -2839,6 +2809,37 @@ } /** + * xmlStringLenDecodeEntities: + * @ctxt: the parser context + * @str: the input string + * @len: the string length + * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF + * @end: an end marker xmlChar, 0 if none + * @end2: an end marker xmlChar, 0 if none + * @end3: an end marker xmlChar, 0 if none + * + * DEPRECATED: Internal function, don't use. + * + * Takes a entity string content and process to do the adequate substitutions. + * + * [67] Reference ::= EntityRef | CharRef + * + * [69] PEReference ::= '%' Name ';' + * + * Returns A newly allocated string with the substitution done. The caller + * must deallocate it ! + */ +xmlChar * +xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, + int what, xmlChar end, xmlChar end2, + xmlChar end3) { + if ((ctxt == NULL) || (str == NULL) || (len < 0)) + return(NULL); + return(xmlStringDecodeEntitiesInt(ctxt, str, len, what, + end, end2, end3, 0)); +} + +/** * xmlStringDecodeEntities: * @ctxt: the parser context * @str: the input string @@ -2847,6 +2848,8 @@ * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none * + * DEPRECATED: Internal function, don't use. + * * Takes a entity string content and process to do the adequate substitutions. * * [67] Reference ::= EntityRef | CharRef @@ -2860,8 +2863,8 @@ xmlStringDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int what, xmlChar end, xmlChar end2, xmlChar end3) { if ((ctxt == NULL) || (str == NULL)) return(NULL); - return(xmlStringLenDecodeEntities(ctxt, str, xmlStrlen(str), what, - end, end2, end3)); + return(xmlStringDecodeEntitiesInt(ctxt, str, xmlStrlen(str), what, + end, end2, end3, 0)); } /************************************************************************ @@ -3914,9 +3917,10 @@ * so XML_SUBSTITUTE_REF is not set here. */ ++ctxt->depth; - ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, - 0, 0, 0); + ret = xmlStringDecodeEntitiesInt(ctxt, buf, len, XML_SUBSTITUTE_PEREF, + 0, 0, 0, /* check */ 1); --ctxt->depth; + if (orig != NULL) { *orig = buf; buf = NULL; @@ -4014,9 +4018,6 @@ } } else { ent = xmlParseEntityRef(ctxt); - ctxt->nbentities++; - if (ent != NULL) - ctxt->nbentities += ent->owner; if ((ent != NULL) && (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { if (len + 10 > buf_size) { @@ -4035,10 +4036,13 @@ } else if ((ent != NULL) && (ctxt->replaceEntities != 0)) { if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { + if (xmlParserEntityCheck(ctxt, ent->length)) + goto error; + ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, - 0, 0, 0); + rep = xmlStringDecodeEntitiesInt(ctxt, ent->content, + ent->length, XML_SUBSTITUTE_REF, 0, 0, 0, + /* check */ 1); --ctxt->depth; if (rep != NULL) { current = rep; @@ -4068,29 +4072,47 @@ const xmlChar *cur = ent->name; /* - * This may look absurd but is needed to detect - * entities problems + * We also check for recursion and amplification + * when entities are not substituted. They're + * often expanded later. */ if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && - (ent->content != NULL) && (ent->checked == 0)) { - unsigned long oldnbent = ctxt->nbentities, diff; + (ent->content != NULL)) { + if ((ent->flags & XML_ENT_CHECKED) == 0) { + unsigned long oldCopy = ctxt->sizeentcopy; - ++ctxt->depth; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); - --ctxt->depth; + ctxt->sizeentcopy = ent->length; - diff = ctxt->nbentities - oldnbent + 1; - if (diff > INT_MAX / 2) - diff = INT_MAX / 2; - ent->checked = diff * 2; - if (rep != NULL) { - if (xmlStrchr(rep, '<')) - ent->checked |= 1; - xmlFree(rep); - rep = NULL; - } else { - ent->content[0] = 0; + ++ctxt->depth; + rep = xmlStringDecodeEntitiesInt(ctxt, + ent->content, ent->length, + XML_SUBSTITUTE_REF, 0, 0, 0, + /* check */ 1); + --ctxt->depth; + + /* + * If we're parsing DTD content, the entity + * might reference other entities which + * weren't defined yet, so the check isn't + * reliable. + */ + if (ctxt->inSubset == 0) { + ent->flags |= XML_ENT_CHECKED; + ent->expandedSize = ctxt->sizeentcopy; + } + + if (rep != NULL) { + xmlFree(rep); + rep = NULL; + } else { + ent->content[0] = 0; + } + + if (xmlParserEntityCheck(ctxt, oldCopy)) + goto error; + } else { + if (xmlParserEntityCheck(ctxt, ent->expandedSize)) + goto error; } } @@ -5565,7 +5587,7 @@ ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); if (ctxt->myDoc == NULL) { xmlErrMemory(ctxt, "New Doc failed"); - return; + goto done; } ctxt->myDoc->properties = XML_DOC_INTERNAL; } @@ -5636,7 +5658,7 @@ ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); if (ctxt->myDoc == NULL) { xmlErrMemory(ctxt, "New Doc failed"); - return; + goto done; } ctxt->myDoc->properties = XML_DOC_INTERNAL; } @@ -7021,6 +7043,8 @@ * We must have the encoding declaration */ encoding = xmlParseEncodingDecl(ctxt); + if (ctxt->instate == XML_PARSER_EOF) + return; if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { /* * The XML REC instructs us to stop parsing right here @@ -7110,9 +7134,7 @@ ctxt->instate = XML_PARSER_DTD; ctxt->external = 1; SKIP_BLANKS; - while (((RAW == '<') && (NXT(1) == '?')) || - ((RAW == '<') && (NXT(1) == '!')) || - (RAW == '%')) { + while ((ctxt->instate != XML_PARSER_EOF) && (RAW != 0)) { GROW; if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { xmlParseConditionalSections(ctxt); @@ -7120,7 +7142,8 @@ xmlParseMarkupDecl(ctxt); } else { xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); - break; + xmlHaltParser(ctxt); + return; } SKIP_BLANKS; } @@ -7210,7 +7233,7 @@ if (ent == NULL) return; if (!ctxt->wellFormed) return; - was_checked = ent->checked; + was_checked = ent->flags & XML_ENT_PARSED; /* special case of predefined entities */ if ((ent->name == NULL) || @@ -7236,11 +7259,10 @@ * far more secure as the parser will only process data coming from * the document entity by default. */ - if (((ent->checked == 0) || - ((ent->children == NULL) && (ctxt->options & XML_PARSE_NOENT))) && + if (((ent->flags & XML_ENT_PARSED) == 0) && ((ent->etype != XML_EXTERNAL_GENERAL_PARSED_ENTITY) || (ctxt->options & (XML_PARSE_NOENT | XML_PARSE_DTDVALID)))) { - unsigned long oldnbent = ctxt->nbentities, diff; + unsigned long oldsizeentcopy = ctxt->sizeentcopy; /* * This is a bit hackish but this seems the best @@ -7253,116 +7275,102 @@ else user_data = ctxt->userData; + /* Avoid overflow as much as possible */ + ctxt->sizeentcopy = 0; + + if (ent->flags & XML_ENT_EXPANDING) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + xmlHaltParser(ctxt); + return; + } + + ent->flags |= XML_ENT_EXPANDING; + /* * Check that this entity is well formed * 4.3.2: An internal general parsed entity is well-formed * if its replacement text matches the production labeled * content. */ - if (ent->guard == XML_ENTITY_BEING_CHECKED) { - ret = XML_ERR_ENTITY_LOOP; - } else { - ent->guard = XML_ENTITY_BEING_CHECKED; - if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { - ctxt->depth++; - ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content, - user_data, &list); - ctxt->depth--; - } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) { - ctxt->depth++; - ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax, - user_data, ctxt->depth, ent->URI, - ent->ExternalID, &list); - ctxt->depth--; - } else { - ret = XML_ERR_ENTITY_PE_INTERNAL; - xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, - "invalid entity type found\n", NULL); - } - ent->guard = XML_ENTITY_NOT_BEING_CHECKED; - } + if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { + ctxt->depth++; + ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content, + user_data, &list); + ctxt->depth--; - /* - * Store the number of entities needing parsing for this entity - * content and do checkings - */ - diff = ctxt->nbentities - oldnbent + 1; - if (diff > INT_MAX / 2) - diff = INT_MAX / 2; - ent->checked = diff * 2; - if ((ent->content != NULL) && (xmlStrchr(ent->content, '<'))) - ent->checked |= 1; + } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) { + ctxt->depth++; + ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax, + user_data, ctxt->depth, ent->URI, + ent->ExternalID, &list); + ctxt->depth--; + } else { + ret = XML_ERR_ENTITY_PE_INTERNAL; + xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, + "invalid entity type found\n", NULL); + } + + ent->flags &= ~XML_ENT_EXPANDING; + ent->flags |= XML_ENT_PARSED | XML_ENT_CHECKED; + ent->expandedSize = ctxt->sizeentcopy; if (ret == XML_ERR_ENTITY_LOOP) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); xmlHaltParser(ctxt); xmlFreeNodeList(list); return; } - if (xmlParserEntityCheck(ctxt, 0, ent, 0)) { + if (xmlParserEntityCheck(ctxt, oldsizeentcopy)) { xmlFreeNodeList(list); return; } if ((ret == XML_ERR_OK) && (list != NULL)) { - if (((ent->etype == XML_INTERNAL_GENERAL_ENTITY) || - (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY))&& - (ent->children == NULL)) { - ent->children = list; - /* - * Prune it directly in the generated document - * except for single text nodes. - */ - if ((ctxt->replaceEntities == 0) || - (ctxt->parseMode == XML_PARSE_READER) || - ((list->type == XML_TEXT_NODE) && - (list->next == NULL))) { - ent->owner = 1; - while (list != NULL) { - list->parent = (xmlNodePtr) ent; - if (list->doc != ent->doc) - xmlSetTreeDoc(list, ent->doc); - if (list->next == NULL) - ent->last = list; - list = list->next; - } - list = NULL; - } else { - ent->owner = 0; - while (list != NULL) { - list->parent = (xmlNodePtr) ctxt->node; - list->doc = ctxt->myDoc; - if (list->next == NULL) - ent->last = list; - list = list->next; - } - list = ent->children; -#ifdef LIBXML_LEGACY_ENABLED - if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) - xmlAddEntityReference(ent, list, NULL); -#endif /* LIBXML_LEGACY_ENABLED */ + ent->children = list; + /* + * Prune it directly in the generated document + * except for single text nodes. + */ + if ((ctxt->replaceEntities == 0) || + (ctxt->parseMode == XML_PARSE_READER) || + ((list->type == XML_TEXT_NODE) && + (list->next == NULL))) { + ent->owner = 1; + while (list != NULL) { + list->parent = (xmlNodePtr) ent; + if (list->doc != ent->doc) + xmlSetTreeDoc(list, ent->doc); + if (list->next == NULL) + ent->last = list; + list = list->next; } - } else { - xmlFreeNodeList(list); - list = NULL; - } + list = NULL; + } else { + ent->owner = 0; + while (list != NULL) { + list->parent = (xmlNodePtr) ctxt->node; + list->doc = ctxt->myDoc; + if (list->next == NULL) + ent->last = list; + list = list->next; + } + list = ent->children; +#ifdef LIBXML_LEGACY_ENABLED + if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) + xmlAddEntityReference(ent, list, NULL); +#endif /* LIBXML_LEGACY_ENABLED */ + } } else if ((ret != XML_ERR_OK) && (ret != XML_WAR_UNDECLARED_ENTITY)) { xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, "Entity '%s' failed to parse\n", ent->name); if (ent->content != NULL) ent->content[0] = 0; - xmlParserEntityCheck(ctxt, 0, ent, 0); } else if (list != NULL) { xmlFreeNodeList(list); list = NULL; } - if (ent->checked == 0) - ent->checked = 2; /* Prevent entity from being parsed and expanded twice (Bug 760367). */ was_checked = 0; - } else if (ent->checked != 1) { - ctxt->nbentities += ent->checked / 2; } /* @@ -7389,33 +7397,34 @@ else user_data = ctxt->userData; - if (ent->guard == XML_ENTITY_BEING_CHECKED) { - ret = XML_ERR_ENTITY_LOOP; - } else { - ent->guard = XML_ENTITY_BEING_CHECKED; - if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { - ctxt->depth++; - ret = xmlParseBalancedChunkMemoryInternal(ctxt, - ent->content, user_data, NULL); - ctxt->depth--; - } else if (ent->etype == - XML_EXTERNAL_GENERAL_PARSED_ENTITY) { - ctxt->depth++; - ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, - ctxt->sax, user_data, ctxt->depth, - ent->URI, ent->ExternalID, NULL); - ctxt->depth--; - } else { - ret = XML_ERR_ENTITY_PE_INTERNAL; - xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, - "invalid entity type found\n", NULL); - } - ent->guard = XML_ENTITY_NOT_BEING_CHECKED; - } + if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { + ctxt->depth++; + ret = xmlParseBalancedChunkMemoryInternal(ctxt, + ent->content, user_data, NULL); + ctxt->depth--; + } else if (ent->etype == + XML_EXTERNAL_GENERAL_PARSED_ENTITY) { + unsigned long oldsizeentities = ctxt->sizeentities; + + ctxt->depth++; + ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, + ctxt->sax, user_data, ctxt->depth, + ent->URI, ent->ExternalID, NULL); + ctxt->depth--; + + /* Undo the change to sizeentities */ + ctxt->sizeentities = oldsizeentities; + } else { + ret = XML_ERR_ENTITY_PE_INTERNAL; + xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, + "invalid entity type found\n", NULL); + } if (ret == XML_ERR_ENTITY_LOOP) { xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); return; } + if (xmlParserEntityCheck(ctxt, 0)) + return; } if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && (ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) { @@ -7429,6 +7438,14 @@ } /* + * We also check for amplification if entities aren't substituted. + * They might be expanded later. + */ + if ((was_checked != 0) && + (xmlParserEntityCheck(ctxt, ent->expandedSize))) + return; + + /* * If we didn't get any children for the entity being built */ if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && @@ -7440,7 +7457,7 @@ return; } - if ((ctxt->replaceEntities) || (ent->children == NULL)) { + if (ctxt->replaceEntities) { /* * There is a problem on the handling of _private for entities * (bug 155816): Should we copy the content of the field from @@ -7454,7 +7471,7 @@ * hack - maybe we should have further tests to determine * what to do. */ - if ((ctxt->node != NULL) && (ent->children != NULL)) { + if (ctxt->node != NULL) { /* * Seems we are generating the DOM content, do * a simple tree copy for all references except the first @@ -7465,13 +7482,6 @@ xmlNodePtr nw = NULL, cur, firstChild = NULL; /* - * We are copying here, make sure there is no abuse - */ - ctxt->sizeentcopy += ent->length + 5; - if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) - return; - - /* * when operating on a reader, the entities definitions * are always owning the entities subtree. if (ctxt->parseMode == XML_PARSE_READER) @@ -7513,13 +7523,6 @@ firstChild = NULL; /* - * We are copying here, make sure there is no abuse - */ - ctxt->sizeentcopy += ent->length + 5; - if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) - return; - - /* * Copy the entity child list and make it the new * entity child list. The goal is to make sure any * ID or REF referenced will be the one from the @@ -7646,11 +7649,6 @@ } /* - * Increase the number of entity references parsed - */ - ctxt->nbentities++; - - /* * Ask first SAX for entity resolution, otherwise try the * entities which may have stored in the parser context. */ @@ -7703,7 +7701,6 @@ ctxt->sax->reference(ctxt->userData, name); } } - xmlParserEntityCheck(ctxt, 0, ent, 0); ctxt->valid = 0; } @@ -7734,13 +7731,16 @@ * not contain a <. */ else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { - if (((ent->checked & 1) || (ent->checked == 0)) && - (ent->content != NULL) && (xmlStrchr(ent->content, '<'))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, - "'<' in entity '%s' is not allowed in attributes values\n", name); + if ((ent->flags & XML_ENT_CHECKED_LT) == 0) { + if ((ent->content != NULL) && (xmlStrchr(ent->content, '<'))) + ent->flags |= XML_ENT_CONTAINS_LT; + ent->flags |= XML_ENT_CHECKED_LT; } + if (ent->flags & XML_ENT_CONTAINS_LT) + xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, + "'<' in entity '%s' is not allowed in attributes " + "values\n", name); } /* @@ -7843,11 +7843,6 @@ } /* - * Increase the number of entity references parsed - */ - ctxt->nbentities++; - - /* * Ask first SAX for entity resolution, otherwise try the * entities which may have stored in the parser context. */ @@ -7897,7 +7892,6 @@ "Entity '%s' not defined\n", name); } - xmlParserEntityCheck(ctxt, 0, ent, 0); /* TODO ? check regressions ctxt->valid = 0; */ } @@ -7928,12 +7922,16 @@ * not contain a <. */ else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent != NULL) && (ent->content != NULL) && - (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && - (xmlStrchr(ent->content, '<'))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, - "'<' in entity '%s' is not allowed in attributes values\n", - name); + (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { + if ((ent->flags & XML_ENT_CHECKED_LT) == 0) { + if ((ent->content != NULL) && (xmlStrchr(ent->content, '<'))) + ent->flags |= XML_ENT_CONTAINS_LT; + ent->flags |= XML_ENT_CHECKED_LT; + } + if (ent->flags & XML_ENT_CONTAINS_LT) + xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, + "'<' in entity '%s' is not allowed in attributes " + "values\n", name); } /* @@ -8022,11 +8020,6 @@ NEXT; /* - * Increase the number of entity references parsed - */ - ctxt->nbentities++; - - /* * Request the entity from SAX */ if ((ctxt->sax != NULL) && @@ -8067,7 +8060,6 @@ name, NULL); ctxt->valid = 0; } - xmlParserEntityCheck(ctxt, 0, NULL, 0); } else { /* * Internal checking in case the entity quest barfed @@ -8080,9 +8072,8 @@ } else { xmlChar start[4]; xmlCharEncoding enc; - - if (xmlParserEntityCheck(ctxt, 0, entity, 0)) - return; + unsigned long parentConsumed; + xmlEntityPtr oldEnt; if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && ((ctxt->options & XML_PARSE_NOENT) == 0) && @@ -8093,12 +8084,33 @@ (ctxt->validate == 0)) return; + if (entity->flags & XML_ENT_EXPANDING) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + xmlHaltParser(ctxt); + return; + } + + /* Must be computed from old input before pushing new input. */ + parentConsumed = ctxt->input->parentConsumed; + oldEnt = ctxt->input->entity; + if ((oldEnt == NULL) || + ((oldEnt->etype == XML_EXTERNAL_PARAMETER_ENTITY) && + ((oldEnt->flags & XML_ENT_PARSED) == 0))) { + xmlSaturatedAdd(&parentConsumed, ctxt->input->consumed); + xmlSaturatedAddSizeT(&parentConsumed, + ctxt->input->cur - ctxt->input->base); + } + input = xmlNewEntityInputStream(ctxt, entity); if (xmlPushInput(ctxt, input) < 0) { xmlFreeInputStream(input); return; } + entity->flags |= XML_ENT_EXPANDING; + + input->parentConsumed = parentConsumed; + if (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) { /* * Get the 4 first bytes and decode the charset @@ -8217,6 +8229,7 @@ } if ((ctxt->input == input) && (ctxt->input->cur >= ctxt->input->end)) { + xmlSaturatedAdd(&ctxt->sizeentities, ctxt->input->consumed); xmlPopInput(ctxt); } else if (!IS_CHAR(c)) { xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, @@ -8226,6 +8239,7 @@ return(-1); } entity->content = buf->content; + entity->length = buf->use; buf->content = NULL; xmlBufferFree(buf); @@ -8293,11 +8307,6 @@ ptr++; /* - * Increase the number of entity references parsed - */ - ctxt->nbentities++; - - /* * Request the entity from SAX */ if ((ctxt->sax != NULL) && @@ -8334,7 +8343,6 @@ name, NULL); ctxt->valid = 0; } - xmlParserEntityCheck(ctxt, 0, NULL, 0); } else { /* * Internal checking in case the entity quest barfed @@ -8473,10 +8481,8 @@ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "xmlParseInternalSubset: error detected in" " Markup declaration\n"); - if (ctxt->inputNr > baseInputNr) - xmlPopInput(ctxt); - else - break; + xmlHaltParser(ctxt); + return; } SKIP_BLANKS; } @@ -9250,6 +9256,8 @@ NEXT; SKIP_BLANKS; val = xmlParseAttValueInternal(ctxt, len, alloc, normalize); + if (val == NULL) + return (NULL); if (normalize) { /* * Sometimes a second normalisation pass for spaces is needed @@ -9647,7 +9655,7 @@ if (j <= nbNs) continue; nsname = xmlGetNamespace(ctxt, attname); - if (nsname != defaults->values[2]) { + if (nsname != defaults->values[5 * i + 2]) { if (nsPush(ctxt, attname, defaults->values[5 * i + 2]) > 0) nbNs++; @@ -11834,7 +11842,7 @@ size = XML_PARSER_BIG_BUFFER_SIZE; } tmp = xmlCheckCdataPush(ctxt->input->cur, size, 0); - if (tmp < 0) { + if (tmp <= 0) { tmp = -tmp; ctxt->input->cur += tmp; goto encoding_error; @@ -12098,7 +12106,11 @@ #endif return(ret); encoding_error: - { + if (ctxt->input->end - ctxt->input->cur < 4) { + __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, + "Input is not proper UTF-8, indicate encoding !\n", + NULL, NULL); + } else { char buffer[150]; snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", @@ -12830,8 +12842,10 @@ if (((depth > 40) && ((oldctxt == NULL) || (oldctxt->options & XML_PARSE_HUGE) == 0)) || - (depth > 1024)) { - return(XML_ERR_ENTITY_LOOP); + (depth > 100)) { + xmlFatalErrMsg(oldctxt, XML_ERR_ENTITY_LOOP, + "Maximum entity nesting depth exceeded"); + return(XML_ERR_ENTITY_LOOP); } if (list != NULL) @@ -12844,6 +12858,10 @@ ctxt = xmlCreateEntityParserCtxtInternal(sax, user_data, URL, ID, NULL, oldctxt); if (ctxt == NULL) return(XML_WAR_UNDECLARED_ENTITY); + if (oldctxt != NULL) { + ctxt->nbErrors = oldctxt->nbErrors; + ctxt->nbWarnings = oldctxt->nbWarnings; + } xmlDetectSAX2(ctxt); newDoc = xmlNewDoc(BAD_CAST "1.0"); @@ -12964,10 +12982,12 @@ } if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = XML_ERR_INTERNAL_ERROR; - else - ret = (xmlParserErrors)ctxt->errNo; + ret = (xmlParserErrors)ctxt->errNo; + if (oldctxt != NULL) { + oldctxt->errNo = ctxt->errNo; + oldctxt->wellFormed = 0; + xmlCopyError(&ctxt->lastError, &oldctxt->lastError); + } } else { if (list != NULL) { xmlNodePtr cur; @@ -12988,29 +13008,26 @@ } /* - * Record in the parent context the number of entities replacement - * done when parsing that reference. - */ - if (oldctxt != NULL) - oldctxt->nbentities += ctxt->nbentities; - - /* * Also record the size of the entity parsed */ if (ctxt->input != NULL && oldctxt != NULL) { - oldctxt->sizeentities += ctxt->input->consumed; - oldctxt->sizeentities += (ctxt->input->cur - ctxt->input->base); + unsigned long consumed = ctxt->input->consumed; + + xmlSaturatedAddSizeT(&consumed, ctxt->input->cur - ctxt->input->base); + + xmlSaturatedAdd(&oldctxt->sizeentities, consumed); + xmlSaturatedAdd(&oldctxt->sizeentities, ctxt->sizeentities); + + xmlSaturatedAdd(&oldctxt->sizeentcopy, consumed); + xmlSaturatedAdd(&oldctxt->sizeentcopy, ctxt->sizeentcopy); } - /* - * And record the last error if any - */ - if ((oldctxt != NULL) && (ctxt->lastError.code != XML_ERR_OK)) - xmlCopyError(&ctxt->lastError, &oldctxt->lastError); if (oldctxt != NULL) { ctxt->dict = NULL; ctxt->attsDefault = NULL; ctxt->attsSpecial = NULL; + oldctxt->nbErrors = ctxt->nbErrors; + oldctxt->nbWarnings = ctxt->nbWarnings; oldctxt->validate = ctxt->validate; oldctxt->valid = ctxt->valid; oldctxt->node_seq.maximum = ctxt->node_seq.maximum; @@ -13121,7 +13138,9 @@ #endif if (((oldctxt->depth > 40) && ((oldctxt->options & XML_PARSE_HUGE) == 0)) || - (oldctxt->depth > 1024)) { + (oldctxt->depth > 100)) { + xmlFatalErrMsg(oldctxt, XML_ERR_ENTITY_LOOP, + "Maximum entity nesting depth exceeded"); return(XML_ERR_ENTITY_LOOP); } @@ -13135,13 +13154,15 @@ ctxt = xmlCreateMemoryParserCtxt((char *) string, size); if (ctxt == NULL) return(XML_WAR_UNDECLARED_ENTITY); + ctxt->nbErrors = oldctxt->nbErrors; + ctxt->nbWarnings = oldctxt->nbWarnings; if (user_data != NULL) ctxt->userData = user_data; else ctxt->userData = ctxt; if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); ctxt->dict = oldctxt->dict; - ctxt->input_id = oldctxt->input_id + 1; + ctxt->input_id = oldctxt->input_id; ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); @@ -13192,7 +13213,7 @@ xmlAddChild((xmlNodePtr) ctxt->myDoc, newRoot); nodePush(ctxt, ctxt->myDoc->children); ctxt->instate = XML_PARSER_CONTENT; - ctxt->depth = oldctxt->depth + 1; + ctxt->depth = oldctxt->depth; ctxt->validate = 0; ctxt->loadsubset = oldctxt->loadsubset; @@ -13217,12 +13238,12 @@ } if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = XML_ERR_INTERNAL_ERROR; - else - ret = (xmlParserErrors)ctxt->errNo; + ret = (xmlParserErrors)ctxt->errNo; + oldctxt->errNo = ctxt->errNo; + oldctxt->wellFormed = 0; + xmlCopyError(&ctxt->lastError, &oldctxt->lastError); } else { - ret = XML_ERR_OK; + ret = XML_ERR_OK; } if ((lst != NULL) && (ret == XML_ERR_OK)) { @@ -13255,18 +13276,19 @@ } /* - * Record in the parent context the number of entities replacement - * done when parsing that reference. + * Also record the size of the entity parsed */ - if (oldctxt != NULL) - oldctxt->nbentities += ctxt->nbentities; + if (ctxt->input != NULL && oldctxt != NULL) { + unsigned long consumed = ctxt->input->consumed; - /* - * Also record the last error if any - */ - if (ctxt->lastError.code != XML_ERR_OK) - xmlCopyError(&ctxt->lastError, &oldctxt->lastError); + xmlSaturatedAddSizeT(&consumed, ctxt->input->cur - ctxt->input->base); + xmlSaturatedAdd(&oldctxt->sizeentcopy, consumed); + xmlSaturatedAdd(&oldctxt->sizeentcopy, ctxt->sizeentcopy); + } + + oldctxt->nbErrors = ctxt->nbErrors; + oldctxt->nbWarnings = ctxt->nbWarnings; ctxt->sax = oldsax; ctxt->dict = NULL; ctxt->attsDefault = NULL; @@ -13775,11 +13797,7 @@ if (pctx != NULL) { ctxt->options = pctx->options; ctxt->_private = pctx->_private; - /* - * this is a subparser of pctx, so the input_id should be - * incremented to distinguish from main entity - */ - ctxt->input_id = pctx->input_id + 1; + ctxt->input_id = pctx->input_id; } /* Don't read from stdin. */ @@ -14695,7 +14713,6 @@ ctxt->depth = 0; ctxt->charset = XML_CHAR_ENCODING_UTF8; ctxt->catalogs = NULL; - ctxt->nbentities = 0; ctxt->sizeentities = 0; ctxt->sizeentcopy = 0; xmlInitNodeInfoSeq(&ctxt->node_seq); @@ -14713,6 +14730,8 @@ if (ctxt->catalogs != NULL) xmlCatalogFreeLocal(ctxt->catalogs); #endif + ctxt->nbErrors = 0; + ctxt->nbWarnings = 0; if (ctxt->lastError.code != XML_ERR_OK) xmlResetError(&ctxt->lastError); }
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c index 1bac205..f55700e 100644 --- a/third_party/libxml/src/parserInternals.c +++ b/third_party/libxml/src/parserInternals.c
@@ -315,6 +315,12 @@ ret = xmlParserInputBufferGrow(in->buf, len); in->base = xmlBufContent(in->buf->buffer); + if (in->base == NULL) { + in->base = BAD_CAST ""; + in->cur = in->base; + in->end = in->base; + return(-1); + } in->cur = in->base + indx; in->end = xmlBufEnd(in->buf->buffer); @@ -1238,7 +1244,7 @@ * the id is actually needed. */ if (ctxt != NULL) { - if (ctxt->input_id >= INT_MAX) { + if (input->id >= INT_MAX) { xmlErrMemory(ctxt, "Input ID overflow\n"); return(NULL); } @@ -1311,8 +1317,11 @@ break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: case XML_EXTERNAL_PARAMETER_ENTITY: - return(xmlLoadExternalEntity((char *) entity->URI, - (char *) entity->ExternalID, ctxt)); + input = xmlLoadExternalEntity((char *) entity->URI, + (char *) entity->ExternalID, ctxt); + if (input != NULL) + input->entity = entity; + return(input); case XML_INTERNAL_GENERAL_ENTITY: xmlErrInternal(ctxt, "Internal entity %s without content !\n", @@ -1343,6 +1352,7 @@ input->cur = entity->content; input->length = entity->length; input->end = &entity->content[input->length]; + input->entity = entity; return(input); } @@ -1641,7 +1651,6 @@ ctxt->depth = 0; ctxt->charset = XML_CHAR_ENCODING_UTF8; ctxt->catalogs = NULL; - ctxt->nbentities = 0; ctxt->sizeentities = 0; ctxt->sizeentcopy = 0; ctxt->input_id = 1;
diff --git a/third_party/libxml/src/pattern.c b/third_party/libxml/src/pattern.c index 4d0423ee..04a4eb7 100644 --- a/third_party/libxml/src/pattern.c +++ b/third_party/libxml/src/pattern.c
@@ -2039,22 +2039,12 @@ #endif /* if 0 ------------------------------------------------------- */ if (match) { final = step.flags & XML_STREAM_STEP_FINAL; - if (desc) { - if (final) { - ret = 1; - } else { - /* descending match create a new state */ - xmlStreamCtxtAddState(stream, stepNr + 1, - stream->level + 1); - } - } else { - if (final) { - ret = 1; - } else { - xmlStreamCtxtAddState(stream, stepNr + 1, - stream->level + 1); - } - } + if (final) { + ret = 1; + } else { + xmlStreamCtxtAddState(stream, stepNr + 1, + stream->level + 1); + } if ((ret != 1) && (step.flags & XML_STREAM_STEP_IN_SET)) { /* * Check if we have a special case like "foo/bar//.", where
diff --git a/third_party/libxml/src/runsuite.c b/third_party/libxml/src/runsuite.c index a9eb434a..0880e0a 100644 --- a/third_party/libxml/src/runsuite.c +++ b/third_party/libxml/src/runsuite.c
@@ -1061,6 +1061,7 @@ nb_errors - old_errors); nb_errors = old_errors + 1; } + old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; @@ -1072,6 +1073,7 @@ nb_tests - old_tests, nb_errors - old_errors, nb_leaks - old_leaks); + old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; @@ -1083,6 +1085,7 @@ nb_tests - old_tests, nb_errors - old_errors, nb_leaks - old_leaks); + old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; @@ -1100,6 +1103,7 @@ nb_errors - old_errors, nb_internals, nb_leaks - old_leaks); + old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; @@ -1107,16 +1111,20 @@ nb_schematas = 0; xstcMetadata("xstc/Tests/Metadata/SunXMLSchema1-0-20020116.testSet", "xstc/Tests/"); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) + if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) { printf("Ran %d tests (%d schemata), no errors\n", nb_tests - old_tests, nb_schematas); - else + } else { printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n", nb_tests - old_tests, nb_schematas, nb_errors - old_errors, nb_internals, nb_leaks - old_leaks); + printf("Some errors were expected.\n"); + nb_errors = old_errors; + } + old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; @@ -1124,16 +1132,19 @@ nb_schematas = 0; xstcMetadata("xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet", "xstc/Tests/"); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) + if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) { printf("Ran %d tests (%d schemata), no errors\n", nb_tests - old_tests, nb_schematas); - else + } else { printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n", nb_tests - old_tests, nb_schematas, nb_errors - old_errors, nb_internals, nb_leaks - old_leaks); + printf("Some errors were expected.\n"); + nb_errors = old_errors; + } if ((nb_errors == 0) && (nb_leaks == 0)) { ret = 0;
diff --git a/third_party/libxml/src/testchar.c b/third_party/libxml/src/testchar.c index 4fd68c0d..b612cbd 100644 --- a/third_party/libxml/src/testchar.c +++ b/third_party/libxml/src/testchar.c
@@ -270,6 +270,7 @@ for (i = 0;i <= 0xFF;i++) { data[0] = (char) i; ctxt->charset = XML_CHAR_ENCODING_UTF8; + ctxt->nbErrors = 0; lastError = 0; c = xmlCurrentChar(ctxt, &len); @@ -305,6 +306,7 @@ data[0] = (char) i; data[1] = (char) j; ctxt->charset = XML_CHAR_ENCODING_UTF8; + ctxt->nbErrors = 0; lastError = 0; c = xmlCurrentChar(ctxt, &len); @@ -398,6 +400,7 @@ data[2] = (char) K; value = (K & 0x3F) + ((j & 0x3F) << 6) + ((i & 0xF) << 12); ctxt->charset = XML_CHAR_ENCODING_UTF8; + ctxt->nbErrors = 0; lastError = 0; c = xmlCurrentChar(ctxt, &len); @@ -500,6 +503,7 @@ value = (L & 0x3F) + ((K & 0x3F) << 6) + ((j & 0x3F) << 12) + ((i & 0x7) << 18); ctxt->charset = XML_CHAR_ENCODING_UTF8; + ctxt->nbErrors = 0; lastError = 0; c = xmlCurrentChar(ctxt, &len);
diff --git a/third_party/libxml/src/testrecurse.c b/third_party/libxml/src/testrecurse.c index b8b6ab94..acfe08b7 100644 --- a/third_party/libxml/src/testrecurse.c +++ b/third_party/libxml/src/testrecurse.c
@@ -17,11 +17,9 @@ #include <sys/stat.h> #include <libxml/parser.h> +#include <libxml/parserInternals.h> #include <libxml/tree.h> #include <libxml/uri.h> -#ifdef LIBXML_READER_ENABLED -#include <libxml/xmlreader.h> -#endif /* * O_BINARY is just for Windows compatibility - if it isn't defined @@ -33,6 +31,9 @@ #define RD_FLAGS O_RDONLY #endif +#define OPT_SAX (1<<0) +#define OPT_NO_SUBST (1<<1) + typedef int (*functest) (const char *filename, const char *result, const char *error, int options); @@ -152,17 +153,61 @@ #include <libxml/xmlIO.h> +typedef struct { + const char *URL; + const char *start; + const char *segment; + const char *finish; +} xmlHugeDocParts; -static const char *start = "<!DOCTYPE foo [\ -<!ENTITY f 'some internal data'> \ -<!ENTITY e '&f;&f;'> \ -<!ENTITY d '&e;&e;'> \ -]> \ -<foo>"; +static const xmlHugeDocParts hugeDocTable[] = { + { + "test/recurse/huge.xml", -static const char *segment = " <bar>&e; &f; &d;</bar>\n"; -static const char *finish = "</foo>"; + "<!DOCTYPE foo [" + "<!ELEMENT foo (bar*)> " + "<!ELEMENT bar (#PCDATA)> " + "<!ATTLIST bar attr CDATA #IMPLIED> " + "<!ENTITY a SYSTEM 'ga.ent'> " + "<!ENTITY b SYSTEM 'gb.ent'> " + "<!ENTITY c SYSTEM 'gc.ent'> " + "<!ENTITY f 'some internal data'> " + "<!ENTITY e '&f;&f;'> " + "<!ENTITY d '&e;&e;'> " + "]> " + "<foo>", + " <bar attr='&e; &f; &d;'>&a; &b; &c; &e; &f; &d;</bar>\n" + " <bar>_123456789_123456789_123456789_123456789</bar>\n" + " <bar>_123456789_123456789_123456789_123456789</bar>\n" + " <bar>_123456789_123456789_123456789_123456789</bar>\n", + + "</foo>" + }, + { + "test/recurse/huge_dtd.dtd", + + "<!ELEMENT foo (#PCDATA)>\n" + "<!ENTITY ent 'success'>\n" + "<!ENTITY % a SYSTEM 'pa.ent'>\n" + "<!ENTITY % b SYSTEM 'pb.ent'>\n" + "<!ENTITY % c SYSTEM 'pc.ent'>\n" + "<!ENTITY % d '<!-- comment -->'>\n" + "<!ENTITY % e '%d;%d;'>\n" + "<!ENTITY % f '%e;%e;'>\n", + + "<!ENTITY ent '%a; %b; %c; %d; %e; %f;'>\n" + "%a; %b; %c; %d; %e; %f;\n" + "<!-- _123456789_123456789_123456789_123456789 -->\n" + "<!-- _123456789_123456789_123456789_123456789 -->\n" + "<!-- _123456789_123456789_123456789_123456789 -->\n", + + "" + }, + { NULL, NULL, NULL, NULL } +}; + +static const xmlHugeDocParts *hugeDocParts; static int curseg = 0; static const char *current; static int rlen; @@ -171,14 +216,22 @@ * hugeMatch: * @URI: an URI to test * - * Check for an huge: query + * Check for a huge query * * Returns 1 if yes and 0 if another Input module should be used */ static int hugeMatch(const char * URI) { - if ((URI != NULL) && (!strncmp(URI, "huge:", 4))) - return(1); + int i; + + if (URI == NULL) + return(0); + + for (i = 0; hugeDocTable[i].URL; i++) { + if (strcmp(URI, hugeDocTable[i].URL) == 0) + return(1); + } + return(0); } @@ -186,25 +239,36 @@ * hugeOpen: * @URI: an URI to test * - * Return a pointer to the huge: query handler, in this example simply + * Return a pointer to the huge query handler, in this example simply * the current pointer... * * Returns an Input context or NULL in case or error */ static void * hugeOpen(const char * URI) { - if ((URI == NULL) || (strncmp(URI, "huge:", 4))) + int i; + + if (URI == NULL) return(NULL); - rlen = strlen(start); - current = start; - return((void *) current); + + for (i = 0; hugeDocTable[i].URL; i++) { + if (strcmp(URI, hugeDocTable[i].URL) == 0) { + hugeDocParts = hugeDocTable + i; + curseg = 0; + current = hugeDocParts->start; + rlen = strlen(current); + return((void *) current); + } + } + + return(NULL); } /** * hugeClose: * @context: the read context * - * Close the huge: query handler + * Close the huge query handler * * Returns 0 or -1 in case of error */ @@ -214,7 +278,7 @@ return(0); } -#define MAX_NODES 1000000 +#define MAX_NODES 10000 /** * hugeRead: @@ -222,7 +286,7 @@ * @buffer: where to store data * @len: number of bytes to read * - * Implement an huge: query read. + * Implement an huge query read. * * Returns the number of bytes read or -1 in case of error */ @@ -242,15 +306,11 @@ memcpy(buffer, current, len); curseg ++; if (curseg == MAX_NODES) { - fprintf(stderr, "\n"); - rlen = strlen(finish); - current = finish; + current = hugeDocParts->finish; } else { - if (curseg % (MAX_NODES / 10) == 0) - fprintf(stderr, "."); - rlen = strlen(segment); - current = segment; + current = hugeDocParts->segment; } + rlen = strlen(current); } else { memcpy(buffer, current, len); rlen -= len; @@ -583,6 +643,17 @@ } } +static void +initSAX(xmlParserCtxtPtr ctxt) { + ctxt->sax->startElementNs = NULL; + ctxt->sax->endElementNs = NULL; + ctxt->sax->characters = NULL; + ctxt->sax->cdataBlock = NULL; + ctxt->sax->ignorableWhitespace = NULL; + ctxt->sax->processingInstruction = NULL; + ctxt->sax->comment = NULL; +} + /************************************************************************ * * * File name and path utilities * @@ -670,19 +741,28 @@ recursiveDetectTest(const char *filename, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { + int options) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int res = 0; + /* + * XML_PARSE_DTDVALID is the only way to load external entities + * without XML_PARSE_NOENT. The validation result doesn't matter + * anyway. + */ + int parserOptions = XML_PARSE_DTDVALID; nb_tests++; ctxt = xmlNewParserCtxt(); + if (options & OPT_SAX) + initSAX(ctxt); + if ((options & OPT_NO_SUBST) == 0) + parserOptions |= XML_PARSE_NOENT; /* * base of the test, parse with the old API */ - doc = xmlCtxtReadFile(ctxt, filename, NULL, - XML_PARSE_NOENT | XML_PARSE_DTDLOAD); + doc = xmlCtxtReadFile(ctxt, filename, NULL, parserOptions); if ((doc != NULL) || (ctxt->lastError.code != XML_ERR_ENTITY_LOOP)) { fprintf(stderr, "Failed to detect recursion in %s\n", filename); xmlFreeParserCtxt(ctxt); @@ -709,19 +789,23 @@ notRecursiveDetectTest(const char *filename, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { + int options) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int res = 0; + int parserOptions = XML_PARSE_DTDLOAD; nb_tests++; ctxt = xmlNewParserCtxt(); + if (options & OPT_SAX) + initSAX(ctxt); + if ((options & OPT_NO_SUBST) == 0) + parserOptions |= XML_PARSE_NOENT; /* * base of the test, parse with the old API */ - doc = xmlCtxtReadFile(ctxt, filename, NULL, - XML_PARSE_NOENT | XML_PARSE_DTDLOAD); + doc = xmlCtxtReadFile(ctxt, filename, NULL, parserOptions); if (doc == NULL) { fprintf(stderr, "Failed to parse correct file %s\n", filename); xmlFreeParserCtxt(ctxt); @@ -733,7 +817,6 @@ return(res); } -#ifdef LIBXML_READER_ENABLED /** * notRecursiveHugeTest: * @filename: the file to parse @@ -749,32 +832,179 @@ notRecursiveHugeTest(const char *filename ATTRIBUTE_UNUSED, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - xmlTextReaderPtr reader; + int options) { + xmlParserCtxtPtr ctxt; + xmlDocPtr doc; int res = 0; - int ret; + int parserOptions = XML_PARSE_DTDVALID; nb_tests++; - reader = xmlReaderForFile("huge:test" , NULL, - XML_PARSE_NOENT | XML_PARSE_DTDLOAD); - if (reader == NULL) { - fprintf(stderr, "Failed to open huge:test\n"); - return(1); - } - ret = xmlTextReaderRead(reader); - while (ret == 1) { - ret = xmlTextReaderRead(reader); - } - if (ret != 0) { - fprintf(stderr, "Failed to parser huge:test with entities\n"); + ctxt = xmlNewParserCtxt(); + if (options & OPT_SAX) + initSAX(ctxt); + if ((options & OPT_NO_SUBST) == 0) + parserOptions |= XML_PARSE_NOENT; + doc = xmlCtxtReadFile(ctxt, "test/recurse/huge.xml", NULL, parserOptions); + if (doc == NULL) { + fprintf(stderr, "Failed to parse huge.xml\n"); res = 1; + } else { + xmlEntityPtr ent; + unsigned long fixed_cost = 50; + unsigned long f_size = xmlStrlen(BAD_CAST "some internal data"); + unsigned long e_size; + unsigned long d_size; + unsigned long total_size; + + ent = xmlGetDocEntity(doc, BAD_CAST "e"); + e_size = f_size * 2 + + xmlStrlen(BAD_CAST "&f;") * 2 + + fixed_cost * 2; + if (ent->expandedSize != e_size) { + fprintf(stderr, "Wrong size for entity e: %lu (expected %lu)\n", + ent->expandedSize, e_size); + res = 1; + } + + ent = xmlGetDocEntity(doc, BAD_CAST "b"); + if (ent->expandedSize != e_size) { + fprintf(stderr, "Wrong size for entity b: %lu (expected %lu)\n", + ent->expandedSize, e_size); + res = 1; + } + + ent = xmlGetDocEntity(doc, BAD_CAST "d"); + d_size = e_size * 2 + + xmlStrlen(BAD_CAST "&e;") * 2 + + fixed_cost * 2; + if (ent->expandedSize != d_size) { + fprintf(stderr, "Wrong size for entity d: %lu (expected %lu)\n", + ent->expandedSize, d_size); + res = 1; + } + + ent = xmlGetDocEntity(doc, BAD_CAST "c"); + if (ent->expandedSize != d_size) { + fprintf(stderr, "Wrong size for entity c: %lu (expected %lu)\n", + ent->expandedSize, d_size); + res = 1; + } + + if (ctxt->sizeentcopy < XML_MAX_TEXT_LENGTH) { + fprintf(stderr, "Total entity size too small: %lu\n", + ctxt->sizeentcopy); + res = 1; + } + + total_size = (f_size + e_size + d_size + 3 * fixed_cost) * + (MAX_NODES - 1) * 3; + if (ctxt->sizeentcopy != total_size) { + fprintf(stderr, "Wrong total entity size: %lu (expected %lu)\n", + ctxt->sizeentcopy, total_size); + res = 1; + } + + if (ctxt->sizeentities != 30) { + fprintf(stderr, "Wrong parsed entity size: %lu (expected %lu)\n", + ctxt->sizeentities, 30lu); + res = 1; + } } - xmlFreeTextReader(reader); + + xmlFreeDoc(doc); + xmlFreeParserCtxt(ctxt); return(res); } -#endif + +/** + * notRecursiveHugeTest: + * @filename: the file to parse + * @result: the file with expected result + * @err: the file with error messages: unused + * + * Parse a memory generated file + * good cases + * + * Returns 0 in case of success, an error code otherwise + */ +static int +hugeDtdTest(const char *filename ATTRIBUTE_UNUSED, + const char *result ATTRIBUTE_UNUSED, + const char *err ATTRIBUTE_UNUSED, + int options) { + xmlParserCtxtPtr ctxt; + xmlDocPtr doc; + int res = 0; + int parserOptions = XML_PARSE_DTDVALID; + + nb_tests++; + + ctxt = xmlNewParserCtxt(); + if (options & OPT_SAX) + initSAX(ctxt); + if ((options & OPT_NO_SUBST) == 0) + parserOptions |= XML_PARSE_NOENT; + doc = xmlCtxtReadFile(ctxt, "test/recurse/huge_dtd.xml", NULL, + parserOptions); + if (doc == NULL) { + fprintf(stderr, "Failed to parse huge_dtd.xml\n"); + res = 1; + } else { + unsigned long fixed_cost = 50; + unsigned long a_size = xmlStrlen(BAD_CAST "<!-- comment -->"); + unsigned long b_size; + unsigned long c_size; + unsigned long e_size; + unsigned long f_size; + unsigned long total_size; + + if (ctxt->sizeentcopy < XML_MAX_TEXT_LENGTH) { + fprintf(stderr, "Total entity size too small: %lu\n", + ctxt->sizeentcopy); + res = 1; + } + + b_size = (a_size + strlen("&a;") + fixed_cost) * 2; + c_size = (b_size + strlen("&b;") + fixed_cost) * 2; + /* + * Internal parameter entites are substitued eagerly and + * need different accounting. + */ + e_size = a_size * 2; + f_size = e_size * 2; + total_size = /* internal */ + e_size + f_size + fixed_cost * 4 + + (a_size + e_size + f_size + fixed_cost * 3) * + (MAX_NODES - 1) * 2 + + /* external */ + (a_size + b_size + c_size + fixed_cost * 3) * + (MAX_NODES - 1) * 2 + + /* final reference in main doc */ + strlen("success") + fixed_cost; + if (ctxt->sizeentcopy != total_size) { + fprintf(stderr, "Wrong total entity size: %lu (expected %lu)\n", + ctxt->sizeentcopy, total_size); + res = 1; + } + + total_size = strlen(hugeDocParts->start) + + strlen(hugeDocParts->segment) * (MAX_NODES - 1) + + strlen(hugeDocParts->finish) + + 28; + if (ctxt->sizeentities != total_size) { + fprintf(stderr, "Wrong parsed entity size: %lu (expected %lu)\n", + ctxt->sizeentities, total_size); + res = 1; + } + } + + xmlFreeDoc(doc); + xmlFreeParserCtxt(ctxt); + + return(res); +} /************************************************************************ * * @@ -787,14 +1017,36 @@ { "Parsing recursive test cases" , recursiveDetectTest, "./test/recurse/lol*.xml", NULL, NULL, NULL, 0 }, + { "Parsing recursive test cases (no substitution)" , + recursiveDetectTest, "./test/recurse/lol*.xml", NULL, NULL, NULL, + OPT_NO_SUBST }, + { "Parsing recursive test cases (SAX)" , + recursiveDetectTest, "./test/recurse/lol*.xml", NULL, NULL, NULL, + OPT_SAX }, + { "Parsing recursive test cases (SAX, no substitution)" , + recursiveDetectTest, "./test/recurse/lol*.xml", NULL, NULL, NULL, + OPT_SAX | OPT_NO_SUBST }, { "Parsing non-recursive test cases" , notRecursiveDetectTest, "./test/recurse/good*.xml", NULL, NULL, NULL, 0 }, -#ifdef LIBXML_READER_ENABLED + { "Parsing non-recursive test cases (SAX)" , + notRecursiveDetectTest, "./test/recurse/good*.xml", NULL, NULL, NULL, + OPT_SAX }, { "Parsing non-recursive huge case" , notRecursiveHugeTest, NULL, NULL, NULL, NULL, 0 }, -#endif + { "Parsing non-recursive huge case (no substitution)" , + notRecursiveHugeTest, NULL, NULL, NULL, NULL, + OPT_NO_SUBST }, + { "Parsing non-recursive huge case (SAX)" , + notRecursiveHugeTest, NULL, NULL, NULL, NULL, + OPT_SAX }, + { "Parsing non-recursive huge case (SAX, no substitution)" , + notRecursiveHugeTest, NULL, NULL, NULL, NULL, + OPT_SAX | OPT_NO_SUBST }, + { "Parsing non-recursive huge DTD case" , + hugeDtdTest, NULL, NULL, NULL, NULL, + 0 }, {NULL, NULL, NULL, NULL, NULL, NULL, 0} };
diff --git a/third_party/libxml/src/threads.c b/third_party/libxml/src/threads.c index f3e2b31..36e5df1 100644 --- a/third_party/libxml/src/threads.c +++ b/third_party/libxml/src/threads.c
@@ -752,6 +752,8 @@ */ if (libxml_is_threaded == -1) libxml_is_threaded = (pthread_mutex_lock != NULL); + if (libxml_is_threaded == 0) + return; #endif /* XML_PTHREAD_WEAK */ pthread_key_create(&globalkey, xmlFreeGlobalState); mainthread = pthread_self();
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c index a7368a3..e0545c1 100644 --- a/third_party/libxml/src/tree.c +++ b/third_party/libxml/src/tree.c
@@ -1411,14 +1411,21 @@ if (val != NULL) xmlFree(val); goto out; } - else if ((ent != NULL) && (ent->children == NULL)) { + else if ((ent != NULL) && + ((ent->flags & XML_ENT_PARSED) == 0) && + ((ent->flags & XML_ENT_EXPANDING) == 0)) { xmlNodePtr temp; - /* Set to non-NULL value to avoid recursion. */ - ent->children = (xmlNodePtr) -1; + /* + * The entity should have been checked already, + * but set the flag anyway to avoid recursion. + */ + ent->flags |= XML_ENT_EXPANDING; ent->children = xmlStringGetNodeList(doc, (const xmlChar*)node->content); ent->owner = 1; + ent->flags &= ~XML_ENT_EXPANDING; + ent->flags |= XML_ENT_PARSED; temp = ent->children; while (temp) { temp->parent = (xmlNodePtr)ent; @@ -1607,14 +1614,21 @@ node = xmlNewReference(doc, val); if (node == NULL) goto out; - if ((ent != NULL) && (ent->children == NULL)) { + if ((ent != NULL) && + ((ent->flags & XML_ENT_PARSED) == 0) && + ((ent->flags & XML_ENT_EXPANDING) == 0)) { xmlNodePtr temp; - /* Set to non-NULL value to avoid recursion. */ - ent->children = (xmlNodePtr) -1; + /* + * The entity should have been checked already, + * but set the flag anyway to avoid recursion. + */ + ent->flags |= XML_ENT_EXPANDING; ent->children = xmlStringGetNodeList(doc, (const xmlChar*)node->content); ent->owner = 1; + ent->flags &= ~XML_ENT_EXPANDING; + ent->flags |= XML_ENT_PARSED; temp = ent->children; while (temp) { temp->parent = (xmlNodePtr)ent; @@ -4217,8 +4231,10 @@ return(NULL); while (cur != NULL) { q = xmlCopyProp(target, cur); - if (q == NULL) + if (q == NULL) { + xmlFreePropList(ret); return(NULL); + } if (p == NULL) { ret = p = q; } else {
diff --git a/third_party/libxml/src/uri.c b/third_party/libxml/src/uri.c index 25e177d..c3d4871f 100644 --- a/third_party/libxml/src/uri.c +++ b/third_party/libxml/src/uri.c
@@ -1171,7 +1171,8 @@ if (temp == NULL) goto mem_error; ret = temp; } - ret[len++] = *p++; + /* TODO: escaping? */ + ret[len++] = (xmlChar) *p++; } } if (uri->port > 0) {
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c index 111bf9dfa..120627c 100644 --- a/third_party/libxml/src/valid.c +++ b/third_party/libxml/src/valid.c
@@ -26,8 +26,9 @@ #include "private/error.h" #include "private/parser.h" -static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, - int create); +static xmlElementPtr +xmlGetDtdElementDesc2(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, + int create); /* #define DEBUG_VALID_ALGO */ /* #define DEBUG_REGEXP_ALGO */ @@ -2113,7 +2114,7 @@ * Validity Check: * Multiple ID per element */ - elemDef = xmlGetDtdElementDesc2(dtd, elem, 1); + elemDef = xmlGetDtdElementDesc2(ctxt, dtd, elem, 1); if (elemDef != NULL) { #ifdef LIBXML_VALID_ENABLED @@ -3277,7 +3278,8 @@ */ static xmlElementPtr -xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, int create) { +xmlGetDtdElementDesc2(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, + int create) { xmlElementTablePtr table; xmlElementPtr cur; xmlChar *uqname = NULL, *prefix = NULL; @@ -3300,7 +3302,7 @@ dtd->elements = (void *) table; } if (table == NULL) { - xmlVErrMemory(NULL, "element table allocation failed"); + xmlVErrMemory(ctxt, "element table allocation failed"); return(NULL); } } @@ -3313,8 +3315,8 @@ if ((cur == NULL) && (create)) { cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); if (cur == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); + xmlVErrMemory(ctxt, "malloc failed"); + goto error; } memset(cur, 0, sizeof(xmlElement)); cur->type = XML_ELEMENT_DECL; @@ -3326,8 +3328,13 @@ cur->prefix = xmlStrdup(prefix); cur->etype = XML_ELEMENT_TYPE_UNDEFINED; - xmlHashAddEntry2(table, name, prefix, cur); + if (xmlHashAddEntry2(table, name, prefix, cur) < 0) { + xmlVErrMemory(ctxt, "adding entry failed"); + xmlFreeElement(cur); + cur = NULL; + } } +error: if (prefix != NULL) xmlFree(prefix); if (uqname != NULL) xmlFree(uqname); return(cur);
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c index 0580018..5cab16f 100644 --- a/third_party/libxml/src/xmlIO.c +++ b/third_party/libxml/src/xmlIO.c
@@ -2936,7 +2936,7 @@ ret->closecallback = NULL; errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); if (errcode != 0) { - xmlFree(ret); + xmlFreeParserInputBuffer(ret); return(NULL); } } @@ -3218,7 +3218,8 @@ if (res < 0) return(-1); - xmlBufAddLen(buf, res); + if (xmlBufAddLen(buf, res) < 0) + return(-1); } /*
diff --git a/third_party/libxml/src/xmlreader.c b/third_party/libxml/src/xmlreader.c index 86e895f..979385a 100644 --- a/third_party/libxml/src/xmlreader.c +++ b/third_party/libxml/src/xmlreader.c
@@ -540,30 +540,23 @@ * * Pushes a new entity reference node on top of the entities stack * - * Returns 0 in case of error, the index in the stack otherwise + * Returns -1 in case of error, the index in the stack otherwise */ static int xmlTextReaderEntPush(xmlTextReaderPtr reader, xmlNodePtr value) { - if (reader->entMax <= 0) { - reader->entMax = 10; - reader->entTab = (xmlNodePtr *) xmlMalloc(reader->entMax * - sizeof(reader->entTab[0])); - if (reader->entTab == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); - return (0); - } - } if (reader->entNr >= reader->entMax) { - reader->entMax *= 2; - reader->entTab = - (xmlNodePtr *) xmlRealloc(reader->entTab, - reader->entMax * - sizeof(reader->entTab[0])); - if (reader->entTab == NULL) { + size_t newSize = reader->entMax == 0 ? 10 : reader->entMax * 2; + xmlNodePtr *tmp; + + tmp = (xmlNodePtr *) xmlRealloc(reader->entTab, + newSize * sizeof(*tmp)); + if (tmp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); - return (0); + return (-1); } + reader->entTab = tmp; + reader->entMax = newSize; } reader->entTab[reader->entNr] = value; reader->ent = value; @@ -1036,7 +1029,11 @@ if ((node->children != NULL) && (node->children->type == XML_ENTITY_DECL) && (node->children->children != NULL)) { - xmlTextReaderEntPush(reader, node); + if (xmlTextReaderEntPush(reader, node) < 0) { + if (node == oldnode) + break; + goto skip_children; + } node = node->children->children; continue; } else { @@ -1482,7 +1479,8 @@ if ((reader->node->children != NULL) && (reader->node->children->type == XML_ENTITY_DECL) && (reader->node->children->children != NULL)) { - xmlTextReaderEntPush(reader, reader->node); + if (xmlTextReaderEntPush(reader, reader->node) < 0) + goto get_next_node; reader->node = reader->node->children->children; } #ifdef LIBXML_REGEXP_ENABLED
diff --git a/third_party/libxml/src/xmlsave.c b/third_party/libxml/src/xmlsave.c index 77cb7b9b..5b5c8f1 100644 --- a/third_party/libxml/src/xmlsave.c +++ b/third_party/libxml/src/xmlsave.c
@@ -2363,6 +2363,7 @@ if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) { xmlSaveErrMemory("creating buffer"); + xmlCharEncCloseFunc(conv_hdlr); return; }
diff --git a/third_party/libxml/src/xmlstring.c b/third_party/libxml/src/xmlstring.c index 54af2121..5473472 100644 --- a/third_party/libxml/src/xmlstring.c +++ b/third_party/libxml/src/xmlstring.c
@@ -48,7 +48,6 @@ if ((cur == NULL) || (len < 0)) return(NULL); ret = (xmlChar *) xmlMallocAtomic((size_t) len + 1); if (ret == NULL) { - xmlErrMemory(NULL, NULL); return(NULL); } memcpy(ret, cur, len); @@ -93,7 +92,6 @@ if ((cur == NULL) || (len < 0)) return(NULL); ret = (xmlChar *) xmlMallocAtomic((size_t) len + 1); if (ret == NULL) { - xmlErrMemory(NULL, NULL); return(NULL); } for (i = 0;i < len;i++) { @@ -463,7 +461,6 @@ return(NULL); ret = (xmlChar *) xmlRealloc(cur, (size_t) size + len + 1); if (ret == NULL) { - xmlErrMemory(NULL, NULL); return(cur); } memcpy(&ret[size], add, len); @@ -503,7 +500,6 @@ return(NULL); ret = (xmlChar *) xmlMalloc((size_t) size + len + 1); if (ret == NULL) { - xmlErrMemory(NULL, NULL); return(xmlStrndup(str1, size)); } memcpy(ret, str1, size); @@ -1032,7 +1028,6 @@ out-of-memory situations. */ xmlFree(*msg); *msg = NULL; - xmlErrMemory(NULL, NULL); return(NULL); }
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c index c96e306..0ec34d8 100644 --- a/third_party/libxml/src/xpath.c +++ b/third_party/libxml/src/xpath.c
@@ -145,6 +145,9 @@ * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) */ +static void +xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes); + #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON /** * xmlXPathCmpNodesExt: @@ -712,6 +715,9 @@ "%s", xmlXPathErrorMessages[error]); return; } + /* Only report the first error */ + if (ctxt->error != 0) + return; ctxt->error = error; if (ctxt->context == NULL) { __xmlRaiseError(NULL, NULL, NULL, @@ -2335,6 +2341,8 @@ * Wrap the Nodeset @val in a new xmlXPathObjectPtr * * Returns the created or reused object. + * + * In case of error the node set is destroyed and NULL is returned. */ static xmlXPathObjectPtr xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) @@ -2873,7 +2881,15 @@ { xmlXPathObjectPtr ret; - if ((ctxt == NULL) || (ctxt->valueNr <= 0)) + /* + * If a memory allocation failed, it can happen that valuePush doesn't + * push a value on the stack. If there's no error check before the + * corresponding valuePop call, we would pop an unrelated object which + * could lead to use-after-free errors later on. So we don't pop values + * if an error was signaled. The stack will be cleaned later in + * xmlXPathFreeParserContext. + */ + if ((ctxt == NULL) || (ctxt->valueNr <= 0) || (ctxt->error != 0)) return (NULL); if (ctxt->valueNr <= ctxt->valueFrame) { @@ -2899,6 +2915,8 @@ * a memory error is recorded in the parser context. * * Returns the number of items on the value stack, or -1 in case of error. + * + * The object is destroyed in case of error. */ int valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) @@ -2917,6 +2935,7 @@ if (ctxt->valueMax >= XPATH_MAX_STACK_DEPTH) { xmlXPathPErrMemory(ctxt, "XPath stack depth limit reached\n"); + xmlXPathFreeObject(value); return (-1); } tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, @@ -2924,6 +2943,7 @@ sizeof(ctxt->valueTab[0])); if (tmp == NULL) { xmlXPathPErrMemory(ctxt, "pushing value\n"); + xmlXPathFreeObject(value); return (-1); } ctxt->valueMax *= 2; @@ -3606,10 +3626,13 @@ ret->nodeMax = XML_NODESET_DEFAULT; if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; + xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - /* TODO: Check memory error. */ - ret->nodeTab[ret->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + if (nsNode == NULL) { + xmlXPathFreeNodeSet(ret); + return(NULL); + } + ret->nodeTab[ret->nodeNr++] = nsNode; } else ret->nodeTab[ret->nodeNr++] = val; } @@ -3666,7 +3689,7 @@ int xmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { int i; - + xmlNodePtr nsNode; if ((cur == NULL) || (ns == NULL) || (node == NULL) || (ns->type != XML_NAMESPACE_DECL) || @@ -3714,8 +3737,10 @@ cur->nodeMax *= 2; cur->nodeTab = temp; } - /* TODO: Check memory error. */ - cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); + nsNode = xmlXPathNodeSetDupNs(node, ns); + if(nsNode == NULL) + return(-1); + cur->nodeTab[cur->nodeNr++] = nsNode; return(0); } @@ -3772,10 +3797,11 @@ } if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; + xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - /* TODO: Check memory error. */ - cur->nodeTab[cur->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + if (nsNode == NULL) + return(-1); + cur->nodeTab[cur->nodeNr++] = nsNode; } else cur->nodeTab[cur->nodeNr++] = val; return(0); @@ -3827,10 +3853,11 @@ } if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; + xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - /* TODO: Check memory error. */ - cur->nodeTab[cur->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + if (nsNode == NULL) + return(-1); + cur->nodeTab[cur->nodeNr++] = nsNode; } else cur->nodeTab[cur->nodeNr++] = val; return(0); @@ -3845,6 +3872,8 @@ * if @val1 is NULL, a new set is created and copied from @val2 * * Returns @val1 once extended or NULL in case of error. + * + * Frees @val1 in case of error. */ xmlNodeSetPtr xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { @@ -3854,35 +3883,8 @@ if (val2 == NULL) return(val1); if (val1 == NULL) { val1 = xmlXPathNodeSetCreate(NULL); - if (val1 == NULL) - return (NULL); -#if 0 - /* - * TODO: The optimization won't work in every case, since - * those nasty namespace nodes need to be added with - * xmlXPathNodeSetDupNs() to the set; thus a pure - * memcpy is not possible. - * If there was a flag on the nodesetval, indicating that - * some temporary nodes are in, that would be helpful. - */ - /* - * Optimization: Create an equally sized node-set - * and memcpy the content. - */ - val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); - if (val1 == NULL) - return(NULL); - if (val2->nodeNr != 0) { - if (val2->nodeNr == 1) - *(val1->nodeTab) = *(val2->nodeTab); - else { - memcpy(val1->nodeTab, val2->nodeTab, - val2->nodeNr * sizeof(xmlNodePtr)); - } - val1->nodeNr = val2->nodeNr; - } - return(val1); -#endif + if (val1 == NULL) + return (NULL); } /* @@ with_ns to check whether namespace nodes should be looked at @@ */ @@ -3921,7 +3923,7 @@ sizeof(xmlNodePtr)); if (val1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } memset(val1->nodeTab, 0 , XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); @@ -3931,28 +3933,33 @@ if (val1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); - return(NULL); + goto error; } temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } val1->nodeTab = temp; val1->nodeMax *= 2; } if (n2->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) n2; + xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - /* TODO: Check memory error. */ - val1->nodeTab[val1->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + if (nsNode == NULL) + goto error; + val1->nodeTab[val1->nodeNr++] = nsNode; } else val1->nodeTab[val1->nodeNr++] = n2; } return(val1); + +error: + xmlXPathFreeNodeSet(val1); + return(NULL); } @@ -3965,6 +3972,8 @@ * Checks for duplicate nodes. Clears set2. * * Returns @set1 once extended or NULL in case of error. + * + * Frees @set1 in case of error. */ static xmlNodeSetPtr xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2) @@ -3993,7 +4002,6 @@ /* * Free the namespace node. */ - set2->nodeTab[i] = NULL; xmlXPathNodeSetFreeNs((xmlNsPtr) n2); goto skip_node; } @@ -4007,7 +4015,7 @@ XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (set1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } memset(set1->nodeTab, 0, XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); @@ -4017,24 +4025,29 @@ if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); - return(NULL); + goto error; } temp = (xmlNodePtr *) xmlRealloc( set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } set1->nodeTab = temp; set1->nodeMax *= 2; } set1->nodeTab[set1->nodeNr++] = n2; skip_node: - {} + set2->nodeTab[i] = NULL; } } set2->nodeNr = 0; return(set1); + +error: + xmlXPathFreeNodeSet(set1); + xmlXPathNodeSetClear(set2, 1); + return(NULL); } /** @@ -4046,6 +4059,8 @@ * Doesn't check for duplicate nodes. Clears set2. * * Returns @set1 once extended or NULL in case of error. + * + * Frees @set1 in case of error. */ static xmlNodeSetPtr xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2) @@ -4061,7 +4076,7 @@ XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (set1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } memset(set1->nodeTab, 0, XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); @@ -4071,22 +4086,28 @@ if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); - return(NULL); + goto error; } temp = (xmlNodePtr *) xmlRealloc( set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); + goto error; } set1->nodeTab = temp; set1->nodeMax *= 2; } set1->nodeTab[set1->nodeNr++] = n2; + set2->nodeTab[i] = NULL; } } set2->nodeNr = 0; return(set1); + +error: + xmlXPathFreeNodeSet(set1); + xmlXPathNodeSetClear(set2, 1); + return(NULL); } /** @@ -4404,6 +4425,8 @@ * Wrap the Nodeset @val in a new xmlXPathObjectPtr * * Returns the newly created object. + * + * In case of error the node set is destroyed and NULL is returned. */ xmlXPathObjectPtr xmlXPathWrapNodeSet(xmlNodeSetPtr val) { @@ -4412,6 +4435,7 @@ ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating node set object\n"); + xmlXPathFreeNodeSet(val); return(NULL); } memset(ret, 0 , sizeof(xmlXPathObject)); @@ -5294,6 +5318,8 @@ * Wraps the @val string into an XPath object. * * Returns the newly created object. + * + * Frees @val in case of error. */ xmlXPathObjectPtr xmlXPathWrapString (xmlChar *val) { @@ -5302,6 +5328,7 @@ ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating string object\n"); + xmlFree(val); return(NULL); } memset(ret, 0 , sizeof(xmlXPathObject)); @@ -6823,6 +6850,7 @@ xmlFree(str2); xmlXPathNumberFunction(ctxt, 1); val = valuePop(ctxt); + CHECK_ERROR0; v = val->floatval; xmlXPathReleaseObject(ctxt->context, val); if (!xmlXPathIsNaN(v)) { @@ -7037,6 +7065,8 @@ valuePush(ctxt, arg2); xmlXPathNumberFunction(ctxt, 1); arg2 = valuePop(ctxt); + if (ctxt->error) + break; /* Falls through. */ case XPATH_NUMBER: /* Hand check NaN and Infinity equalities */ @@ -7102,6 +7132,8 @@ valuePush(ctxt, arg1); xmlXPathNumberFunction(ctxt, 1); arg1 = valuePop(ctxt); + if (ctxt->error) + break; /* Hand check NaN and Infinity equalities */ if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { @@ -7401,21 +7433,13 @@ xmlXPathNumberFunction(ctxt, 1); arg1 = valuePop(ctxt); } - if (arg1->type != XPATH_NUMBER) { - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } if (arg2->type != XPATH_NUMBER) { valuePush(ctxt, arg2); xmlXPathNumberFunction(ctxt, 1); arg2 = valuePop(ctxt); } - if (arg2->type != XPATH_NUMBER) { - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } + if (ctxt->error) + goto error; /* * Add tests for infinity and nan * => feedback on 3.4 for Inf and NaN @@ -7465,6 +7489,7 @@ } } } +error: xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return(ret); @@ -10001,13 +10026,13 @@ #endif if (cur == NULL) return(0); while (IS_BLANK_CH(*cur)) cur++; - if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { - return(xmlXPathNAN); - } if (*cur == '-') { isneg = 1; cur++; } + if ((*cur != '.') && ((*cur < '0') || (*cur > '9'))) { + return(xmlXPathNAN); + } #ifdef __GNUC__ /* @@ -10264,7 +10289,10 @@ } else { XP_ERROR(XPATH_START_LITERAL_ERROR); } - if (ret == NULL) return; + if (ret == NULL) { + xmlXPathPErrMemory(ctxt, NULL); + return; + } lit = xmlXPathCacheNewString(ctxt->context, ret); if (lit == NULL) { ctxt->error = XPATH_MEMORY_ERROR; @@ -14112,6 +14140,7 @@ comp = xmlXPathNewCompExpr(); if (comp == NULL) { xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); + xmlFreePattern(stream); return(NULL); } comp->stream = stream;
diff --git a/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v2.xml b/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v2.xml index 5fc513d..8d59b58e 100644 --- a/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v2.xml +++ b/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v2.xml
@@ -709,6 +709,8 @@ <request name="set_accessibility_id" since="1"> <description summary="set accessibility ID to the surface"> + [Deprecated] Use zaura_surface's set_accessibility_id instead. + Set accessibility window ID to the surface. A negative number removes the existing accessibility ID from the surface. </description>
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium index 261309d..46d2d314 100644 --- a/third_party/wpt_tools/README.chromium +++ b/third_party/wpt_tools/README.chromium
@@ -1,7 +1,7 @@ Name: web-platform-tests - Test Suites for Web Platform specifications Short Name: wpt URL: https://github.com/web-platform-tests/wpt/ -Version: 42ac0c1e812c9c3d0735a69caaf97771bc36da38 +Version: 356789e060381be774b9564c076093811e048b36 License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html) License File: NOT_SHIPPED Security Critical: no
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py index 9e8737e..1b65d22 100644 --- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py +++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py
@@ -39,6 +39,10 @@ error_code = "no such frame" +class NoSuchScriptException(BidiException): + error_code = "no such script" + + class UnknownCommandException(BidiException): error_code = "unknown command"
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/script.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/script.py index d9af11a..a33a9a7 100644 --- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/script.py +++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/script.py
@@ -45,6 +45,30 @@ class Script(BidiModule): @command + def add_preload_script( + self, + function_declaration: str, + arguments: Optional[List[Mapping[str, Any]]] = None, + sandbox: Optional[str] = None + ) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "functionDeclaration": function_declaration + } + + if arguments is not None: + params["arguments"] = arguments + if sandbox is not None: + params["sandbox"] = sandbox + + return params + + @add_preload_script.result + def _add_preload_script(self, result: Mapping[str, Any]) -> Any: + assert "script" in result + + return result["script"] + + @command def call_function( self, function_declaration: str, @@ -134,3 +158,11 @@ assert isinstance(result["realms"], list) return result["realms"] + + @command + def remove_preload_script(self, script: str) -> Any: + params: MutableMapping[str, Any] = { + "script": script + } + + return params
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py index ba533f4..3e4a6c8 100644 --- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py +++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
@@ -193,15 +193,22 @@ if self.kill_safari: self.logger.debug("Going to stop Safari") for proc in psutil.process_iter(attrs=["exe"]): - if (proc.info["exe"] is not None and - os.path.samefile(proc.info["exe"], self.safari_path)): - self.logger.debug("Stopping Safari %s" % proc.pid) + if proc.info["exe"] is None: + continue + + try: + if not os.path.samefile(proc.info["exe"], self.safari_path): + continue + except OSError: + continue + + self.logger.debug("Stopping Safari %s" % proc.pid) + try: + proc.terminate() try: - proc.terminate() - try: - proc.wait(10) - except psutil.TimeoutExpired: - proc.kill() - proc.wait(10) - except psutil.NoSuchProcess: - pass + proc.wait(10) + except psutil.TimeoutExpired: + proc.kill() + proc.wait(10) + except psutil.NoSuchProcess: + pass
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py index 1fac29a..94b70ad 100644 --- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py +++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py
@@ -573,6 +573,20 @@ response = None req_handler = None + def cleanup(): + # Try to close the files + # Ignore any exception (e.g. if the file handle was already closed for some reason). + if rfile: + try: + rfile.close() + except OSError: + pass + if wfile: + try: + wfile.close() + except OSError: + pass + while not self.close_connection: try: frame = queue.get(True, 1) @@ -582,10 +596,7 @@ self.logger.debug(f'({self.uid} - {stream_id}) {str(frame)}') if isinstance(frame, RequestReceived): - if rfile: - rfile.close() - if wfile: - wfile.close() + cleanup() pipe_rfile, pipe_wfile = os.pipe() (rfile, wfile) = os.fdopen(pipe_rfile, 'rb'), os.fdopen(pipe_wfile, 'wb') @@ -626,10 +637,7 @@ (self.uid, stream_id)) break - if rfile: - rfile.close() - if wfile: - wfile.close() + cleanup() def frame_handler(self, request, response, handler): try: @@ -854,7 +862,7 @@ self.logger.info(f"Starting {http_type} server on {http_scheme}://{self.host}:{self.port}") self.started = True self.server_thread = threading.Thread(target=self.httpd.serve_forever) - self.server_thread.setDaemon(True) # don't hang on exit + self.server_thread.daemon = True # don't hang on exit self.server_thread.start() def stop(self):
diff --git a/tools/accessibility/coverage/test_finder.py b/tools/accessibility/coverage/test_finder.py new file mode 100755 index 0000000..44b9b83b --- /dev/null +++ b/tools/accessibility/coverage/test_finder.py
@@ -0,0 +1,266 @@ +#!/usr/bin/env python +# 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. + +# -----------------------------FILE OVERVIEW----------------------------- # +# This script generates a list of tests that exist for given parameters. +# +# This script was created so that we could determine which tests are used +# by specific components, so that coverage can be generated for specific +# components. +# +# Use the built in help for instructions. +# ----------------------------------------------------------------------- # + +import os +import sys +import argparse +import fnmatch +import re +import time +import json +from threading import Thread, Lock +sys.path.append(os.path.abspath("./third_party/blink/tools")) +sys.path.append(os.path.abspath("./")) +# Chromium check +NOT_CHROME_ERROR = 'You must be in the chromium src directory to run this command.' +try: + file = open('./DIR_METADATA', 'r') + if not 'project: "chromium"' in file.read(): + print(NOT_CHROME_ERROR) + exit() +except IOError: + print(NOT_CHROME_ERROR) + exit() + +from third_party.blink.tools.blinkpy.w3c.directory_owners_extractor import DirectoryOwnersExtractor +from third_party.blink.tools.blinkpy.common.host import Host + +# CONSTANTS +DIR_METADATA = 'DIR_METADATA' +COMMON_METADATA = 'COMMON_METADATA' +OWNERS = 'OWNERS' +TEST_NAME_REGEX = re.compile( + r"TEST(_[FP])?\(\s*'?([a-zA-Z][a-zA-Z0-9]*)'?,\s*'?([a-zA-Z][a-zA-Z0-9_]*)'?", + re.MULTILINE) +TEST_SUITE_REGEX = re.compile( + r'TEST_SUITE(_[FP])?\(\s*([a-zA-Z][a-zA-Z0-9]*),\s*([a-zA-Z][a-zA-Z0-9]*),', + re.MULTILINE) + +parser = argparse.ArgumentParser( + "Determines test suites for given directories and components") +parser.add_argument('-c', + '--components', + nargs='+', + # TODO: Adjust to buganizer once the + # coverage team updates the tool + help='A monorail component to collect suites for', + default=[]) +parser.add_argument( + '-d', + '--dirs', + nargs='*', + help='Directory to search through, at least one must be present', + default=['./']) +parser.add_argument('-i', + '--ignore_dir', + nargs='*', + help='Directories to ignore', + default=[]) +parser.add_argument('-o', + '--out_file', + help='The file to write the suites to.', + required=True) +parser.add_argument('-j', + '--jobs', + required=False, + help='The number of threads to allow', + type=int, + default=0) +args = parser.parse_args() + + +class ThreadManager(int): + def __init__(self, max_threads): + self.num_threads = 0 + self.max_threads = max_threads + self.lock = Lock() + + def _thread_wrapper(self, func, args): + func(*args) + with self.lock: + self.num_threads -= 1 + + def run(self, func, args): + if self.num_threads < self.max_threads: + thread = Thread(target=self._thread_wrapper, args=(func, args)) + with self.lock: + self.num_threads += 1 + thread.start() + return True + else: + return False + + def wait_until_threads_done(self): + while self.num_threads > 0: + time.sleep(0.1) + + +class TestFinder(argparse.Namespace): + def __init__(self, args): + self.host = Host() + self.component_map = dict() + self.dirs_with_tests = set() + self.disabled_tests = dict() + self.maybe_tests = dict() + self.total_disabled = 0 + self.total_maybe = 0 + self.dirs = args.dirs + self.comps = args.components + self.dir_thread_manager = ThreadManager(args.jobs * .75) + self.read_thread_manager = ThreadManager(args.jobs / 4) + self.out_file = args.out_file + + def is_hidden(self, path): + name = os.path.basename(os.path.abspath(path)) + return name.startswith('.') + + def is_output_dir(self, path): + name = os.path.basename(os.path.abspath(path)) + return name.startswith('out') + + def is_test_file(self, filepath): + if filepath.endswith('.py'): + return False + noext = os.path.splitext(os.path.abspath(filepath))[0] + name = os.path.basename(noext) + return name.endswith('test') + + def get_items_in_dir(self, path): + items_list = os.listdir(path) + files = list() + dirs = list() + for item in items_list: + item_path = os.path.abspath(os.path.join(path, item)) + if os.path.isfile(item_path): + files.append(item_path) + else: + dirs.append(item_path) + return [files, dirs] + + def get_component_for_dir(self, path, type): + # Python does something weird with hidden dirs. + # We don't care about those anyway. + if self.is_hidden(path): + return None + metadata_path = os.path.join(path, type) + extractor = DirectoryOwnersExtractor(Host()) + try: + return extractor.extract_component(metadata_path) + except KeyError: + return None + + def get_test_suites_for_file(self, filepath, suites): + try: + new_suites = set() + text = open(filepath, 'r').read() + relPath = os.path.relpath(filepath) + # Find regular tests + matches = re.findall(TEST_NAME_REGEX, text) + for m in matches: + new_suites.add(m[1]) + # Check for disabled and maybe tests + if m[2] != None and m[2].startswith('DISABLED'): + disabled = self.disabled_tests.get(relPath) + self.total_disabled+=1 + if disabled == None: + disabled = [] + self.disabled_tests[relPath] = disabled + disabled.append(m[1] + "." + m[2]) + elif m[2] != None and m[2].startswith('MAYBE'): + self.total_maybe += 1 + maybe = self.maybe_tests.get(relPath) + if maybe == None: + maybe = [] + self.maybe_tests[relPath] = maybe + maybe.append(m[1] + "." + m[2]) + # Find suites + matches = re.findall(TEST_SUITE_REGEX, text) + for m in matches: + new_suites.add(m[2]) + suites.extend(new_suites) + except IOError: + print('Failed to open ' + filepath) + return list() + + def get_test_suites_for_dir(self, dir, suites): + files, _ = self.get_items_in_dir(dir) + files = list(filter(lambda file: self.is_test_file(file), files)) + if files.__len__() > 0: + self.dirs_with_tests.add(os.path.relpath(dir)) + for file in files: + if not self.read_thread_manager.run(self.get_test_suites_for_file, + (file, suites)): + self.get_test_suites_for_file(file, suites) + + def start(self): + for dir in self.dirs: + self.build_component_map(dir, None) + self.dir_thread_manager.wait_until_threads_done() + self.save() + + def save(self): + with open(self.out_file, 'w') as outfile: + data = { + "components": self.component_map, + "directories": [*self.dirs_with_tests], + "disabled_tests": self.disabled_tests, + "maybe_tests": self.maybe_tests, + "total_disabled": self.total_disabled, + "total_maybe": self.total_maybe + } + json.dump(data, outfile, indent=2) + + def build_component_map(self, cur_dir, common_component): + # Normalize cur_dir + cur_dir = os.path.abspath(cur_dir) + # Get the component + component = self.get_component_for_dir(cur_dir, DIR_METADATA) + using_common_metadata = False + # If the component is in common metadata, it should pass through to sub dir. + if component == None and common_component == None: + component = self.get_component_for_dir(cur_dir, COMMON_METADATA) + using_common_metadata = True + if component != None: + allowed = self.comps.__len__() == 0 + for comp_glob in self.comps: + result = fnmatch.filter([component], comp_glob) + allowed = result.__len__() > 0 + if allowed: + break + if allowed: + tests_for_comp = self.component_map.get(component) + # If the component isn't in the map yet, add it + if tests_for_comp == None: + tests_for_comp = list() + self.component_map[component] = tests_for_comp + self.get_test_suites_for_dir(cur_dir, tests_for_comp) + # Even if the dir didn't have a component we still need to check it's subdirs. + _, sub_dirs = self.get_items_in_dir(cur_dir) + for sub_dir in sub_dirs: + # skip hidden directories + if not self.is_hidden(sub_dir) and not self.is_output_dir(sub_dir): + common_component_to_pass = component if using_common_metadata else common_component + if not self.dir_thread_manager.run(self.build_component_map, + (sub_dir, common_component_to_pass)): + print("didn't use thread for dir") + self.build_component_map(sub_dir, common_component_to_pass) + + +try: + finder = TestFinder(args) + finder.start() +except KeyboardInterrupt: + print('\nUser Interrupted') + exit()
diff --git a/tools/binary_size/libsupersize/viewer/static/dom.js b/tools/binary_size/libsupersize/viewer/static/dom.js index b781fdc5..c62e612 100644 --- a/tools/binary_size/libsupersize/viewer/static/dom.js +++ b/tools/binary_size/libsupersize/viewer/static/dom.js
@@ -137,11 +137,15 @@ this.divDiffStatusIcons = /** @type {!HTMLDivElement} */ (this.query('#div-diff-status-icons')); - /** @type {!HTMLTemplateElement} Template for groups in the tree. */ + /** @public {!HTMLDivElement} */ + this.divMetricsIcons = + /** @type {!HTMLDivElement} */ (this.query('#div-metrics-icons')); + + /** @type {!HTMLTemplateElement} Template for groups in the symbol tree. */ this.tmplSymbolTreeGroup = /** @type {!HTMLTemplateElement} */ ( this.query('#tmpl-symbol-tree-group')); - /** @type {!HTMLTemplateElement} Template for leaves in the tree. */ + /** @type {!HTMLTemplateElement} Template for leaves in the symbol tree. */ this.tmplSymbolTreeLeaf = /** @type {!HTMLTemplateElement} */ ( this.query('#tmpl-symbol-tree-leaf')); @@ -153,6 +157,22 @@ this.ulSymbolTree = /** @type {!HTMLUListElement} */ (this.query('#ul-symbol-tree')); + /** @type {!HTMLTemplateElement} Template for groups in the metrics tree. */ + this.tmplMetricsTreeGroup = /** @type {!HTMLTemplateElement} */ ( + this.query('#tmpl-metrics-tree-group')); + + /** @type {!HTMLTemplateElement} Template for leaves in the metrics tree. */ + this.tmplMetricsTreeLeaf = /** @type {!HTMLTemplateElement} */ ( + this.query('#tmpl-metrics-tree-leaf')); + + /** @public {!HTMLDivElement} */ + this.divMetricsView = + /** @type {!HTMLDivElement} */ (this.query('#div-metrics-view')); + + /** @type {!HTMLUListElement} */ + this.ulMetricsTree = + /** @type {!HTMLUListElement} */ (this.query('#ul-metrics-tree')); + /** @public {!HTMLDivElement} */ this.divNoSymbolsMsg = /** @type {!HTMLDivElement} */ (this.query('#div-no-symbols-msg'));
diff --git a/tools/binary_size/libsupersize/viewer/static/infocard.css b/tools/binary_size/libsupersize/viewer/static/infocard.css index 9ccc8a1..6014b17d63 100644 --- a/tools/binary_size/libsupersize/viewer/static/infocard.css +++ b/tools/binary_size/libsupersize/viewer/static/infocard.css
@@ -19,8 +19,8 @@ opacity: 0; transition: 0.3s ease transform, 0.3s ease opacity, 0.3s ease visibility; } -.tree-view:hover ~ .infocards, -.tree-view.focused ~ .infocards, +#main-tree-view:hover ~ .infocards, +#main-tree-view.focused ~ .infocards, .infocards:hover { visibility: visible; opacity: 1;
diff --git a/tools/binary_size/libsupersize/viewer/static/main.css b/tools/binary_size/libsupersize/viewer/static/main.css index 9cddb3c..c464679 100644 --- a/tools/binary_size/libsupersize/viewer/static/main.css +++ b/tools/binary_size/libsupersize/viewer/static/main.css
@@ -61,15 +61,16 @@ grid-area: options; } +.top-view { + margin: 0 auto; + max-width: 1200px; +} + .symbols { grid-area: symbols; padding: 0 48px; margin-bottom: 240px; } -.tree-view { - margin: 0 auto; - max-width: 1200px; -} .headline { color: #202124; @@ -281,16 +282,57 @@ word-break: break-word; } -.metadata { - margin: 0 auto; - max-width: 1200px; -} - +#div-metrics-view:not(.active), #div-metadata-view:not(.active), #pre-metadata-content:not(.active) { display: none; } +#div-metrics-view .node.leaf { + display: block; +} + +#div-metrics-view .node.leaf::before { + content: none; +} + +#div-metrics-view table { + border-collapse: collapse; + margin-left: 25px; +} + +#div-metrics-view table td { + border: 1px solid rgba(0,0,0,0.25); + min-width: 80px; +} + +#div-metrics-view table td.number { + text-align: right; +} + +#div-metrics-view table tr td { + background: #fff; +} + +#div-metrics-view table .positive td { + background: #fcc; +} + +#div-metrics-view table .negative td { + background: #dfd; +} + +#div-metrics-view table .positive .diff { + color: #f00; +} +#div-metrics-view table .positive .diff:before { + content: '+'; +} + +#div-metrics-view table .negative .diff { + color: #080; +} + #div-review-info{ font-size: 13px; }
diff --git a/tools/binary_size/libsupersize/viewer/static/shared.js b/tools/binary_size/libsupersize/viewer/static/shared.js index 428bfae..14f9a3f 100644 --- a/tools/binary_size/libsupersize/viewer/static/shared.js +++ b/tools/binary_size/libsupersize/viewer/static/shared.js
@@ -42,6 +42,34 @@ */ /** + * @typedef {Object} MetricsItem + * @property {string} name - Item name, used for UI and grouping for total. + * @property {number} value - Metrics value, can be bytes or count. + * @property {number|undefined} beforeValue - Optional value for "before". + */ + +/** + * @typedef {Object} MetricsTreeNode + * @property {string|undefined} name - The full name of the node, and is shown + * in the UI. + * @property {?MetricsTreeNode} parent - Parent tree node, null if this is a + * root node. + * @property {!Array<!MetricsTreeNode>|undefined} children - Child nodes. + * Non-existent or null indicates this is a leaf node. + * @property {!Array<!MetricsItem>|undefined} items - For leaf nodes only, a + * list of named values for a metric. Mutually exclusive with |liveItems|. + * @property {?function(function(string): boolean): !Array<!MetricsItem>| + * undefined} liveItems - For leaf nodes only, function to return a + * list of named values for a metric, taking a filtering function. To be + * included, the filter is eithe rnull, or needs to return true for names of + * all ancestor with |isFiltered| true. Mutually exclusive with |item|. + * @property {boolean|undefined} isFiltered - For group nodes only, whether + * filtering is applied to the node. + * @property {string|undefined} iconKey - For group nodes only, input for + * getMetricsIconTemplate() to retrieve icon. + */ + +/** * Stats about a node's descendants of a certain type. * @typedef {Object} TreeNodeChildStats * @property {number} size - Byte size. @@ -200,7 +228,7 @@ }; /** - * Throws error if |cond| is false. + * Throws error if |cond| is falsey. * @param {boolean} cond The condition to check. * @param {string=} msg Message on assert failure. */ @@ -210,13 +238,13 @@ } /** - * Throws error if |obj| is null; returns |obj| otherwise. - * @param {?Object} obj The condition to check. + * Throws error if |obj| is null or undefined; returns |obj| otherwise. + * @param {?Object} obj The (non-primitive) object to check. * @param {string=} msg Message on assert failure. * @return {!Object} */ function assertNotNull(obj, msg = 'Assert fail: Object is null.') { - if (!obj) + if (obj == null) // Using == to also include undefined. throw new Error(msg); return obj; } @@ -303,3 +331,27 @@ maximumFractionDigits: hi, }); } + +/** + * Combines multiple iterators (if non-null) into a single iterator. + * @param {...?Iterable<*>} itList + * @generator + */ +function* joinIter(...itList) { + for (const it of itList) { + if (it) { + for (const v of it) { + yield v; + } + } + } +} + +/** + * Returns a sorted list of disstinct strings taken from an iterator. + * @param {!Iterable<string>} it + * @return {!Array<string>} + */ +function uniquifyIterToString(it) { + return Array.from(new Set(it)).sort(); +}
diff --git a/tools/binary_size/libsupersize/viewer/static/state.js b/tools/binary_size/libsupersize/viewer/static/state.js index 056b2322..0c00b2d9 100644 --- a/tools/binary_size/libsupersize/viewer/static/state.js +++ b/tools/binary_size/libsupersize/viewer/static/state.js
@@ -294,6 +294,30 @@ } /** + * @return {?function(string): boolean} + * @public + */ + getFilter() { + const getRegExpOrNull = (s) => { + if (s) { + try { + return new RegExp(s); + } catch (err) { + } + } + return null; + }; + + const includeRE = getRegExpOrNull(this.stInclude.get()); + const excludeRE = getRegExpOrNull(this.stExclude.get()); + if (includeRE) { + return excludeRE ? (s) => includeRE.test(s) && !excludeRE.test(s) : + (s) => includeRE.test(s); + } + return excludeRE ? (s) => !excludeRE.test(s) : null; + } + + /** * @return {boolean} * @public */ @@ -456,38 +480,47 @@ } function _makeIconTemplateGetter() { - const getIcon = (q) => assertNotNull(g_el.divIcons.querySelector(q)); + const getSymbolIcon = (q) => assertNotNull(g_el.divIcons.querySelector(q)); /** * @type {{[type:string]: SVGSVGElement}} Icon elements * that correspond to each symbol type. */ const symbolIcons = { - D: getIcon('.foldericon'), - G: getIcon('.groupicon'), - J: getIcon('.javaclassicon'), - F: getIcon('.fileicon'), - b: getIcon('.bssicon'), - d: getIcon('.dataicon'), - r: getIcon('.readonlyicon'), - t: getIcon('.codeicon'), - R: getIcon('.relroicon'), - x: getIcon('.dexicon'), - m: getIcon('.dexmethodicon'), - p: getIcon('.localpakicon'), - P: getIcon('.nonlocalpakicon'), - o: getIcon('.othericon'), // used as default icon + D: getSymbolIcon('.foldericon'), + G: getSymbolIcon('.groupicon'), + J: getSymbolIcon('.javaclassicon'), + F: getSymbolIcon('.fileicon'), + b: getSymbolIcon('.bssicon'), + d: getSymbolIcon('.dataicon'), + r: getSymbolIcon('.readonlyicon'), + t: getSymbolIcon('.codeicon'), + R: getSymbolIcon('.relroicon'), + x: getSymbolIcon('.dexicon'), + m: getSymbolIcon('.dexmethodicon'), + p: getSymbolIcon('.localpakicon'), + P: getSymbolIcon('.nonlocalpakicon'), + o: getSymbolIcon('.othericon'), // used as default icon '*': null, }; - const getDiffStatusIcons = (q) => { + const getDiffStatusIcon = (q) => { return assertNotNull(g_el.divDiffStatusIcons.querySelector(q)); }; const statusIcons = { - added: getDiffStatusIcons('.addedicon'), - removed: getDiffStatusIcons('.removedicon'), - changed: getDiffStatusIcons('.changedicon'), - unchanged: getDiffStatusIcons('.unchangedicon'), + added: getDiffStatusIcon('.addedicon'), + removed: getDiffStatusIcon('.removedicon'), + changed: getDiffStatusIcon('.changedicon'), + unchanged: getDiffStatusIcon('.unchangedicon'), + }; + + const getMetricsIcon = (q) => { + return assertNotNull(g_el.divMetricsIcons.querySelector(q)) + }; + const metricsIcons = { + group: getSymbolIcon('.groupicon'), // Reuse. + file: getSymbolIcon('.fileicon'), // Reuse. + metrics: getMetricsIcon('.metricsicon'), }; /** @type {Map<string, {color:string, description:string}>} */ @@ -563,11 +596,20 @@ return statusIcons[key].cloneNode(true); } + /** + * @param {string} key + * @return {SVGSVGElement} + */ + function getMetricsIconTemplate(key) { + return metricsIcons[key].cloneNode(true); + } + return { getIconTemplate, getIconTemplateWithFill, getIconStyle, - getDiffStatusTemplate + getDiffStatusTemplate, + getMetricsIconTemplate, }; } @@ -661,7 +703,8 @@ getIconTemplate, getIconTemplateWithFill, getIconStyle, - getDiffStatusTemplate + getDiffStatusTemplate, + getMetricsIconTemplate, } = _makeIconTemplateGetter(); const {getSizeContents, setSizeClasses} = _makeSizeTextGetter(); _startListeners();
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-ui.js b/tools/binary_size/libsupersize/viewer/static/tree-ui.js index 924102a..d3f66f3 100644 --- a/tools/binary_size/libsupersize/viewer/static/tree-ui.js +++ b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
@@ -37,7 +37,7 @@ rootElt.getElementsByClassName('node')); /** - * @protected @const {WeakMap<HTMLElement, Readonly<NODE_DATA_TYPE>>} + * @protected @const {!WeakMap<HTMLElement, Readonly<NODE_DATA_TYPE>>} * Maps from UI nodes to data object to enable queries by event listeners * and other methods. */ @@ -157,7 +157,11 @@ async toggleGroupElement(event) { event.preventDefault(); - // See #tmpl-symbol-tree-group for the relation of these elements. + // Canonical structure: + // <li> <!-- |treeitem| --> + // <a class="node">...</a> <!-- |link| --> + // <ul>...</ul> <!-- |group| --> + // </li> const link = /** @type {!HTMLAnchorElement} */ (event.currentTarget); const treeitem = /** @type {!HTMLLIElement} */ (link.parentElement); const group = /** @type {!HTMLUListElement} */ (link.nextElementSibling); @@ -507,6 +511,122 @@ } } +/** + * Class to manage UI to display a few tree levels (for containers and files), + * with each leaf node displaying a table of metrics data. + * @extends {TreeUi<MetricsTreeNode>} + */ +class MetricsTreeUi extends TreeUi { + constructor() { + super(g_el.ulMetricsTree); + + /** @private {?function(string): boolean} */ + this.nameFilter = null; + + /** @private @const {function(!KeyboardEvent): *} */ + this.boundHandleKeyDown = this.handleKeyDown.bind(this); + } + + /** @public */ + updateFilter() { + this.nameFilter = state.getFilter(); + } + + /** + * @param {!MetricsTreeNode} nodeData + * @param {!HTMLTableElement} table + * @private + */ + populateMetricsTable(nodeData, table) { + const diffMode = state.getDiffMode(); + const items = nodeData.items ?? nodeData.liveItems(this.nameFilter); + if (items.length > 0) { + const headings = ['Name']; + headings.push(...(diffMode ? ['Before', 'After', 'Diff'] : ['Value'])) + const tr = document.createElement('tr'); + for (const t of headings) { + tr.appendChild(dom.textElement('th', t, '')); + } + table.appendChild(tr); + } + for (const item of items) { + const tr = document.createElement('tr'); + tr.appendChild(dom.textElement('td', item.name, '')); + if (diffMode) { + tr.appendChild( + dom.textElement('td', formatNumber(item.beforeValue), 'number')); + } + tr.appendChild(dom.textElement('td', formatNumber(item.value), 'number')); + if (diffMode) { + const delta = item.value - item.beforeValue; + if (delta !== 0) + tr.classList.add(delta < 0 ? 'negative' : 'positive'); + tr.appendChild( + dom.textElement('td', formatNumber(delta), 'number diff')); + } + table.appendChild(tr); + } + } + + /** @override @protected */ + makeGroupOrLeafFragment(nodeData) { + const isLeaf = !nodeData.children; + // Use different template depending on whether node is group or leaf. + const tmpl = isLeaf ? g_el.tmplMetricsTreeLeaf : g_el.tmplMetricsTreeGroup; + const fragment = document.importNode(tmpl.content, true); + const listItemElt = fragment.firstElementChild; + const nodeElt = + /** @type {HTMLAnchorElement} */ (listItemElt.firstElementChild); + + // Set the symbol name and hover text. + if (nodeData.name) { + const spanSymbolName = /** @type {HTMLSpanElement} */ ( + fragment.querySelector('.symbol-name')); + spanSymbolName.textContent = nodeData.name; + spanSymbolName.title = nodeData.name; + } + + if (isLeaf) + this.populateMetricsTable(nodeData, fragment.querySelector('table')); + if (nodeData.iconKey) { + // Insert type dependent SVG icon at the start of |nodeElt|. + const icon = getMetricsIconTemplate(nodeData.iconKey); + nodeElt.insertBefore(icon, nodeElt.firstElementChild); + } + + return {fragment, isLeaf}; + } + + /** @override @protected */ + async getGroupChildrenData(link) { + let data = this.uiNodeToData.get(link); + return data.children.filter( + ch => !ch.isFiltered || !this.nameFilter || this.nameFilter(ch.name)); + } + + /** + * @param {!KeyboardEvent} event + * @protected + */ + handleKeyDown(event) { + if (event.altKey || event.ctrlKey || event.metaKey) + return; + + /** @type {!TreeNodeElement} */ + const nodeElt = /** @type {!TreeNodeElement} */ (event.target); + /** @type {number} Index of this element in the node list */ + const focusIndex = Array.prototype.indexOf.call(this.liveNodeList, nodeElt); + + this.handleKeyNavigationCommon(event, nodeElt, focusIndex); + } + + init() { + super.init(); + + g_el.ulMetricsTree.addEventListener('keydown', this.boundHandleKeyDown); + } +} + { class ProgressBar { /** @param {!HTMLProgressElement} elt */ @@ -538,6 +658,13 @@ const _symbolTreeUi = new SymbolTreeUi(); _symbolTreeUi.init(); + /** @type {?MetricsTreeNode} */ + let _metricsRootData = null; + + /** @type {!MetricsTreeUi} */ + const _metricsTreeUi = new MetricsTreeUi(); + _metricsTreeUi.init(); + /** @param {TreeProgress} message */ function onProgressMessage(message) { const {error, percent} = message; @@ -563,6 +690,7 @@ document.body.classList.toggle('diff', Boolean(diffMode)); processBuildTreeResponse(message); + renderAndShowMetricsTree(metadata); setMetadataContent(metadata); g_el.divMetadataView.classList.toggle('active', true); setReviewInfo(metadata); @@ -650,6 +778,187 @@ } /** + * Extracts the underlying tree data for Metrics Tree rendering, and returns + * the root data node. + * @param {Object} metadata + * @return {!MetricsTreeNode} + */ + function extractMetricsTree(metadata) { + const EMPTY_OBJ = {}; + + const diffMode = state.getDiffMode(); + const containers = metadata?.size_file?.containers ?? []; + const beforeContainers = metadata?.before_size_file?.containers ?? []; + + const makeContainerMap = (curContainers) => { + const ret = new Map(); + for (const c of curContainers) { + ret.set(c.name, c); + } + return ret; + }; + const containerMap = makeContainerMap(containers); + const beforeContainerMap = makeContainerMap(beforeContainers); + + /** + * @param {string} name + * @param {?Array<!MetricsTreeNode>} children + * @param {string} iconKey + * @return !MetricsTreeNode + */ + const makeNode = (name, children, iconKey) => { + const node = /** @type {!MetricsTreeNode} */ ({name}); + if (children) + node.children = children; + if (iconKey) + node.iconKey = iconKey; + return node; + }; + + /** + * @param {!MetricsTreeNode} parent + * @param {!MetricsTreeNode} child + */ + const addChild = (parent, child) => { + parent.children.push(child); + child.parent = parent; + }; + + const containerNames = uniquifyIterToString( + joinIter(containerMap.keys(), beforeContainerMap.keys())); + const dexNodes = []; + + const rootNode = makeNode('Metrics', [], 'metrics'); + rootNode.parent = null; + + // Populate with containers -> files -> table. + for (const containerName of containerNames) { + const metricsByFile = + containerMap.get(containerName)?.metrics_by_file ?? EMPTY_OBJ; + const beforeMetricsByFile = + beforeContainerMap.get(containerName)?.metrics_by_file ?? EMPTY_OBJ; + const filenames = uniquifyIterToString(joinIter( + Object.keys(metricsByFile), Object.keys(beforeMetricsByFile))); + if (filenames.length === 0) + continue; + + const containerNode = makeNode(containerName, [], 'group'); + containerNode.isFiltered = true; + + for (const filename of filenames) { + const isDex = filename.endsWith('.dex'); + const metrics = metricsByFile[filename] ?? EMPTY_OBJ; + const beforeMetrics = beforeMetricsByFile[filename] ?? EMPTY_OBJ; + const metricNames = uniquifyIterToString( + joinIter(Object.keys(metrics), Object.keys(beforeMetrics))); + // |fileNode| has single |tableNode| child to enable UI show / hide. + const fileNode = makeNode(filename, [], 'file'); + const tableNode = makeNode('', null, null); // Leaf. + tableNode.items = []; + if (isDex) + dexNodes.push(tableNode); + for (const metricName of metricNames) { + const item = /** @type {!MetricsItem} */ ({}); + item.name = metricName; + item.value = metrics[metricName] ?? 0; + if (diffMode) + item.beforeValue = beforeMetrics[metricName] ?? 0; + tableNode.items.push(item); + } + addChild(fileNode, tableNode); + addChild(containerNode, fileNode); + } + addChild(rootNode, containerNode); + } + + // Add special node to compute totals. + if (dexNodes.length > 0) { + const totalNode = makeNode('(TOTAL)', [], 'metrics'); + const dexFileNode = makeNode('(DEX)', [], 'file'); + const tableNode = makeNode('', null, null); // Leaf. + + /** + * @param {!Map<string, !MetricsItem>} items + * @param {string} metricName + * @return {!MetricsItem} + */ + const getOrMakeMetricsItem = (items, metricName) => { + let ret = items.get(metricName); + if (!ret) { + ret = /** @type {!MetricsItem} */ ({name: metricName, value: 0}) + if (diffMode) { + ret.beforeValue = 0; + } + items.set(metricName, ret); + } + return ret; + }; + + /** + * @param {!MetricsTreeNode} node + * @param {function(string): boolean} nameFilter + * @return {boolean} + */ + const hasAncestorRejectedByFilter = (node, nameFilter) => { + if (nameFilter) { + for (; node; node = node.parent) { + if (node.isFiltered && !nameFilter(node.name)) + return true; + } + } + return false; + }; + + /** @param {function(string): boolean} nameFilter */ + tableNode.liveItems = (nameFilter) => { + const dstItems = /** @type {!Map<string, !MetricsItem>}*/ (new Map()); + for (const srcNode of dexNodes) { + // Skip if any ancestor with |isFiltered| fails |nameFilter|. + if (hasAncestorRejectedByFilter(srcNode, nameFilter)) + continue; + for (const srcItem of srcNode.items) { + const dstItem = getOrMakeMetricsItem(dstItems, srcItem.name); + dstItem.value += srcItem.value; + if (diffMode) + dstItem.beforeValue += srcItem.beforeValue; + } + } + return Array.from(dstItems.values()) + .sort((a, b) => a.name.localeCompare(b.name)); + }; + + addChild(dexFileNode, tableNode); + addChild(totalNode, dexFileNode); + addChild(rootNode, totalNode); + } + return rootNode; + } + + /** + * Extracts metrics data and renders the Metrics Tree. + * @param {?Object} metadata Used to compute Metrics Tree data. If null, reuse + * cached data. Otherwise new data is saved to cache. + */ + function renderAndShowMetricsTree(metadata) { + if (metadata) + _metricsRootData = extractMetricsTree(metadata); + _metricsTreeUi.updateFilter(); + + /** @type {?DocumentFragment} */ + let rootElement = null; + if (_metricsRootData) { + rootElement = _metricsTreeUi.makeNodeElement(_metricsRootData); + /** @type {!HTMLAnchorElement} */ + const link = rootElement.querySelector('.node'); + // Leave root UI node collapsed, but reachable by tab. + link.tabIndex = 0; + } + + dom.replace(g_el.ulMetricsTree, rootElement); + g_el.divMetricsView.classList.toggle('active', true); + } + + /** * Modifies metadata in-place so they render better. * @param {Object} metadata */ @@ -724,6 +1033,7 @@ _progress.setValue(0); const message = await window.supersize.worker.buildTree(); processBuildTreeResponse(message); + renderAndShowMetricsTree(null); } g_el.fileUpload.addEventListener('change', async (event) => {
diff --git a/tools/binary_size/libsupersize/viewer/static/viewer.html b/tools/binary_size/libsupersize/viewer/static/viewer.html index bdea245..b8e52f2 100644 --- a/tools/binary_size/libsupersize/viewer/static/viewer.html +++ b/tools/binary_size/libsupersize/viewer/static/viewer.html
@@ -415,7 +415,13 @@ <title>Unchanged</title> </svg> </div> - <!-- Template for tree groups and leaves --> + <div hidden id="div-metrics-icons"> + <svg class="icon metricsicon" height="24" width="24" fill="#716f71"> + <title>Metrics</title> + <path d="M9.5 21v-18h4v18ZM2 21v-7h4v7ZM17 21v-12h4v12Z"/> + </svg> + </div> + <!-- Templates for symbol tree groups and leaves --> <template id="tmpl-symbol-tree-group"> <li role="treeitem" aria-expanded="false" aria-describedby="div-infocard-artifact"> @@ -434,8 +440,8 @@ </span> </li> </template> - <!-- Tree view --> - <main class="tree-view"> + <!-- Tree View --> + <main id="main-tree-view" class="top-view"> <header class="tree-header"> <span class="subtitle">Name</span> <span id="span-size-header" class="subtitle">Size</span> @@ -447,8 +453,35 @@ <div id="div-no-symbols-msg" style="display:none"> This diff contains no symbols (no sizes changed). </div> - <!-- Metadata Node --> - <div id="div-metadata-view" class="metadata" + <!-- Templates for metrics tree groups and leaves --> + <template id="tmpl-metrics-tree-group"> + <li role="treeitem" aria-expanded="false"> + <a class="node" href="#" tabindex="-1" role="presentation"> + <span class="symbol-name"></span> + </a> + <ul role="group"></ul> + </li> + </template> + <template id="tmpl-metrics-tree-leaf"> + <li role="treeitem"> + <span class="node leaf"> + <table></table> + </span> + </li> + </template> + <!-- Metrics View --> + <div id="div-metrics-view" class="top-view"> + <ul id="ul-metrics-tree" class="tree" role="tree" + aria-labelledby="h1-headline"> + <li> + <a class="node" tabindex="0" role="presentation"> + <span class="metadata-symbol-name">Metrics</span> + </a> + </li> + </ul> + </div> + <!-- Metadata View --> + <div id="div-metadata-view" class="top-view" title="Metadata from .size/.sizediff file"> <a class="node" tabindex="0" role="presentation"> <svg width="24" height="24" viewBox="0 0 24 24" @@ -460,7 +493,7 @@ <span class="metadata-symbol-name">Metadata</span> </a> </div> - <pre id="pre-metadata-content" class="metadata"></pre> + <pre id="pre-metadata-content" class="top-view"></pre> <!-- Symbol and artifact breakdown cards --> <link href="infocard.css" rel="stylesheet"> <div class="infocards">
diff --git a/tools/cast3p/runtime.version b/tools/cast3p/runtime.version index 18bc715..add67a2 100644 --- a/tools/cast3p/runtime.version +++ b/tools/cast3p/runtime.version
@@ -1 +1 @@ -344773 +345874
diff --git a/tools/fuchsia/upload_webengine_build.py b/tools/fuchsia/upload_webengine_build.py index 5243a23c..0c894c8 100755 --- a/tools/fuchsia/upload_webengine_build.py +++ b/tools/fuchsia/upload_webengine_build.py
@@ -16,7 +16,7 @@ import sys WEB_ENGINE_TARGETS = [ - 'cast_runner_pkg', 'web_engine_shell_pkg', 'web_runner_pkg', + 'cast_runner_pkg', 'web_engine_shell_pkg', 'performance_web_engine_test_suite' ]
diff --git a/tools/gdb/.style.yapf b/tools/gdb/.style.yapf index de0c6a70..fdd0723 100644 --- a/tools/gdb/.style.yapf +++ b/tools/gdb/.style.yapf
@@ -1,2 +1,2 @@ [style] -based_on_style = chromium +based_on_style = yapf
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index d8a54f2..c6fbd472 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -630,6 +630,10 @@ "META": {"sizes": {"includes": [10]}}, "includes": [3030], }, + "<(SHARED_INTERMEDIATE_DIR)/ash/webui/common/resources/resources.grd": { + "META": {"sizes": {"includes": [400]}}, + "includes": [3035], + }, "ash/webui/help_app_ui/resources/help_app_resources.grd": { "includes": [3040], },
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index fa1fc7f..bef724bc 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -254,8 +254,8 @@ 'Dawn Linux x64 Builder': 'dawn_tests_with_desktop_gl_release_trybot_reclient', 'Dawn Linux x64 DEPS Builder': 'dawn_tests_with_desktop_gl_release_trybot_reclient', - 'Dawn Mac x64 Builder': 'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient', - 'Dawn Mac x64 DEPS Builder': 'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient', + 'Dawn Mac x64 Builder': 'dawn_tests_release_bot_dcheck_always_on_reclient', + 'Dawn Mac x64 DEPS Builder': 'dawn_tests_release_bot_dcheck_always_on_reclient', 'Dawn Win10 x64 ASAN Release': 'dawn_tests_asan_release_bot_dcheck_always_on_reclient', 'Dawn Win10 x64 Builder': 'dawn_tests_release_bot_dcheck_always_on_reclient', @@ -1082,7 +1082,6 @@ 'chromeos-amd64-generic-cfi-thin-lto-rel': 'chromeos_amd64-generic_cfi_thin_lto_reclient', 'chromeos-amd64-generic-dbg': 'chromeos_amd64-generic_dbg_reclient', 'chromeos-amd64-generic-rel': 'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized_dchecks_reclient', - 'chromeos-amd64-generic-rel-rts': 'chromeos_amd64-generic_use_fake_dbus_clients', 'chromeos-arm-generic-dbg': 'chromeos_arm-generic_dbg_try_reclient', 'chromeos-arm-generic-rel': 'chromeos_arm-generic_dcheck_always_on_reclient', 'chromeos-arm64-generic-rel': 'chromeos_arm64-generic_dchecks_reclient', @@ -1123,9 +1122,9 @@ 'android-dawn-arm-rel': 'dawn_tests_android_release_trybot', 'dawn-android-arm-deps-rel': 'dawn_tests_android_release_trybot', 'dawn-linux-x64-deps-rel': 'dawn_tests_with_desktop_gl_release_trybot_reclient', - 'dawn-mac-x64-deps-rel': 'dawn_tests_release_trybot_alloc_none_reclient', - 'dawn-try-mac-amd-exp': 'dawn_tests_release_trybot_alloc_none', - 'dawn-try-mac-intel-exp': 'dawn_tests_release_trybot_alloc_none', + 'dawn-mac-x64-deps-rel': 'dawn_tests_release_trybot_reclient', + 'dawn-try-mac-amd-exp': 'dawn_tests_release_trybot', + 'dawn-try-mac-intel-exp': 'dawn_tests_release_trybot', 'dawn-try-win-x64-intel-exp': 'dawn_tests_release_trybot_reclient', 'dawn-try-win-x86-intel-exp': 'dawn_tests_release_trybot_x86_reclient', 'dawn-try-win10-x64-asan-rel': 'dawn_tests_asan_release_trybot_reclient', @@ -1133,7 +1132,7 @@ 'dawn-win10-x64-deps-rel': 'dawn_tests_release_trybot_reclient', 'dawn-win10-x86-deps-rel': 'dawn_tests_release_trybot_x86_reclient', 'linux-dawn-rel': 'dawn_tests_with_desktop_gl_release_trybot_reclient', - 'mac-dawn-rel': 'dawn_tests_release_trybot_alloc_none', + 'mac-dawn-rel': 'dawn_tests_release_trybot', 'win-dawn-rel': 'dawn_tests_release_trybot_reclient', }, @@ -2026,10 +2025,6 @@ 'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'release', 'is_skylab', ], - 'chromeos_amd64-generic_use_fake_dbus_clients':[ - 'chromeos_amd64-generic', 'use_fake_dbus_clients', 'also_build_lacros_chrome_for_architecture_amd64', - ], - 'chromeos_amd64-generic_use_fake_dbus_clients_goma':[ 'chromeos_amd64-generic_goma', 'use_fake_dbus_clients', 'also_build_lacros_chrome_for_architecture_amd64', ], @@ -2428,12 +2423,6 @@ 'dawn_tests', 'asan', 'release_trybot_reclient', ], - # https://crbug.com/dawn/1200: temporarily avoid using partition alloc - # while we investigate a crash in the mac AMD shader compiler. - 'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient': [ - 'dawn_tests', 'release_trybot_minimal_symbols_reclient', 'padisabled', - ], - 'dawn_tests_release_bot_dcheck_always_on_reclient': [ 'dawn_tests', 'release_trybot_minimal_symbols_reclient', ], @@ -2442,19 +2431,10 @@ 'dawn_tests', 'release_trybot_minimal_symbols_reclient', 'x86', ], - # https://crbug.com/dawn/1200: temporarily avoid using partition alloc - # while we investigate a crash in the mac AMD shader compiler. - 'dawn_tests_release_trybot_alloc_none': [ - 'dawn_tests', 'release_trybot', 'padisabled', + 'dawn_tests_release_trybot': [ + 'dawn_tests', 'release_trybot', ], - # https://crbug.com/dawn/1200: temporarily avoid using partition alloc - # while we investigate a crash in the mac AMD shader compiler. - 'dawn_tests_release_trybot_alloc_none_reclient': [ - 'dawn_tests', 'release_trybot_reclient', 'padisabled', - ], - - 'dawn_tests_release_trybot_reclient': [ 'dawn_tests', 'release_trybot_reclient', ], @@ -3908,10 +3888,6 @@ 'gn_args': 'target_os="chromeos"', }, - 'chromeos_amd64-generic': { - 'mixins': ['chromeos_device', 'amd64-generic',] - }, - 'chromeos_amd64-generic-crostoolchain': { 'mixins': ['chromeos_device', 'amd64-generic-crostoolchain',] }, @@ -4492,12 +4468,6 @@ 'gn_args': 'ozone_platform_x11=false' }, - # https://crbug.com/dawn/1200: Used to disable partition alloc while we - # investigate a crash in the mac AMD shader compiler. - 'padisabled': { - 'gn_args': 'use_partition_alloc_as_malloc=false enable_backup_ref_ptr_support=false enable_mte_checked_ptr_support=false', - }, - # Used to pass the list of files to instrument for coverage to the compile # wrapper. See: # https://cs.chromium.org/chromium/build/scripts/slave/recipe_modules/code_coverage/api.py
diff --git a/tools/mb/mb_config_expectations/chromium.dawn.json b/tools/mb/mb_config_expectations/chromium.dawn.json index 4eaaf60..21938e8b 100644 --- a/tools/mb/mb_config_expectations/chromium.dawn.json +++ b/tools/mb/mb_config_expectations/chromium.dawn.json
@@ -55,13 +55,10 @@ "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 1, "use_dawn": true, - "use_partition_alloc_as_malloc": false, "use_remoteexec": true } }, @@ -69,13 +66,10 @@ "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 1, "use_dawn": true, - "use_partition_alloc_as_malloc": false, "use_remoteexec": true } },
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json index a7f42a9..efd14c2 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
@@ -33,17 +33,6 @@ "use_remoteexec": true } }, - "chromeos-amd64-generic-rel-rts": { - "args_file": "//build/args/chromeos/amd64-generic.gni", - "gn_args": { - "also_build_lacros_chrome_for_architecture": "amd64", - "dcheck_always_on": false, - "is_chromeos_device": true, - "ozone_platform_headless": true, - "use_goma": true, - "use_real_dbus_clients": false - } - }, "chromeos-arm-generic-dbg": { "args_file": "//build/args/chromeos/arm-generic.gni", "gn_args": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json b/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json index b64ba9d..72c04dc 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json
@@ -43,13 +43,10 @@ "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 0, "use_dawn": true, - "use_partition_alloc_as_malloc": false, "use_remoteexec": true } }, @@ -57,28 +54,22 @@ "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 0, "use_dawn": true, - "use_goma": true, - "use_partition_alloc_as_malloc": false + "use_goma": true } }, "dawn-try-mac-intel-exp": { "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 0, "use_dawn": true, - "use_goma": true, - "use_partition_alloc_as_malloc": false + "use_goma": true } }, "dawn-try-win-x64-intel-exp": { @@ -167,14 +158,11 @@ "gn_args": { "dawn_enable_opengles": true, "dcheck_always_on": true, - "enable_backup_ref_ptr_support": false, - "enable_mte_checked_ptr_support": false, "is_component_build": false, "is_debug": false, "symbol_level": 0, "use_dawn": true, - "use_goma": true, - "use_partition_alloc_as_malloc": false + "use_goma": true } }, "win-dawn-rel": {
diff --git a/tools/md_browser/md_browser.py b/tools/md_browser/md_browser.py index a7b3058..a0dfe46 100755 --- a/tools/md_browser/md_browser.py +++ b/tools/md_browser/md_browser.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env vpython3 # 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. @@ -20,12 +20,10 @@ import webbrowser from xml.etree import ElementTree +import markdown THIS_DIR = os.path.realpath(os.path.dirname(__file__)) SRC_DIR = os.path.dirname(os.path.dirname(THIS_DIR)) -sys.path.insert(0, os.path.join(SRC_DIR, 'third_party', 'Python-Markdown')) -import markdown - def main(argv): parser = argparse.ArgumentParser(prog='md_browser')
diff --git a/tools/memory/partition_allocator/inspect_utils.cc b/tools/memory/partition_allocator/inspect_utils.cc index b50bd73..0c66eca 100644 --- a/tools/memory/partition_allocator/inspect_utils.cc +++ b/tools/memory/partition_allocator/inspect_utils.cc
@@ -6,7 +6,6 @@ #include <sys/mman.h> -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/thread_cache.h" #include "base/check_op.h" #include "base/debug/proc_maps_linux.h"
diff --git a/tools/memory/partition_allocator/inspect_utils_linux.cc b/tools/memory/partition_allocator/inspect_utils_linux.cc index 7afa2cc..28c132c3 100644 --- a/tools/memory/partition_allocator/inspect_utils_linux.cc +++ b/tools/memory/partition_allocator/inspect_utils_linux.cc
@@ -6,7 +6,6 @@ #include <sys/mman.h> -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/thread_cache.h" #include "base/check_op.h" #include "base/debug/proc_maps_linux.h"
diff --git a/tools/memory/partition_allocator/inspect_utils_mac.cc b/tools/memory/partition_allocator/inspect_utils_mac.cc index d43b31a3..a3b8ed2 100644 --- a/tools/memory/partition_allocator/inspect_utils_mac.cc +++ b/tools/memory/partition_allocator/inspect_utils_mac.cc
@@ -9,7 +9,6 @@ #include <mach/mach_vm.h> #include <sys/mman.h> -#include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h" #include "base/allocator/partition_allocator/thread_cache.h" #include "base/check_op.h" #include "base/debug/proc_maps_linux.h"
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index d6b091a..cc73fc5 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -11865,6 +11865,32 @@ </description> </action> +<action name="IOSBookmarksEditorClosedWithSwipeDown"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + Recorded when the user closes bookmark editor by swiping down. iOS-only. + </description> +</action> + +<action name="IOSBookmarksFolderChooserClosedWithSwipeDown"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + Recorded when the user closes bookmark folder chooser by swiping down. + iOS-only. + </description> +</action> + +<action name="IOSBookmarksFolderEditorClosedWithSwipeDown"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + Recorded when the user closes bookmark folder editor by swiping down. + iOS-only. + </description> +</action> + <action name="IOSClearBrowsingDataCloseWithSwipe"> <owner>edchin@chromium.org</owner> <owner>gambard@chromium.org</owner> @@ -18002,6 +18028,12 @@ </description> </action> +<action name="MobileBookmarkManagerAddedBookmarkUndone"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>The user undid added bookmark on iOS only.</description> +</action> + <action name="MobileBookmarkManagerClose"> <owner>twellington@google.com</owner> <owner>sczs@chromium.org</owner> @@ -18020,6 +18052,12 @@ </description> </action> +<action name="MobileBookmarkManagerDeletedEntryUndone"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>The user undid bookmark deletion on iOS only.</description> +</action> + <action name="MobileBookmarkManagerDragReorder"> <owner>jhimawan@google.com</owner> <owner>twellington@google.com</owner> @@ -18033,7 +18071,8 @@ <owner>twellington@google.com</owner> <owner>clank-app-team@google.com</owner> <description> - Recorded when a user edits a bookmark in the Android bookmark manager. + Recorded when a user edits a bookmark in bookmark manager, on iOS or + Android. </description> </action> @@ -18041,7 +18080,7 @@ <owner>twellington@google.com</owner> <owner>clank-app-team@google.com</owner> <description> - Recorded when a user edits a folder in the Android bookmark manager. + Recorded when a user edits a folder in bookmark manager, on iOS or Android. </description> </action> @@ -18115,10 +18154,16 @@ <owner>clank-app-team@google.com</owner> <description> Recorded when a user moves all selected bookmark items to a new folder in - the Android bookmark manager. + bookmark manager, on iOS or Android. </description> </action> +<action name="MobileBookmarkManagerMoveToFolderUndone"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>The user undid bookmark move on iOS only.</description> +</action> + <action name="MobileBookmarkManagerMoveUp"> <owner>jhimawan@google.com</owner> <owner>twellington@google.com</owner> @@ -18145,11 +18190,19 @@ </description> </action> +<action name="MobileBookmarkManagerOpenedBookmarkEditorFromSnackbar"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user opened the bookmark editor using the snackbar. + </description> +</action> + <action name="MobileBookmarkManagerOpenFolder"> <owner>twellington@google.com</owner> <owner>clank-app-team@google.com</owner> <description> - Recorded when a user opens a folder in the Android bookmark manager. + Recorded when a user opens a folder on iOS and Android. </description> </action> @@ -18197,6 +18250,92 @@ </description> </action> +<action name="MobileBookmarkManagerUpdatedBookmarkUndone"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>The user undid bookmark update on iOS only.</description> +</action> + +<action name="MobileBookmarksEditorCanceled"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user canceled the bookmark editor view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksEditorDeletedBookmark"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user deleted the bookmark in the bookmark editor view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksEditorOpenedFolderChooser"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user opened the folder chooser in the bookmark editor view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksEditorSaved"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>The user saved the bookmark editor view. iOS-only.</description> +</action> + +<action name="MobileBookmarksFolderChooserCanceled"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user canceled the bookmark folder chooser view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksFolderChooserDone"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user confirmed the bookmark folder chooser view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksFolderEditorCanceled"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user canceled the bookmark folder editor view. iOS-only. + </description> +</action> + +<action name="MobileBookmarksFolderEditorDeletedFolder"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user deleted the folder while in the bookmark folder editor view. + iOS-only. + </description> +</action> + +<action name="MobileBookmarksFolderEditorOpenedFolderChooser"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user opened the folder chooser in the bookmark folder editor view. + iOS-only. + </description> +</action> + +<action name="MobileBookmarksFolderEditorSaved"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + The user confirmed the bookmark folder editor view. iOS-only. + </description> +</action> + <action name="MobileBottomToolbarHomeButton"> <obsolete>Removed as of 2020/09/09.</obsolete> <owner>mdjones@chromium.org</owner> @@ -18767,7 +18906,7 @@ <action name="MobileFreUMALinkTapped"> <owner>arthurmilchior@chromium.org</owner> - <owner>jlebel@google.com</owner> + <owner>jlebel@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <description> User tapped on the UMA link on the first run welcome view. This metric is @@ -20950,6 +21089,15 @@ </description> </action> +<action name="MobileTabGridAddedMultipleNewBookmarks"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + User added multiple new bookmarks base on the selected tabs, in the iOS tab + grid. It is possible to have one tab selected. + </description> +</action> + <action name="MobileTabGridBeganReordering"> <owner>edchin@chromium.org</owner> <owner>marq@chromium.org</owner> @@ -21119,6 +21267,20 @@ <description>User moves from a Tab to an existing other Tab.</description> </action> +<action name="MobileTabGridOpenedBookmarkEditorForExistingBookmark"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description> + User edited an existing bookmark, in the iOS tab grid. + </description> +</action> + +<action name="MobileTabGridOpenedBookmarkEditorForNewBookmark"> + <owner>jlebel@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <description>User adds one new bookmark, in the iOS tab grid.</description> +</action> + <action name="MobileTabGridOpenIncognitoTab"> <owner>edchin@chromium.org</owner> <owner>marq@chromium.org</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 64205946..cf57780 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -1388,14 +1388,6 @@ <int value="7" label="Picture in picture"/> </enum> -<enum name="ActivityTrackerAnalyzerCreationError"> - <int value="0" label="Invalid memory mapped file"/> - <int value="1" label="PMA bad file"/> - <int value="2" label="PMA uninitialized"/> - <int value="3" label="PMA deleted"/> - <int value="4" label="PMA corrupt"/> -</enum> - <enum name="ActivityTrackerCollectInitStatus"> <int value="0" label="Success"/> <int value="1" label="Unknown directory"/> @@ -3439,27 +3431,6 @@ <int value="26" label="LAUNCH_SOURCE_REPARENTING"/> </enum> -<enum name="AppleScriptCommandEvents"> - <int value="0" label="Tab Close"/> - <int value="1" label="Tab Copy"/> - <int value="2" label="Tab Cut"/> - <int value="3" label="Tab Execute Javascript"/> - <int value="4" label="Tab Go Back"/> - <int value="5" label="Tab Go Forward"/> - <int value="6" label="Tab Paste"/> - <int value="7" label="Tab Print"/> - <int value="8" label="Tab Redo"/> - <int value="9" label="Tab Reload"/> - <int value="10" label="Tab Save"/> - <int value="11" label="Tab Select All"/> - <int value="12" label="Tab Stop"/> - <int value="13" label="Tab Undo"/> - <int value="14" label="Tab View Source"/> - <int value="15" label="Window Close"/> - <int value="16" label="Window Enter Presentation Mode"/> - <int value="17" label="Window Exit Presentation Mode"/> -</enum> - <enum name="AppLifecycleEvent"> <int value="0" label="Enter Foreground"/> <int value="1" label="Enter Background"/> @@ -12366,11 +12337,6 @@ <int value="1" label="Force CSD-P ping request"/> </enum> -<enum name="BooleanForeground"> - <int value="0" label="Background"/> - <int value="1" label="Foreground"/> -</enum> - <enum name="BooleanForegroundNotification"> <int value="0" label="Background Notification"/> <int value="1" label="Foreground Notification"/> @@ -17547,6 +17513,17 @@ <int value="8" label="REQUEST_JOB_FETCH"/> </enum> +<enum name="ClusterFilterReason"> + <int value="0" label="Not filtered"/> + <int value="1" label="Not enough visits with images"/> + <int value="2" label="Not a match for the chosen categories"/> + <int value="3" label="Not search initiated"/> + <int value="4" label="No related searches"/> + <int value="5" label="Too many noisy/mundane visits"/> + <int value="6" label="Only contained a single visit"/> + <int value="7" label="Contains content that should not be visible"/> +</enum> + <enum name="CoalescePotentialPackets"> <int value="0" label="No Advantage"/> <int value="1" label="Header packets Only"/> @@ -47365,15 +47342,6 @@ <int value="7" label="Unknown error"/> </enum> -<enum name="GCMConnectionResetReason"> - <int value="0" label="Login failure"/> - <int value="1" label="Close command"/> - <int value="2" label="Heartbeat failure"/> - <int value="3" label="Socket failure"/> - <int value="4" label="Network change"/> - <int value="5" label="New heartbeat interval"/> -</enum> - <enum name="GCMDecryptionResult"> <int value="0" label="Success (message unencrypted)"/> <int value="1" label="Success (message decrypted per draft 03)"/> @@ -47397,11 +47365,6 @@ <int value="3" label="Failure (unable to encrypt using AES-GCM)"/> </enum> -<enum name="GCMEndpoints"> - <int value="0" label="mtalk.google.com:5228"/> - <int value="1" label="mtalk.google.com:443"/> -</enum> - <enum name="GCMInvalidationsIncomingMessageStatus"> <obsolete> Deprecated 2020-02, no longer used. @@ -58219,6 +58182,7 @@ <int value="-2041091005" label="OmniboxDomainSuggestions:enabled"/> <int value="-2040471724" label="CrOSComponent:disabled"/> <int value="-2040360427" label="DesktopScreenshots:disabled"/> + <int value="-2040154722" label="TimeOfDayScreenSaver:enabled"/> <int value="-2040115518" label="load-media-router-component-extension"/> <int value="-2039971160" label="UseNAT64ForIPv4Literal:enabled"/> <int value="-2039439354" @@ -58832,6 +58796,8 @@ <int value="-1704472714" label="UseMessagesGoogleComDomain:disabled"/> <int value="-1704022650" label="EnableDangerousDownloadDialog:enabled"/> <int value="-1703709912" label="enable-new-ntp"/> + <int value="-1703479539" + label="InternalServerSideSpeechRecognition:disabled"/> <int value="-1703308540" label="disable-webaudio"/> <int value="-1701123067" label="ShowManagedUi:enabled"/> <int value="-1700764114" label="HelpAppBackgroundPage:enabled"/> @@ -59758,6 +59724,7 @@ <int value="-1209720026" label="AppMenuMobileSiteOption:disabled"/> <int value="-1208501269" label="AutofillScanThemeDialog:enabled"/> <int value="-1208044478" label="InheritNativeThemeFromParentWidget:enabled"/> + <int value="-1207393499" label="ExtensionWebFileHandlers:disabled"/> <int value="-1206875404" label="EnableIncognitoWindowCounter:enabled"/> <int value="-1206698676" label="MacV2Sandbox:disabled"/> <int value="-1206524306" label="EnableAuraTooltipsOnWindows:disabled"/> @@ -59886,6 +59853,7 @@ <int value="-1142034548" label="BuiltInModuleKvStorage:enabled"/> <int value="-1141780291" label="DisplayChangeModal:disabled"/> <int value="-1140923360" label="DeprecateAssistantStylusFeatures:disabled"/> + <int value="-1140212005" label="ExtensionWebFileHandlers:enabled"/> <int value="-1138851579" label="QuerySearchBurnInPeriod:disabled"/> <int value="-1137745598" label="PhoneHubNudge:disabled"/> <int value="-1137696948" label="enable-chromeos-account-manager"/> @@ -59915,6 +59883,7 @@ <int value="-1122853453" label="LazyImageLoading:enabled"/> <int value="-1122458028" label="UnifiedMediaView:enabled"/> <int value="-1121931029" label="DownloadsForeground:enabled"/> + <int value="-1120594059" label="PowerBookmarkBackend:enabled"/> <int value="-1120188661" label="PolicyLogsPageAndroid:enabled"/> <int value="-1119700637" label="ui-disable-partial-swap"/> <int value="-1119552494" label="SyncTrustedVaultPassphraseRecovery:disabled"/> @@ -61493,6 +61462,7 @@ <int value="-222282965" label="disable_idle_sockets_close_on_memory_pressure:enabled"/> <int value="-221649438" label="AllowTouchpadHapticClickSettings:disabled"/> + <int value="-220829663" label="TimeOfDayScreenSaver:disabled"/> <int value="-220599034" label="UsePdfCompositorServiceForPrint:enabled"/> <int value="-220298483" label="ImeOptionsInSettings:enabled"/> <int value="-218843425" label="auto-framing-override"/> @@ -61701,6 +61671,7 @@ <int value="-97145978" label="DesktopPWAsStayInWindow:enabled"/> <int value="-96820962" label="ExperimentalAccessibilitySelectToSpeakVoiceSwitching:enabled"/> + <int value="-94535722" label="TimeOfDayWallpaper:enabled"/> <int value="-94335249" label="UseAAudioDriver:enabled"/> <int value="-93619449" label="video-tutorials-instant-fetch"/> <int value="-92116820" label="InlineUpdateFlow:enabled"/> @@ -62538,6 +62509,7 @@ <int value="365068212" label="PiexWasm:disabled"/> <int value="365467768" label="prefetch-search-results"/> <int value="365737168" label="SingleTouchSelect:disabled"/> + <int value="366860338" label="InternalServerSideSpeechRecognition:enabled"/> <int value="367063319" label="PasswordImport:disabled"/> <int value="368224960" label="FedCmRpContext:disabled"/> <int value="368854020" label="ash-screen-rotation-animation"/> @@ -63022,6 +62994,7 @@ <int value="656864700" label="FillOnAccountSelectHttp:disabled"/> <int value="657832926" label="SwipeToMoveCursor:enabled"/> <int value="658127191" label="ReadAnything:enabled"/> + <int value="658725396" label="PowerBookmarkBackend:disabled"/> <int value="658983252" label="enable-features"/> <int value="659051425" label="AdaptiveButtonInTopToolbarCustomizationV2:disabled"/> @@ -63736,6 +63709,7 @@ <int value="1063909131" label="CrOSDspBasedAgcAllowed:disabled"/> <int value="1064288458" label="OfflineRecentPages:enabled"/> <int value="1064317648" label="UseMojoVideoDecoderForPepper:disabled"/> + <int value="1065347448" label="CrOSLateBootAudioAPNoiseCancellation:enabled"/> <int value="1065451331" label="NtpRealboxPedals:disabled"/> <int value="1065481614" label="SystemEmojiPickerGIFSupport:disabled"/> <int value="1065547630" label="EnableInputNoiseCancellationUi:disabled"/> @@ -64641,6 +64615,7 @@ <int value="1586251544" label="VoiceButtonInTopToolbar:disabled"/> <int value="1586476635" label="LargeFaviconFromGoogle:enabled"/> <int value="1587521886" label="SSLCommittedInterstitials:enabled"/> + <int value="1587972722" label="TimeOfDayWallpaper:disabled"/> <int value="1588716465" label="CrostiniUseLxd4:disabled"/> <int value="1589341623" label="disable-easy-unlock"/> <int value="1590278995" @@ -65350,6 +65325,8 @@ <int value="1964816410" label="AndroidPayIntegrationV2:enabled"/> <int value="1965055310" label="SyncSetupFriendlySettings:enabled"/> <int value="1965148406" label="AssistMultiWordLacrosSupport:disabled"/> + <int value="1965526499" + label="CrOSLateBootAudioAPNoiseCancellation:disabled"/> <int value="1965534355" label="conversions-debug-mode"/> <int value="1965976546" label="NewOverviewAnimations:disabled"/> <int value="1966730288" label="disable-threaded-compositing"/> @@ -70380,6 +70357,7 @@ <int value="2" label="Accepted scheme (eg. https)"/> <int value="3" label="Intent scheme"/> <int value="4" label="MDoc scheme"/> + <int value="5" label="openid4vp"/> </enum> <enum name="NavigationIsGuest"> @@ -87829,6 +87807,20 @@ <int value="9" label="Laugh Cry"/> </enum> +<enum name="ReadAnythingLetterSpacing"> + <int value="0" label="Tight (Deprecated)"/> + <int value="1" label="Standard"/> + <int value="2" label="Wide"/> + <int value="3" label="Very Wide"/> +</enum> + +<enum name="ReadAnythingLineSpacing"> + <int value="0" label="Tight (Deprecated)"/> + <int value="1" label="Standard"/> + <int value="2" label="Loose"/> + <int value="3" label="Very Loose"/> +</enum> + <enum name="ReadDynamicRulesJSONStatus"> <int value="0" label="kSuccess"/> <int value="1" label="kFileDoesNotExist"/> @@ -93964,35 +93956,6 @@ <int value="2" label="App"/> </enum> -<enum name="SharingDesktopScreenshotAction"> -<!-- - SharingScreenshotAction must be kept in sync with SharingScreenshotAction defined - in /chrome/browser/ui/webui/image_editor/image_editor.mojom ---> - - <int value="0" label="Crop tool selected"/> - <int value="1" label="Text tool selected"/> - <int value="2" label="Draw tool selected"/> - <int value="3" label="Circle tool selected"/> - <int value="4" label="Rectangle tool selected"/> - <int value="5" label="Line tool selected"/> - <int value="6" label="Arrow tool selected"/> - <int value="7" label="Emoji tool selected"/> - <int value="8" label="Highlight tool selected"/> - <int value="9" label="Zoom in selected"/> - <int value="10" label="Zoom out selected"/> - <int value="11" label="Screenshot Copied"/> - <int value="12" label="Screenshot Saved"/> - <int value="13" label="Screenshot Shared"/> - <int value="14" label="Text tool: color changed"/> - <int value="15" label="Text tool: font changed"/> - <int value="16" label="Text tool: size changed"/> - <int value="17" label="Draw tool: size changed"/> - <int value="18" label="Draw tool: color changed"/> - <int value="19" label="Highlight tool: color changed"/> - <int value="20" label="Fallback webui loaded"/> -</enum> - <enum name="SharingDeviceRegistrationResult"> <int value="0" label="Operation is successful"/> <int value="1" label="Failed with Sync not ready"/> @@ -98288,6 +98251,13 @@ <int value="1" label="DirectWriting, Add Space Or Text"/> <int value="2" label="DirectWriting, Remove Spaces"/> <int value="3" label="DirectWriting, Split Or Merge"/> + <int value="4" label="Android, Select"/> + <int value="5" label="Android, Insert"/> + <int value="6" label="Android, Delete"/> + <int value="7" label="Android, Remove Space"/> + <int value="8" label="Android, Join Or Split"/> + <int value="9" label="Android, Select Range"/> + <int value="10" label="Android, Delete Range"/> </enum> <enum name="SubframeDownloadSandboxOriginAdGesture">
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index cd9ec22..8c58a9b 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -1695,6 +1695,24 @@ </token> </histogram> +<histogram name="Accessibility.ReadAnything.LetterSpacing" + enum="ReadAnythingLetterSpacing" expires_after="2023-11-30"> + <owner>abigailbklein@google.com</owner> + <owner>chrome-a11y-core@google.com</owner> + <summary> + Records the user-chosen letter spacing for the Read Anything panel. + </summary> +</histogram> + +<histogram name="Accessibility.ReadAnything.LineSpacing" + enum="ReadAnythingLineSpacing" expires_after="2023-11-30"> + <owner>abigailbklein@google.com</owner> + <owner>chrome-a11y-core@google.com</owner> + <summary> + Records the user-chosen line spacing for the Read Anything panel. + </summary> +</histogram> + <histogram name="Accessibility.Reliability.Tree.UnserializeError" enum="AccessibilityTreeUnserializeError" expires_after="2023-11-30"> <owner>aleventhal@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index fa80cae..3d2a1b0 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1778,6 +1778,17 @@ </summary> </histogram> +<histogram name="Ash.Desks.CloseAllZombieWindowsFound" units="windows" + expires_after="2024-02-21"> + <owner>benbecker@google.com</owner> + <owner>chromeos-wms@google.com</owner> + <summary> + Emitted one minute after the DesksController synchronously closes all + windows with widgets remaining in a desk. Reports the number of windows with + null widgets that are still open after that time. + </summary> +</histogram> + <histogram name="Ash.Desks.ConsecutiveDailyVisits" units="days" expires_after="2023-07-02"> <owner>afakhry@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 94af10a..4142328 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1876,6 +1876,16 @@ </summary> </histogram> +<histogram name="Autofill.FormContextMenuImpressions.ByNumberOfFields" + units="fields" expires_after="2023-09-01"> + <owner>vidhanj@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Number of fields on form where the context menu was shown. Recorded on the + form submission. + </summary> +</histogram> + <histogram name="Autofill.FormEvents.Address{AutofillDataAvailability}" enum="AutofillFormEvent" expires_after="2023-12-12"> <owner>battre@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml index f66c817..3f0641222 100644 --- a/tools/metrics/histograms/metadata/content/histograms.xml +++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -1160,7 +1160,7 @@ </histogram> <histogram name="ContentSuggestions.Feed.Network.RequestSizeKB.Compressed" - units="KB" expires_after="M90"> + units="KB" expires_after="M120"> <owner>carlosk@chromium.org</owner> <owner>harringtond@chromium.org</owner> <owner>feed@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml index d00aa756..94cd663c 100644 --- a/tools/metrics/histograms/metadata/extensions/histograms.xml +++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -164,7 +164,8 @@ <owner>tapted@chromium.org</owner> <summary> The number of times v1 apps are launched grouped by - extension_misc::AppLaunchBuckets. See also Apps.AppLaunch for v2 apps. + extension_misc::AppLaunchBuckets. See also Apps.AppLaunch for v2 apps. Note + this was changed in 2023-02 to no longer count web app launches. </summary> </histogram> @@ -3465,6 +3466,16 @@ </token> </histogram> +<histogram name="Extensions.Navigation.Scheme" enum="NavigationScheme" + expires_after="2024-01-01"> + <owner>jkokatsu@google.com</owner> + <owner>extensions-core@chromium.org</owner> + <summary> + Counts usage of various schemes (e.g. file:, chrome:, http:) when a + navigation is triggered from an extension (such as through tabs API). + </summary> +</histogram> + <histogram name="Extensions.NetworkDelay" units="ms" expires_after="2023-12-15"> <owner>rdevlin.cronin@chromium.org</owner> <owner>kelvinjiang@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/gcm/histograms.xml b/tools/metrics/histograms/metadata/gcm/histograms.xml index dacf4c3..fd679d7 100644 --- a/tools/metrics/histograms/metadata/gcm/histograms.xml +++ b/tools/metrics/histograms/metadata/gcm/histograms.xml
@@ -49,56 +49,6 @@ </summary> </histogram> -<histogram name="GCM.ConnectionDisconnectErrorCode" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="M77"> - <owner>zea@chromium.org</owner> - <summary>URL response and error codes from GCM disconnect events.</summary> -</histogram> - -<histogram name="GCM.ConnectionEndpoint" enum="GCMEndpoints" - expires_after="2018-08-30"> - <owner>zea@chromium.org</owner> - <summary>Number of connections made to each specific MCS endpoint.</summary> -</histogram> - -<histogram name="GCM.ConnectionFailureErrorCode" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2018-08-30"> - <owner>zea@chromium.org</owner> - <summary>URL response and error codes from GCM connection attempts.</summary> -</histogram> - -<histogram name="GCM.ConnectionLatency" units="ms" expires_after="M88"> - <owner>peter@chromium.org</owner> - <owner>zea@chromium.org</owner> - <summary> - The time between the initiation of a connection and the successful - completion of it. - </summary> -</histogram> - -<histogram name="GCM.ConnectionResetReason" enum="GCMConnectionResetReason" - expires_after="2018-08-30"> - <owner>zea@chromium.org</owner> - <summary>Reasons for GCM connection resets.</summary> -</histogram> - -<histogram name="GCM.ConnectionSuccessRate" enum="BooleanSuccess" - expires_after="2018-08-30"> - <owner>zea@chromium.org</owner> - <summary> - GCM connection success rate. Does not take into account login success. See - GCM.ConnectionFailureErrorCode for a breakdown of connection failure - reasons. - </summary> -</histogram> - -<histogram name="GCM.ConnectionUpTime" units="ms" expires_after="2018-08-30"> - <owner>zea@chromium.org</owner> - <summary> - Time (from login until reset) that a GCM connection was active. - </summary> -</histogram> - <histogram name="GCM.Crypto.CreateKeySuccessRate" enum="BooleanSuccess" expires_after="M88"> <owner>peter@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml index e661840b..95fec57 100644 --- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -114,7 +114,6 @@ supported css, html, image, javascript, or video mime types."/> <suffix name="Video" label="Resources identified by video/*."/> <affected-histogram name="Ads.ResourceUsage.Size.Cache2.Mime"/> - <affected-histogram name="Ads.ResourceUsage.Size.Network.Mime"/> </histogram_suffixes> <histogram_suffixes name="AdResourceSizes" separator="."> @@ -129,7 +128,6 @@ <suffix name="Subframe.VanillaResource" label="Subframe resources not tagged as ads."/> <affected-histogram name="Ads.ResourceUsage.Size.Cache2"/> - <affected-histogram name="Ads.ResourceUsage.Size.Network"/> </histogram_suffixes> <histogram_suffixes name="AdsPageLoadMetricsBytes" separator="."> @@ -4520,6 +4518,11 @@ label="All SharedImages memory. Typically accounted for in other processes, e.g. renderers, this is the total Chrome-wide memory used by SharedImages."/> + <suffix name="SharedImages.Purgeable" + label="All purgeable SharedImages memory. Typically accounted for in + other processes, e.g. renderers, this is the total Chrome-wide + memory used by SharedImages. Non-zero only on platforms where + SharedImages can be purgeable."/> <suffix name="SiteStorage" label="Only counting memory used by Web storage API."/> <suffix name="SiteStorage.BlobStorage"
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml index f42ee0d..352906f 100644 --- a/tools/metrics/histograms/metadata/history/histograms.xml +++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -857,6 +857,21 @@ </histogram> <histogram + name="History.Clusters.Backend.FilterClusterProcessor.ClusterFilterReason.{Source}" + enum="ClusterFilterReason" expires_after="2023-08-08"> + <owner>sophiechang@chromium.org</owner> + <owner>chrome-journeys@google.com</owner> + <component>UI>Browser>Journeys</component> + <summary> + Logs the reason why a cluster was filtered out of the return set for each + cluster provided to the clustering backend when invoked by {Source}. Note + that a single cluster can log multiple values in this metric if it is + ineligible for multiple reasons. + </summary> + <token key="Source" variants="ClusteringRequestSource"/> +</histogram> + +<histogram name="History.Clusters.Backend.FilterClusterProcessor.NumClusters.{Segment}{Source}" units="ms" expires_after="2023-08-08"> <owner>sophiechang@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml index 8a9563ec..7263bfe 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -941,6 +941,30 @@ </summary> </histogram> +<histogram name="NewTabPage.HistoryClusters.HasClusterToShow" enum="Boolean" + expires_after="2023-08-08"> + <owner>sophiechang@chromium.org</owner> + <owner>tiborg@chromium.org</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <summary> + Logs whether there is at least one cluster that can be shown in the history + clusters module that matches the desired filtering criteria configurable via + Finch. Only logged on the 1P NTP and the history clusters module is enabled. + </summary> +</histogram> + +<histogram name="NewTabPage.HistoryClusters.NumClusterCandidates" + units="counts" expires_after="2023-08-08"> + <owner>sophiechang@chromium.org</owner> + <owner>tiborg@chromium.org</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <summary> + Logs the number of clusters that match the desired filtering criteria + configurable via Finch for the history clusters module. Only logged on the + 1P NTP and the history clusters module is enabled. + </summary> +</histogram> + <histogram name="NewTabPage.Languages.UILanguageRatioInTwoTopLanguages" units="%" expires_after="M77"> <owner>jkrcal@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 5b1757c..1fe3f2a5 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -350,15 +350,6 @@ </summary> </histogram> -<histogram name="ActivityTracker.Collect.AnalyzerCreationError" - enum="ActivityTrackerAnalyzerCreationError" expires_after="M90"> - <owner>siggi@chromium.org</owner> - <summary> - The analyzer creation error code. Logged each time analyzer creation fails, - at most once per processed stability debug file. - </summary> -</histogram> - <histogram name="ActivityTracker.Collect.InitStatus" enum="ActivityTrackerCollectInitStatus" expires_after="M90"> <owner>siggi@chromium.org</owner> @@ -888,24 +879,6 @@ </summary> </histogram> -<histogram base="true" name="Ads.ResourceUsage.Size.Network" units="KB" - expires_after="2020-10-02"> - <obsolete> - Removed 11/2020. - </obsolete> - <owner>johnidel@chromium.org</owner> - <owner>jkarlin@chromium.org</owner> - <summary> - For a given resource fetched from the network, logs the network bytes used - to load the resource (including headers), even if the resource request was - canceled or incomplete. Recorded when the resource request is complete, or - when the page is destroyed/navigated for incomplete resources. The sum of - samples across a page load may differ substatially from the true sum due to - per-sample rounding. These are not intended to be compared to page level - histograms. - </summary> -</histogram> - <histogram name="AnchorElementMetrics.Clicked.OnDSE.SameHost" enum="BooleanAnchorElementSameHost" expires_after="2021-08-09"> <obsolete> @@ -1035,12 +1008,6 @@ </summary> </histogram> -<histogram name="AppleScript.CommandEvent" enum="AppleScriptCommandEvents" - expires_after="M81"> - <owner>spqchan@chromium.org</owner> - <summary>The number of times an AppleScript event gets called.</summary> -</histogram> - <histogram name="AsyncDNS.ConfigChange" enum="BooleanSuccess" expires_after="M77"> <obsolete> @@ -2282,26 +2249,6 @@ </summary> </histogram> -<histogram name="ChildProcess.HungRendererAvailableMemoryMB" units="MB" - expires_after="2020-05-31"> - <owner>cduvall@chromium.org</owner> - <owner>cmumford@chromium.org</owner> - <summary> - The amount of avaiable memory when a renderer hangs. Recorded for every - renderer hang. - </summary> -</histogram> - -<histogram name="ChildProcess.HungRendererInForeground" - enum="BooleanForeground" expires_after="2020-12-13"> - <owner>cduvall@chromium.org</owner> - <owner>cmumford@chromium.org</owner> - <summary> - Whether a renderer hang happened in the foreground or background. Recorded - for every renderer hang on Android. - </summary> -</histogram> - <histogram name="ChildProcess.Killed2" enum="ProcessType2" expires_after="never"> <!-- expires-never: Critical stability metrics. go/chrome-stability-metrics -->
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml index 6c0bba29..e9c85249 100644 --- a/tools/metrics/histograms/metadata/renderer/histograms.xml +++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -420,6 +420,13 @@ </summary> </histogram> +<histogram name="Renderer.Preload.UnusedResource" enum="BooleanSuccess" + expires_after="2024-02-17"> + <owner>yoavweiss@chromium.org</owner> + <owner>speed-metrics-dev@chromium.org</owner> + <summary>Counts the number of unused preloads per ResourceType.</summary> +</histogram> + <histogram name="Renderer.ProcessLifetime3{RendererHostedContentType}" units="ms" expires_after="2023-02-28"> <owner>fdoray@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml index 331e0bf..3be3ed6 100644 --- a/tools/metrics/histograms/metadata/sharing/histograms.xml +++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -127,16 +127,6 @@ </summary> </histogram> -<histogram name="Sharing.DesktopScreenshot.Action" - enum="SharingDesktopScreenshotAction" expires_after="2023-02-26"> - <owner>jeffreycohen@chromium.org</owner> - <owner>src/chrome/browser/share/OWNERS</owner> - <summary> - Logged when actions are taken in the sharing desktop screenshot image - editing feature. - </summary> -</histogram> - <histogram name="Sharing.DeviceRegistrationResult" enum="SharingDeviceRegistrationResult" expires_after="M97"> <owner>knollr@chromium.org</owner> @@ -490,16 +480,6 @@ </summary> </histogram> -<histogram name="Sharing.SharingHubAndroid.CloseReason" - enum="BottomSheet.StateChangeReason" expires_after="2023-01-15"> - <owner>ellyjones@chromium.org</owner> - <owner>src/chrome/browser/share/OWNERS</owner> - <summary> - The reason why the Clank sharing hub was closed, logged when the bottom - sheet transitions into the HIDDEN state. Android-only. - </summary> -</histogram> - <histogram name="Sharing.SharingHubAndroid.Opened" enum="ShareOrigin" expires_after="2023-07-02"> <owner>sophey@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml index 6cb3bf6..936a21f 100644 --- a/tools/metrics/histograms/metadata/startup/histograms.xml +++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -324,20 +324,6 @@ </summary> </histogram> -<histogram name="Startup.Android.NewInstance.LaunchedFromDraggedLinkViewIntent" - enum="Boolean" expires_after="2023-07-09"> - <owner>twellington@chromium.org</owner> - <owner>aishwaryarj@google.com</owner> - <summary> - Recorded when a VIEW intent to launch ChromeTabbedActivity contained the - FLAG_ACTIVITY_MULTIPLE_TASK flag. Records 'true' if the intent came from - dragging a link out of Chrome, and false otherwise. Note that some OEMs - currently do not use the full ClipData.Item intent when propagating a drag - event, in which case 'false' will be recorded regardless of whether the drag - event / VIEW intent originated from Chrome. - </summary> -</histogram> - <histogram name="Startup.Android.ShowChromeStartSegmentationResult" enum="ShowChromeStartSegmentationResult" expires_after="2023-04-09"> <owner>hanxi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml index 6ec209e..1aca32b 100644 --- a/tools/metrics/histograms/metadata/storage/histograms.xml +++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -225,16 +225,6 @@ </summary> </histogram> -<histogram name="Clipboard.X11StoreCopyPasteDuration" units="ms" - expires_after="M95"> - <owner>dcheng@chromium.org</owner> - <owner>pkotwicz@chromium.org</owner> - <summary> - The length of time that it takes to transfer ownership of Chrome's CLIPBOARD - selection to the clipboard manager when Chrome exits. - </summary> -</histogram> - <histogram name="LevelDBEnv.DeleteTableBackupFile" enum="BooleanSuccess" expires_after="2023-08-01"> <owner>cmumford@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index df92aa26..c847c8d 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -254,6 +254,21 @@ </summary> </histogram> +<histogram name="UMA.FileMetricsProvider.{Source}.MergedHistogramsCount" + units="histograms" expires_after="2023-11-01"> + <owner>lucnguyen@google.com</owner> + <owner>src/base/metrics/OWNERS</owner> + <summary> + The number of histograms merged to the current session from a PMA file from + the {Source} source. Emitted right after merging the histograms. + </summary> + <token key="Source"> + <variant name="DeferredBrowserMetrics"/> + <variant name="NotificationHelperMetrics"/> + <variant name="SetupMetrics"/> + </token> +</histogram> + <histogram name="UMA.IndependentLog.{Provider}.FinalizeTime" units="ms" expires_after="2023-07-01"> <owner>lucnguyen@google.com</owner>
diff --git a/tools/perf/contrib/cluster_telemetry/ad_tagging_ct.py b/tools/perf/contrib/cluster_telemetry/ad_tagging_ct.py index cc77c494..208f9c1d 100644 --- a/tools/perf/contrib/cluster_telemetry/ad_tagging_ct.py +++ b/tools/perf/contrib/cluster_telemetry/ad_tagging_ct.py
@@ -68,10 +68,6 @@ tbm_options = timeline_based_measurement.Options(category_filter) uma_histograms = [ - 'Ads.ResourceUsage.Size.Network.Mainframe.AdResource', - 'Ads.ResourceUsage.Size.Network.Mainframe.VanillaResource', - 'Ads.ResourceUsage.Size.Network.Subframe.AdResource', - 'Ads.ResourceUsage.Size.Network.Subframe.VanillaResource', 'PageLoad.Clients.Ads.AllPages.NonAdNetworkBytes', 'PageLoad.Clients.Ads.AllPages.PercentNetworkBytesAds', 'PageLoad.Clients.Ads.Cpu.AdFrames.Aggregate.TotalUsage',
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index d3ac0d7..31b122f 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -410,8 +410,8 @@ }, 'fuchsia-builder-perf-arm64': { 'additional_compile_targets': [ - 'web_engine_shell_pkg', 'cast_runner_pkg', 'web_runner_pkg', - 'chromium_builder_perf', 'base_perftests' + 'web_engine_shell_pkg', 'cast_runner_pkg', 'chromium_builder_perf', + 'base_perftests' ], }, 'fuchsia-builder-perf-x64': {
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index eacc2fdaa..6c584f0 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@ "full_remote_path": "perfetto-luci-artifacts/1d202f2412734f1e782d991618c7c4a7952e8738/linux-arm64/trace_processor_shell" }, "win": { - "hash": "ac703781ed7ba9e9b0d0c627acae83a5e16c1d9d", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/55985e77ff4f3e023d321c7f7236e8cfe098e545/trace_processor_shell.exe" + "hash": "7a5fbb9d865715d5e5a81f1a8a3f1c6e072088ed", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4bda78645d1d23a98473b793bc532a3ebff6c7f9/trace_processor_shell.exe" }, "linux_arm": { "hash": "0606572451d2b1efd97a9cbc99906d2ca8351d1f", "full_remote_path": "perfetto-luci-artifacts/1d202f2412734f1e782d991618c7c4a7952e8738/linux-arm/trace_processor_shell" }, "mac": { - "hash": "79520d7a405bc77d9e9320c8522eb0b4d2ecef5b", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/55985e77ff4f3e023d321c7f7236e8cfe098e545/trace_processor_shell" + "hash": "d65a0f4516c5f246282974ed4581cfbe388a3b33", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4bda78645d1d23a98473b793bc532a3ebff6c7f9/trace_processor_shell" }, "mac_arm64": { "hash": "984da18bc97e0a53e4ed54880eef0642f8ad2fd2",
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py index e989521..b9b9a4d 100755 --- a/tools/rust/build_rust.py +++ b/tools/rust/build_rust.py
@@ -180,7 +180,7 @@ sys.exit(1) -def Configure(llvm_bins_path, llvm_libs_root): +def Configure(llvm_bins_path, llvm_libs_root, link_tensorflow): # Read the config.toml template file... with open(RUST_CONFIG_TEMPLATE_PATH, 'r') as input: template = string.Template(input.read()) @@ -194,6 +194,11 @@ subs['LLVM_BIN'] = quote_string(str(llvm_bins_path)) subs['PACKAGE_VERSION'] = GetPackageVersionForBuild() + if link_tensorflow: + subs['RUSTC_LLVM_LDFLAGS'] = '-ltf_xla_runtime' + else: + subs['RUSTC_LLVM_LDFLAGS'] = '' + # ...and apply substitutions, writing to config.toml in Rust tree. with open(os.path.join(RUST_SRC_DIR, 'config.toml'), 'w') as output: output.write(template.substitute(subs)) @@ -275,104 +280,125 @@ os.path.join(RUST_SRC_DIR, '.cargo', 'config.toml')) -def RunXPy(sub, args, llvm_bins_path, zlib_path, libxml2_dirs, build_mac_arm, - gcc_toolchain_path, verbose): - ''' Run x.py, Rust's build script''' - # We append to these flags, make sure they exist. - ENV_FLAGS = [ - 'CFLAGS', - 'CXXFLAGS', - 'LDFLAGS', - 'RUSTFLAGS_BOOTSTRAP', - 'RUSTFLAGS_NOT_BOOTSTRAP', - 'RUSTDOCFLAGS', - ] +class XPy: + ''' Runner for x.py, Rust's build script. Holds shared state between x.py + runs. ''' - RUSTENV = collections.defaultdict(str, os.environ) - for f in ENV_FLAGS: - RUSTENV.setdefault(f, '') + def __init__(self, llvm_bins_path, zlib_path, libxml2_dirs, build_mac_arm, + gcc_toolchain_path, verbose): + self._env = collections.defaultdict(str, os.environ) + self._build_mac_arm = build_mac_arm + self._verbose = verbose - # The AR, CC, CXX flags control the C/C++ compiler used through the `cc` - # crate. There are also C/C++ targets that are part of the Rust toolchain - # build for which the tool is controlled from `config.toml`, so these must - # be duplicated there. + # We append to these flags, make sure they exist. + ENV_FLAGS = [ + 'CFLAGS', + 'CXXFLAGS', + 'LDFLAGS', + 'RUSTFLAGS_BOOTSTRAP', + 'RUSTFLAGS_NOT_BOOTSTRAP', + 'RUSTDOCFLAGS', + ] - if sys.platform == 'win32': - RUSTENV['AR'] = os.path.join(llvm_bins_path, 'llvm-lib.exe') - RUSTENV['CC'] = os.path.join(llvm_bins_path, 'clang-cl.exe') - RUSTENV['CXX'] = os.path.join(llvm_bins_path, 'clang-cl.exe') - else: - RUSTENV['AR'] = os.path.join(llvm_bins_path, 'llvm-ar') - RUSTENV['CC'] = os.path.join(llvm_bins_path, 'clang') - RUSTENV['CXX'] = os.path.join(llvm_bins_path, 'clang++') + self._env = collections.defaultdict(str, os.environ) + for f in ENV_FLAGS: + self._env.setdefault(f, '') - if sys.platform == 'darwin': - # The system/xcode compiler would find system SDK correctly, but - # the Clang we've built does not. See - # https://github.com/llvm/llvm-project/issues/45225 - sdk_path = subprocess.check_output(['xcrun', '--show-sdk-path'], - text=True).rstrip() - RUSTENV['CFLAGS'] += f' -isysroot {sdk_path}' - RUSTENV['CXXFLAGS'] += f' -isysroot {sdk_path}' - RUSTENV['LDFLAGS'] += f' -isysroot {sdk_path}' - RUSTENV['RUSTFLAGS_BOOTSTRAP'] += ( - f' -Clink-arg=-isysroot -Clink-arg={sdk_path}') - RUSTENV['RUSTFLAGS_NOT_BOOTSTRAP'] += ( - f' -Clink-arg=-isysroot -Clink-arg={sdk_path}') - # Rust compiletests don't get any of the RUSTFLAGS that we set here and - # then the clang linker can't find `-lSystem`, unless we set the - # `SDKROOT`. - RUSTENV['SDKROOT'] = sdk_path + # The AR, CC, CXX flags control the C/C++ compiler used through the `cc` + # crate. There are also C/C++ targets that are part of the Rust + # toolchain build for which the tool is controlled from `config.toml`, + # so these must be duplicated there. - if zlib_path: - RUSTENV['CFLAGS'] += f' -I{zlib_path}' - RUSTENV['CXXFLAGS'] += f' -I{zlib_path}' - RUSTENV['LDFLAGS'] += f' {LD_PATH_FLAG}{zlib_path}' - RUSTENV['RUSTFLAGS_BOOTSTRAP'] += ( - f' -Clink-arg={LD_PATH_FLAG}{zlib_path}') - RUSTENV['RUSTFLAGS_NOT_BOOTSTRAP'] += ( - f' -Clink-arg={LD_PATH_FLAG}{zlib_path}') + if sys.platform == 'win32': + self._env['AR'] = os.path.join(llvm_bins_path, 'llvm-lib.exe') + self._env['CC'] = os.path.join(llvm_bins_path, 'clang-cl.exe') + self._env['CXX'] = os.path.join(llvm_bins_path, 'clang-cl.exe') + else: + self._env['AR'] = os.path.join(llvm_bins_path, 'llvm-ar') + self._env['CC'] = os.path.join(llvm_bins_path, 'clang') + self._env['CXX'] = os.path.join(llvm_bins_path, 'clang++') - if libxml2_dirs: - RUSTENV['CFLAGS'] += f' -I{libxml2_dirs.include_dir}' - RUSTENV['CXXFLAGS'] += f' -I{libxml2_dirs.include_dir}' - RUSTENV['LDFLAGS'] += f' {LD_PATH_FLAG}{libxml2_dirs.lib_dir}' - RUSTENV['RUSTFLAGS_BOOTSTRAP'] += ( - f' -Clink-arg={LD_PATH_FLAG}{libxml2_dirs.lib_dir}') - RUSTENV['RUSTFLAGS_NOT_BOOTSTRAP'] += ( - f' -Clink-arg={LD_PATH_FLAG}{libxml2_dirs.lib_dir}') + if sys.platform == 'darwin': + # The system/xcode compiler would find system SDK correctly, but + # the Clang we've built does not. See + # https://github.com/llvm/llvm-project/issues/45225 + sdk_path = subprocess.check_output(['xcrun', '--show-sdk-path'], + text=True).rstrip() + RUSTENV['CFLAGS'] += f' -isysroot {sdk_path}' + RUSTENV['CXXFLAGS'] += f' -isysroot {sdk_path}' + RUSTENV['LDFLAGS'] += f' -isysroot {sdk_path}' + RUSTENV['RUSTFLAGS_BOOTSTRAP'] += ( + f' -Clink-arg=-isysroot -Clink-arg={sdk_path}') + RUSTENV['RUSTFLAGS_NOT_BOOTSTRAP'] += ( + f' -Clink-arg=-isysroot -Clink-arg={sdk_path}') + # Rust compiletests don't get any of the RUSTFLAGS that we set here + # and then the clang linker can't find `-lSystem`, unless we set the + # `SDKROOT`. + RUSTENV['SDKROOT'] = sdk_path - if gcc_toolchain_path: - # We use these flags to avoid linking with the system libstdc++. - gcc_toolchain_flag = f'--gcc-toolchain={gcc_toolchain_path}' - RUSTENV['CFLAGS'] += f' {gcc_toolchain_flag}' - RUSTENV['CXXFLAGS'] += f' {gcc_toolchain_flag}' - RUSTENV['LDFLAGS'] += f' {gcc_toolchain_flag}' - # A `-Clink-arg=<foo>` arg passes `foo`` to the linker invovation. - RUSTENV['RUSTFLAGS_BOOTSTRAP'] += f' -Clink-arg={gcc_toolchain_flag}' - RUSTENV[ - 'RUSTFLAGS_NOT_BOOTSTRAP'] += f' -Clink-arg={gcc_toolchain_flag}' - RUSTENV['RUSTFLAGS_BOOTSTRAP'] += ( - f' -L native={gcc_toolchain_path}/lib64') - RUSTENV['RUSTFLAGS_NOT_BOOTSTRAP'] += ( - f' -L native={gcc_toolchain_path}/lib64') + if zlib_path: + self._env['CFLAGS'] += f' -I{zlib_path}' + self._env['CXXFLAGS'] += f' -I{zlib_path}' + self._env['LDFLAGS'] += f' {LD_PATH_FLAG}{zlib_path}' + self._env['RUSTFLAGS_BOOTSTRAP'] += ( + f' -Clink-arg={LD_PATH_FLAG}{zlib_path}') + self._env['RUSTFLAGS_NOT_BOOTSTRAP'] += ( + f' -Clink-arg={LD_PATH_FLAG}{zlib_path}') - # Rustdoc should use our clang linker as well, as we pass flags that - # the system linker may not understand. - RUSTENV['RUSTDOCFLAGS'] += f' -Clinker={RUSTENV["CC"]}' + if libxml2_dirs: + self._env['CFLAGS'] += f' -I{libxml2_dirs.include_dir}' + self._env['CXXFLAGS'] += f' -I{libxml2_dirs.include_dir}' + self._env['LDFLAGS'] += f' {LD_PATH_FLAG}{libxml2_dirs.lib_dir}' + self._env['RUSTFLAGS_BOOTSTRAP'] += ( + f' -Clink-arg={LD_PATH_FLAG}{libxml2_dirs.lib_dir}') + self._env['RUSTFLAGS_NOT_BOOTSTRAP'] += ( + f' -Clink-arg={LD_PATH_FLAG}{libxml2_dirs.lib_dir}') - # Cargo normally stores files in $HOME. Override this. - RUSTENV['CARGO_HOME'] = CARGO_HOME_DIR + if gcc_toolchain_path: + # We use these flags to avoid linking with the system libstdc++. + gcc_toolchain_flag = f'--gcc-toolchain={gcc_toolchain_path}' + self._env['CFLAGS'] += f' {gcc_toolchain_flag}' + self._env['CXXFLAGS'] += f' {gcc_toolchain_flag}' + self._env['LDFLAGS'] += f' {gcc_toolchain_flag}' + # A `-Clink-arg=<foo>` arg passes `foo`` to the linker invovation. + self._env[ + 'RUSTFLAGS_BOOTSTRAP'] += f' -Clink-arg={gcc_toolchain_flag}' + self._env[ + 'RUSTFLAGS_NOT_BOOTSTRAP'] += f' -Clink-arg={gcc_toolchain_flag}' + self._env['RUSTFLAGS_BOOTSTRAP'] += ( + f' -L native={gcc_toolchain_path}/lib64') + self._env['RUSTFLAGS_NOT_BOOTSTRAP'] += ( + f' -L native={gcc_toolchain_path}/lib64') - # This enables the compiler to produce Mac ARM binaries. - if build_mac_arm: - args.extend(['--target', 'aarch64-apple-darwin']) + # Direct rustc to use Chromium's lld instead of the system linker. This + # is critical for stage 1 onward since we need to link libs with LLVM + # bitcode. It is also good for a hermetic build in general. + # + # The `--undefined-version` flag is needed due to a bug in libtest: + # https://github.com/rust-lang/rust/issues/105967 + self._env[ + 'RUSTFLAGS_BOOTSTRAP'] += ' -Clink-arg=-fuse-ld=lld -Clink-arg=-Wl,--undefined-version' + self._env[ + 'RUSTFLAGS_NOT_BOOTSTRAP'] += ' -Clink-arg=-fuse-ld=lld -Clink-arg=-Wl,--undefined-version' - os.chdir(RUST_SRC_DIR) - cmd = [sys.executable, 'x.py', sub] - if verbose and verbose > 0: - cmd.append('-' + verbose * 'v') - RunCommand(cmd + args, msvc_arch='x64', env=RUSTENV) + # Rustdoc should use our clang linker as well, as we pass flags that + # the system linker may not understand. + self._env['RUSTDOCFLAGS'] += f' -Clinker={self._env["CC"]}' + + # Cargo normally stores files in $HOME. Override this. + self._env['CARGO_HOME'] = CARGO_HOME_DIR + + def run(self, sub, args): + ''' Run x.py subcommand with specified args. ''' + # This enables the compiler to produce Mac ARM binaries. + if self._build_mac_arm: + args.extend(['--target', 'aarch64-apple-darwin']) + + os.chdir(RUST_SRC_DIR) + cmd = [sys.executable, 'x.py', sub] + if self._verbose and self._verbose > 0: + cmd.append('-' + self._verbose * 'v') + RunCommand(cmd + args, msvc_arch='x64', env=self._env) # Get arguments to run desired test suites, minus disabled tests. @@ -451,7 +477,8 @@ '--use-final-llvm-build-dir', action='store_true', help='use libs in LLVM_BUILD_DIR instead of LLVM_BOOTSTRAP_DIR. Useful ' - 'with --fetch-llvm-libs for local builds.') + 'with --fetch-llvm-libs for local builds. When enabled, these ' + 'libraries must not use LTO.') parser.add_argument( '--run-xpy', action='store_true', @@ -468,14 +495,31 @@ print('--build-mac-arm only valid on intel to cross-build arm') return 1 - # Get the LLVM root for libs. We use LLVM_BUILD_DIR tools either way. + # A production Rust toolchain will use our final-stage LLVM build. These + # LLVM libs are built with LTO enabled, using the same LLVM revision from an + # earlier build stage as backend. The Rust toolchain we start with (the + # upstream beta release) however cannot process these since it uses an + # earlier LLVM build as its backend. # - # TODO(https://crbug.com/1245714): use LTO libs from LLVM_BUILD_DIR for - # stage 2+. + # The Rust toolchain can be bootstrapped using earlier native-code LLVM + # artifacts for its first stage, then using the final LLVM libs for further + # stages. We do this because the bootstrap libs don't support targeting all + # platforms, while the final LLVM libs do. + # + # Enable conditionally based on arguments and build host. + # + # TODO(https://crbug.com/1412187): hash out implementation issues on + # non-Linux and enable unconditionally (sans script argument). + use_lto_llvm = False + if not args.use_final_llvm_build_dir and sys.platform.startswith('linux'): + use_lto_llvm = True + + # Get the LLVM root for the stage0 build. This normally comes from the LLVM + # bootstrap stage, but for local builds we support using LLVM_BUILD_DIR. if args.use_final_llvm_build_dir: - llvm_libs_root = LLVM_BUILD_DIR + llvm_bootstrap_root = LLVM_BUILD_DIR else: - llvm_libs_root = build.LLVM_BOOTSTRAP_DIR + llvm_bootstrap_root = build.LLVM_BOOTSTRAP_DIR # If we're building for Mac ARM on an x86_64 Mac, we can't use the final # clang binaries as they don't have x86_64 support. Building them with that @@ -511,8 +555,9 @@ # `args.gcc_toolchain` if so. build.MaybeDownloadHostGcc(args) - # Set up config.toml in Rust source tree to configure build. - Configure(llvm_bins_path, llvm_libs_root) + # Set up config.toml in Rust source tree to configure build for stage0. + # Normally, we will reconfigure later to use the production LLVM libs. + Configure(llvm_bins_path, llvm_bootstrap_root, link_tensorflow=False) cargo_bin = FetchCargo(checkout_revision) CargoVendor(cargo_bin) @@ -538,25 +583,46 @@ # Cargo depends on OpenSSL. AddOpenSSLToEnv(args.build_mac_arm) + xpy = XPy(llvm_bins_path, zlib_path, libxml2_dirs, args.build_mac_arm, + args.gcc_toolchain, args.verbose) + if args.run_xpy: if rest[0] == '--': rest = rest[1:] - RunXPy(rest[0], rest[1:], llvm_bins_path, zlib_path, libxml2_dirs, - args.build_mac_arm, args.gcc_toolchain, args.verbose) + xpy.run(rest[0], rest[1:]) return 0 else: assert not rest if not args.skip_clean: print('Cleaning build artifacts...') - RunXPy('clean', [], llvm_bins_path, zlib_path, libxml2_dirs, - args.build_mac_arm, args.gcc_toolchain, args.verbose) + xpy.run('clean', []) + + # Run the stage0 build separately using the bootstrap LLVM libs. This will + # allow further stages to process the LTO-enabled LLVM libs. + # + # On the other hand, when `use_lto_llvm` is disabled, we always use the + # native-code bootstrap libs. + # + # The build has already been configured above for the bootstrap stage. + xpy.run('build', ['--stage', '0', 'compiler/rustc']) + + xpy_args = [] + # Reconfigure to use production LLVM libs. After this point we must tell + # x.py to keep the stage0 artifacts, even though config.toml changed. + # + # Note we must link tensorflow into rustc_llvm on Linux, since our LLVM + # build includes it for MLGO. Unfortunately llvm-config does not report this + # dependency. See https://github.com/llvm/llvm-project/issues/60751. + if use_lto_llvm: + Configure(llvm_bins_path, + LLVM_BUILD_DIR, + link_tensorflow=sys.platform.startswith('linux')) + xpy_args = ['--keep-stage', '0'] if not args.skip_test: print('Running stage 2 tests...') - # Run a subset of tests. Tell x.py to keep the rustc we already built. - RunXPy('test', GetTestArgs(), llvm_bins_path, zlib_path, libxml2_dirs, - args.build_mac_arm, args.gcc_toolchain, args.verbose) + xpy.run('test', ['--stage', '2'] + xpy_args + GetTestArgs()) targets = [ 'library/proc_macro', 'library/std', 'src/tools/cargo', @@ -566,8 +632,7 @@ # Build stage 2 compiler, tools, and libraries. This should reuse earlier # stages from the test command (if run). print('Building stage 2 artifacts...') - RunXPy('build', ['--stage', '2'] + targets, llvm_bins_path, zlib_path, - libxml2_dirs, args.build_mac_arm, args.gcc_toolchain, args.verbose) + xpy.run('build', xpy_args + ['--stage', '2'] + targets) if args.skip_install: # Rust is fully built. We can quit. @@ -578,8 +643,7 @@ if os.path.exists(RUST_TOOLCHAIN_OUT_DIR): shutil.rmtree(RUST_TOOLCHAIN_OUT_DIR) - RunXPy('install', DISTRIBUTION_ARTIFACTS, llvm_bins_path, zlib_path, - libxml2_dirs, args.build_mac_arm, args.gcc_toolchain, args.verbose) + xpy.run('install', xpy_args + DISTRIBUTION_ARTIFACTS) # Copy additional sources required for building stdlib out of # RUST_TOOLCHAIN_SRC_DIST_DIR.
diff --git a/tools/rust/config.toml.template b/tools/rust/config.toml.template index cca56f4..b95de12 100644 --- a/tools/rust/config.toml.template +++ b/tools/rust/config.toml.template
@@ -8,9 +8,10 @@ [llvm] download-ci-llvm = false -# Doesn't affect LLVM build (which we don't do) but rather how rustc_llvm crate -# is linked. +# These don't affect the LLVM build (which we don't do) but rather how the +# rustc_llvm crate is linked. static-libstdcpp = true +ldflags = "$RUSTC_LLVM_LDFLAGS" [rust] download-rustc = false
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py index afab59f..c461ae5 100755 --- a/tools/rust/update_rust.py +++ b/tools/rust/update_rust.py
@@ -30,7 +30,7 @@ # These fields are written by //tools/clang/scripts/upload_revision.py, and # should not be changed manually. RUST_REVISION = '6e0115778b0aedc90b59e035476c38e1b8c5c29b' -RUST_SUB_REVISION = 1 +RUST_SUB_REVISION = 2 # Trunk on 2022-10-15. # @@ -62,7 +62,7 @@ # TODO(lukasza): Include CRUBIT_REVISION and CRUBIT_SUB_REVISION once we # include Crubit binaries in the generated package. See also a TODO comment # in BuildCrubit in package_rust.py. -FALLBACK_REVISION = '6e0115778b0aedc90b59e035476c38e1b8c5c29b-1-llvmorg-17-init-2082-g6d4a674a-1' +FALLBACK_REVISION = '6e0115778b0aedc90b59e035476c38e1b8c5c29b-2-llvmorg-17-init-2387-g68e81d7e-1' # Hash of src/stage0.json, which itself contains the stage0 toolchain hashes. # We trust the Rust build system checks, but to ensure it is not tampered with
diff --git a/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc b/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc index e90d113..313c767 100644 --- a/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc +++ b/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc
@@ -389,7 +389,15 @@ if (!wrapper) continue; - nodes.push_back(wrapper->ax_tree()->GetFromId(app_node_info.node_id)); + AXNode* node = wrapper->ax_tree()->GetFromId(app_node_info.node_id); + // We don't expect this to ever be null, however in b:269669313 we see that + // it is occasionally null. This DCHECK might help sus out what's going on, + // meanwhile don't add the node to the result if it is null to avoid + // crashes in non-debug builds. + DCHECK(node); + if (node != nullptr) { + nodes.push_back(node); + } } return nodes;
diff --git a/ui/android/java/src/org/chromium/ui/base/OverlayTransformApiHelper.java b/ui/android/java/src/org/chromium/ui/base/OverlayTransformApiHelper.java index 02aaf8d..9cb7bad 100644 --- a/ui/android/java/src/org/chromium/ui/base/OverlayTransformApiHelper.java +++ b/ui/android/java/src/org/chromium/ui/base/OverlayTransformApiHelper.java
@@ -24,7 +24,6 @@ implements AttachedSurfaceControl.OnBufferTransformHintChangedListener, Window.OnFrameMetricsAvailableListener { private final WindowAndroid mWindowAndroid; - private final Window mWindow; private boolean mBufferTransformListenerAdded; private boolean mFrameMetricsListenerAdded; @@ -35,8 +34,6 @@ private OverlayTransformApiHelper(WindowAndroid windowAndroid) { mWindowAndroid = windowAndroid; - mWindow = windowAndroid.getWindow(); - assert mWindow != null; addOnBufferTransformHintChangedListener(); } @@ -46,7 +43,9 @@ } private void addOnBufferTransformHintChangedListener() { - AttachedSurfaceControl surfacecontrol = mWindow.getRootSurfaceControl(); + Window window = mWindowAndroid.getWindow(); + if (window == null) return; + AttachedSurfaceControl surfacecontrol = window.getRootSurfaceControl(); if (surfacecontrol == null) { // If AttachedSurfaceControl is not available yet, wait until it's ready and set the // listener. @@ -63,7 +62,9 @@ private void doAddOnBufferTransformHintChangedListener() { if (mBufferTransformListenerAdded) return; - AttachedSurfaceControl surfacecontrol = mWindow.getRootSurfaceControl(); + Window window = mWindowAndroid.getWindow(); + if (window == null) return; + AttachedSurfaceControl surfacecontrol = window.getRootSurfaceControl(); if (surfacecontrol != null) { surfacecontrol.addOnBufferTransformHintChangedListener(this); mBufferTransformListenerAdded = true; @@ -73,7 +74,9 @@ private void removeOnBufferTransformHintChangedListener() { if (!mBufferTransformListenerAdded) return; - AttachedSurfaceControl surfacecontrol = mWindow.getRootSurfaceControl(); + Window window = mWindowAndroid.getWindow(); + if (window == null) return; + AttachedSurfaceControl surfacecontrol = window.getRootSurfaceControl(); if (surfacecontrol != null) { surfacecontrol.removeOnBufferTransformHintChangedListener(this); mBufferTransformListenerAdded = false; @@ -92,19 +95,25 @@ private void addOnFrameMetricsAvailableListener() { if (mFrameMetricsListenerAdded) return; - mWindow.addOnFrameMetricsAvailableListener(this, new Handler(Looper.myLooper())); + Window window = mWindowAndroid.getWindow(); + if (window == null) return; + window.addOnFrameMetricsAvailableListener(this, new Handler(Looper.myLooper())); mFrameMetricsListenerAdded = true; } private void removeOnFrameMetricsAvailableListener() { if (!mFrameMetricsListenerAdded) return; - mWindow.removeOnFrameMetricsAvailableListener(this); + Window window = mWindowAndroid.getWindow(); + if (window == null) return; + window.removeOnFrameMetricsAvailableListener(this); mFrameMetricsListenerAdded = false; } @OverlayTransform int getOverlayTransform() { - AttachedSurfaceControl surfacecontrol = mWindow.getRootSurfaceControl(); + Window window = mWindowAndroid.getWindow(); + if (window == null) return OverlayTransform.INVALID; + AttachedSurfaceControl surfacecontrol = window.getRootSurfaceControl(); if (surfacecontrol == null) { return OverlayTransform.INVALID; }
diff --git a/ui/aura/client/drag_drop_delegate.cc b/ui/aura/client/drag_drop_delegate.cc index 649ff3e..a5e0cb5 100644 --- a/ui/aura/client/drag_drop_delegate.cc +++ b/ui/aura/client/drag_drop_delegate.cc
@@ -25,6 +25,12 @@ DEFINE_UI_CLASS_PROPERTY_KEY(DragDropDelegate*, kDragDropDelegateKey, nullptr) +DragDropDelegate::DropCallbackWithAnimation +DragDropDelegate::GetDropCallbackWithAnimation( + const ui::DropTargetEvent& event) { + return base::NullCallback(); +} + void SetDragDropDelegate(Window* window, DragDropDelegate* delegate) { window->SetProperty(kDragDropDelegateKey, delegate); }
diff --git a/ui/aura/client/drag_drop_delegate.h b/ui/aura/client/drag_drop_delegate.h index eed95e4a..d0e56310 100644 --- a/ui/aura/client/drag_drop_delegate.h +++ b/ui/aura/client/drag_drop_delegate.h
@@ -17,7 +17,8 @@ namespace ui { class DropTargetEvent; -} +class LayerTreeOwner; +} // namespace ui namespace aura { class Window; @@ -46,6 +47,13 @@ base::OnceCallback<void(std::unique_ptr<ui::OSExchangeData> data, ui::mojom::DragOperation& output_drag_op)>; + // Callback emitted by GetDropCallbackWithAnimation used to handle deferred + // drop events and drag image dropping animation. + using DropCallbackWithAnimation = base::OnceCallback<void( + std::unique_ptr<ui::OSExchangeData> data, + ui::mojom::DragOperation& output_drag_op, + std::unique_ptr<ui::LayerTreeOwner> old_layer_owner)>; + // OnDragEntered is invoked when the mouse enters this window during a drag & // drop session. This is immediately followed by an invocation of // OnDragUpdated, and eventually one of OnDragExited, or GetDropCallback. @@ -62,9 +70,14 @@ // Invoked during a drag and drop session when the user release the mouse, but // the drop is held because of the DataTransferPolicyController. - // The returned callback may be NullCallback if there's nothing to do and the - // drop event is ignored. + // The implementation may support different a callback to obtain a drag image + // widget and manipulate the dropping animation when + // GetDropCallbackWithAnimation returns base::NullCallback(). Otherwise, the + // implementation will fallback to the default GetDropCallback(). If both + // callbacks are null, there's nothing to do and the drop event is ignored. virtual DropCallback GetDropCallback(const ui::DropTargetEvent& event) = 0; + virtual DropCallbackWithAnimation GetDropCallbackWithAnimation( + const ui::DropTargetEvent& event); protected: virtual ~DragDropDelegate() {}
diff --git a/ui/base/interaction/element_tracker_mac.mm b/ui/base/interaction/element_tracker_mac.mm index 429f724..396e2562 100644 --- a/ui/base/interaction/element_tracker_mac.mm +++ b/ui/base/interaction/element_tracker_mac.mm
@@ -54,7 +54,7 @@ void ActivateElement(ElementIdentifier identifier) { const auto it = elements_.find(identifier); - DCHECK(it != elements_.end()); + CHECK(it != elements_.end()); ui::ElementTracker::GetFrameworkDelegate()->NotifyElementActivated( it->second.get()); }
diff --git a/ui/base/x/x11_clipboard_helper.cc b/ui/base/x/x11_clipboard_helper.cc index 4dd5c19..b6fa7dc 100644 --- a/ui/base/x/x11_clipboard_helper.cc +++ b/ui/base/x/x11_clipboard_helper.cc
@@ -295,11 +295,8 @@ return; std::vector<x11::Atom> targets = format_map.GetTypes(); - base::TimeTicks start = base::TimeTicks::Now(); selection_requestor_->PerformBlockingConvertSelectionWithParameter( x11::GetAtom(kClipboardManager), x11::GetAtom(kSaveTargets), targets); - UMA_HISTOGRAM_TIMES("Clipboard.X11StoreCopyPasteDuration", - base::TimeTicks::Now() - start); } XClipboardHelper::TargetList XClipboardHelper::GetTargetList(
diff --git a/ui/chromeos/events/keyboard_capability.h b/ui/chromeos/events/keyboard_capability.h index ab1e2e0..431f44db 100644 --- a/ui/chromeos/events/keyboard_capability.h +++ b/ui/chromeos/events/keyboard_capability.h
@@ -64,7 +64,7 @@ base::MakeFixedFlatMap<KeyboardCode, KeyboardCode>({ {KeyboardCode::VKEY_DELETE, KeyboardCode::VKEY_BACK}, {KeyboardCode::VKEY_HOME, KeyboardCode::VKEY_LEFT}, - {KeyboardCode::VKEY_UP, KeyboardCode::VKEY_PRIOR}, + {KeyboardCode::VKEY_PRIOR, KeyboardCode::VKEY_UP}, {KeyboardCode::VKEY_END, KeyboardCode::VKEY_RIGHT}, {KeyboardCode::VKEY_NEXT, KeyboardCode::VKEY_DOWN}, {KeyboardCode::VKEY_INSERT, KeyboardCode::VKEY_BACK}, @@ -75,7 +75,7 @@ inline constexpr auto kReversedSixPackKeyToSystemKeyMap = base::MakeFixedFlatMap<KeyboardCode, KeyboardCode>({ {KeyboardCode::VKEY_LEFT, KeyboardCode::VKEY_HOME}, - {KeyboardCode::VKEY_PRIOR, KeyboardCode::VKEY_UP}, + {KeyboardCode::VKEY_UP, KeyboardCode::VKEY_PRIOR}, {KeyboardCode::VKEY_RIGHT, KeyboardCode::VKEY_END}, {KeyboardCode::VKEY_DOWN, KeyboardCode::VKEY_NEXT}, });
diff --git a/ui/chromeos/events/mojom/BUILD.gn b/ui/chromeos/events/mojom/BUILD.gn index 4c51b1d..4ccf218 100644 --- a/ui/chromeos/events/mojom/BUILD.gn +++ b/ui/chromeos/events/mojom/BUILD.gn
@@ -7,5 +7,6 @@ assert(is_chromeos_ash) mojom("mojom") { + webui_module_path = "/" sources = [ "modifier_key.mojom" ] }
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp index 6534adc..0c91f7a 100644 --- a/ui/chromeos/file_manager_strings.grdp +++ b/ui/chromeos/file_manager_strings.grdp
@@ -858,6 +858,9 @@ <message name="IDS_FILE_BROWSER_SEARCH_NO_MATCHING_RESULTS_DESC" desc="Text displayed in the files under the title when a search has no results"> Try another search </message> + <message name="IDS_FILE_BROWSER_SEARCH_V2_EDUCATION_NUDGE" desc="Educational text that appears next to the search query to inform the user about existence of new search features."> + New search features available + </message> <message name="IDS_FILE_BROWSER_SEARCH_A11Y_CLEAR_SEARCH" desc="Text spoken by ChromeVox/screen reader when a search term has been cleared"> Search text cleared, showing all files and folders.
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SEARCH_V2_EDUCATION_NUDGE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SEARCH_V2_EDUCATION_NUDGE.png.sha1 new file mode 100644 index 0000000..54a21436 --- /dev/null +++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SEARCH_V2_EDUCATION_NUDGE.png.sha1
@@ -0,0 +1 @@ +1def4bde68f71ea7dd26bf4f568ddd795b3c7e82 \ No newline at end of file
diff --git a/ui/chromeos/styles/cros_ref_colors.json5 b/ui/chromeos/styles/cros_ref_colors.json5 index 636947a..59a539a 100644 --- a/ui/chromeos/styles/cros_ref_colors.json5 +++ b/ui/chromeos/styles/cros_ref_colors.json5
@@ -38,6 +38,7 @@ secondary0: '#000000', secondary10: '#001d35', + secondary15: '#002844', secondary20: '#003355', secondary30: '#004a77', secondary40: '#00639b',
diff --git a/ui/chromeos/styles/cros_sys_colors.json5 b/ui/chromeos/styles/cros_sys_colors.json5 index 2f83899..146345053 100644 --- a/ui/chromeos/styles/cros_sys_colors.json5 +++ b/ui/chromeos/styles/cros_sys_colors.json5
@@ -118,7 +118,7 @@ /* Bases */ header: { light: '$cros.ref.secondary90', - dark: '$cros.ref.secondary20', + dark: '$cros.ref.secondary15', }, 'app-base-shaded': { light: '$cros.ref.neutralvariant95',
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index cbe8ac5..2a8734d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Knip</translation> <translation id="7732111077498238432">Netwerk word deur beleid beheer</translation> <translation id="7736003208887389532">Wil jy hierdie lêers permanent uitvee?</translation> +<translation id="7740287852186792672">Soekresultate</translation> <translation id="7748626145866214022">Meer opsies is op die aksiebalk beskikbaar. Druk Alt + A om op die aksiebalk te fokus.</translation> <translation id="7760449188139285140">Chinees-Wubi</translation> <translation id="7765158879357617694">Skuif</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index e393bea..18e3eb1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">ቁረጥ</translation> <translation id="7732111077498238432">አውታረ መረብ በመመሪያ ቁጥጥር የሚደረግበት ነው</translation> <translation id="7736003208887389532">እነዚህ ፋይሎች በቋሚነት ይሰረዙ?</translation> +<translation id="7740287852186792672">የፍለጋ ውጤቶች</translation> <translation id="7748626145866214022">ተጨማሪ አማራጮች በእርምጃ አሞሌው ላይ ይገኛሉ። በእርምጃ አሞሌው ላይ ለማተኮር Alt + A ይጫኑ።</translation> <translation id="7760449188139285140">ቻይንኛ ዉቢ</translation> <translation id="7765158879357617694">ውሰድ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index 4f6590b..a4d6dd5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">قص</translation> <translation id="7732111077498238432">هناك سياسة تحكم هذه الشبكة</translation> <translation id="7736003208887389532">هل تريد حذف هذه الملفات نهائيًا؟</translation> +<translation id="7740287852186792672">نتائج البحث</translation> <translation id="7748626145866214022">تتوفر مزيد من الخيارات على شريط الإجراءات. يُرجى الضغط على "Alt + A" لتركيز هذا الشريط.</translation> <translation id="7760449188139285140">الصينية باستخدام لوحة مفاتيح Wubi</translation> <translation id="7765158879357617694">نقل</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index 586fd06e..067e784 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Kəsin</translation> <translation id="7732111077498238432">Şəbəkə siyasətlə idarə edilir</translation> <translation id="7736003208887389532">Bu fayllar həmişəlik silinsin?</translation> +<translation id="7740287852186792672">Axtarış nəticələri</translation> <translation id="7748626145866214022">Əməliyyat panelində daha çox seçim əlçatandır. Əməliyyat panelinə fokuslanmaq üçün Alt + A düymələrinə basın.</translation> <translation id="7760449188139285140">Çin dili (Vubi)</translation> <translation id="7765158879357617694">Daşıyın</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index 44a51e09..42fd360 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Спампаваць мабільны профіль, сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, "<ph name="NETWORK_NAME" />", <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Англійская (Вялікабрытанія)</translation> <translation id="3975895378829046965">Бенгальская (фанетычная раскладка)</translation> +<translation id="3999574733850440202">Файлы Microsoft, якія нядаўна адкрываліся, былі перамешчаны на OneDrive</translation> <translation id="4002066346123236978">Назва</translation> <translation id="4017788180641807848">Англійская (ЗША) з раскладкай Workman</translation> <translation id="4019998208269143058">Замацаваць у раздзеле "Хуткія файлы"</translation> @@ -906,6 +907,7 @@ <translation id="8300849813060516376">Памылка OTASP</translation> <translation id="8312871300878166382">Уставіць у папку</translation> <translation id="8329978297633540474">Звычайны тэкст</translation> +<translation id="8332007959299458842">Файлы Microsoft, якія нядаўна адкрываліся, былі перамешчаны на Google Дыск</translation> <translation id="8335587457941836791">Адмацаваць з паліцы</translation> <translation id="8335837413233998004">Беларуская</translation> <translation id="8336153091935557858">Учора, <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index 5bc8bc37..2740ab50 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Изрязване</translation> <translation id="7732111077498238432">Мрежата се контролира чрез правила</translation> <translation id="7736003208887389532">Да се изтрият ли за постоянно тези файлове?</translation> +<translation id="7740287852186792672">Резултати от търсенето</translation> <translation id="7748626145866214022">В лентата за действия има още опции. Натиснете Alt + A, за да поставите фокуса върху нея.</translation> <translation id="7760449188139285140">Китайски (уби)</translation> <translation id="7765158879357617694">Преместване</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index 9e25a159..ed8a855 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">কাটুন</translation> <translation id="7732111077498238432">নেটওয়ার্কগুলি নীতি নিয়ন্ত্রিত</translation> <translation id="7736003208887389532">এইসব ফাইল স্থায়ীভাবে মুছতে চান?</translation> +<translation id="7740287852186792672">সার্চ ফলাফল</translation> <translation id="7748626145866214022">অ্যাকশন বারে আরও বিকল্প উপলভ্য। অ্যাকশন বারে ফোকাস করতে Alt + A প্রেস করুন।</translation> <translation id="7760449188139285140">চীনা উবি</translation> <translation id="7765158879357617694">সরান</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb index 947e65f..cf684eb 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">irski</translation> <translation id="4124935795427217608">Jednorog</translation> <translation id="4131235941541910880">Premjestite stavke koje su vam nepotrebne u otpad</translation> +<translation id="4134804435730168042">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktiviranje nakon postavljanja uređaja</translation> <translation id="4153015322587141338">Desnom tipkom kliknite na fajl i odaberite "<ph name="PIN_COMMAND" />" za brzi pristup fajlovima na polici.</translation> <translation id="4157569377477607576">Pravila administratora ne preporučuju:</translation> <translation id="4159731583141908892">Fajl <ph name="FILE_NAME" /> je premješten.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">Fajl "<ph name="FILE_NAME" />" će se izbrisati i nećete ga moći vratiti.</translation> <translation id="4418686080762064601">Kreirajte prečicu za svoje fajlove</translation> <translation id="4425149324548788773">Moj disk</translation> +<translation id="4432921877815220091">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktiviranje nakon postavljanja uređaja, upravlja administrator</translation> <translation id="4439427728133035643">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, poveži</translation> <translation id="4442424173763614572">Traženje DNS-a nije uspjelo</translation> <translation id="4462159676511157176">Serveri prilagođenog imena</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Kopiranje nije uspjelo zbog neočekivane greške: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">nizozemski (Nizozemska) s međunarodnom SAD tastaturom za PC</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktiviranje nakon postavljanja uređaja</translation> <translation id="5955954492236143329">Broj stavki: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="5957366693331451795">Uređaji Chromebox</translation> <translation id="5982621672636444458">Opcije sortiranja</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Izreži</translation> <translation id="7732111077498238432">Mrežu kontroliraju pravila</translation> <translation id="7736003208887389532">Trajno izbrisati ove fajlove?</translation> +<translation id="7740287852186792672">Rezultati pretraživanja</translation> <translation id="7748626145866214022">Više opcija je dostupno u traci s aktivnostima. Pritisnite Alt + A da fokusirate traku s aktivnostima.</translation> <translation id="7760449188139285140">kineski wubi</translation> <translation id="7765158879357617694">Pomjeri</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Dostupno van mreže</translation> <translation id="8492972329130824181">Kućna mreža nije dostupna. Prijenos roming podataka na mobilnoj mreži mora biti omogućen da se povežete.</translation> <translation id="8499098729323186194">Izdvajanje stavki (njih <ph name="NUMBER_OF_ITEMS" />)...</translation> +<translation id="8502913769543567768">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktiviranje nakon postavljanja uređaja, upravlja administrator</translation> <translation id="8521441079177373948">Velika Britanija</translation> <translation id="853494022971700746">francuski (Francuska)</translation> <translation id="8540608333167683902">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, detalji</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 0206a81f..60f47d69 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Baixa el perfil mòbil, xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglès (Regne Unit)</translation> <translation id="3975895378829046965">Bengalí fonètic</translation> +<translation id="3999574733850440202">Els fitxers de Microsoft oberts recentment s'han mogut a OneDrive</translation> <translation id="4002066346123236978">Títol</translation> <translation id="4017788180641807848">Anglès (EUA) amb teclat Workman</translation> <translation id="4019998208269143058">Fixa als fitxers ràpids</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">Retalla</translation> <translation id="7732111077498238432">La xarxa està controlada per una política</translation> <translation id="7736003208887389532">Vols suprimir permanentment aquests fitxers?</translation> +<translation id="7740287852186792672">Resultats de la cerca</translation> <translation id="7748626145866214022">Hi ha més opcions disponibles a la barra d'accions. Prem Alt+A per posar el focus a la barra d'accions.</translation> <translation id="7760449188139285140">Xinès (wubi)</translation> <translation id="7765158879357617694">Mou</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">Error d'OTASP</translation> <translation id="8312871300878166382">Enganxa a la carpeta</translation> <translation id="8329978297633540474">Text sense format</translation> +<translation id="8332007959299458842">Els fitxers de Microsoft oberts recentment s'han mogut a Google Drive</translation> <translation id="8335587457941836791">Deixa de fixar al prestatge</translation> <translation id="8335837413233998004">Bielorús</translation> <translation id="8336153091935557858">Ahir a les <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index 320fe02..d39593a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Vyjmout</translation> <translation id="7732111077498238432">Síť podléhá zásadám</translation> <translation id="7736003208887389532">Trvale tyto soubory smazat?</translation> +<translation id="7740287852186792672">Výsledky vyhledávání</translation> <translation id="7748626145866214022">Další možnosti jsou k dispozici na panelu akcí. Na panel akcí přejdete stisknutím kláves Alt + A.</translation> <translation id="7760449188139285140">čínština (Wubi)</translation> <translation id="7765158879357617694">Přesunout</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index e4a709be..41e004ab8c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Klip</translation> <translation id="7732111077498238432">Netværket er underlagt politikker</translation> <translation id="7736003208887389532">Vil du slette disse filer permanent?</translation> +<translation id="7740287852186792672">Søgeresultater</translation> <translation id="7748626145866214022">Der er flere tilgængelige muligheder på handlingslinjen. Tryk på Alt+A for at fokusere på handlingslinjen.</translation> <translation id="7760449188139285140">Kinesisk wubi</translation> <translation id="7765158879357617694">Flyt</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index c728986..16bb5cb 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Ausschneiden</translation> <translation id="7732111077498238432">Das Netzwerk ist richtliniengesteuert</translation> <translation id="7736003208887389532">Diese Dateien endgültig löschen?</translation> +<translation id="7740287852186792672">Suchergebnisse</translation> <translation id="7748626145866214022">Auf der Aktionsleiste sind weitere Optionen verfügbar. Drücke Alt + A, um den Fokus auf die Aktionsleiste zu setzen.</translation> <translation id="7760449188139285140">Chinesisch (Wubi)</translation> <translation id="7765158879357617694">Verschieben</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index ddcae5522..46a3cce9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -848,6 +848,7 @@ <translation id="7724603315864178912">Αποκοπή</translation> <translation id="7732111077498238432">Το δίκτυο διέπεται από πολιτική</translation> <translation id="7736003208887389532">Μόνιμη διαγραφή αυτών των αρχείων;</translation> +<translation id="7740287852186792672">Αποτελέσματα αναζήτησης</translation> <translation id="7748626145866214022">Στη γραμμή ενεργειών υπάρχουν περισσότερες επιλογές. Πιέστε Alt + A, για να εστιάσετε στη γραμμή ενεργειών.</translation> <translation id="7760449188139285140">Κινεζικά Wubi</translation> <translation id="7765158879357617694">Μεταφορά</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index ceab556a..47e4848 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -764,6 +764,7 @@ <translation id="7126604456862387217">'<b><ph name="SEARCH_STRING" /></b>' - <em>search Drive</em></translation> <translation id="7135561821015524160">Kannada (phonetic)</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Missing 'subject alternative name match' or 'domain suffix match' to validate the authentication server identity</translation> <translation id="7165320105431587207">Failed to configure network</translation> <translation id="7170041865419449892">Out of range</translation> <translation id="7180611975245234373">Refresh</translation> @@ -834,6 +835,7 @@ <translation id="7724603315864178912">Cut</translation> <translation id="7732111077498238432">Network is policy controlled</translation> <translation id="7736003208887389532">Permanently delete these files?</translation> +<translation id="7740287852186792672">Search results</translation> <translation id="7748626145866214022">More options available on the action bar. Press Alt + A to focus the action bar.</translation> <translation id="7760449188139285140">Chinese Wubi</translation> <translation id="7765158879357617694">Move</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb index 497e977..62440ad 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Cortar</translation> <translation id="7732111077498238432">La red está controlada por políticas</translation> <translation id="7736003208887389532">¿Quieres borrar estos archivos de forma permanente?</translation> +<translation id="7740287852186792672">Resultados de búsqueda</translation> <translation id="7748626145866214022">Hay más opciones disponibles en la barra de acciones. Presiona Alt + A para cambiar el foco a la barra de acciones.</translation> <translation id="7760449188139285140">Chino (Wubi)</translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index e63e208e..b9bd5b7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Cortar</translation> <translation id="7732111077498238432">La red está controlada por políticas</translation> <translation id="7736003208887389532">¿Eliminar permanentemente estos archivos?</translation> +<translation id="7740287852186792672">Resultados de la búsqueda</translation> <translation id="7748626145866214022">Hay más opciones disponibles en la barra de acciones. Pulsa Alt + A para seleccionarla.</translation> <translation id="7760449188139285140">Chino (Wubi)</translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 1a50281..09013fea 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Lõika</translation> <translation id="7732111077498238432">Võrgus kehtivad eeskirjad</translation> <translation id="7736003208887389532">Kas kustutada need failid jäädavalt?</translation> +<translation id="7740287852186792672">Otsingutulemused</translation> <translation id="7748626145866214022">Toiminguribal on saadaval rohkem valikuid. Toiminguriba esiletõstmiseks vajutage klahve Alt + A.</translation> <translation id="7760449188139285140">hiina, wubi</translation> <translation id="7765158879357617694">Liiguta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index 95edc9a..a2546d46 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Deskargatu mugikorreko profila, <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" /> sare, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Ingelesa (Erresuma Batua)</translation> <translation id="3975895378829046965">Bengalar fonetikoa</translation> +<translation id="3999574733850440202">Duela gutxi irekitako Microsoft-eko fitxategiak OneDrive-ra eraman dira</translation> <translation id="4002066346123236978">Izena</translation> <translation id="4017788180641807848">Ingelesa (AEB), Workman teklatuarekin</translation> <translation id="4019998208269143058">Ainguratu Fitxategi bizkorrak atalean</translation> @@ -829,6 +830,7 @@ <translation id="7724603315864178912">Ebaki</translation> <translation id="7732111077498238432">Gidalerroen bidez dago kontrolatuta sarea</translation> <translation id="7736003208887389532">Fitxategiak betiko ezabatu nahi dituzu?</translation> +<translation id="7740287852186792672">Bilaketa-emaitzak</translation> <translation id="7748626145866214022">Ekintza-barran aukera gehiago dituzu eskuragarri. Ekintza-barra fokuratzeko, sakatu Alt + A.</translation> <translation id="7760449188139285140">Txinatarra (wubi)</translation> <translation id="7765158879357617694">Eraman</translation> @@ -906,6 +908,7 @@ <translation id="8300849813060516376">OTASP zerbitzuak huts egin du</translation> <translation id="8312871300878166382">Itsatsi karpetan</translation> <translation id="8329978297633540474">Testu arrunta</translation> +<translation id="8332007959299458842">Duela gutxi irekitako Microsoft-eko fitxategiak Google Drive-ra eraman dira</translation> <translation id="8335587457941836791">Desainguratu apaletik</translation> <translation id="8335837413233998004">Bielorrusiarra</translation> <translation id="8336153091935557858">Atzo (<ph name="YESTERDAY_DAYTIME" />)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index ed7685c..38ea4fc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">برش</translation> <translation id="7732111077498238432">شبکه توسط خطمشی کنترل میشود</translation> <translation id="7736003208887389532">این فایلها برای همیشه حذف شود؟</translation> +<translation id="7740287852186792672">نتایج جستجو</translation> <translation id="7748626145866214022">گزینههای بیشتر در نوار کنش دردسترس است. برای تمرکز بر نوار کنش، Alt + A را فشار دهید.</translation> <translation id="7760449188139285140">چینی (ووبی)</translation> <translation id="7765158879357617694">انتقال</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index b541e108..beb21a9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Lataa mobiiliprofiili, verkko <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">englanti (Yhdistynyt kuningaskunta)</translation> <translation id="3975895378829046965">foneettinen bangla</translation> +<translation id="3999574733850440202">Äskettäin avatut Microsoft-tiedostot on siirretty OneDriveen</translation> <translation id="4002066346123236978">Nimi</translation> <translation id="4017788180641807848">englanti (Yhdysvallat), Workman-näppäimistö</translation> <translation id="4019998208269143058">Kiinnitä pikatiedostoihin</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">Leikkaa</translation> <translation id="7732111077498238432">Tämän verkon toimintaa ohjataan käytännöillä.</translation> <translation id="7736003208887389532">Poistetaanko tiedostot pysyvästi?</translation> +<translation id="7740287852186792672">Hakutulokset</translation> <translation id="7748626145866214022">Lisää valintoja on saatavilla toimintopalkissa. Aseta toimintopalkki aktiiviseksi painamalla Alt + A.</translation> <translation id="7760449188139285140">kiina (wubi)</translation> <translation id="7765158879357617694">Siirrä</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">OTASP epäonnistui</translation> <translation id="8312871300878166382">Liitä kansioon</translation> <translation id="8329978297633540474">Vain teksti</translation> +<translation id="8332007959299458842">Äskettäin avatut Microsoft-tiedostot on siirretty Google Driveen</translation> <translation id="8335587457941836791">Poista kiinnitys hyllystä</translation> <translation id="8335837413233998004">valkovenäjä</translation> <translation id="8336153091935557858">eilen <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 8842592..2ae0999 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">I-cut</translation> <translation id="7732111077498238432">Kinokontrol ng patakaran ang network</translation> <translation id="7736003208887389532">Permanenteng i-delete ang mga file na ito?</translation> +<translation id="7740287852186792672">Mga resulta sa paghahanap</translation> <translation id="7748626145866214022">Available ang higit pang opsyon sa action bar. Pindutin ang Alt + A para i-focus ang action bar.</translation> <translation id="7760449188139285140">Chinese Wubi</translation> <translation id="7765158879357617694">Ilipat</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index 23678abb..75455f7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -832,6 +832,7 @@ <translation id="7724603315864178912">Couper</translation> <translation id="7732111077498238432">Le réseau est contrôlé par une politique</translation> <translation id="7736003208887389532">Supprimer définitivement ces fichiers?</translation> +<translation id="7740287852186792672">Résultats de recherche</translation> <translation id="7748626145866214022">Vous trouverez d'autres options dans la barre d'action. Appuyez sur Alt + A pour mettre en évidence la barre d'action.</translation> <translation id="7760449188139285140">Chinois (Wubi)</translation> <translation id="7765158879357617694">Déplacer</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index 65526f4..e57e45c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Téléchargez le profil mobile, Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Anglais (Royaume-Uni)</translation> <translation id="3975895378829046965">Bengali (phonétique)</translation> +<translation id="3999574733850440202">Les fichiers Microsoft ouverts récemment ont été déplacés vers OneDrive</translation> <translation id="4002066346123236978">Titre</translation> <translation id="4017788180641807848">Anglais (États-Unis) avec clavier Workman</translation> <translation id="4019998208269143058">Épingler aux fichiers rapides</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">Couper</translation> <translation id="7732111077498238432">Le réseau est soumis à des règles</translation> <translation id="7736003208887389532">Supprimer définitivement ces fichiers ?</translation> +<translation id="7740287852186792672">Résultats de la recherche</translation> <translation id="7748626145866214022">D'autres options sont disponibles dans la barre d'action. Appuyez sur Alt+A pour la sélectionner.</translation> <translation id="7760449188139285140">Chinois (Wubi)</translation> <translation id="7765158879357617694">Déplacer</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">Échec de l'opération OTASP</translation> <translation id="8312871300878166382">Coller dans le dossier</translation> <translation id="8329978297633540474">Texte brut</translation> +<translation id="8332007959299458842">Les fichiers Microsoft ouverts récemment ont été déplacés vers Google Drive</translation> <translation id="8335587457941836791">Retirer de l'étagère</translation> <translation id="8335837413233998004">Biélorusse</translation> <translation id="8336153091935557858">Hier à <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index 3b8a45356..bbea641 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Descargar perfil para móbiles, rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglés (Reino Unido)</translation> <translation id="3975895378829046965">Bengalí (fonético)</translation> +<translation id="3999574733850440202">Os ficheiros de Microsoft abertos recentemente movéronse a OneDrive</translation> <translation id="4002066346123236978">Título</translation> <translation id="4017788180641807848">Inglés (EUA) con teclado Workman</translation> <translation id="4019998208269143058">Fixar en ficheiros rápidos</translation> @@ -829,6 +830,7 @@ <translation id="7724603315864178912">Cortar</translation> <translation id="7732111077498238432">A rede está controlada pola política</translation> <translation id="7736003208887389532">Queres eliminar permanentemente estes ficheiros?</translation> +<translation id="7740287852186792672">Resultados da busca</translation> <translation id="7748626145866214022">Hai máis opcións dispoñibles na barra de accións. Preme Alt + A para enfocar a barra de accións.</translation> <translation id="7760449188139285140">Chinés (Wubi)</translation> <translation id="7765158879357617694">Mover</translation> @@ -906,6 +908,7 @@ <translation id="8300849813060516376">Erro de OTASP</translation> <translation id="8312871300878166382">Pegar no cartafol</translation> <translation id="8329978297633540474">Texto sen formato</translation> +<translation id="8332007959299458842">Os ficheiros de Microsoft abertos recentemente movéronse a Google Drive</translation> <translation id="8335587457941836791">Deixar de fixar no estante</translation> <translation id="8335837413233998004">Belaruso</translation> <translation id="8336153091935557858">Onte ás <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index d279ceee..223b8a47 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170"><ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />ના નેટવર્ક <ph name="NETWORK_COUNT" />માંથી <ph name="NETWORK_INDEX" /> મોબાઇલ પ્રોફાઇલ ડાઉનલોડ કરો</translation> <translation id="3973925058222872294">અંગ્રેજી (યુકે)</translation> <translation id="3975895378829046965">બંગાળી ફોનેટિક</translation> +<translation id="3999574733850440202">તાજેતરમાં ખોલવામાં આવેલી Microsoft ફાઇલો OneDrive પર ખસેડવામાં આવી છે</translation> <translation id="4002066346123236978">શીર્ષક</translation> <translation id="4017788180641807848">અંગ્રેજી (યુએસ), વર્કમેન કીબોર્ડ સાથે</translation> <translation id="4019998208269143058">ફાઇલોના ઝડપી ઍક્સેસ પર પિન કરો</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">કાપો</translation> <translation id="7732111077498238432">નેટવર્ક પૉલિસી દ્વારા નિયંત્રિત છે</translation> <translation id="7736003208887389532">શું આ ફાઇલો કાયમ માટે ડિલીટ કરીએ?</translation> +<translation id="7740287852186792672">શોધ પરિણામો</translation> <translation id="7748626145866214022">ક્રિયા બાર પર વધુ વિકલ્પો ઉપલબ્ધ છે. ક્રિયા બાર પર ફોકસ કરવા માટે Alt + A દબાવો.</translation> <translation id="7760449188139285140">ચાઇનીઝ વુબી</translation> <translation id="7765158879357617694">સ્થાન</translation> @@ -905,6 +907,7 @@ <translation id="8300849813060516376">OTASP નિષ્ફળ</translation> <translation id="8312871300878166382">ફોલ્ડરમાં પેસ્ટ કરો</translation> <translation id="8329978297633540474">સાદી ટેક્સ્ટ</translation> +<translation id="8332007959299458842">તાજેતરમાં ખોલવામાં આવેલી Microsoft ફાઇલો Google Drive પર ખસેડવામાં આવી છે</translation> <translation id="8335587457941836791">શેલ્ફમાંથી અનપિન કરો</translation> <translation id="8335837413233998004">બેલારુશિયન</translation> <translation id="8336153091935557858">ગઈ કાલે <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index ecd6a42a..01a5317 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">काटें</translation> <translation id="7732111077498238432">नेटवर्क, नीति से नियंत्रित है</translation> <translation id="7736003208887389532">क्या आपको इन फ़ाइलों को हमेशा के लिए मिटाना है?</translation> +<translation id="7740287852186792672">खोज परिणाम</translation> <translation id="7748626145866214022">कार्रवाई बार पर और भी विकल्प उपलब्ध हैं. कार्रवाई बार पर फ़ोकस करने के लिए Alt + A दबाएं.</translation> <translation id="7760449188139285140">चाइनीज़ वुबी</translation> <translation id="7765158879357617694">ले जाएं</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index c54bbf10..e4b101da 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">irski</translation> <translation id="4124935795427217608">Jednorog</translation> <translation id="4131235941541910880">Nepotrebne stavke premjestite u otpad</translation> +<translation id="4134804435730168042">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktivira se nakon postavljanja uređaja</translation> <translation id="4153015322587141338">Desnom tipkom kliknite datoteku i odaberite "<ph name="PIN_COMMAND" />" da biste brzo pristupali datotekama na traci.</translation> <translation id="4157569377477607576">Prema pravilima administratora ne preporučuje se sljedeće:</translation> <translation id="4159731583141908892">Premješteno: <ph name="FILE_NAME" />.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">Datoteka <ph name="FILE_NAME" /> izbrisat će se i nećete je moći vratiti.</translation> <translation id="4418686080762064601">Izradite prečac za svoje datoteke</translation> <translation id="4425149324548788773">Moj disk</translation> +<translation id="4432921877815220091">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktivira se nakon postavljanja uređajaa, upravlja administrator</translation> <translation id="4439427728133035643">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, povežite</translation> <translation id="4442424173763614572">Nije uspjelo pretraživanje DNS poslužitelja</translation> <translation id="4462159676511157176">Prilagođeni poslužitelji naziva</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Kopiranje nije uspjelo, neočekivana pogreška: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">nizozemski (Nizozemska) s američkom međunarodnom tipkovnicom za PC</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktivira se nakon postavljanja uređaja</translation> <translation id="5955954492236143329">Broj stavki: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="5957366693331451795">Chromeboxovi</translation> <translation id="5982621672636444458">Opcije razvrstavanja</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Izreži</translation> <translation id="7732111077498238432">Mreža je kontrolirana pravilima</translation> <translation id="7736003208887389532">Želite li trajno izbrisati te datoteke?</translation> +<translation id="7740287852186792672">Rezultati pretraživanja</translation> <translation id="7748626145866214022">Više opcija dostupno je na traci radnji. Pritisnite Alt + A da biste fokusirali traku radnji.</translation> <translation id="7760449188139285140">kineski wubi</translation> <translation id="7765158879357617694">Pomakni</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Dostupno izvanmrežno</translation> <translation id="8492972329130824181">Kućna mreža nije dostupna. Za povezivanje je potrebno omogućiti roaming mobilnih podataka.</translation> <translation id="8499098729323186194">Izdvajanje <ph name="NUMBER_OF_ITEMS" /> stavke/stavki...</translation> +<translation id="8502913769543567768">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktivira se nakon postavljanja uređaja, upravlja administrator</translation> <translation id="8521441079177373948">engleska (Velika Britanija)</translation> <translation id="853494022971700746">francuski (Francuska)</translation> <translation id="8540608333167683902">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, pojedinosti</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb index 4bf67bf..ef7f6c4f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Kivágás</translation> <translation id="7732111077498238432">A hálózatot házirend szabályozza</translation> <translation id="7736003208887389532">Véglegesen törli ezeket a fájlokat?</translation> +<translation id="7740287852186792672">Keresés eredménye</translation> <translation id="7748626145866214022">További lehetőségek érhetők el a műveletsávon, amelyre az Alt+A billentyűkóddal helyezheti át a fókuszt.</translation> <translation id="7760449188139285140">kínai, vubi</translation> <translation id="7765158879357617694">Áthelyezés</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb index 9d0b753..a48a67a7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Կտրել</translation> <translation id="7732111077498238432">Ցանցը վերահսկվում է քաղաքականությամբ</translation> <translation id="7736003208887389532">Ընդմիշտ ջնջե՞լ այս ֆայլերը։</translation> +<translation id="7740287852186792672">Որոնման արդյունքներ</translation> <translation id="7748626145866214022">Գործողությունների գոտում առկա են լրացուցիչ ընտրանքներ: Սեղմեք Alt+A՝ գործողությունների գոտին նշելու համար:</translation> <translation id="7760449188139285140">չինարեն (Wubi)</translation> <translation id="7765158879357617694">Տեղափոխել</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index f6f1853..cde12e1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Download profil seluler, Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inggris (Inggris Raya)</translation> <translation id="3975895378829046965">Fonetik Bengali</translation> +<translation id="3999574733850440202">File Microsoft yang baru saja dibuka telah dipindahkan ke OneDrive</translation> <translation id="4002066346123236978">Judul</translation> <translation id="4017788180641807848">Inggris (AS) dengan keyboard Workman</translation> <translation id="4019998208269143058">Sematkan ke file cepat</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">Potong</translation> <translation id="7732111077498238432">Jaringan dikontrol oleh kebijakan</translation> <translation id="7736003208887389532">Hapus permanen file ini?</translation> +<translation id="7740287852186792672">Hasil penelusuran</translation> <translation id="7748626145866214022">Opsi lainnya tersedia di menu tindakan. Tekan Alt + A untuk memindahkan menu tindakan ke posisi tengah.</translation> <translation id="7760449188139285140">Wubi China</translation> <translation id="7765158879357617694">Pindahkan</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">OTASP gagal</translation> <translation id="8312871300878166382">Tempelkan ke folder</translation> <translation id="8329978297633540474">Teks biasa</translation> +<translation id="8332007959299458842">File Microsoft yang baru saja dibuka telah dipindahkan ke Google Drive</translation> <translation id="8335587457941836791">Lepaskan pin dari rak</translation> <translation id="8335837413233998004">Belarusia</translation> <translation id="8336153091935557858"><ph name="YESTERDAY_DAYTIME" /> kemarin</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index 17601d5..afa6cb4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Sækja snjallprófíl, netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Enska (bresk)</translation> <translation id="3975895378829046965">Bengalska hljóðritun</translation> +<translation id="3999574733850440202">Nýlega opnaðar Microsoft-skrár voru færðar yfir á OneDrive</translation> <translation id="4002066346123236978">Heiti</translation> <translation id="4017788180641807848">Enska (bandarísk) með Workman-lyklaborði</translation> <translation id="4019998208269143058">Festa við „Skrár fljótt“</translation> @@ -829,6 +830,7 @@ <translation id="7724603315864178912">Klippa</translation> <translation id="7732111077498238432">Netkerfinu er stjórnað af reglu</translation> <translation id="7736003208887389532">Eyða þessum skrám endanlega?</translation> +<translation id="7740287852186792672">Leitarniðurstöður</translation> <translation id="7748626145866214022">Fleiri valkosti er að finna á aðgerðastikunni. Ýttu á Alt + A til að setja aðgerðastikuna í fókus.</translation> <translation id="7760449188139285140">Kínverska Wubi</translation> <translation id="7765158879357617694">Færa</translation> @@ -906,6 +908,7 @@ <translation id="8300849813060516376">OTASP mistókst</translation> <translation id="8312871300878166382">Líma inn í möppu</translation> <translation id="8329978297633540474">Ósniðinn texti</translation> +<translation id="8332007959299458842">Nýlega opnaðar Microsoft-skrár voru færðar yfir á Google Drive</translation> <translation id="8335587457941836791">Losa úr hillu</translation> <translation id="8335837413233998004">Hvítrússneska</translation> <translation id="8336153091935557858">Í gær <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index a282ec8..30db5fd 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Scarica il profilo per dispositivi mobili, rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Inglese (UK)</translation> <translation id="3975895378829046965">Bengalese fonetica</translation> +<translation id="3999574733850440202">I file Microsoft aperti di recente sono stati spostati in OneDrive</translation> <translation id="4002066346123236978">Titolo</translation> <translation id="4017788180641807848">Inglese (USA) con tastiera Workman</translation> <translation id="4019998208269143058">Blocca sui file rapidi</translation> @@ -363,6 +364,7 @@ <translation id="4092890906744441904">Irlandese</translation> <translation id="4124935795427217608">Unicorno</translation> <translation id="4131235941541910880">Sposta nel cestino gli elementi che non ti servono</translation> +<translation id="4134804435730168042">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Attiva dopo la configurazione del dispositivo</translation> <translation id="4153015322587141338">Fai clic con il tasto destro del mouse su un file e seleziona "<ph name="PIN_COMMAND" />" per accedervi rapidamente dalla barra delle app.</translation> <translation id="4157569377477607576">Il criterio dell'amministratore sconsiglia:</translation> <translation id="4159731583141908892">Elemento <ph name="FILE_NAME" /> spostato.</translation> @@ -405,6 +407,7 @@ <translation id="4414834425328380570">Il file "<ph name="FILE_NAME" />" verrà eliminato e non potrai ripristinarlo.</translation> <translation id="4418686080762064601">Crea una scorciatoia per i tuoi file</translation> <translation id="4425149324548788773">I miei file</translation> +<translation id="4432921877815220091">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Attiva dopo la configurazione del dispositivo, Gestita dall'amministratore</translation> <translation id="4439427728133035643">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, intensità del segnale <ph name="SIGNAL_STRENGTH" />%, connetti</translation> <translation id="4442424173763614572">Ricerca DNS non riuscita</translation> <translation id="4462159676511157176">Assegna nomi personalizzati a server</translation> @@ -613,6 +616,7 @@ <translation id="5913638992615760742">Operazione di copia non riuscita, errore imprevisto: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Olandese (Paesi Bassi) con tastiera PC internazionale USA</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Attiva dopo la configurazione del dispositivo</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> elementi</translation> <translation id="5957366693331451795">I Chromebox</translation> <translation id="5982621672636444458">Opzioni ordinamento</translation> @@ -829,6 +833,7 @@ <translation id="7724603315864178912">Taglia</translation> <translation id="7732111077498238432">La rete è gestita tramite norme</translation> <translation id="7736003208887389532">Vuoi eliminare definitivamente questi file?</translation> +<translation id="7740287852186792672">Risultati della ricerca</translation> <translation id="7748626145866214022">Nella barra delle azioni sono disponibili altre opzioni. Premi ALT + A per impostare lo stato attivo sulla barra.</translation> <translation id="7760449188139285140">Cinese Wubi</translation> <translation id="7765158879357617694">Sposta</translation> @@ -906,6 +911,7 @@ <translation id="8300849813060516376">OTASP non riuscito</translation> <translation id="8312871300878166382">Incolla nella cartella</translation> <translation id="8329978297633540474">Testo normale</translation> +<translation id="8332007959299458842">I file Microsoft aperti di recente sono stati spostati su Google Drive</translation> <translation id="8335587457941836791">Stacca dalla barra delle app</translation> <translation id="8335837413233998004">Bielorusso</translation> <translation id="8336153091935557858">Ieri alle <ph name="YESTERDAY_DAYTIME" /></translation> @@ -932,6 +938,7 @@ <translation id="8487700953926739672">Disponibile offline</translation> <translation id="8492972329130824181">La rete di casa non è disponibile. Il roaming dei dati mobili deve essere attivato per connettersi.</translation> <translation id="8499098729323186194">Estrazione di <ph name="NUMBER_OF_ITEMS" /> elementi in corso…</translation> +<translation id="8502913769543567768">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Attiva dopo la configurazione del dispositivo, Gestita dall'amministratore</translation> <translation id="8521441079177373948">Regno Unito</translation> <translation id="853494022971700746">Francese (Francia)</translation> <translation id="8540608333167683902">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensità del segnale <ph name="SIGNAL_STRENGTH" />%, dettagli</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 878027e..05f1df5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">הורדה של פרופיל נייד, רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">אנגלית (בריטניה)</translation> <translation id="3975895378829046965">בנגלית פונטית</translation> +<translation id="3999574733850440202">קובצי Microsoft שנפתחו לאחרונה עברו ל-OneDrive</translation> <translation id="4002066346123236978">כותרת</translation> <translation id="4017788180641807848">מקלדת Workman באנגלית (ארה"ב)</translation> <translation id="4019998208269143058">הצמדה לקבצים המהירים</translation> @@ -363,6 +364,7 @@ <translation id="4092890906744441904">אירית</translation> <translation id="4124935795427217608">חד-קרן</translation> <translation id="4131235941541910880">אפשר להעביר לאשפה פריטים שאין לך צורך בהם</translation> +<translation id="4134804435730168042">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, הפעלה בסיום הגדרת המכשיר</translation> <translation id="4153015322587141338">כדי לגשת במהירות לקבצים שבמדף, יש ללחוץ לחיצה ימנית על קובץ ולבחור באפשרות '<ph name="PIN_COMMAND" />'.</translation> <translation id="4157569377477607576">לפי מדיניות האדמין, הפעולות הבאות לא מומלצות:</translation> <translation id="4159731583141908892">ההעברה של <ph name="FILE_NAME" /> הסתיימה.</translation> @@ -405,6 +407,7 @@ <translation id="4414834425328380570">הקובץ '<ph name="FILE_NAME" />' יימחק ולא תהיה אפשרות לשחזר אותו.</translation> <translation id="4418686080762064601">יצירת קיצור דרך לקבצים</translation> <translation id="4425149324548788773">האחסון שלי</translation> +<translation id="4432921877815220091">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, הפעלה בסיום הגדרת המכשיר, בניהול האדמין</translation> <translation id="4439427728133035643">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, עוצמת האות: <ph name="SIGNAL_STRENGTH" />%, התחברות</translation> <translation id="4442424173763614572">חיפוש ה-DNS נכשל</translation> <translation id="4462159676511157176">שרתי שמות מותאמים אישית</translation> @@ -615,6 +618,7 @@ <translation id="5913638992615760742">פעולת ההעתקה נכשלה, שגיאה בלתי צפויה: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">הולנדית (הולנד) עם מקלדת בינלאומית של ארה"ב ל-PC</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, הפעלה בסיום הגדרת המכשיר</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> פריטים</translation> <translation id="5957366693331451795">מכשירי Chromebox</translation> <translation id="5982621672636444458">אפשרויות מיון</translation> @@ -831,6 +835,7 @@ <translation id="7724603315864178912">חיתוך</translation> <translation id="7732111077498238432">הרשת כפופה למדיניות</translation> <translation id="7736003208887389532">האם למחוק את הקבצים האלה לתמיד?</translation> +<translation id="7740287852186792672">תוצאות חיפוש</translation> <translation id="7748626145866214022">אפשרויות נוספות זמינות בסרגל הפעולות. הקשה על Alt + A תדגיש את סרגל הפעולות.</translation> <translation id="7760449188139285140">סינית Wubi</translation> <translation id="7765158879357617694">העברה</translation> @@ -908,6 +913,7 @@ <translation id="8300849813060516376">OTASP נכשל</translation> <translation id="8312871300878166382">הדבקה בתיקייה</translation> <translation id="8329978297633540474">טקסט רגיל</translation> +<translation id="8332007959299458842">קובצי Microsoft שנפתחו לאחרונה עברו ל-Google Drive</translation> <translation id="8335587457941836791">ביטול הצמדה למדף</translation> <translation id="8335837413233998004">בלארוסית</translation> <translation id="8336153091935557858">אתמול <ph name="YESTERDAY_DAYTIME" /></translation> @@ -934,6 +940,7 @@ <translation id="8487700953926739672">זמין אופליין</translation> <translation id="8492972329130824181">הרשת הביתית אינה זמינה. יש להפעיל נדידה בחבילת גלישה כדי להתחבר.</translation> <translation id="8499098729323186194">מתבצע חילוץ של <ph name="NUMBER_OF_ITEMS" /> פריטים…</translation> +<translation id="8502913769543567768">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, הפעלה בסיום הגדרת המכשיר, בניהול האדמין</translation> <translation id="8521441079177373948">בריטניה</translation> <translation id="853494022971700746">צרפתית (צרפת)</translation> <translation id="8540608333167683902">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, עוצמת האות: <ph name="SIGNAL_STRENGTH" />%, פרטים</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index c870276..a7b5f57 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">切り取り</translation> <translation id="7732111077498238432">ネットワークはポリシーによって管理されています</translation> <translation id="7736003208887389532">これらのファイルを完全に削除しますか?</translation> +<translation id="7740287852186792672">検索結果</translation> <translation id="7748626145866214022">アクションバーのオプションが増えました。アクションバーにフォーカスを移動するには Alt+A キーを押してください。</translation> <translation id="7760449188139285140">中国語(五筆)</translation> <translation id="7765158879357617694">移動</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index b594de54..8e119f4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">ირლანდიური</translation> <translation id="4124935795427217608">ზღაპრული მარტორქა</translation> <translation id="4131235941541910880">გადაიტანეთ არასაჭირო ერთეულები წაშლილებში</translation> +<translation id="4134804435730168042">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, გაააქტიურეთ მოწყობილობის დაყენების შემდეგ</translation> <translation id="4153015322587141338">თაროდან თქვენს ფაილებზე სწრაფი წვდომა რომ იქონიოთ, მარჯვენა ღილაკით დააწკაპუნეთ ფაილზე და აირჩიეთ „<ph name="PIN_COMMAND" />“.</translation> <translation id="4157569377477607576">ადმინისტრატორის წესების მიხედვით რეკომენდებული არ არის:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> გადატანილია.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">„<ph name="FILE_NAME" />“ წაიშლება და მის აღდგენას ვერ შეძლებთ.</translation> <translation id="4418686080762064601">შექმენით თქვენი ფაილების მალსახმობი</translation> <translation id="4425149324548788773">ჩემი Drive</translation> +<translation id="4432921877815220091">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, გაააქტიურეთ მოწყობილობის დაყენების შემდეგ, მართავს თქვენი ადმინისტრატორი</translation> <translation id="4439427728133035643">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, დაკავშირება</translation> <translation id="4442424173763614572">DNS ძიება ვერ განხორციელდა</translation> <translation id="4462159676511157176">ინდივიდუალური სახელთა სერვერები</translation> @@ -614,6 +616,7 @@ <translation id="5913638992615760742">კოპირების ოპერაცია ვერ შესრულდა, მოულოდნელი შეცდომა: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">ნიდერლანდური (ნიდერლანდები) აშშ-ის საერთაშორისო (PC) კლავიატურით</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, გაააქტიურეთ მოწყობილობის დაყენების შემდეგ</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> ერთეული</translation> <translation id="5957366693331451795">Chromebox-ები</translation> <translation id="5982621672636444458">დალაგების ვარიანტები</translation> @@ -830,6 +833,7 @@ <translation id="7724603315864178912">ამოჭრა</translation> <translation id="7732111077498238432">ქსელი იმართება წესებით</translation> <translation id="7736003208887389532">გსურთ, სამუდამოდ წაშალოთ ეს ფაილები?</translation> +<translation id="7740287852186792672">ძიების შედეგები</translation> <translation id="7748626145866214022">დამატებითი ვარიანტები ხელმისაწვდომია ქმედებათა ზოლში. ქმედებათა ზოლის ფოკუსში მოსაქცევად გამოიყენეთ კლავიშთა კომბინაცია: Alt + A.</translation> <translation id="7760449188139285140">ჩინური Wubi</translation> <translation id="7765158879357617694">გადატანა</translation> @@ -934,6 +938,7 @@ <translation id="8487700953926739672">ოფლაინში ხელმისაწვდომი</translation> <translation id="8492972329130824181">სახლის ქსელი მიუწვდომელია. დასაკავშირებლად საჭიროა მობილური ინტერნეტის როუმინგის ჩართვა.</translation> <translation id="8499098729323186194">მიმდინარეობს <ph name="NUMBER_OF_ITEMS" /> ერთეულის ამოღება...</translation> +<translation id="8502913769543567768">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, გაააქტიურეთ მოწყობილობის დაყენების შემდეგ, მართავს თქვენი ადმინისტრატორი</translation> <translation id="8521441079177373948">დიდი ბრიტანეთი</translation> <translation id="853494022971700746">ფრანგული (საფრანგეთი)</translation> <translation id="8540608333167683902">ქსელი <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, დეტალები</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index bdeb581..7a41b2f2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Мобильдік профильді жүктеп алу, <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_PROVIDER_NAME" /> провайдерінің <ph name="NETWORK_NAME" /> желісі</translation> <translation id="3973925058222872294">Ағылшын (БK)</translation> <translation id="3975895378829046965">Бенгал (фонетикалық)</translation> +<translation id="3999574733850440202">Жақында ашылған Microsoft файлдары OneDrive дискісіне көшірілді</translation> <translation id="4002066346123236978">Тақырып</translation> <translation id="4017788180641807848">Ағылшын (АҚШ), Workman пернетақтасымен</translation> <translation id="4019998208269143058">"Файлдарға жылдам өту" бөліміне бекіту</translation> @@ -363,6 +364,7 @@ <translation id="4092890906744441904">Ирланд</translation> <translation id="4124935795427217608">Пырақ</translation> <translation id="4131235941541910880">Қажетсіз элементтерді себетке жіберіңіз.</translation> +<translation id="4134804435730168042"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Құрылғыны орнатудан кейін белсендіру</translation> <translation id="4153015322587141338">Сөредегі файлдарға жылдам кіру үшін файлды тінтуірдің оң жақ түймесімен басып, "<ph name="PIN_COMMAND" />" пәрменін таңдаңыз.</translation> <translation id="4157569377477607576">Әкімші саясаты бойынша ұсынылмайды:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> жылжытылды.</translation> @@ -405,6 +407,7 @@ <translation id="4414834425328380570">"<ph name="FILE_NAME" />" жойылады және оны қалпына келтіре алмайсыз.</translation> <translation id="4418686080762064601">Файлдардың таңбашасын жасау</translation> <translation id="4425149324548788773">Менің Drive дискім</translation> +<translation id="4432921877815220091"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, Құрылғыны орнатудан кейін белсендіру, Әкімшіңіз басқарады</translation> <translation id="4439427728133035643"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, қосылу</translation> <translation id="4442424173763614572">DNS іздеу сәтсіз аяқталды</translation> <translation id="4462159676511157176">Реттелетін атау серверлері</translation> @@ -613,6 +616,7 @@ <translation id="5913638992615760742">Көшіру операциясы сәтсіз аяқталды, күтпеген қате болды: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Нидерланд (Нидерланд) (АҚШ халықаралық дербес компьютер пернетақтасымен)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, Құрылғыны орнатудан кейін белсендіру</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> элемент</translation> <translation id="5957366693331451795">Chromebox құрылғылары</translation> <translation id="5982621672636444458">Сұрыптау параметрлері</translation> @@ -759,6 +763,7 @@ <translation id="7126604456862387217">"<b><ph name="SEARCH_STRING" /></b>" – <em>Drive ішінен іздеу</em></translation> <translation id="7135561821015524160">Каннада (фонетикалық)</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Аутентификация серверінің идентификациясын тексеру үшін "Балама атау тақырыбы сәйкестігі" немесе "Домен суффиксі сәйкестігі" жоқ.</translation> <translation id="7165320105431587207">Желіні реттеу мүмкін емес</translation> <translation id="7170041865419449892">Ауқымнан тыс</translation> <translation id="7180611975245234373">Жаңарту</translation> @@ -829,6 +834,7 @@ <translation id="7724603315864178912">Қиып алу</translation> <translation id="7732111077498238432">Желі саясатпен бақыланады</translation> <translation id="7736003208887389532">Бұл файлдар біржола жойылсын ба?</translation> +<translation id="7740287852186792672">Іздеу нәтижелері</translation> <translation id="7748626145866214022">Әрекеттер жолағында басқа да опциялар бар. Оны ерекшелеу үшін Alt + A пернелерін басыңыз.</translation> <translation id="7760449188139285140">Қытай (Wubi)</translation> <translation id="7765158879357617694">Жылжыту</translation> @@ -906,6 +912,7 @@ <translation id="8300849813060516376">OTASP сәтсіз аяқталды</translation> <translation id="8312871300878166382">Қалта ішіне қою</translation> <translation id="8329978297633540474">Қарапайым мәтін</translation> +<translation id="8332007959299458842">Жақында ашылған Microsoft файлдары Google Drive дискісіне көшірілді</translation> <translation id="8335587457941836791">Сөреден босату</translation> <translation id="8335837413233998004">Белорус</translation> <translation id="8336153091935557858">Кеше <ph name="YESTERDAY_DAYTIME" /></translation> @@ -932,6 +939,7 @@ <translation id="8487700953926739672">Желіден тыс істейді</translation> <translation id="8492972329130824181">Үй желісі қолжетімді емес. Байланысу үшін мобильдік интернет роумингін қосу қажет.</translation> <translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> элемент алынып жатыр…</translation> +<translation id="8502913769543567768"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Құрылғыны орнатудан кейін белсендіру, Әкімшіңіз басқарады</translation> <translation id="8521441079177373948">Ұлыбритания</translation> <translation id="853494022971700746">Француз (Франция)</translation> <translation id="8540608333167683902"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, мәліметтер</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_km.xtb b/ui/chromeos/translations/ui_chromeos_strings_km.xtb index a3a58f35..9daf8b60 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_km.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_km.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">ទាញយកកម្រងព័ត៌មានឧបករណ៍ចល័ត បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ភាសាអង់គ្លេស (ចក្រភពអង់គ្លេស)</translation> <translation id="3975895378829046965">សូរសព្ទជាភាសាបេងហ្គាល់</translation> +<translation id="3999574733850440202">ឯកសារ Microsoft ដែលទើបបើកថ្មីៗបានផ្លាស់ទីទៅ OneDrive</translation> <translation id="4002066346123236978">ចំណងជើង</translation> <translation id="4017788180641807848">ភាសាអង់គ្លេស (សហរដ្ឋអាមេរិក) ដែលប្រើក្ដារចុច Workman</translation> <translation id="4019998208269143058">ខ្ទាស់ទៅឯកសាររហ័ស</translation> @@ -759,6 +760,7 @@ <translation id="7126604456862387217">'<b><ph name="SEARCH_STRING" /></b>' - <em>ស្វែងរក Drive</em></translation> <translation id="7135561821015524160">សូរសព្ទជាភាសាកាន់ណាដា</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">បាត់ 'ភាពត្រូវគ្នានៃឈ្មោះជំនួសនៃប្រធានបទ' ឬ 'ភាពត្រូវគ្នានៃកន្ទុយដូមែន' សម្រាប់បញ្ជាក់ភាពត្រឹមត្រូវនៃអត្តសញ្ញាណម៉ាស៊ីនមេផ្ទៀងផ្ទាត់</translation> <translation id="7165320105431587207">បានបរាជ័យក្នុងការកំណត់បណ្តាាញ</translation> <translation id="7170041865419449892">នៅក្រៅសេវា</translation> <translation id="7180611975245234373">ធ្វើឲ្យថ្មីឡើងវិញ…</translation> @@ -829,6 +831,7 @@ <translation id="7724603315864178912">កាត់</translation> <translation id="7732111077498238432">បណ្តាញត្រូវបានគ្រប់គ្រងដោយគោលការណ៍</translation> <translation id="7736003208887389532">លុបឯកសារទាំងនេះជាអចិន្ត្រៃយ៍ឬ?</translation> +<translation id="7740287852186792672">លទ្ធផលស្វែងរក</translation> <translation id="7748626145866214022">មានជម្រើសច្រើនទៀតនៅលើរបារសកម្មភាព។ ចុច Alt + A ដើម្បីផ្ដោតលើរបារសកម្មភាព។</translation> <translation id="7760449188139285140">ភាសាចិនវូប៊ី</translation> <translation id="7765158879357617694">ផ្លាស់ទី</translation> @@ -906,6 +909,7 @@ <translation id="8300849813060516376">OTASP បានបរាជ័យ</translation> <translation id="8312871300878166382">បិទភ្ជាប់ទៅក្នុងថតឯកសារ</translation> <translation id="8329978297633540474">អត្ថបទធម្មតា</translation> +<translation id="8332007959299458842">ឯកសារ Microsoft ដែលទើបបើកថ្មីៗបានផ្លាស់ទីទៅ Google ថាស</translation> <translation id="8335587457941836791">ដកការដៅចេញពីធ្នើ</translation> <translation id="8335837413233998004">ភាសាបេឡារុស</translation> <translation id="8336153091935557858">ម្សិលមិញ <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb index 79b5c6b..024d0e5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">ಐರಿಷ್</translation> <translation id="4124935795427217608">ಯುನಿಕಾರ್ನ್</translation> <translation id="4131235941541910880">ನಿಮಗೆ ಬೇಡದ ಐಟಂಗಳನ್ನು ಅನುಪಯುಕ್ತಕ್ಕೆ ಸರಿಸಿ</translation> +<translation id="4134804435730168042"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, ಸಾಧನದ ಸೆಟಪ್ ನಂತರ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="4153015322587141338">ಶೆಲ್ಫ್ನಲ್ಲಿರುವ ನಿಮ್ಮ ಫೈಲ್ಗಳಿಗೆ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು, ಫೈಲ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು "<ph name="PIN_COMMAND" />" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation> <translation id="4157569377477607576">ನಿರ್ವಾಹಕರ ನೀತಿ ಇವುಗಳನ್ನು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> ಐಟಂಗಳನ್ನು ಸರಿಸಲಾಗಿದೆ.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">"<ph name="FILE_NAME" />" ಅನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="4418686080762064601">ನಿಮ್ಮ ಫೈಲ್ಗಳಿಗಾಗಿ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ರಚಿಸಿ</translation> <translation id="4425149324548788773">ನನ್ನ ಡ್ರೈವ್</translation> +<translation id="4432921877815220091"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, ಸಾಧನದ ಸೆಟಪ್ ನಂತರ ಸಕ್ರಿಯಗೊಳಿಸಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ</translation> <translation id="4439427728133035643"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ಕನೆಕ್ಟ್</translation> <translation id="4442424173763614572">DNS ಲುಕಪ್ ವಿಫಲವಾಗಿದೆ</translation> <translation id="4462159676511157176">ಕಸ್ಟಮ್ ಹೆಸರು ಸರ್ವರ್ಗಳು</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">ನಕಲಿಸುವಿಕೆ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲವಾಗಿದೆ, ಅನಿರೀಕ್ಷಿತ ದೋಷ: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">ಯುಎಸ್ ಅಂತರರಾಷ್ಟ್ರೀಯ PC ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಡಚ್ (ನೆದರ್ಲ್ಯಾಂಡ್ಸ್)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, ಸಾಧನದ ಸೆಟಪ್ ನಂತರ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> ಐಟಂಗಳು</translation> <translation id="5957366693331451795">Chromeboxes</translation> <translation id="5982621672636444458">ಆಯ್ಕೆಗಳನ್ನು ವಿಂಗಡಿಸು</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">ಕತ್ತರಿಸು</translation> <translation id="7732111077498238432">ನೆಟ್ವರ್ಕ್ ನೀತಿಯ ನಿಯಂತ್ರಣದಲ್ಲಿದೆ</translation> <translation id="7736003208887389532">ಈ ಫೈಲ್ಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಬೇಕೇ?</translation> +<translation id="7740287852186792672">ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು</translation> <translation id="7748626145866214022">ಕ್ರಿಯೆಯ ಬಾರ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿವೆ. ಕ್ರಿಯೆಯ ಬಾರ್ ಅನ್ನು ಫೋಕಸ್ ಮಾಡಲು Alt + A ಒತ್ತಿರಿ.</translation> <translation id="7760449188139285140">ಚೈನೀಸ್ ವುಬಿ</translation> <translation id="7765158879357617694">ಸರಿಸು</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">ಆಫ್ಲೈನ್ ಲಭ್ಯವಿದೆ</translation> <translation id="8492972329130824181">ಗೃಹ ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ. ಕನೆಕ್ಟ್ ಮಾಡಲು ಮೊಬೈಲ್ ಡೇಟಾ ರೋಮಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> ಐಟಂಗಳನ್ನು ಬೇರ್ಪಡಿಸಲಾಗುತ್ತಿದೆ...</translation> +<translation id="8502913769543567768"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, ಸಾಧನದ ಸೆಟಪ್ ನಂತರ ಸಕ್ರಿಯಗೊಳಿಸಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸಿಸುತ್ತಿದ್ದಾರೆ</translation> <translation id="8521441079177373948">UK</translation> <translation id="853494022971700746">ಫ್ರೆಂಚ್ (ಫ್ರಾನ್ಸ್)</translation> <translation id="8540608333167683902"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ವಿವರಗಳು</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index 3f07685f..58195533 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">잘라내기</translation> <translation id="7732111077498238432">네트워크는 정책을 통해 제어됩니다</translation> <translation id="7736003208887389532">파일을 완전히 삭제하시겠습니까?</translation> +<translation id="7740287852186792672">검색결과</translation> <translation id="7748626145866214022">작업 표시줄에서 더 많은 옵션을 사용할 수 있습니다. 작업 표시줄에 초점을 맞추려면 Alt + A를 누르세요.</translation> <translation id="7760449188139285140">중국어(오필화수입법)</translation> <translation id="7765158879357617694">이동</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb index 71cd6f0..be960b5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Кесүү</translation> <translation id="7732111077498238432">Тармак саясат аркылуу көзөмөлдөнөт</translation> <translation id="7736003208887389532">Бул файлдарды биротоло өчүрөсүзбү?</translation> +<translation id="7740287852186792672">Издөө натыйжалары</translation> <translation id="7748626145866214022">Аракет тилкесинде дагы башка параметрлер бар. Ал жерге өтүү үчүн Alt + A баскычтарын басыңыз.</translation> <translation id="7760449188139285140">Кытайча (Wubi)</translation> <translation id="7765158879357617694">Жылуу</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb index fc5db84..69ec2d6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">ຕັດ</translation> <translation id="7732111077498238432">ຄວບຄຸມເຄືອຂ່າຍຕາມນະໂຍບາຍ</translation> <translation id="7736003208887389532">ລຶບໄຟລ໌ເຫຼົ່ານີ້ອອກຢ່າງຖາວອນບໍ?</translation> +<translation id="7740287852186792672">ຜົນການຊອກຫາ</translation> <translation id="7748626145866214022">ມີຕົວເລືອກເພີ່ມເຕີມຢູ່ໃນແຖບດຳເນີນການ. ກະລຸນາກົດ Alt + A ເພື່ອເນັ້ນໜັກໃສ່ແຖບດຳເນີນການ.</translation> <translation id="7760449188139285140">ພາສາຈີນ (Wubi)</translation> <translation id="7765158879357617694">ຍ້າຍ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index c2b5141..634fad1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Atsisiųsti mobiliojo ryšio tinklo profilį; <ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, „<ph name="NETWORK_PROVIDER_NAME" />“</translation> <translation id="3973925058222872294">Anglų k. (JK)</translation> <translation id="3975895378829046965">Bengalų k. fonetinė</translation> +<translation id="3999574733850440202">Neseniai atidaryti „Microsoft“ failai perkelti į „OneDrive“</translation> <translation id="4002066346123236978">Pavadinimas</translation> <translation id="4017788180641807848">Anglų k. (JAV) su „Workman“ klaviatūra</translation> <translation id="4019998208269143058">Prisegti prie sparčiųjų failų</translation> @@ -760,6 +761,7 @@ <translation id="7126604456862387217"><b><ph name="SEARCH_STRING" /></b> – <em>ieškoti Diske</em></translation> <translation id="7135561821015524160">Kanadietiška fonetinė</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Neužpildytas laukas „Alternatyvaus subjekto pavadinimo atitiktis“ arba „Domeno plėtinio atitiktis“, todėl negalima patvirtinti autentifikavimo serverio tapatybės</translation> <translation id="7165320105431587207">Nepavyko sukonfigūruoti tinklo</translation> <translation id="7170041865419449892">Nepasiekiama</translation> <translation id="7180611975245234373">Atnaujinti</translation> @@ -830,6 +832,7 @@ <translation id="7724603315864178912">Iškirpti</translation> <translation id="7732111077498238432">Tinklą valdo politika</translation> <translation id="7736003208887389532">Visam laikui ištrinti šiuos failus?</translation> +<translation id="7740287852186792672">Paieškos rezultatai</translation> <translation id="7748626145866214022">Daugiau parinkčių pasiekiama veiksmų juostoje. Paspauskite „Alt“ + A, kad suaktyvintumėte veiksmų juostą.</translation> <translation id="7760449188139285140">Kinų k. „Wubi“</translation> <translation id="7765158879357617694">Perkelti</translation> @@ -907,6 +910,7 @@ <translation id="8300849813060516376">OTASP nepavyko</translation> <translation id="8312871300878166382">Įklijuoti į aplanką</translation> <translation id="8329978297633540474">Grynasis tekstas</translation> +<translation id="8332007959299458842">Neseniai atidaryti „Microsoft“ failai perkelti į „Google“ diską</translation> <translation id="8335587457941836791">Atsegti nuo lentynos</translation> <translation id="8335837413233998004">Baltarusių k.</translation> <translation id="8336153091935557858">Vakar <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index f3a4e5a..9678772a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">Lejupielādēt mobilo sakaru profilu, tīkls numur <ph name="NETWORK_INDEX" />, tīklu skaits ir <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Angļu (Apvienotā Karaliste)</translation> <translation id="3975895378829046965">Bengāļu, fonētiskā</translation> +<translation id="3999574733850440202">Nesen atvērtie Microsoft faili ir pārvietoti uz pakalpojumu OneDrive.</translation> <translation id="4002066346123236978">Nosaukums</translation> <translation id="4017788180641807848">Angļu (ASV), ar Workman tastatūru</translation> <translation id="4019998208269143058">Piespraust sadaļai “Ātrā piekļuve failiem”</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">Izgriezt</translation> <translation id="7732111077498238432">Tīklu pārvalda politika</translation> <translation id="7736003208887389532">Vai vēlaties neatgriezeniski izdzēst šos failus?</translation> +<translation id="7740287852186792672">Meklēšanas rezultāti</translation> <translation id="7748626145866214022">Vairāk pieejamu opciju darbību joslā. Lai izceltu darbību joslu, nospiediet taustiņu kombināciju Alt+A.</translation> <translation id="7760449188139285140">Ķīniešu, Wubi</translation> <translation id="7765158879357617694">Pārvietot</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">OTASP neizdevās</translation> <translation id="8312871300878166382">Ielīmēt mapē</translation> <translation id="8329978297633540474">Vienkāršs teksts</translation> +<translation id="8332007959299458842">Nesen atvērtie Microsoft faili ir pārvietoti uz Google disku.</translation> <translation id="8335587457941836791">Atspraust no plaukta</translation> <translation id="8335837413233998004">Baltkrievu</translation> <translation id="8336153091935557858">Vakar plkst. <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb index 0f03a53..b841d78 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Исечи</translation> <translation id="7732111077498238432">Мрежата се контролира со правило</translation> <translation id="7736003208887389532">Трајно да се избришат датотекиве?</translation> +<translation id="7740287852186792672">Резултати од пребарувањето</translation> <translation id="7748626145866214022">Повеќе опции се достапни на лентата со дејства. Притиснете Alt + A за да се нагласи лентата со дејства.</translation> <translation id="7760449188139285140">кинески вуби</translation> <translation id="7765158879357617694">Премести</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb index 93379ac..67dd829 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">മൊബൈൽ പ്രൊഫൈൽ ഡൗൺലോഡ് ചെയ്യുക, <ph name="NETWORK_COUNT" /> എണ്ണത്തിൽ <ph name="NETWORK_INDEX" />-ാമത്തെ നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ഇംഗ്ലീഷ് (യുകെ)</translation> <translation id="3975895378829046965">ബംഗ്ലാ ഉച്ചാരണ ശബ്ദം</translation> +<translation id="3999574733850440202">അടുത്തിടെ തുറന്ന Microsoft ഫയലുകൾ OneDrive-ലേക്ക് നീക്കി</translation> <translation id="4002066346123236978">ശീർഷകം</translation> <translation id="4017788180641807848">Workman കീബോർഡ് ഉള്ള ഇംഗ്ലീഷ് (യുഎസ്)</translation> <translation id="4019998208269143058">പെട്ടെന്ന് ആക്സസ് ചെയ്യാവുന്ന ഫയലുകളിലേക്ക് പിൻ ചെയ്യുക</translation> @@ -363,6 +364,7 @@ <translation id="4092890906744441904">ഐറിഷ്</translation> <translation id="4124935795427217608">യൂണികോൺ</translation> <translation id="4131235941541910880">നിങ്ങൾക്ക് ആവശ്യമില്ലാത്ത ഇനങ്ങൾ ട്രാഷിലേക്ക് നീക്കുക</translation> +<translation id="4134804435730168042"><ph name="NETWORK_COUNT" /> നെറ്റ്വർക്കുകളിൽ <ph name="NETWORK_INDEX" />-ാമത്തേത്, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, ഉപകരണം സജ്ജീകരിച്ചതിന് ശേഷം സജീവമാക്കുക</translation> <translation id="4153015322587141338">ഷെൽഫിലെ നിങ്ങളുടെ ഫയലുകളിലേക്ക് അതിവേഗ ആക്സസ് ലഭിക്കാൻ, ഒരു ഫയലിൽ വലത് ക്ലിക്ക് ചെയ്ത് "<ph name="PIN_COMMAND" />" തിരഞ്ഞെടുക്കുക.</translation> <translation id="4157569377477607576">അഡ്മിൻ നയം ഇവ നിർദ്ദേശിക്കുന്നില്ല:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> നീക്കി.</translation> @@ -405,6 +407,7 @@ <translation id="4414834425328380570">"<ph name="FILE_NAME" />" ഇല്ലാതാക്കും, നിങ്ങൾക്ക് അത് പുനഃസ്ഥാപിക്കാനാകില്ല.</translation> <translation id="4418686080762064601">നിങ്ങളുടെ ഫയലുകൾക്കുള്ള കുറുക്കുവഴി സൃഷ്ടിക്കുക</translation> <translation id="4425149324548788773">എന്റെ ഡ്രൈവ്</translation> +<translation id="4432921877815220091"><ph name="NETWORK_COUNT" /> നെറ്റ്വർക്കുകളിൽ <ph name="NETWORK_INDEX" />-ാമത്തേത്, <ph name="NETWORK_NAME" />, ഉപകരണം സജ്ജീകരിച്ചതിന് ശേഷം സജീവമാക്കുക, നിങ്ങളുടെ അഡ്മിൻ മാനേജ് ചെയ്യുന്നത്</translation> <translation id="4439427728133035643"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, കണക്റ്റ് ചെയ്യുക</translation> <translation id="4442424173763614572">DNS തിരയൽ പരാജയപ്പെട്ടു</translation> <translation id="4462159676511157176">ഇഷ്ടാനുസൃത നാമ സെർവറുകൾ</translation> @@ -614,6 +617,7 @@ <translation id="5913638992615760742">അപ്രതീക്ഷിത പിശക് കാരണം പകർത്താനായില്ല: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">യുഎസ് അന്താരാഷ്ട്ര PC കീബോർഡ് ഉള്ള ഡച്ച് (നെതർലാൻഡ്സ്)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063"><ph name="NETWORK_COUNT" /> നെറ്റ്വർക്കുകളിൽ <ph name="NETWORK_INDEX" />-ാമത്തേത്, <ph name="NETWORK_NAME" />, ഉപകരണം സജ്ജീകരിച്ചതിന് ശേഷം സജീവമാക്കുക</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> ഇനങ്ങൾ</translation> <translation id="5957366693331451795">Chromebox-കൾ</translation> <translation id="5982621672636444458">അടുക്കൽ ഓപ്ഷനുകൾ</translation> @@ -830,6 +834,7 @@ <translation id="7724603315864178912">മുറിക്കുക</translation> <translation id="7732111077498238432">നെറ്റ്വർക്ക് നയത്തിനാൽ നിയന്ത്രിതമാണ്</translation> <translation id="7736003208887389532">ഈ ഫയലുകൾ ശാശ്വതമായി ഇല്ലാതാക്കണോ?</translation> +<translation id="7740287852186792672">തിരയൽ ഫലങ്ങള്</translation> <translation id="7748626145866214022">കൂടുതൽ ഓപ്ഷനുകൾ പ്രവർത്തന ബാറിൽ ലഭ്യമാണ്. പ്രവർത്തന ബാർ ഫോക്കസ് ചെയ്യുന്നതിന് Alt + A അമർത്തുക.</translation> <translation id="7760449188139285140">ചൈനീസ് വുബി</translation> <translation id="7765158879357617694">നീക്കുക</translation> @@ -907,6 +912,7 @@ <translation id="8300849813060516376">OTASP പരാജയപ്പെട്ടു</translation> <translation id="8312871300878166382">ഫോൾഡറിൽ ഒട്ടിക്കുക</translation> <translation id="8329978297633540474">പ്ലെയിന് വാചകം</translation> +<translation id="8332007959299458842">അടുത്തിടെ തുറന്ന Microsoft ഫയലുകൾ Google Drive-ലേക്ക് നീക്കി</translation> <translation id="8335587457941836791">ഷെൽഫിൽ നിന്ന് അൺപിൻ ചെയ്യുക</translation> <translation id="8335837413233998004">ബെലാറുഷ്യൻ</translation> <translation id="8336153091935557858">ഇന്നലെ <ph name="YESTERDAY_DAYTIME" /></translation> @@ -933,6 +939,7 @@ <translation id="8487700953926739672">ഓഫ്ലൈനില് ലഭ്യമാണ്</translation> <translation id="8492972329130824181">വീട്ടിലെ നെറ്റ്വർക്ക് ലഭ്യമല്ല. കണക്റ്റ് ചെയ്യാൻ മൊബൈൽ ഡാറ്റ റോമിംഗ് പ്രവർത്തനക്ഷമമാക്കണം.</translation> <translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> ഇനങ്ങൾ എക്സ്ട്രാക്റ്റ് ചെയ്യുന്നു...</translation> +<translation id="8502913769543567768"><ph name="NETWORK_COUNT" /> നെറ്റ്വർക്കുകളിൽ <ph name="NETWORK_INDEX" />-ാമത്തേത്, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, ഉപകരണം സജ്ജീകരിച്ചതിന് ശേഷം സജീവമാക്കുക, നിങ്ങളുടെ അഡ്മിൻ മാനേജ് ചെയ്യുന്നത്</translation> <translation id="8521441079177373948">യുകെ</translation> <translation id="853494022971700746">ഫ്രഞ്ച് (ഫ്രാൻസ്)</translation> <translation id="8540608333167683902"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, വിശദാംശങ്ങൾ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb index 0df5a6b..ec0f70a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -828,6 +828,7 @@ <translation id="7724603315864178912">Хайчлах</translation> <translation id="7732111077498238432">Сүлжээг удирдамжаар хянадаг</translation> <translation id="7736003208887389532">Эдгээр файлыг бүрмөсөн устгах уу?</translation> +<translation id="7740287852186792672">Хайлтын үр дүн</translation> <translation id="7748626145866214022">Үйлдлийн талбар хэсэгт илүү их сонголт боломжтой байна. Үйлдлийн талбарыг чиглүүлэхийн тулд Alt + A дарна уу.</translation> <translation id="7760449188139285140">Хятад вуби</translation> <translation id="7765158879357617694">Зөөх</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb index ef53ebc6..cf644f3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">कट करा</translation> <translation id="7732111077498238432">नेटवर्क धोरण-नियंत्रित आहे</translation> <translation id="7736003208887389532">या फाइल कायमस्वरूपी हटवायच्या आहेत का?</translation> +<translation id="7740287852186792672">शोध परिणाम</translation> <translation id="7748626145866214022">ॲक्शन बारवर आणखी पर्याय उपलब्ध आहेत. ॲक्शन बारवर फोकस करण्यासाठी Alt + A दाबा.</translation> <translation id="7760449188139285140">चीनी वुबी</translation> <translation id="7765158879357617694">हलवा</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb index d3c8c41..122e800a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Potong</translation> <translation id="7732111077498238432">Rangkaian dikawal oleh dasar</translation> <translation id="7736003208887389532">Padamkan fail ini secara kekal?</translation> +<translation id="7740287852186792672">Hasil carian</translation> <translation id="7748626145866214022">Lagi pilihan tersedia pada bar tindakan. Tekan Alt + A untuk memfokuskan bar tindakan.</translation> <translation id="7760449188139285140">Wubi Cina</translation> <translation id="7765158879357617694">Alih</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index c4c67f8..8f6f64f2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -47,7 +47,7 @@ <translation id="1395262318152388157">ဆလိုက်ဒါးကို ရှာပါ</translation> <translation id="1399511500114202393">အသုံးပြုသူ အသိအမှတ်ပြုလက်မှတ် မရှိပါ</translation> <translation id="1403008701842173542">နေရာအနှံ့</translation> -<translation id="1404323374378969387">နော်ဝေ</translation> +<translation id="1404323374378969387">နော်ဝေး</translation> <translation id="1433628812591023318">Parallels Desktop တွင် ဖိုင်များဆွဲချရန် ဖိုင်ကို Windows ဖိုင်များသို့ ရွှေ့ရပါမည်။</translation> <translation id="1435838927755162558">ဖိုင်တွဲကို Parallels Desktop အား မျှဝေခြင်း</translation> <translation id="1439919885608649279">ပန်းများနှင့်လူ</translation> @@ -678,7 +678,7 @@ <translation id="649877868557234318"><ph name="FILE_NAME" /> ကို <ph name="FOLDER_NAME" /> တွင် ထုတ်ယူနေသည်</translation> <translation id="6499681088828539489">မျှဝေထားသည့် ကွန်ရက်များအတွက် ပရောက်စီများကို ခွင့်မပြုရန်</translation> <translation id="6503285896705205014">ဖိုင် <ph name="COUNT" /> ဖိုင် မိတ္တူကူးခြင်းကို စီမံခန့်ခွဲသူမူဝါဒက ပိတ်ထားသည်</translation> -<translation id="6509122719576673235">နော်ဝေ ဂျီယန်</translation> +<translation id="6509122719576673235">နော်ဝေး ဂျီယန်</translation> <translation id="6528513914570774834">ဤစက်ပစ္စည်း၏ အခြားအသုံးပြုသူများအား ဤကွန်ရက်ကို အသုံးပြုခွင့်ပေးရန်</translation> <translation id="653019979737152879">စင့်ခ် လုပ်နေ <ph name="FILE_NAME" />...</translation> <translation id="6549689063733911810">မကြာခင်</translation> @@ -830,6 +830,7 @@ <translation id="7724603315864178912">ဖြတ်တောက်</translation> <translation id="7732111077498238432">ကွန်ရက်မူဝါဒကို ထိန်းချုပ်ထားပါသည်</translation> <translation id="7736003208887389532">ဤဖိုင်များကို အပြီးဖျက်မလား။</translation> +<translation id="7740287852186792672">ရှာဖွေမှု ရလဒ်များ</translation> <translation id="7748626145866214022">လုပ်ဆောင်ချက်ဘားတန်းတွင် နောက်ထပ်ရွေးချယ်စရာများ ရှိပါသည်။ လုပ်ဆောင်ချက်ဘားတန်းကို ရွေးရန် Alt + A ကို နှိပ်ပါ။</translation> <translation id="7760449188139285140">တရုတ် ဝူဘီ</translation> <translation id="7765158879357617694">ရွှေ့ရန်</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb index ebe9da0f..efad0be 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">काट्नुहोस्</translation> <translation id="7732111077498238432">नेटवर्क नीतिद्वारा नियन्त्रित छ</translation> <translation id="7736003208887389532">यी फाइलहरू सदाका लागि मेटाउने हो?</translation> +<translation id="7740287852186792672">खोजका परिणाम</translation> <translation id="7748626145866214022">कारबाहीसम्बन्धी पट्टीमा थप विकल्पहरू उपलब्ध छन्। कारबाहीसम्बन्धी पट्टीमा फोकस गर्न Alt + A कुन्जी थिच्नुहोस्।</translation> <translation id="7760449188139285140">चिनियाँ वुबी</translation> <translation id="7765158879357617694">सार्नुहोस्</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index 483d8ba..29f4e48 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -832,6 +832,7 @@ <translation id="7724603315864178912">Knip</translation> <translation id="7732111077498238432">Netwerk wordt beheerd op basis van beleid</translation> <translation id="7736003208887389532">Deze bestanden definitief verwijderen?</translation> +<translation id="7740287852186792672">Zoekresultaten</translation> <translation id="7748626145866214022">Meer opties beschikbaar op de actiebalk. Druk op Alt+A om de focus op de actiebalk te plaatsen.</translation> <translation id="7760449188139285140">Chinees (Wubi)</translation> <translation id="7765158879357617694">Verplaatsen</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index eb4ca44..e5b317c2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -834,6 +834,7 @@ <translation id="7724603315864178912">Klipp ut</translation> <translation id="7732111077498238432">Nettverket er kontrollert av regler</translation> <translation id="7736003208887389532">Vil du slette disse filene for godt?</translation> +<translation id="7740287852186792672">Søkeresultater</translation> <translation id="7748626145866214022">Flere alternativer er tilgjengelige på handlingslinjen. Trykk på Alt + A for å fokusere på handlingslinjen.</translation> <translation id="7760449188139285140">Kinesisk wubi</translation> <translation id="7765158879357617694">Flytt</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb index 7ed259c..f226f53 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">ମୋବାଇଲ ପ୍ରୋଫାଇଲ୍, <ph name="NETWORK_COUNT" />ର <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> ନେଟୱାର୍କ ଡାଉନଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="3973925058222872294">ଇଂରାଜୀ (UK)</translation> <translation id="3975895378829046965">ବଙ୍ଗଳା ଫୋନେଟିକ୍</translation> +<translation id="3999574733850440202">ବର୍ତ୍ତମାନ ଖୋଲାଯାଇଥିବା Microsoft ଫାଇଲଗୁଡ଼ିକ OneDriveକୁ ମୁଭ କରାଯାଇଛି</translation> <translation id="4002066346123236978">ଆଖ୍ୟା</translation> <translation id="4017788180641807848">ୱାର୍କମ୍ୟାନ୍ କୀବୋର୍ଡ ସହ ଇଂରାଜୀ (US)</translation> <translation id="4019998208269143058">କ୍ୱିକ ଫାଇଲଗୁଡ଼ିକରେ ପିନ କରନ୍ତୁ</translation> @@ -824,6 +825,7 @@ <translation id="7724603315864178912">Cut</translation> <translation id="7732111077498238432">ନେଟ୍ୱର୍କ ନୀତି ନିୟନ୍ତ୍ରିତ ଅଟେ</translation> <translation id="7736003208887389532">ଏହି ଫାଇଲଗୁଡ଼ିକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ କରିବେ?</translation> +<translation id="7740287852186792672">ସନ୍ଧାନ ଫଳାଫଳଗୁଡିକ</translation> <translation id="7748626145866214022">ଆକ୍ସନ୍ ବାର୍ରେ ଅଧିକ ବିକଳ୍ପ ଉପଲବ୍ଧ ଅଛି ଆକ୍ସନ ବାର୍କୁ ଫୋକସ୍ କରିବାକୁ Alt + A ଦବାନ୍ତୁ।</translation> <translation id="7760449188139285140">ଚାଇନିଜ୍ ୟୁବି</translation> <translation id="7765158879357617694">ନିଅନ୍ତୁ</translation> @@ -901,6 +903,7 @@ <translation id="8300849813060516376">OTASP ବିଫଳ ହେଲା</translation> <translation id="8312871300878166382">ଫୋଲ୍ଡର୍ରେ ପେଷ୍ଟ କରନ୍ତୁ</translation> <translation id="8329978297633540474">କେବଳ ଟେକ୍ସଟ୍</translation> +<translation id="8332007959299458842">ବର୍ତ୍ତମାନ ଖୋଲାଯାଇଥିବା Microsoft ଫାଇଲଗୁଡ଼ିକ Google Driveକୁ ମୁଭ କରାଯାଇଛି</translation> <translation id="8335587457941836791">ସେଲ୍ଫରୁ ଅନପିନ୍ କରନ୍ତୁ</translation> <translation id="8335837413233998004">ବେଲାରୁସିଆନ୍</translation> <translation id="8336153091935557858">ଗତକାଲି <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb index 50efb7cb..c925e0b2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">ਕੱਟੋ</translation> <translation id="7732111077498238432">ਨੈੱਟਵਰਕ ਨੂੰ ਨੀਤੀ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="7736003208887389532">ਕੀ ਇਨ੍ਹਾਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪੱਕੇ ਤੌਰ 'ਤੇ ਮਿਟਾਉਣਾ ਹੈ?</translation> +<translation id="7740287852186792672">ਨਤੀਜੇ ਖੋਜੋ</translation> <translation id="7748626145866214022">ਕਾਰਵਾਈ ਬਾਰ 'ਤੇ ਹੋਰ ਵੀ ਵਿਕਲਪ ਉਪਲਬਧ ਹਨ। ਕਾਰਵਾਈ ਬਾਰ 'ਤੇ ਫੋਕਸ ਕਰਨ ਲਈ Alt + A ਦਬਾਓ।</translation> <translation id="7760449188139285140">ਚੀਨੀ ਵੂਬੀ</translation> <translation id="7765158879357617694">ਮੂਵ ਕਰੋ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 5899d52..29068e6c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">Irlandzki</translation> <translation id="4124935795427217608">Jednorożec</translation> <translation id="4131235941541910880">Przenieś niepotrzebne elementy do kosza</translation> +<translation id="4134804435730168042">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktywuj po skonfigurowaniu urządzenia</translation> <translation id="4153015322587141338">Aby mieć szybki dostęp do swoich plików na półce, kliknij plik prawym przyciskiem i wybierz „<ph name="PIN_COMMAND" />”.</translation> <translation id="4157569377477607576">Zgodnie z zasadą administratora nie zaleca się:</translation> <translation id="4159731583141908892">Plik <ph name="FILE_NAME" /> został przeniesiony.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">Plik „<ph name="FILE_NAME" />” zostanie usunięty i nie będzie można go przywrócić.</translation> <translation id="4418686080762064601">Utwórz skrót do swoich plików</translation> <translation id="4425149324548788773">Mój dysk</translation> +<translation id="4432921877815220091">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktywuj po skonfigurowaniu urządzenia, zarządzana przez administratora</translation> <translation id="4439427728133035643">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, połącz</translation> <translation id="4442424173763614572">Wyszukiwanie DNS nie powiodło się.</translation> <translation id="4462159676511157176">Własne serwery nazw</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Kopiowanie nie powiodło się z powodu nieoczekiwanego błędu: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Niderlandzki (Holandia) z klawiaturą amerykańską międzynarodową (PC)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktywuj po skonfigurowaniu urządzenia</translation> <translation id="5955954492236143329">Elementy: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="5957366693331451795">Chromeboksy</translation> <translation id="5982621672636444458">Opcje sortowania</translation> @@ -761,6 +764,7 @@ <translation id="7126604456862387217">„<b><ph name="SEARCH_STRING" /></b>” – <em>wyszukaj na Dysku</em></translation> <translation id="7135561821015524160">Kannada (znaki fonetyczne)</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Brak wartości w polu „Dopasowanie alternatywnej nazwy podmiotu” lub „Dopasowanie sufiksu domeny” – nie można zweryfikować tożsamość serwera uwierzytelniania</translation> <translation id="7165320105431587207">Nie można skonfigurować sieci</translation> <translation id="7170041865419449892">Poza zasięgiem</translation> <translation id="7180611975245234373">Odśwież</translation> @@ -831,6 +835,7 @@ <translation id="7724603315864178912">Wytnij</translation> <translation id="7732111077498238432">W sieci obowiązują zasady</translation> <translation id="7736003208887389532">Czy chcesz trwale usunąć te pliki?</translation> +<translation id="7740287852186792672">Wyniki wyszukiwania</translation> <translation id="7748626145866214022">Na pasku działań jest dostępnych więcej opcji. Aby go zaznaczyć, naciśnij Alt + A.</translation> <translation id="7760449188139285140">Chiński wubi</translation> <translation id="7765158879357617694">Przenieś</translation> @@ -935,6 +940,7 @@ <translation id="8487700953926739672">Dostępny offline</translation> <translation id="8492972329130824181">Sieć domowa jest niedostępna. Aby nawiązać połączenie, musisz włączyć komórkową transmisję danych w roamingu.</translation> <translation id="8499098729323186194">Wyodrębniam elementy (<ph name="NUMBER_OF_ITEMS" />)…</translation> +<translation id="8502913769543567768">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktywuj po skonfigurowaniu urządzenia, zarządzana przez administratora</translation> <translation id="8521441079177373948">brytyjska klawiatura</translation> <translation id="853494022971700746">Francuski (Francja)</translation> <translation id="8540608333167683902">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, szczegóły</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb index 559d3ff..7a72ae7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Recortar</translation> <translation id="7732111077498238432">A rede é controlada por política</translation> <translation id="7736003208887389532">Excluir esses arquivos permanentemente?</translation> +<translation id="7740287852186792672">Resultados da pesquisa</translation> <translation id="7748626145866214022">Mais opções disponíveis na barra de ação. Pressione Alt e A para colocar o foco na barra de ação.</translation> <translation id="7760449188139285140">Chinês (wubi)</translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index e527529..606fa91 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">Irlandês</translation> <translation id="4124935795427217608">Unicórnio</translation> <translation id="4131235941541910880">Mova os itens de que não precisa para o lixo</translation> +<translation id="4134804435730168042">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Ativar após a configuração do dispositivo</translation> <translation id="4153015322587141338">Clique com o botão direito do rato num ficheiro e selecione "<ph name="PIN_COMMAND" />" para um acesso rápido aos seus ficheiros na prateleira.</translation> <translation id="4157569377477607576">A política do administrador não recomenda:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> movido.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">O ficheiro "<ph name="FILE_NAME" />" vai ser apagado e não vai ser possível restaurá-lo.</translation> <translation id="4418686080762064601">Crie um atalho para os seus ficheiros</translation> <translation id="4425149324548788773">O meu disco</translation> +<translation id="4432921877815220091">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Ativar após a configuração do dispositivo, Gerida pelo administrador</translation> <translation id="4439427728133035643">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, intensidade do sinal: <ph name="SIGNAL_STRENGTH" />%, ligar</translation> <translation id="4442424173763614572">A procura de DNS falhou</translation> <translation id="4462159676511157176">Servidores de nome personalizado</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Falha na operação de cópia, erro inesperado: <ph name="ERROR_MESSAGE" />.</translation> <translation id="5926082595146149752">Neerlandês (Países Baixos) com o teclado de PC americano internacional</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Ativar após a configuração do dispositivo</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> itens</translation> <translation id="5957366693331451795">Chromeboxes</translation> <translation id="5982621672636444458">Opções de ordenação</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Cortar</translation> <translation id="7732111077498238432">A rede é controlada por políticas.</translation> <translation id="7736003208887389532">Eliminar definitivamente estes ficheiros?</translation> +<translation id="7740287852186792672">Resultados de pesquisa</translation> <translation id="7748626145866214022">Há mais opções disponíveis na barra de ação. Prima Alt + A para focar a barra de ação.</translation> <translation id="7760449188139285140">Wubi chinês</translation> <translation id="7765158879357617694">Mover</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Disponível offline</translation> <translation id="8492972329130824181">A rede doméstica não está disponível. O roaming de dados móveis tem de estar ativado para estabelecer a ligação.</translation> <translation id="8499098729323186194">A extrair <ph name="NUMBER_OF_ITEMS" /> itens…</translation> +<translation id="8502913769543567768">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Ativar após a configuração do dispositivo, Gerida pelo administrador</translation> <translation id="8521441079177373948">Reino Unido</translation> <translation id="853494022971700746">Francês (França)</translation> <translation id="8540608333167683902">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensidade do sinal: <ph name="SIGNAL_STRENGTH" />%, detalhes</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index da92877..b7a7281 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">Irlandeză</translation> <translation id="4124935795427217608">Unicorn</translation> <translation id="4131235941541910880">Mută elementele de care nu ai nevoie în coșul de gunoi</translation> +<translation id="4134804435730168042">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Activează după configurarea dispozitivului</translation> <translation id="4153015322587141338">Dă clic dreapta pe un fișier și selectează <ph name="PIN_COMMAND" /> pentru acces rapid la fișierele din raft.</translation> <translation id="4157569377477607576">Politica implementată de administrator nu recomandă:</translation> <translation id="4159731583141908892">Mutate: <ph name="FILE_NAME" />.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570"><ph name="FILE_NAME" /> va fi șters și nu vei putea să-l restabilești.</translation> <translation id="4418686080762064601">Creează o comandă rapidă pentru fișiere</translation> <translation id="4425149324548788773">Contul meu Drive</translation> +<translation id="4432921877815220091">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Activează după configurarea dispozitivului, Gestionată de administratorul tău</translation> <translation id="4439427728133035643">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, conectează-te</translation> <translation id="4442424173763614572">Căutarea DNS nu a reușit</translation> <translation id="4462159676511157176">Servere de nume personalizate</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Nu s-a putut copia, eroare neprevăzută: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Neerlandeză (Țările de Jos) cu tastatură S.U.A. internațională pentru PC</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Activează după configurarea dispozitivului</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> elemente</translation> <translation id="5957366693331451795">Chromeboxurile</translation> <translation id="5982621672636444458">Opțiuni de sortare</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Decupează</translation> <translation id="7732111077498238432">Rețeaua este controlată de politică</translation> <translation id="7736003208887389532">Ștergi definitiv fișierele?</translation> +<translation id="7740287852186792672">Rezultatele căutării</translation> <translation id="7748626145866214022">Mai multe opțiuni disponibile în bara de acțiuni. Apasă pe Alt + A pentru a focaliza bara de acțiune.</translation> <translation id="7760449188139285140">Chineză Wubi</translation> <translation id="7765158879357617694">Mută</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Disponibil offline</translation> <translation id="8492972329130824181">Rețeaua de domiciliu nu este disponibilă. Trebuie să activezi roamingul de date mobile pentru a te conecta.</translation> <translation id="8499098729323186194">Se extrag <ph name="NUMBER_OF_ITEMS" /> elemente...</translation> +<translation id="8502913769543567768">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Activează după configurarea dispozitivului, Gestionată de administratorul tău</translation> <translation id="8521441079177373948">UK</translation> <translation id="853494022971700746">Franceză (Franța)</translation> <translation id="8540608333167683902">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, detalii</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb index 510ed132..bdf992c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">Ирландский</translation> <translation id="4124935795427217608">Единорог</translation> <translation id="4131235941541910880">Перемещайте ненужные объекты в корзину.</translation> +<translation id="4134804435730168042">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – <ph name="NETWORK_NAME" />, поставщик – <ph name="NETWORK_PROVIDER_NAME" />. Чтобы активировать сеть, настройте устройство.</translation> <translation id="4153015322587141338">Нажмите на файл правой кнопкой мыши и выберите "<ph name="PIN_COMMAND" />".</translation> <translation id="4157569377477607576">Не рекомендуется администратором:</translation> <translation id="4159731583141908892">Перемещено: <ph name="FILE_NAME" />.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">Файл "<ph name="FILE_NAME" />" будет удален. Вы не сможете отменить это действие.</translation> <translation id="4418686080762064601">Создайте ярлык файла</translation> <translation id="4425149324548788773">Мой диск</translation> +<translation id="4432921877815220091">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – <ph name="NETWORK_NAME" />. Сеть под управлением администратора. Чтобы активировать ее, настройте устройство.</translation> <translation id="4439427728133035643">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, подключение</translation> <translation id="4442424173763614572">Произошла ошибка при поиске сервера DNS</translation> <translation id="4462159676511157176">Другие серверы имен</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Произошла непредвиденная ошибка. <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Нидерландский (Нидерланды), американская международная раскладка (ПК)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – <ph name="NETWORK_NAME" />. Чтобы активировать сеть, настройте устройство.</translation> <translation id="5955954492236143329">Объектов: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="5957366693331451795">Устройства Chromebox</translation> <translation id="5982621672636444458">Сортировать</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Вырезать</translation> <translation id="7732111077498238432">В этой сети установлены правила</translation> <translation id="7736003208887389532">Удалить эти файлы навсегда?</translation> +<translation id="7740287852186792672">Результаты поиска</translation> <translation id="7748626145866214022">Больше возможностей доступно на панели действий. Чтобы перейти на нее, нажмите клавиши Alt + A.</translation> <translation id="7760449188139285140">Китайский, Wubi</translation> <translation id="7765158879357617694">Переместить</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Доступно в автономном режиме</translation> <translation id="8492972329130824181">Домашняя сеть недоступна. Чтобы установить соединение, включите мобильный интернет-роуминг.</translation> <translation id="8499098729323186194">Извлечение объектов (<ph name="NUMBER_OF_ITEMS" />)...</translation> +<translation id="8502913769543567768">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – <ph name="NETWORK_NAME" />, поставщик – <ph name="NETWORK_PROVIDER_NAME" />. Сеть под управлением администратора. Чтобы активировать ее, настройте устройство.</translation> <translation id="8521441079177373948">Британская</translation> <translation id="853494022971700746">Французский (Франция)</translation> <translation id="8540608333167683902">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, подробная информация</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index 02ffe9a..36506e2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">ජංගම පැතිකඩ බාගන්න, ජාල <ph name="NETWORK_COUNT" />කින් <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ඉංග්රීසි (එ.රා.)</translation> <translation id="3975895378829046965">බංග්ලා ශබ්දිම</translation> +<translation id="3999574733850440202">මෑතක දී විවෘත කරන ලද Microsoft ගොනු OneDrive වෙත ගෙන ගොස් ඇත</translation> <translation id="4002066346123236978">සිරස්තලය</translation> <translation id="4017788180641807848">Workman යතුරුපුවරුව සමග ඉංග්රීසි (එ.ජ.)</translation> <translation id="4019998208269143058">ඉක්මන් ගොනු වෙත අමුණන්න</translation> @@ -829,6 +830,7 @@ <translation id="7724603315864178912">කැපීම</translation> <translation id="7732111077498238432">ජාලය ප්රතිපත්තියෙන් පාලනය වේ</translation> <translation id="7736003208887389532">මෙම ගොනු ස්ථිරවම මකන්න ද?</translation> +<translation id="7740287852186792672">සෙවීම් ප්රතිඵල</translation> <translation id="7748626145866214022">ක්රියා තීරුවෙහි තවත් විකල්ප තිබේ. ක්රියා තීරුවට අවධානය යොමු කිරීමට Alt + A ඔබන්න.</translation> <translation id="7760449188139285140">චීන වුබි</translation> <translation id="7765158879357617694">චලනය කරන්න</translation> @@ -906,6 +908,7 @@ <translation id="8300849813060516376">OTASP අසාර්ථක විය</translation> <translation id="8312871300878166382">ෆෝල්ඩරය තුළ අලවන්න</translation> <translation id="8329978297633540474">සරල පෙළ</translation> +<translation id="8332007959299458842">මෑතක දී විවෘත කරන ලද Microsoft ගොනු Google Drive වෙත ගෙන ගොස් ඇත</translation> <translation id="8335587457941836791">රාක්කයෙන් ඉවත්කරන්න</translation> <translation id="8335837413233998004">බෙලරුසියානු</translation> <translation id="8336153091935557858">ඊයේ <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index ad6ec4a..8b4999b5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Vystrihnúť</translation> <translation id="7732111077498238432">Sieť je riadená pravidlami</translation> <translation id="7736003208887389532">Chcete tieto súbory natrvalo odstrániť?</translation> +<translation id="7740287852186792672">Výsledky vyhľadávania</translation> <translation id="7748626145866214022">Ďalšie možnosti sú k dispozícii na paneli akcií. Prejdete na neho stlačením klávesov Alt + A.</translation> <translation id="7760449188139285140">Čínska klávesnica Wubi</translation> <translation id="7765158879357617694">Presunúť</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index ffac366a..36c10b7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">irščina</translation> <translation id="4124935795427217608">Samorog</translation> <translation id="4131235941541910880">Nepotrebne elemente premaknite v smetnjak.</translation> +<translation id="4134804435730168042">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktiviranje po nastavitvi naprave</translation> <translation id="4153015322587141338">Z desnim gumbom kliknite datoteko in izberite ukaz »<ph name="PIN_COMMAND" />«, če želite hitro dostopati do datotek na polici.</translation> <translation id="4157569377477607576">Pravilnik skrbnika ne priporoča:</translation> <translation id="4159731583141908892">Premaknjeno: <ph name="FILE_NAME" />.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">Datoteka »<ph name="FILE_NAME" />« bo izbrisana in ne bo je mogoče obnoviti.</translation> <translation id="4418686080762064601">Ustvarite bližnjico za svoje datoteke</translation> <translation id="4425149324548788773">Moj disk</translation> +<translation id="4432921877815220091">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktiviranje po nastavitvi naprave, upravlja skrbnik</translation> <translation id="4439427728133035643">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, moč signala je <ph name="SIGNAL_STRENGTH" /> %, vzpostavitev povezave</translation> <translation id="4442424173763614572">Iskanje DNS ni uspelo</translation> <translation id="4462159676511157176">Imenski strežniki po meri</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">Operacija kopiranja ni uspela, nepričakovana napaka: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">nizozemščina (Nizozemska) z mednarodno angleško tipkovnico (ZDA – za računalnike s sistemom Windows)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, aktiviranje po nastavitvi naprave</translation> <translation id="5955954492236143329">Št. datotek: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="5957366693331451795">Chromeboxi</translation> <translation id="5982621672636444458">Možnosti razvrščanja</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">Izreži</translation> <translation id="7732111077498238432">Omrežje je upravljano s pravilniki</translation> <translation id="7736003208887389532">Želite trajno izbrisati te datoteke?</translation> +<translation id="7740287852186792672">Rezultati iskanja</translation> <translation id="7748626145866214022">Več možnosti je na voljo v vrstici dejanj. Pritisnite Alt + A za označitev vrstice dejanj.</translation> <translation id="7760449188139285140">kitajščina (način vnosa wubi)</translation> <translation id="7765158879357617694">Premakni</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">Na voljo brez povezave</translation> <translation id="8492972329130824181">Domače omrežje ni na voljo. Za povezavo mora biti omogočeno mobilno podatkovno gostovanje.</translation> <translation id="8499098729323186194">Razširjanje elementov (<ph name="NUMBER_OF_ITEMS" />) …</translation> +<translation id="8502913769543567768">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, aktiviranje po nastavitvi naprave, upravlja skrbnik</translation> <translation id="8521441079177373948">Združeno kraljestvo</translation> <translation id="853494022971700746">francoščina (Francija)</translation> <translation id="8540608333167683902">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, moč signala je <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb index 024d9cd..a0eab99 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Prite</translation> <translation id="7732111077498238432">Rrjeti kontrollohet nga një politikë</translation> <translation id="7736003208887389532">Të fshihen përgjithmonë këta skedarë?</translation> +<translation id="7740287852186792672">Rezultatet e kërkimit</translation> <translation id="7748626145866214022">Më shumë opsione ofrohen në shiritin e veprimeve. Shtyp Alt + A për t'u fokusuar te shiriti e veprimeve.</translation> <translation id="7760449188139285140">Kinezisht Wubi</translation> <translation id="7765158879357617694">Zhvendos</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb index ee1b1430..de65c36a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb
@@ -761,6 +761,7 @@ <translation id="7126604456862387217">„<b><ph name="SEARCH_STRING" /></b>“ – <em>pretraži Disk</em></translation> <translation id="7135561821015524160">kanada fonetska</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Nedostaje „Podudaranje alternativnog imena subjekta“ ili „Podudaranje sufiksa domena“ da bi se potvrdio identitet servera za potvrdu identiteta</translation> <translation id="7165320105431587207">Konfiguracija mreže nije uspela</translation> <translation id="7170041865419449892">Izvan opsega</translation> <translation id="7180611975245234373">Osveži</translation> @@ -831,6 +832,7 @@ <translation id="7724603315864178912">Iseci</translation> <translation id="7732111077498238432">Mrežu kontrolišu smernice</translation> <translation id="7736003208887389532">Želite da trajno izbrišete ove fajlove?</translation> +<translation id="7740287852186792672">Rezultati pretrage</translation> <translation id="7748626145866214022">Još opcija je dostupno na traci sa radnjama. Pritisnite Alt+A da biste fokusirali traku sa radnjama.</translation> <translation id="7760449188139285140">kineski vubi</translation> <translation id="7765158879357617694">Premesti</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb index de4a449..fdb0027 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -761,6 +761,7 @@ <translation id="7126604456862387217">„<b><ph name="SEARCH_STRING" /></b>“ – <em>претражи Диск</em></translation> <translation id="7135561821015524160">канада фонетска</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">Недостаје „Подударање алтернативног имена субјекта“ или „Подударање суфикса домена“ да би се потврдио идентитет сервера за потврду идентитета</translation> <translation id="7165320105431587207">Конфигурација мреже није успела</translation> <translation id="7170041865419449892">Изван опсега</translation> <translation id="7180611975245234373">Освежи</translation> @@ -831,6 +832,7 @@ <translation id="7724603315864178912">Исеци</translation> <translation id="7732111077498238432">Мрежу контролишу смернице</translation> <translation id="7736003208887389532">Желите да трајно избришете ове фајлове?</translation> +<translation id="7740287852186792672">Резултати претраге</translation> <translation id="7748626145866214022">Још опција је доступно на траци са радњама. Притисните Alt+A да бисте фокусирали траку са радњама.</translation> <translation id="7760449188139285140">кинески вуби</translation> <translation id="7765158879357617694">Премести</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index 98797f9..c44850a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Klipp ut</translation> <translation id="7732111077498238432">Nätverket styrs av en princip</translation> <translation id="7736003208887389532">Vill du radera filerna permanent?</translation> +<translation id="7740287852186792672">Sökresultat</translation> <translation id="7748626145866214022">I åtgärdsfältet finns fler alternativ. Du flyttar fokus till åtgärdsfältet med Alt + A.</translation> <translation id="7760449188139285140">kinesiska (Wubi)</translation> <translation id="7765158879357617694">Flytta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index def3948..b84734a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -27,6 +27,7 @@ <translation id="1201402288615127009">Endelea</translation> <translation id="1209796539517632982">Seva za jina otomatiki</translation> <translation id="1210831758834677569">Kilao</translation> +<translation id="1221555006497674479">Nafasi ya hifadhi ni ndogo, imesalia asilimia <ph name="REMAINING_PERCENTAGE" /> kati ya <ph name="TOTAL_SPACE" /> ya nafasi yako ya hifadhi ya pamoja.</translation> <translation id="1243314992276662751">Pakia</translation> <translation id="1249250836236328755">Aina</translation> <translation id="1254593899333212300">Muunganisho wa Mtandao wa moja kwa moja</translation> @@ -73,6 +74,7 @@ <translation id="1641780993263690097">Pinyin ya Kichina</translation> <translation id="1646019627374511909">Inafanya faili <ph name="NUMBER_OF_ITEMS" /> zipatikane nje ya mtandao</translation> <translation id="164969095109328410">Kifaa cha Chrome</translation> +<translation id="1661207570040737402">Umetumia nafasi yako yote ya hifadhi ya pamoja ya Google Workspace.</translation> <translation id="1661867754829461514">PIN inakosekana</translation> <translation id="166439687370499867">Huruhusiwi kubadilisha mipangilio ya mtandao unaoshirikiwa</translation> <translation id="1665611772925418501">Faili isingeweza kurekebishwa.</translation> @@ -353,6 +355,7 @@ <translation id="3971140002794351170">Pakua maelezo ya eSIM ya vifaa vya mkononi, Mtandao <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">Kiingereza (Uingereza)</translation> <translation id="3975895378829046965">Fonetiki ya Kibangla</translation> +<translation id="3999574733850440202">Faili za Microsoft zilizofunguliwa hivi karibuni zimehamishiwa kwenye OneDrive</translation> <translation id="4002066346123236978">Kichwa</translation> <translation id="4017788180641807848">Kiingereza (Marekani) kwenye kibodi ya Workman</translation> <translation id="4019998208269143058">Bandika kwenye faili zinazofikiwa kwa haraka</translation> @@ -828,6 +831,7 @@ <translation id="7724603315864178912">Kata</translation> <translation id="7732111077498238432">Mtandao unadhibitiwa na sera</translation> <translation id="7736003208887389532">Ungependa kufuta kabisa faili hizi?</translation> +<translation id="7740287852186792672">Matokeo ya utafutaji</translation> <translation id="7748626145866214022">Chaguo zaidi zinapatikana kwenye upau wa shughuli. Bonyeza Alt + A ili uangazie upau wa shughuli.</translation> <translation id="7760449188139285140">Mbinu ya Wubi ya kuingiza data ya Kichina</translation> <translation id="7765158879357617694">Sogeza</translation> @@ -905,6 +909,7 @@ <translation id="8300849813060516376">OTASP imeshindikana</translation> <translation id="8312871300878166382">Bandika ndani ya folda</translation> <translation id="8329978297633540474">Matini makavu</translation> +<translation id="8332007959299458842">Faili za Microsoft zilizofunguliwa hivi karibuni zimehamishiwa kwenye Hifadhi ya Google</translation> <translation id="8335587457941836791">Banua kutoka kwenye rafu</translation> <translation id="8335837413233998004">Kibelarusi</translation> <translation id="8336153091935557858">Jana <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 05582bb..911d78f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">இந்த மொபைல் சுயவிவரத்தைப் பதிவிறக்கும்: நெட்வொர்க் <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">ஆங்கிலம் (யுகே)</translation> <translation id="3975895378829046965">வங்காளம் ஒலிப்புமுறை</translation> +<translation id="3999574733850440202">சமீபத்தில் திறக்கப்பட்ட Microsoft ஃபைல்கள் OneDriveக்கு நகர்த்தப்பட்டுள்ளன</translation> <translation id="4002066346123236978">தலைப்பு</translation> <translation id="4017788180641807848">ஆங்கிலம் (யூஎஸ்) - வொர்க்மேன் கீபோர்டு</translation> <translation id="4019998208269143058">'துரித ஃபைல்கள்' பிரிவில் பின் செய்</translation> @@ -830,6 +831,7 @@ <translation id="7724603315864178912">வெட்டு</translation> <translation id="7732111077498238432">இது கொள்கையால் கட்டுப்படுத்தப்படும் நெட்வொர்க்</translation> <translation id="7736003208887389532">இந்த ஃபைல்களை நிரந்தரமாக நீக்கவா?</translation> +<translation id="7740287852186792672">தேடல் முடிவுகள்</translation> <translation id="7748626145866214022">செயல் பட்டியில் பல விருப்பங்கள் உள்ளன. செயல் பட்டியில் கவனம் செலுத்த, Alt + Aஐ அழுத்தவும்.</translation> <translation id="7760449188139285140">சீனம் (உபி)</translation> <translation id="7765158879357617694">நகர்த்து</translation> @@ -907,6 +909,7 @@ <translation id="8300849813060516376">OTASP தோல்வியுற்றது</translation> <translation id="8312871300878166382">ஃபோல்டரில் ஒட்டு</translation> <translation id="8329978297633540474">எளிய உரை</translation> +<translation id="8332007959299458842">சமீபத்தில் திறக்கப்பட்ட Microsoft ஃபைல்கள் Google Driveக்கு நகர்த்தப்பட்டுள்ளன</translation> <translation id="8335587457941836791">அடுக்கிலிருந்து பிரித்தெடு</translation> <translation id="8335837413233998004">பெலாரஷ்யன்</translation> <translation id="8336153091935557858">நேற்று <ph name="YESTERDAY_DAYTIME" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index fdec5a6..2de65fc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">కత్తిరించండి</translation> <translation id="7732111077498238432">విధానం ద్వారా నెట్వర్క్ నియంత్రించబడుతుంది</translation> <translation id="7736003208887389532">ఈ ఫైల్స్ను శాశ్వతంగా తొలగించాలా?</translation> +<translation id="7740287852186792672">శోధన ఫలితాలు</translation> <translation id="7748626145866214022">చర్య బార్లో మరిన్ని ఎంపికలు అందుబాటులో ఉంటాయి. చర్య బార్పై దృష్టి పెట్టడం కోసం Alt + A నొక్కండి.</translation> <translation id="7760449188139285140">చైనీస్ వుబీ</translation> <translation id="7765158879357617694">తరలించు</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index e8ff0eb..07c3e9d31d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -834,6 +834,7 @@ <translation id="7724603315864178912">ตัด</translation> <translation id="7732111077498238432">เครือข่ายมีนโยบายควบคุม</translation> <translation id="7736003208887389532">ลบไฟล์เหล่านี้อย่างถาวรใช่ไหม</translation> +<translation id="7740287852186792672">ผลการค้นหา</translation> <translation id="7748626145866214022">มีตัวเลือกเพิ่มเติมในแถบการทำงาน กด Alt + A เพื่อโฟกัสแถบการทำงาน</translation> <translation id="7760449188139285140">จีน (Wubi)</translation> <translation id="7765158879357617694">ย้าย</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 05376af..271e509 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Kes</translation> <translation id="7732111077498238432">Ağ, politika ile denetleniyor</translation> <translation id="7736003208887389532">Bu dosyalar kalıcı olarak silinsin mi?</translation> +<translation id="7740287852186792672">Arama sonuçları</translation> <translation id="7748626145866214022">İşlem çubuğunda daha fazla seçenek var. İşlem çubuğuna odaklanmak için Alt + A tuşlarına basın.</translation> <translation id="7760449188139285140">Çince Wubi</translation> <translation id="7765158879357617694">Taşı</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index 6115e8641..a4f476a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Вирізати</translation> <translation id="7732111077498238432">Мережа контролюється правилами</translation> <translation id="7736003208887389532">Видалити ці файли назавжди?</translation> +<translation id="7740287852186792672">Результати пошуку</translation> <translation id="7748626145866214022">На панелі дій доступно більше параметрів. Натисніть Alt + A, щоб відкрити її.</translation> <translation id="7760449188139285140">Китайська, вубі</translation> <translation id="7765158879357617694">Перемістити</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index e87b5be..3a70459 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -355,6 +355,7 @@ <translation id="3971140002794351170">موبائل پروفائل ڈاؤن لوڈ کریں، نیٹ ورک <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" /></translation> <translation id="3973925058222872294">انگریزی (برطانیہ)</translation> <translation id="3975895378829046965">بنگالی فونیٹک</translation> +<translation id="3999574733850440202">حال ہی میں کھلی ہوئی Microsoft فائلز OneDrive میں منتقل ہوگئی ہیں</translation> <translation id="4002066346123236978">عنوان</translation> <translation id="4017788180641807848">Workman کی بورڈ کے ساتھ انگریزی (امریکہ)</translation> <translation id="4019998208269143058">فوری فائلز کو پن کریں</translation> @@ -363,6 +364,7 @@ <translation id="4092890906744441904">آئرش</translation> <translation id="4124935795427217608">یونیکارن</translation> <translation id="4131235941541910880">ان آئٹمز کو کوڑے دان میں منتقل کریں جن کی آپ کو ضرورت نہیں ہے</translation> +<translation id="4134804435730168042"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" />، آلے کے سیٹ اپ ہونے کے بعد فعال کریں</translation> <translation id="4153015322587141338">کسی فائل پر دائیں کلک کریں اور شیلف میں موجود اپنی فائلوں تک فوری رسائی کے لیے "<ph name="PIN_COMMAND" />" کو منتخب کریں۔</translation> <translation id="4157569377477607576">منتظم کی پالیسی درج ذیل کی تجویز نہیں کرتی ہے:</translation> <translation id="4159731583141908892"><ph name="FILE_NAME" /> منتقل ہو گیا۔</translation> @@ -405,6 +407,7 @@ <translation id="4414834425328380570">"<ph name="FILE_NAME" />" حذف ہو جائے گا اور آپ اسے بحال نہیں کر سکیں گے۔</translation> <translation id="4418686080762064601">اپنی فائلوں کے ليے ایک شارٹ کٹ تخلیق کریں</translation> <translation id="4425149324548788773">میری ڈرائیو</translation> +<translation id="4432921877815220091"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، آلے کے سیٹ اپ ہونے کے بعد فعال کریں، اپنے منتظم کے زیر انتظام</translation> <translation id="4439427728133035643"><ph name="NETWORK_COUNT" /> میں سے <ph name="NETWORK_INDEX" /> نیٹ ورک، <ph name="NETWORK_NAME" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />%، منسلک کریں</translation> <translation id="4442424173763614572">DNS کی تلاش ناکام ہو گئی</translation> <translation id="4462159676511157176">حسب ضرورت نام سرورز</translation> @@ -613,6 +616,7 @@ <translation id="5913638992615760742">کاپی کرنے کی کارروائی ناکام ہو گئی، غیر متوقع خرابی: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">امریکی بین الاقوامی PC کی بورڈ کے ساتھ ڈچ (نیدرلینڈز)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، آلے کے سیٹ اپ ہونے کے بعد فعال کریں</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> آئٹمز</translation> <translation id="5957366693331451795">Chromeboxes</translation> <translation id="5982621672636444458">ترتیب دینے کے اختیارات</translation> @@ -759,6 +763,7 @@ <translation id="7126604456862387217">'<b><ph name="SEARCH_STRING" /></b>' - <em> Drive تلاش کریں</em></translation> <translation id="7135561821015524160">کنّڑ فونیٹک</translation> <translation id="714034171374937760">Chromebase</translation> +<translation id="7162080671816799010">توثیق سرور کی شناخت کی توثیق کرنے کے لیے 'موضوع کے متبادل نام کی مماثلت' یا 'ڈومین لاحقہ کی مماثلت' غائب ہے</translation> <translation id="7165320105431587207">نیٹ ورک کنفیگر کرنے میں ناکام ہوگیا</translation> <translation id="7170041865419449892">رینج سے باہر</translation> <translation id="7180611975245234373">ریفریش کریں</translation> @@ -829,6 +834,7 @@ <translation id="7724603315864178912">کٹ کریں</translation> <translation id="7732111077498238432">نیٹ ورک پالیسی سے کنٹرول کی جاتی ہے</translation> <translation id="7736003208887389532">ان فائلز کو مستقل طور پر حذف کریں؟</translation> +<translation id="7740287852186792672">تلاش کے نتائج</translation> <translation id="7748626145866214022">کارروائی بار پر مزید اختیارات دستیاب ہیں۔ کارروائی بار پر فوکس کرنے کے لئے Alt + A دبائیں۔</translation> <translation id="7760449188139285140">چینی Wubi</translation> <translation id="7765158879357617694">منتقل کریں</translation> @@ -906,6 +912,7 @@ <translation id="8300849813060516376">OTASP ناکام ہوگیا</translation> <translation id="8312871300878166382">فولڈر میں پیسٹ کریں</translation> <translation id="8329978297633540474">سادہ متن</translation> +<translation id="8332007959299458842">حال ہی میں کھلی ہوئی Microsoft فائلز Google Drive میں منتقل ہوگئی ہیں</translation> <translation id="8335587457941836791">شیلف سے پن ہٹائیں</translation> <translation id="8335837413233998004">بيلاروسی</translation> <translation id="8336153091935557858">گزشتہ کل <ph name="YESTERDAY_DAYTIME" /></translation> @@ -932,6 +939,7 @@ <translation id="8487700953926739672">آف لائن دستیاب ہے</translation> <translation id="8492972329130824181">ہوم نیٹ ورک دستیاب نہیں ہے۔ منسلک ہونے کیلئے موبائل ڈیٹا رومنگ کو فعال کرنا ہوگا۔</translation> <translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> آئٹمز کو اخذ کیا جا رہا ہے…</translation> +<translation id="8502913769543567768"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" />، آلے کے سیٹ اپ ہونے کے بعد فعال کریں، اپنے منتظم کے زیر انتظام</translation> <translation id="8521441079177373948">UK</translation> <translation id="853494022971700746">فرانسیسی (فرانس)</translation> <translation id="8540608333167683902"><ph name="NETWORK_COUNT" /> میں سے <ph name="NETWORK_INDEX" /> نیٹ ورک، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، سگنل کی مضبوطی<ph name="SIGNAL_STRENGTH" />%، تفصیلات</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb index 6be6295..afe2baf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">Irland</translation> <translation id="4124935795427217608">Bir shoxli ot</translation> <translation id="4131235941541910880">Elementlarni boshqa jildga olish uchun chiqitdon kerak emas</translation> +<translation id="4134804435730168042">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, Qurilma sozlangandan keyin faollashtiriladi</translation> <translation id="4153015322587141338">Fayl ustida oʻng tugmani bosing va javon ichidagi fayllarga tezkor kirish uchun “<ph name="PIN_COMMAND" />” bandini tanlang.</translation> <translation id="4157569377477607576">Administrator tavsiya qilmaydi:</translation> <translation id="4159731583141908892">Boshqa joyga olindi: <ph name="FILE_NAME" />.</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">“<ph name="FILE_NAME" />” fayli oʻchib ketadi va qayta tiklanmaydi.</translation> <translation id="4418686080762064601">Fayllaringiz uchun yorliq yarating</translation> <translation id="4425149324548788773">My Drive</translation> +<translation id="4432921877815220091">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Qurilma sozlangandan keyin faollashtiriladi, Administrator boshqaruvida</translation> <translation id="4439427728133035643">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />%, Ulanish</translation> <translation id="4442424173763614572">DNS topilmadi</translation> <translation id="4462159676511157176">Boshqa nom serverlari</translation> @@ -614,6 +616,7 @@ <translation id="5913638992615760742">Nusxalash amali bajarilmadi, kutilmagan xatolik: <ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">Golland (Niderlandiya) va kompyuter uchun AQSH klaviaturasi (xalqaro)</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Qurilma sozlangandan keyin faollashtiriladi</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> ta obyekt</translation> <translation id="5957366693331451795">Chromeboxe qurilmalari</translation> <translation id="5982621672636444458">Saralash</translation> @@ -830,6 +833,7 @@ <translation id="7724603315864178912">Qirqish</translation> <translation id="7732111077498238432">Tarmoq sozlamalari faqat siyosat asosida</translation> <translation id="7736003208887389532">Bu fayllar butunlay oʻchirib tashlansinmi?</translation> +<translation id="7740287852186792672">Qidiruv natijalari</translation> <translation id="7748626145866214022">Amallar panelida qo‘shimcha sozlamalar mavjud. Amallar paneliga o‘tish uchun Alt+A tugmalarini bosing.</translation> <translation id="7760449188139285140">Xitoy (Wubi)</translation> <translation id="7765158879357617694">Ko‘chirib o‘tkazish</translation> @@ -934,6 +938,7 @@ <translation id="8487700953926739672">Internetsiz foydalanish mumkin</translation> <translation id="8492972329130824181">Uydagi tarmoq ishlamayapti. Ulanish uchun mobil internet-roumingni yoqing.</translation> <translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> ta fayl arxivdan chiqarilmoqda...</translation> +<translation id="8502913769543567768">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Provayder: <ph name="NETWORK_PROVIDER_NAME" />, Qurilma sozlangandan keyin faollashtiriladi, Administrator boshqaruvida</translation> <translation id="8521441079177373948">UK</translation> <translation id="853494022971700746">Fransuz (Fransiya)</translation> <translation id="8540608333167683902">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Ulanish:<ph name="CONNECTION_STATUS" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />%, Batafsil</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb index 0957ceb..41bbcdb0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -831,6 +831,7 @@ <translation id="7724603315864178912">Cắt</translation> <translation id="7732111077498238432">Mạng được kiểm soát bằng chính sách</translation> <translation id="7736003208887389532">Xoá vĩnh viễn các tệp này?</translation> +<translation id="7740287852186792672">Kết quả tìm kiếm</translation> <translation id="7748626145866214022">Trên thanh hành động có các tùy chọn khác. Nhấn tổ hợp phím Alt + A để đặt tiêu điểm vào thanh hành động.</translation> <translation id="7760449188139285140">Tiếng Trung Ngũ bút</translation> <translation id="7765158879357617694">Di chuyển</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index 0bb467a0..08110af 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">爱尔兰语</translation> <translation id="4124935795427217608">独角兽</translation> <translation id="4131235941541910880">将不需要的内容移至回收站</translation> +<translation id="4134804435730168042">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在设备完成设置后启用</translation> <translation id="4153015322587141338">只需右键点击某个文件并选择“<ph name="PIN_COMMAND" />”,即可在任务栏中快速访问相应文件。</translation> <translation id="4157569377477607576">管理员政策不建议:</translation> <translation id="4159731583141908892">已移动 <ph name="FILE_NAME" />。</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">“<ph name="FILE_NAME" />”将被删除且无法恢复。</translation> <translation id="4418686080762064601">为您的文件创建快捷方式</translation> <translation id="4425149324548788773">我的云端硬盘</translation> +<translation id="4432921877815220091">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,在设备完成设置后启用,由您的管理员管理</translation> <translation id="4439427728133035643">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,信号强度为 <ph name="SIGNAL_STRENGTH" />%,连接</translation> <translation id="4442424173763614572">DNS 查找失败</translation> <translation id="4462159676511157176">自定义域名服务器</translation> @@ -610,6 +612,7 @@ <translation id="5913638992615760742">复制操作失败,出现了意外的错误:<ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">荷兰语(荷兰)美式国际 PC 键盘</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,在设备完成设置后启用</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> 项内容</translation> <translation id="5957366693331451795">Chromebox</translation> <translation id="5982621672636444458">排序选项</translation> @@ -826,6 +829,7 @@ <translation id="7724603315864178912">剪切</translation> <translation id="7732111077498238432">网络受政策控制</translation> <translation id="7736003208887389532">要永久删除这些文件吗?</translation> +<translation id="7740287852186792672">搜索结果</translation> <translation id="7748626145866214022">操作栏中提供了更多选项。按 Alt + A 即可聚焦于操作栏。</translation> <translation id="7760449188139285140">中文五笔</translation> <translation id="7765158879357617694">移动</translation> @@ -930,6 +934,7 @@ <translation id="8487700953926739672">可离线使用</translation> <translation id="8492972329130824181">无法使用家庭网络。必须启用移动数据漫游才能联网。</translation> <translation id="8499098729323186194">正在提取 <ph name="NUMBER_OF_ITEMS" /> 个项目…</translation> +<translation id="8502913769543567768">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在设备完成设置后启用,由您的管理员管理</translation> <translation id="8521441079177373948">英国英语</translation> <translation id="853494022971700746">法语(法国)</translation> <translation id="8540608333167683902">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,信号强度为 <ph name="SIGNAL_STRENGTH" />%,详细信息</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index 854d671..e62d465 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">愛爾蘭文</translation> <translation id="4124935795427217608">獨角獸</translation> <translation id="4131235941541910880">將不需要的項目移至垃圾桶</translation> +<translation id="4134804435730168042">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在裝置完成設定後啟用</translation> <translation id="4153015322587141338">在檔案上按一下右鍵,然後選取 [<ph name="PIN_COMMAND" />],以便在捷徑列中快速存取檔案。</translation> <translation id="4157569377477607576">管理員政策不建議:</translation> <translation id="4159731583141908892">已移動 <ph name="FILE_NAME" />。</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">系統將刪除「<ph name="FILE_NAME" />」,而且無法還原。</translation> <translation id="4418686080762064601">為檔案建立捷徑</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> +<translation id="4432921877815220091">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,在裝置完成設定後啟用,由管理員管理</translation> <translation id="4439427728133035643">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,連接</translation> <translation id="4442424173763614572">DNS 查詢失敗</translation> <translation id="4462159676511157176">自訂名稱伺服器</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">複製作業失敗,發生未預期的錯誤:<ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">荷蘭文 (荷蘭),美國國際 (PC) 鍵盤</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,在裝置完成設定後啟用</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> 個項目</translation> <translation id="5957366693331451795">Chromebox</translation> <translation id="5982621672636444458">排序選項</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">剪下</translation> <translation id="7732111077498238432">網絡受政策控制</translation> <translation id="7736003208887389532">要永久刪除這些檔案嗎?</translation> +<translation id="7740287852186792672">搜尋結果</translation> <translation id="7748626145866214022">您可以在操作列查看更多選項。按 Alt + A 鍵即可將焦點移至操作列。</translation> <translation id="7760449188139285140">中文 (五筆)</translation> <translation id="7765158879357617694">移動</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">可離線使用</translation> <translation id="8492972329130824181">無法使用住宅網絡,您必須啟用流動數據漫遊服務才能連線。</translation> <translation id="8499098729323186194">正在解壓縮 <ph name="NUMBER_OF_ITEMS" /> 個項目…</translation> +<translation id="8502913769543567768">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在裝置完成設定後啟用,由管理員管理</translation> <translation id="8521441079177373948">英文</translation> <translation id="853494022971700746">法文 (法國)</translation> <translation id="8540608333167683902">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,詳情</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb index b93b879..be3247b3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -364,6 +364,7 @@ <translation id="4092890906744441904">愛爾蘭文</translation> <translation id="4124935795427217608">獨角獸</translation> <translation id="4131235941541910880">你可以將不需要的項目移到垃圾桶</translation> +<translation id="4134804435730168042">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在裝置完成設定後啟用</translation> <translation id="4153015322587141338">在檔案上按一下滑鼠右鍵,然後選取「<ph name="PIN_COMMAND" />」,即可快速存取檔案櫃中的檔案。</translation> <translation id="4157569377477607576">根據管理員政策,建議你不要:</translation> <translation id="4159731583141908892">已移動 <ph name="FILE_NAME" />。</translation> @@ -406,6 +407,7 @@ <translation id="4414834425328380570">「<ph name="FILE_NAME" />」將遭刪除且無法還原。</translation> <translation id="4418686080762064601">為檔案建立捷徑</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> +<translation id="4432921877815220091">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,在裝置完成設定後啟用,由管理員管理</translation> <translation id="4439427728133035643">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="NETWORK_NAME" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,連線</translation> <translation id="4442424173763614572">DNS 查詢失敗</translation> <translation id="4462159676511157176">自訂名稱伺服器</translation> @@ -615,6 +617,7 @@ <translation id="5913638992615760742">複製作業失敗,發生未預期的錯誤:<ph name="ERROR_MESSAGE" /></translation> <translation id="5926082595146149752">荷蘭文 (荷蘭) 搭配美式國際 PC 鍵盤</translation> <translation id="5932901536148835538">Chromebit</translation> +<translation id="5948255720516436063">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,在裝置完成設定後啟用</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> 個項目</translation> <translation id="5957366693331451795">Chromebox</translation> <translation id="5982621672636444458">排序選項</translation> @@ -831,6 +834,7 @@ <translation id="7724603315864178912">剪下</translation> <translation id="7732111077498238432">網路受到政策控制</translation> <translation id="7736003208887389532">要永久刪除這些檔案嗎?</translation> +<translation id="7740287852186792672">搜尋結果</translation> <translation id="7748626145866214022">動作列中有更多可用的選項。按下 Alt+A 即可將焦點移到動作列。</translation> <translation id="7760449188139285140">中文 (五筆)</translation> <translation id="7765158879357617694">移動</translation> @@ -935,6 +939,7 @@ <translation id="8487700953926739672">可離線使用</translation> <translation id="8492972329130824181">無法使用家用網路,你必須啟用行動數據漫遊服務才能連線。</translation> <translation id="8499098729323186194">正在擷取 <ph name="NUMBER_OF_ITEMS" /> 個項目...</translation> +<translation id="8502913769543567768">第 <ph name="NETWORK_INDEX" /> 個網路,共 <ph name="NETWORK_COUNT" /> 個網路,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,在裝置完成設定後啟用,由管理員管理</translation> <translation id="8521441079177373948">英式配置</translation> <translation id="853494022971700746">法文 (法國)</translation> <translation id="8540608333167683902">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,詳細資料</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index 8cc7c2ee..22c7ecf0 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -830,6 +830,7 @@ <translation id="7724603315864178912">Sika</translation> <translation id="7732111077498238432">Inethiwekhi ilawulwa inqubomgomo</translation> <translation id="7736003208887389532">Sula la mafayela ingunaphakade?</translation> +<translation id="7740287852186792672">Imiphumela yosesho</translation> <translation id="7748626145866214022">Izinketho eziningi ezitholakala kubha yesenzo. Cindezela ku-Alt + A ukuze ugxilise ibha yesenzo.</translation> <translation id="7760449188139285140">Chinese Wubi</translation> <translation id="7765158879357617694">Hambisa</translation>
diff --git a/ui/color/color_id.h b/ui/color/color_id.h index ac2f1ad..1e5092d 100644 --- a/ui/color/color_id.h +++ b/ui/color/color_id.h
@@ -28,6 +28,7 @@ E_CPONLY(kColorRefPrimary100) \ E_CPONLY(kColorRefSecondary0) \ E_CPONLY(kColorRefSecondary10) \ + E_CPONLY(kColorRefSecondary15) \ E_CPONLY(kColorRefSecondary20) \ E_CPONLY(kColorRefSecondary30) \ E_CPONLY(kColorRefSecondary40) \ @@ -105,24 +106,24 @@ \ /* UI material system color tokens */ \ /* Primary. */ \ - E_CPONLY(kColorSysPrimary) \ E_CPONLY(kColorSysOnPrimary) \ - E_CPONLY(kColorSysPrimaryContainer) \ E_CPONLY(kColorSysOnPrimaryContainer) \ + E_CPONLY(kColorSysPrimary) \ + E_CPONLY(kColorSysPrimaryContainer) \ /* Secondary. */ \ - E_CPONLY(kColorSysSecondary) \ E_CPONLY(kColorSysOnSecondary) \ - E_CPONLY(kColorSysSecondaryContainer) \ E_CPONLY(kColorSysOnSecondaryContainer) \ + E_CPONLY(kColorSysSecondary) \ + E_CPONLY(kColorSysSecondaryContainer) \ /* Tertiary. */ \ - E_CPONLY(kColorSysTertiary) \ E_CPONLY(kColorSysOnTertiary) \ - E_CPONLY(kColorSysTertiaryContainer) \ E_CPONLY(kColorSysOnTertiaryContainer) \ + E_CPONLY(kColorSysTertiary) \ + E_CPONLY(kColorSysTertiaryContainer) \ /* Error. */ \ E_CPONLY(kColorSysError) \ - E_CPONLY(kColorSysOnError) \ E_CPONLY(kColorSysErrorContainer) \ + E_CPONLY(kColorSysOnError) \ E_CPONLY(kColorSysOnErrorContainer) \ /* Neutral. */ \ E_CPONLY(kColorSysOnSurface) \ @@ -130,8 +131,8 @@ E_CPONLY(kColorSysOutline) \ E_CPONLY(kColorSysSurfaceVariant) \ /* Inverse. */ \ - E_CPONLY(kColorSysInversePrimary) \ E_CPONLY(kColorSysInverseOnSurface) \ + E_CPONLY(kColorSysInversePrimary) \ /* Surfaces. */ \ E_CPONLY(kColorSysSurface) \ E_CPONLY(kColorSysSurface1) \ @@ -145,20 +146,20 @@ E_CPONLY(kColorSysOnSurfaceSubtle) \ /* Chrome surfaces. */ \ E_CPONLY(kColorSysBase) \ + E_CPONLY(kColorSysHeader) \ + E_CPONLY(kColorSysHeaderInactive) \ E_CPONLY(kColorSysOnBase) \ E_CPONLY(kColorSysOnBaseSecondary) \ E_CPONLY(kColorSysOnBaseDivider) \ E_CPONLY(kColorSysOnBaseBorder) \ - E_CPONLY(kColorSysHeader) \ - E_CPONLY(kColorSysHeaderInactive) \ + E_CPONLY(kColorSysOnHeaderContainer) \ + E_CPONLY(kColorSysOnHeaderContainerInactive) \ E_CPONLY(kColorSysOnHeaderDivider) \ E_CPONLY(kColorSysOnHeaderDividerInactive) \ E_CPONLY(kColorSysOnHeaderPrimary) \ E_CPONLY(kColorSysOnHeaderPrimaryInactive) \ E_CPONLY(kColorSysOnHeaderSecondary) \ E_CPONLY(kColorSysOnHeaderSecondaryInactive) \ - E_CPONLY(kColorSysOnHeaderContainer) \ - E_CPONLY(kColorSysOnHeaderContainerInactive) \ /* Effects. */ \ E_CPONLY(kColorSysShadow) \ /* States. */ \ @@ -169,6 +170,9 @@ E_CPONLY(kColorSysStateFocusRing) \ E_CPONLY(kColorSysStateDisabled) \ E_CPONLY(kColorSysStateDisabledContainer) \ + /* Containers. */ \ + E_CPONLY(kColorSysOnTonalContainer) \ + E_CPONLY(kColorSysTonalContainer) \ /* Core color concepts */ \ /* kColorAccent is used in color_provider_css_colors_test.ts. */ \ /* If changing the variable name, the variable name in the test needs to */ \ @@ -197,6 +201,8 @@ E_CPONLY(kColorAvatarHeaderArt) \ E_CPONLY(kColorAvatarIconGuest) \ E_CPONLY(kColorAvatarIconIncognito) \ + E_CPONLY(kColorBadgeBackground) \ + E_CPONLY(kColorBadgeForeground) \ E_CPONLY(kColorBubbleBackground) \ E_CPONLY(kColorBubbleBorder) \ E_CPONLY(kColorBubbleBorderShadowLarge) \
diff --git a/ui/color/material_ui_color_mixer.cc b/ui/color/material_ui_color_mixer.cc index 6c9e0b9a..0e3b2700 100644 --- a/ui/color/material_ui_color_mixer.cc +++ b/ui/color/material_ui_color_mixer.cc
@@ -23,6 +23,8 @@ << (dark_mode ? "Dark" : "Light") << " window."; ColorMixer& mixer = provider->AddMixer(); + mixer[kColorBadgeBackground] = {kColorSysTonalContainer}; + mixer[kColorBadgeForeground] = {kColorSysOnTonalContainer}; mixer[kColorButtonBackground] = {kColorSysSurface}; mixer[kColorButtonBackgroundPressed] = GetResultingPaintColor({kColorSysStatePressed}, {kColorButtonBackground});
diff --git a/ui/color/ref_color_mixer.cc b/ui/color/ref_color_mixer.cc index 3aa68b62..978720b 100644 --- a/ui/color/ref_color_mixer.cc +++ b/ui/color/ref_color_mixer.cc
@@ -44,6 +44,7 @@ mixer[kColorRefSecondary0] = {palette.secondary().get(0)}; mixer[kColorRefSecondary10] = {palette.secondary().get(10)}; + mixer[kColorRefSecondary15] = {palette.secondary().get(15)}; mixer[kColorRefSecondary20] = {palette.secondary().get(20)}; mixer[kColorRefSecondary30] = {palette.secondary().get(30)}; mixer[kColorRefSecondary40] = {palette.secondary().get(40)};
diff --git a/ui/color/sys_color_mixer.cc b/ui/color/sys_color_mixer.cc index 347fe21..e06bffed 100644 --- a/ui/color/sys_color_mixer.cc +++ b/ui/color/sys_color_mixer.cc
@@ -78,31 +78,31 @@ // Surfaces. mixer[kColorSysSurface] = {dark_mode ? kColorRefNeutral10 : kColorRefNeutral100}; - mixer[kColorSysSurface1] = { + mixer[kColorSysSurface1] = dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x0C), {kColorRefNeutral10}) : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x0C), - {kColorRefNeutral99})}; - mixer[kColorSysSurface2] = { + {kColorRefNeutral99}); + mixer[kColorSysSurface2] = dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x14), {kColorRefNeutral10}) : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x14), - {kColorRefNeutral99})}; - mixer[kColorSysSurface3] = { + {kColorRefNeutral99}); + mixer[kColorSysSurface3] = dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x1C), {kColorRefNeutral10}) : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x1C), - {kColorRefNeutral99})}; - mixer[kColorSysSurface4] = { + {kColorRefNeutral99}); + mixer[kColorSysSurface4] = dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x1E), {kColorRefNeutral10}) : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x1E), - {kColorRefNeutral99})}; - mixer[kColorSysSurface5] = { + {kColorRefNeutral99}); + mixer[kColorSysSurface5] = dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x23), {kColorRefNeutral10}) : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x23), - {kColorRefNeutral99})}; + {kColorRefNeutral99}); // General. mixer[kColorSysOnSurfacePrimary] = {dark_mode ? kColorRefPrimary90 @@ -143,26 +143,29 @@ mixer[kColorSysShadow] = {kColorRefNeutral100}; // States. - mixer[kColorSysStateHover] = {dark_mode - ? SetAlpha({kColorRefNeutral90}, 0x14) - : SetAlpha({kColorRefNeutral10}, 0x14)}; - mixer[kColorSysStateFocus] = {dark_mode - ? SetAlpha({kColorRefNeutral90}, 0x1E) - : SetAlpha({kColorRefNeutral10}, 0x1E)}; - mixer[kColorSysStatePressed] = {dark_mode - ? SetAlpha({kColorRefNeutral90}, 0x1E) - : SetAlpha({kColorRefNeutral10}, 0x1E)}; - mixer[kColorSysStateDrag] = {dark_mode - ? SetAlpha({kColorRefNeutral90}, 0x29) - : SetAlpha({kColorRefNeutral10}, 0x29)}; + mixer[kColorSysStateHover] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x14) + : SetAlpha({kColorRefNeutral10}, 0x14); + mixer[kColorSysStateFocus] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x1E) + : SetAlpha({kColorRefNeutral10}, 0x1E); + mixer[kColorSysStatePressed] = dark_mode + ? SetAlpha({kColorRefNeutral90}, 0x1E) + : SetAlpha({kColorRefNeutral10}, 0x1E); + mixer[kColorSysStateDrag] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x29) + : SetAlpha({kColorRefNeutral10}, 0x29); mixer[kColorSysStateFocusRing] = {dark_mode ? kColorRefPrimary80 : kColorRefPrimary40}; - mixer[kColorSysStateDisabled] = {dark_mode - ? SetAlpha({kColorRefNeutral90}, 0x60) - : SetAlpha({kColorRefNeutral10}, 0x60)}; - mixer[kColorSysStateDisabledContainer] = { + mixer[kColorSysStateDisabled] = dark_mode + ? SetAlpha({kColorRefNeutral90}, 0x60) + : SetAlpha({kColorRefNeutral10}, 0x60); + mixer[kColorSysStateDisabledContainer] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x1E) - : SetAlpha({kColorRefNeutral10}, 0x1E)}; + : SetAlpha({kColorRefNeutral10}, 0x1E); + + // Containers. + mixer[kColorSysTonalContainer] = {dark_mode ? kColorRefPrimary30 + : kColorRefPrimary90}; + mixer[kColorSysOnTonalContainer] = {dark_mode ? kColorRefPrimary90 + : kColorRefPrimary10}; } } // namespace ui
diff --git a/ui/color/ui_color_mixer.cc b/ui/color/ui_color_mixer.cc index b24966e..13e834c 100644 --- a/ui/color/ui_color_mixer.cc +++ b/ui/color/ui_color_mixer.cc
@@ -26,6 +26,11 @@ mixer[kColorAvatarHeaderArt] = {kColorMidground}; mixer[kColorAvatarIconGuest] = {kColorSecondaryForeground}; mixer[kColorAvatarIconIncognito] = {kColorPrimaryForeground}; + mixer[kColorBadgeBackground] = + PickGoogleColor(kColorAccent, kColorDialogBackground, + color_utils::kMinimumVisibleContrastRatio); + mixer[kColorBadgeForeground] = + GetColorWithMaxContrast(kColorButtonBackgroundProminent); mixer[kColorBubbleBackground] = {kColorPrimaryBackground}; mixer[kColorBubbleBorder] = {kColorMidground}; mixer[kColorBubbleBorderShadowLarge] = {SetAlpha(kColorShadowBase, 0x1A)};
diff --git a/ui/color/win/accent_color_observer.cc b/ui/color/win/accent_color_observer.cc index 7de55ad..cf96622 100644 --- a/ui/color/win/accent_color_observer.cc +++ b/ui/color/win/accent_color_observer.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/no_destructor.h" +#include "base/task/sequenced_task_runner.h" #include "skia/ext/skia_utils_win.h" #include "ui/gfx/color_utils.h" @@ -82,8 +83,10 @@ callbacks_.Notify(); - // Watch for future changes. - if (!dwm_key_->StartWatching(base::BindOnce( + // Watch for future changes. If there is no task runner, this is a test or + // tool context and watching is unnecessary. + if (!base::SequencedTaskRunner::HasCurrentDefault() || + !dwm_key_->StartWatching(base::BindOnce( &AccentColorObserver::OnDwmKeyUpdated, base::Unretained(this)))) { dwm_key_.reset(); }
diff --git a/ui/events/event_processor_unittest.cc b/ui/events/event_processor_unittest.cc index add5eac..347cfee 100644 --- a/ui/events/event_processor_unittest.cc +++ b/ui/events/event_processor_unittest.cc
@@ -146,7 +146,8 @@ // first event processor should be handled by |target_handler| instead. auto target_handler = std::make_unique<ReDispatchEventHandler>( second_processor.get(), root()->child_at(0)); - std::ignore = root()->child_at(0)->SetTargetHandler(target_handler.get()); + EventHandler* old_handler = + root()->child_at(0)->SetTargetHandler(target_handler.get()); // Dispatch a mouse event to the tree of event targets owned by the first // event processor, checking in ReDispatchEventHandler that the phase and @@ -174,6 +175,9 @@ EXPECT_EQ(1, target_handler->num_mouse_events()); EXPECT_TRUE(second_root->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED)); EXPECT_TRUE(mouse2.handled()); + + old_handler = root()->child_at(0)->SetTargetHandler(old_handler); + EXPECT_EQ(old_handler, target_handler.get()); } // Verifies that OnEventProcessingFinished() is called when an event @@ -375,9 +379,13 @@ EXPECT_EQ(std::vector<std::string>(expected, expected + std::size(expected)), recorder); - root()->RemovePreTargetHandler(&pre_root); - child_r->RemovePreTargetHandler(&pre_child); grandchild_r->RemovePreTargetHandler(&pre_grandchild); + child_r->RemovePreTargetHandler(&pre_child); + root()->RemovePreTargetHandler(&pre_root); + + grandchild_r->set_recorder(nullptr); + child_r->set_recorder(nullptr); + root()->set_recorder(nullptr); } namespace {
diff --git a/ui/file_manager/file_manager/common/js/file_type.js b/ui/file_manager/file_manager/common/js/file_type.js index 3a9974ac..93aef85 100644 --- a/ui/file_manager/file_manager/common/js/file_type.js +++ b/ui/file_manager/file_manager/common/js/file_type.js
@@ -253,7 +253,7 @@ }; /** - * @param {Entry} entry Reference to the file. + * @param {Entry|FilesAppEntry} entry Reference to the file. * @param {string=} opt_mimeType Optional mime type for the file. * @return {boolean} Returns true if the file is encrypted with CSE. */
diff --git a/ui/file_manager/file_manager/containers/nudge_container.ts b/ui/file_manager/file_manager/containers/nudge_container.ts index aa9bec68..50d5480 100644 --- a/ui/file_manager/file_manager/containers/nudge_container.ts +++ b/ui/file_manager/file_manager/containers/nudge_container.ts
@@ -308,7 +308,7 @@ TRASH_NUDGE = 'trash-nudge', ONE_DRIVE_MOVED_FILE_NUDGE = 'one-drive-moved-file-nudge', DRIVE_MOVED_FILE_NUDGE = 'drive-moved-file-nudge', - + SEARCH_V2_EDUCATION_NUDGE = 'search-v2-education-nudge', } /** @@ -367,4 +367,11 @@ // Expire after 4 releases (expires when M120 hits Stable). expiryDate: new Date(2023, 12, 5), }, + [NudgeType['SEARCH_V2_EDUCATION_NUDGE']]: { + anchor: () => document.querySelector<HTMLSpanElement>('#search-wrapper'), + content: () => str('SEARCH_V2_EDUCATION_NUDGE'), + direction: NudgeDirection.BOTTOM_STARTWARD, + // Expire after 4 releases (expires when M120 hits Stable). + expiryDate: new Date(2023, 12, 5), + }, };
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js index df53d37..d64812bd 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -1697,6 +1697,9 @@ prefs.officeFileMovedOneDrive < prefs.officeFileMovedGoogleDrive) { this.ui_.nudgeContainer.showNudge(NudgeType['DRIVE_MOVED_FILE_NUDGE']); } + if (util.isSearchV2Enabled()) { + this.ui_.nudgeContainer.showNudge(NudgeType['SEARCH_V2_EDUCATION_NUDGE']); + } if (redraw) { this.directoryTree.redraw(false);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table.js b/ui/file_manager/file_manager/foreground/js/ui/file_table.js index 197ee86..d3e72ba9 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_table.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
@@ -1017,7 +1017,7 @@ // The cell name does not matter as the entire list item is needed. forEachCell('.table-row-cell > .date', function(item, entry, listItem) { filelist.updateListItemExternalProps( - listItem, + listItem, entry, this.metadataModel_.getCache( [entry], [
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js index be8e3dc..74615691 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js
@@ -369,7 +369,7 @@ 'contentMimeType', ])[0]; filelist.updateListItemExternalProps( - li, externalProps, util.isTeamDriveRoot(entry)); + li, entry, externalProps, util.isTeamDriveRoot(entry)); // Overriding the default role 'list' to 'listbox' for better // accessibility on ChromeOS. @@ -502,74 +502,79 @@ /** * Updates grid item or table row for the externalProps. * @param {ListItem} li List item. + * @param {Entry|FilesAppEntry} entry The entry. * @param {Object} externalProps Metadata. */ -filelist.updateListItemExternalProps = (li, externalProps, isTeamDriveRoot) => { - if (li.classList.contains('file')) { - li.classList.toggle( - 'dim-offline', externalProps.availableOffline === false); - li.classList.toggle('dim-hosted', !!externalProps.hosted); - if (externalProps.contentMimeType) { - li.classList.toggle( - 'dim-encrypted', - externalProps.contentMimeType.startsWith( - 'application/vnd.google-gsuite.encrypted')); - } - } - - li.classList.toggle('pinned', externalProps.pinned); - - const iconDiv = li.querySelector('.detail-icon'); - if (!iconDiv) { - return; - } - - if (externalProps.customIconUrl) { - iconDiv.style.backgroundImage = 'url(' + externalProps.customIconUrl + ')'; - } else { - iconDiv.style.backgroundImage = ''; // Back to the default image. - } - - if (li.classList.contains('directory')) { - iconDiv.classList.toggle('shared', !!externalProps.shared); - iconDiv.classList.toggle('team-drive-root', !!isTeamDriveRoot); - iconDiv.classList.toggle('computers-root', !!externalProps.isMachineRoot); - iconDiv.classList.toggle( - 'external-media-root', !!externalProps.isExternalMedia); - } - - const inlineStatus = li.querySelector('.inline-status'); - if (inlineStatus) { - // Clear the inline status' aria label and set it to "in progress", - // "queued", or "available offline" with the respective order of - // precedence if applicable. - inlineStatus.setAttribute( - 'aria-label', externalProps.pinned ? str('OFFLINE_COLUMN_LABEL') : ''); - - const {syncStatus} = externalProps; - let progress = externalProps.progress ?? 0; - if (util.isInlineSyncStatusEnabled() && syncStatus) { - switch (syncStatus) { - case chrome.fileManagerPrivate.SyncStatus.QUEUED: - case chrome.fileManagerPrivate.SyncStatus.ERROR: - progress = 0; - inlineStatus.setAttribute('aria-label', str('QUEUED_LABEL')); - break; - case chrome.fileManagerPrivate.SyncStatus.IN_PROGRESS: - inlineStatus.setAttribute( - 'aria-label', - `${str('IN_PROGRESS_LABEL')} - ${(progress * 100).toFixed(0)}%`); - break; - default: - break; +filelist.updateListItemExternalProps = + (li, entry, externalProps, isTeamDriveRoot) => { + if (li.classList.contains('file')) { + li.classList.toggle( + 'dim-offline', externalProps.availableOffline === false); + li.classList.toggle('dim-hosted', !!externalProps.hosted); + if (externalProps.contentMimeType) { + li.classList.toggle( + 'dim-encrypted', + FileType.isEncrypted(entry, externalProps.contentMimeType)); + } } - li.setAttribute('data-sync-status', syncStatus); - li.querySelector('.progress') - .setAttribute('progress', progress.toFixed(2)); - } - } -}; + li.classList.toggle('pinned', externalProps.pinned); + + const iconDiv = li.querySelector('.detail-icon'); + if (!iconDiv) { + return; + } + + if (externalProps.customIconUrl) { + iconDiv.style.backgroundImage = + 'url(' + externalProps.customIconUrl + ')'; + } else { + iconDiv.style.backgroundImage = ''; // Back to the default image. + } + + if (li.classList.contains('directory')) { + iconDiv.classList.toggle('shared', !!externalProps.shared); + iconDiv.classList.toggle('team-drive-root', !!isTeamDriveRoot); + iconDiv.classList.toggle( + 'computers-root', !!externalProps.isMachineRoot); + iconDiv.classList.toggle( + 'external-media-root', !!externalProps.isExternalMedia); + } + + const inlineStatus = li.querySelector('.inline-status'); + if (inlineStatus) { + // Clear the inline status' aria label and set it to "in progress", + // "queued", or "available offline" with the respective order of + // precedence if applicable. + inlineStatus.setAttribute( + 'aria-label', + externalProps.pinned ? str('OFFLINE_COLUMN_LABEL') : ''); + + const {syncStatus} = externalProps; + let progress = externalProps.progress ?? 0; + if (util.isInlineSyncStatusEnabled() && syncStatus) { + switch (syncStatus) { + case chrome.fileManagerPrivate.SyncStatus.QUEUED: + case chrome.fileManagerPrivate.SyncStatus.ERROR: + progress = 0; + inlineStatus.setAttribute('aria-label', str('QUEUED_LABEL')); + break; + case chrome.fileManagerPrivate.SyncStatus.IN_PROGRESS: + inlineStatus.setAttribute( + 'aria-label', + `${str('IN_PROGRESS_LABEL')} - ${ + (progress * 100).toFixed(0)}%`); + break; + default: + break; + } + + li.setAttribute('data-sync-status', syncStatus); + li.querySelector('.progress') + .setAttribute('progress', progress.toFixed(2)); + } + } + }; /** * Handles tap events on file list to change the selection state.
diff --git a/ui/file_manager/integration_tests/file_manager/search.js b/ui/file_manager/integration_tests/file_manager/search.js index 47926ef..bff5263 100644 --- a/ui/file_manager/integration_tests/file_manager/search.js +++ b/ui/file_manager/integration_tests/file_manager/search.js
@@ -577,3 +577,15 @@ await remoteCall.callRemoteTestUtil('getBreadcrumbPath', appId, []); chrome.test.assertEq(beforeSearchPath, afterSearchPath); }; + +/** + * Tests that the educational nudge is displayed when the files + * app is started with V2 version of search enabled. + */ +testcase.showsEducationNudge = async () => { + // Open the Files app. + const appId = await setupAndWaitUntilReady(RootPath.DRIVE); + + // Check that the nudge and its text is visible. + await remoteCall.waitNudge(appId, 'New search features available'); +};
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js index 2f609db5..967393d 100644 --- a/ui/file_manager/integration_tests/test_util.js +++ b/ui/file_manager/integration_tests/test_util.js
@@ -732,6 +732,7 @@ nameText: 'test-encrypted.txt', sizeText: '--', typeText: 'Plain text', + availableOffline: true, }), testDocument: new TestEntryInfo({
diff --git a/ui/gfx/image/image_skia_operations.cc b/ui/gfx/image/image_skia_operations.cc index 785649ef..04fa4fa2 100644 --- a/ui/gfx/image/image_skia_operations.cc +++ b/ui/gfx/image/image_skia_operations.cc
@@ -59,10 +59,7 @@ BinaryImageSource(const ImageSkia& first, const ImageSkia& second, const char* source_name) - : first_(first), - second_(second), - source_name_(source_name) { - } + : first_(first), second_(second), source_name_(source_name) {} BinaryImageSource(const BinaryImageSource&) = delete; BinaryImageSource& operator=(const BinaryImageSource&) = delete; @@ -82,7 +79,7 @@ DCHECK_NE(first_rep.scale(), second_rep.scale()); if (first_rep.scale() == second_rep.scale()) { LOG(ERROR) << "ImageSkiaRep size mismatch in " << source_name_; - return GetErrorImageRep(first_rep.scale(),first_rep.pixel_size()); + return GetErrorImageRep(first_rep.scale(), first_rep.pixel_size()); } first_rep = first_.GetRepresentation(1.0f); second_rep = second_.GetRepresentation(1.0f); @@ -118,8 +115,7 @@ const ImageSkia& second, double alpha) : BinaryImageSource(first, second, "BlendingImageSource"), - alpha_(alpha) { - } + alpha_(alpha) {} BlendingImageSource(const BlendingImageSource&) = delete; BlendingImageSource& operator=(const BlendingImageSource&) = delete; @@ -152,8 +148,7 @@ // gfx::CanvasImageSource override. void Draw(Canvas* canvas) override { canvas->DrawImageInt(first_, 0, 0); - canvas->DrawImageInt(second_, - (first_.width() - second_.width()) / 2, + canvas->DrawImageInt(second_, (first_.width() - second_.width()) / 2, (first_.height() - second_.height()) / 2); } @@ -165,9 +160,7 @@ class TransparentImageSource : public gfx::ImageSkiaSource { public: TransparentImageSource(const ImageSkia& image, double alpha) - : image_(image), - alpha_(alpha) { - } + : image_(image), alpha_(alpha) {} TransparentImageSource(const TransparentImageSource&) = delete; TransparentImageSource& operator=(const TransparentImageSource&) = delete; @@ -182,8 +175,7 @@ return image_rep; SkBitmap alpha; - alpha.allocN32Pixels(image_rep.pixel_width(), - image_rep.pixel_height()); + alpha.allocN32Pixels(image_rep.pixel_width(), image_rep.pixel_height()); alpha.eraseColor(SkColorSetA(SK_ColorBLACK, SK_AlphaOPAQUE * alpha_)); return ImageSkiaRep( SkBitmapOperations::CreateMaskedBitmap(image_rep.GetBitmap(), alpha), @@ -197,8 +189,7 @@ class MaskedImageSource : public BinaryImageSource { public: MaskedImageSource(const ImageSkia& rgb, const ImageSkia& alpha) - : BinaryImageSource(rgb, alpha, "MaskedImageSource") { - } + : BinaryImageSource(rgb, alpha, "MaskedImageSource") {} MaskedImageSource(const MaskedImageSource&) = delete; MaskedImageSource& operator=(const MaskedImageSource&) = delete; @@ -218,14 +209,15 @@ class TiledImageSource : public gfx::ImageSkiaSource { public: TiledImageSource(const ImageSkia& source, - int src_x, int src_y, - int dst_w, int dst_h) + int src_x, + int src_y, + int dst_w, + int dst_h) : source_(source), src_x_(src_x), src_y_(src_y), dst_w_(dst_w), - dst_h_(dst_h) { - } + dst_h_(dst_h) {} TiledImageSource(const TiledImageSource&) = delete; TiledImageSource& operator=(const TiledImageSource&) = delete; @@ -238,8 +230,8 @@ if (source_rep.is_null()) return source_rep; - gfx::Rect bounds = DIPToPixelBounds(gfx::Rect(src_x_, src_y_, dst_w_, - dst_h_), source_rep.scale()); + gfx::Rect bounds = DIPToPixelBounds( + gfx::Rect(src_x_, src_y_, dst_w_, dst_h_), source_rep.scale()); return ImageSkiaRep(SkBitmapOperations::CreateTiledBitmap( source_rep.GetBitmap(), bounds.x(), bounds.y(), bounds.width(), bounds.height()), @@ -256,11 +248,8 @@ class HSLImageSource : public gfx::ImageSkiaSource { public: - HSLImageSource(const ImageSkia& image, - const color_utils::HSL& hsl_shift) - : image_(image), - hsl_shift_(hsl_shift) { - } + HSLImageSource(const ImageSkia& image, const color_utils::HSL& hsl_shift) + : image_(image), hsl_shift_(hsl_shift) {} HSLImageSource(const HSLImageSource&) = delete; HSLImageSource& operator=(const HSLImageSource&) = delete; @@ -285,16 +274,13 @@ // ImageSkiaSource which uses SkBitmapOperations::CreateButtonBackground // to generate image reps for the target image. The image and mask can be -// diferent sizes (crbug.com/171725). -class ButtonImageSource: public gfx::ImageSkiaSource { +// different sizes (crbug.com/171725). +class ButtonImageSource : public gfx::ImageSkiaSource { public: ButtonImageSource(SkColor color, const ImageSkia& image, const ImageSkia& mask) - : color_(color), - image_(image), - mask_(mask) { - } + : color_(color), image_(image), mask_(mask) {} ButtonImageSource(const ButtonImageSource&) = delete; ButtonImageSource& operator=(const ButtonImageSource&) = delete; @@ -328,13 +314,11 @@ // ImageSkiaSource which uses SkBitmap::extractSubset to generate image reps // for the target image. -class ExtractSubsetImageSource: public gfx::ImageSkiaSource { +class ExtractSubsetImageSource : public gfx::ImageSkiaSource { public: ExtractSubsetImageSource(const gfx::ImageSkia& image, const gfx::Rect& subset_bounds) - : image_(image), - subset_bounds_(subset_bounds) { - } + : image_(image), subset_bounds_(subset_bounds) {} ExtractSubsetImageSource(const ExtractSubsetImageSource&) = delete; ExtractSubsetImageSource& operator=(const ExtractSubsetImageSource&) = delete; @@ -347,8 +331,8 @@ if (image_rep.is_null()) return image_rep; - SkIRect subset_bounds_in_pixel = RectToSkIRect( - DIPToPixelBounds(subset_bounds_, image_rep.scale())); + SkIRect subset_bounds_in_pixel = + RectToSkIRect(DIPToPixelBounds(subset_bounds_, image_rep.scale())); SkBitmap dst; bool success = image_rep.GetBitmap().extractSubset(&dst, subset_bounds_in_pixel); @@ -370,8 +354,7 @@ const Size& target_dip_size) : source_(source), resize_method_(method), - target_dip_size_(target_dip_size) { - } + target_dip_size_(target_dip_size) {} ResizeSource(const ResizeSource&) = delete; ResizeSource& operator=(const ResizeSource&) = delete; @@ -477,9 +460,7 @@ public: RotatedSource(const ImageSkia& source, SkBitmapOperations::RotationAmount rotation) - : source_(source), - rotation_(rotation) { - } + : source_(source), rotation_(rotation) {} RotatedSource(const RotatedSource&) = delete; RotatedSource& operator=(const RotatedSource&) = delete; @@ -658,8 +639,10 @@ // static ImageSkia ImageSkiaOperations::CreateTiledImage(const ImageSkia& source, - int src_x, int src_y, - int dst_w, int dst_h) { + int src_x, + int src_y, + int dst_w, + int dst_h) { if (source.isNull()) return ImageSkia(); @@ -729,8 +712,7 @@ const gfx::Insets shadow_padding = -gfx::ShadowValue::GetMargin(shadows); gfx::Size shadow_image_size = source.size(); - shadow_image_size.Enlarge(shadow_padding.width(), - shadow_padding.height()); + shadow_image_size.Enlarge(shadow_padding.width(), shadow_padding.height()); return ImageSkia(std::make_unique<DropShadowSource>(source, shadows), shadow_image_size); } @@ -745,8 +727,8 @@ // static ImageSkia ImageSkiaOperations::CreateRotatedImage( - const ImageSkia& source, - SkBitmapOperations::RotationAmount rotation) { + const ImageSkia& source, + SkBitmapOperations::RotationAmount rotation) { if (source.isNull()) return ImageSkia();
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index 3816ec1..f9dd9c2 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc
@@ -543,8 +543,9 @@ } void ResetRenderTextInstance() { - render_text_ = std::make_unique<RenderTextHarfBuzz>(); - test_api_ = std::make_unique<test::RenderTextTestApi>(GetRenderText()); + auto new_text = std::make_unique<RenderTextHarfBuzz>(); + test_api_ = std::make_unique<test::RenderTextTestApi>(new_text.get()); + render_text_ = std::move(new_text); } void ResetCursorX() { test_api()->reset_cached_cursor_x(); }
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index 2a07859..2578b5f 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -224,13 +224,6 @@ ] } - if (is_linux || is_chromeos || use_ozone) { - sources += [ - "native_pixmap_egl_binding_helper.cc", - "native_pixmap_egl_binding_helper.h", - ] - } - if (is_linux || is_chromeos) { sources += [ "gl_image_gl_texture.cc",
diff --git a/ui/gl/gl_display.cc b/ui/gl/gl_display.cc index 0408567..c7ee183 100644 --- a/ui/gl/gl_display.cc +++ b/ui/gl/gl_display.cc
@@ -120,6 +120,7 @@ #define EGL_ANGLE_platform_angle_device_id #define EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE 0x34D6 #define EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE 0x34D7 +#define EGL_PLATFORM_ANGLE_DISPLAY_KEY_ANGLE 0x34DC #endif /* EGL_ANGLE_platform_angle_device_id */ // From ANGLE's egl/eglext.h. @@ -251,7 +252,8 @@ 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) { + 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); @@ -267,6 +269,10 @@ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE); extra_display_attribs.push_back(high_part); } + if (display_key != DisplayKey::kDefault) { + extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DISPLAY_KEY_ANGLE); + extra_display_attribs.push_back(static_cast<EGLint>(display_key)); + } EGLNativeDisplayType display = native_display.GetDisplay(); switch (display_type) { case DEFAULT: @@ -503,8 +509,12 @@ } // namespace -GLDisplay::GLDisplay(uint64_t system_device_id, DisplayPlatform type) - : system_device_id_(system_device_id), type_(type) {} +GLDisplay::GLDisplay(uint64_t system_device_id, + DisplayKey display_key, + DisplayPlatform type) + : system_device_id_(system_device_id), + display_key_(display_key), + type_(type) {} GLDisplay::~GLDisplay() = default; @@ -545,8 +555,8 @@ eglHandleGPUSwitchANGLE(display_); } -GLDisplayEGL::GLDisplayEGL(uint64_t system_device_id) - : GLDisplay(system_device_id, EGL), display_(EGL_NO_DISPLAY) { +GLDisplayEGL::GLDisplayEGL(uint64_t system_device_id, DisplayKey display_key) + : GLDisplay(system_device_id, display_key, EGL), display_(EGL_NO_DISPLAY) { ext = std::make_unique<DisplayExtensionsEGL>(); } @@ -638,6 +648,62 @@ return true; } +bool GLDisplayEGL::InitializeFromDisplay(GLDisplay* other_display) { + GLDisplayEGL* other_display_egl = other_display->GetAs<GLDisplayEGL>(); + if (!other_display_egl->IsInitialized()) { + return false; + } + + if (display_key_ == other_display->display_key()) { + return true; + } + + if (display_ != EGL_NO_DISPLAY) { + return true; + } + + if (other_display_egl->system_device_id() != system_device_id_) { + return false; + } + + type_ = other_display_egl->type(); + display_type_ = other_display_egl->GetDisplayType(); + native_display_ = other_display_egl->GetNativeDisplay(); + ext = std::make_unique<DisplayExtensionsEGL>(*other_display_egl->ext.get()); + + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + std::vector<std::string> enabled_angle_features = + GetStringVectorFromCommandLine(command_line, + switches::kEnableANGLEFeatures); + std::vector<std::string> disabled_angle_features = + GetStringVectorFromCommandLine(command_line, + switches::kDisableANGLEFeatures); + bool disable_all_angle_features = + command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds); + + EGLDisplay display = + GetDisplayFromType(display_type_, native_display_, enabled_angle_features, + disabled_angle_features, disable_all_angle_features, + system_device_id_, display_key_); + + if (!eglInitialize(display, nullptr, nullptr)) { + LOG(ERROR) << "Failed to initialize new display from existing display."; + return false; + } + + display_ = display; + + InitializeCommon(); + + if (ext->b_EGL_ANGLE_power_preference) { + gpu_switching_observer_ = + std::make_unique<EGLGpuSwitchingObserver>(display_); + ui::GpuSwitchingManager::GetInstance()->AddObserver( + gpu_switching_observer_.get()); + } + return true; +} + void GLDisplayEGL::InitializeForTesting() { display_ = eglGetCurrentDisplay(); ext->InitializeExtensionSettings(display_); @@ -693,9 +759,10 @@ 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_); + EGLDisplay display = + GetDisplayFromType(display_type, native_display, enabled_angle_features, + disabled_angle_features, disable_all_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/gl/gl_display.h b/ui/gl/gl_display.h index f00fd2c..b27102b 100644 --- a/ui/gl/gl_display.h +++ b/ui/gl/gl_display.h
@@ -82,20 +82,26 @@ GLDisplay& operator=(const GLDisplay&) = delete; uint64_t system_device_id() const { return system_device_id_; } + DisplayKey display_key() const { return display_key_; } + DisplayPlatform type() const { return type_; } virtual ~GLDisplay(); virtual void* GetDisplay() const = 0; virtual void Shutdown() = 0; virtual bool IsInitialized() const = 0; + virtual bool InitializeFromDisplay(GLDisplay* display) = 0; template <typename GLDisplayPlatform> GLDisplayPlatform* GetAs(); protected: - GLDisplay(uint64_t system_device_id, DisplayPlatform type); + GLDisplay(uint64_t system_device_id, + DisplayKey display_key, + DisplayPlatform type); uint64_t system_device_id_ = 0; + DisplayKey display_key_ = DisplayKey::kDefault; DisplayPlatform type_ = NONE; }; @@ -125,6 +131,7 @@ bool Initialize(bool supports_angle, std::vector<DisplayType> init_displays, EGLDisplayPlatform native_display); + bool InitializeFromDisplay(GLDisplay* other_display) override; void InitializeForTesting(); bool InitializeExtensionSettings(); @@ -158,7 +165,7 @@ EGLDisplay display_ = EGL_NO_DISPLAY; }; - explicit GLDisplayEGL(uint64_t system_device_id); + GLDisplayEGL(uint64_t system_device_id, DisplayKey display_key); bool InitializeDisplay(bool supports_angle, std::vector<DisplayType> init_displays,
diff --git a/ui/gl/gl_display_manager.h b/ui/gl/gl_display_manager.h index cd38dc3..08ff9dd5 100644 --- a/ui/gl/gl_display_manager.h +++ b/ui/gl/gl_display_manager.h
@@ -21,6 +21,21 @@ namespace gl { +struct DisplayMapEntry { + DisplayMapEntry() = default; + + explicit DisplayMapEntry(uint64_t system_device_id) + : system_device_id_(system_device_id) {} + + DisplayMapEntry(uint64_t system_device_id, gl::DisplayKey display_key) + : system_device_id_(system_device_id), display_key_(display_key) {} + + auto tie() const { return std::tie(system_device_id_, display_key_); } + + uint64_t system_device_id_ = 0; + gl::DisplayKey display_key_ = gl::DisplayKey::kDefault; +}; + template <typename GLDisplayPlatform> class GLDisplayManager { public: @@ -51,17 +66,21 @@ for (auto iter = gpu_preference_map_.begin(); iter != gpu_preference_map_.end(); /* no increment */) { - if (iter->second == system_device_id) { - gpu_preference_map_.erase(iter++); + if (iter->second == system_device_id && gpu_preference_map_.size() > 1) { + iter = gpu_preference_map_.erase(iter); } else { iter++; } } - auto iter = gpu_preference_map_.find(GpuPreference::kDefault); - if (iter == gpu_preference_map_.end()) { - gpu_preference_map_[GpuPreference::kDefault] = - gpu_preference_map_.begin()->second; + // Ensure that kDefault is always set if there is at least one other gpu + // preference. + if (!gpu_preference_map_.empty()) { + auto iter = gpu_preference_map_.find(GpuPreference::kDefault); + if (iter == gpu_preference_map_.end()) { + gpu_preference_map_[GpuPreference::kDefault] = + gpu_preference_map_.begin()->second; + } } base::AutoLock auto_lock(lock_); @@ -93,10 +112,6 @@ GLDisplayManager(const GLDisplayManager&) = delete; GLDisplayManager& operator=(const GLDisplayManager&) = delete; - GLDisplayPlatform* GetDisplay(GpuPreference preference) { - return GetDisplay(GetSystemDeviceId(preference)); - } - bool IsEmpty() { base::AutoLock auto_lock(lock_); return displays_.empty(); @@ -106,6 +121,20 @@ override_egl_dual_gpu_rendering_support_for_tests_ = value; } + bool SupportsEGLDualGPURendering() { + return features::SupportsEGLDualGPURendering() || + override_egl_dual_gpu_rendering_support_for_tests_; + } + + GLDisplayPlatform* GetDisplay(GpuPreference preference, + gl::DisplayKey display_key) { + return GetDisplay(GetSystemDeviceId(preference), display_key); + } + + GLDisplayPlatform* GetDisplay(GpuPreference preference) { + return GetDisplay(GetSystemDeviceId(preference), gl::DisplayKey::kDefault); + } + private: friend class base::NoDestructor<GLDisplayManager<GLDisplayPlatform>>; #if defined(USE_EGL) @@ -117,25 +146,22 @@ GLDisplayManager() = default; virtual ~GLDisplayManager() = default; - GLDisplayPlatform* GetDisplay(uint64_t system_device_id) { + GLDisplayPlatform* GetDisplay(uint64_t system_device_id, + gl::DisplayKey display_key) { base::AutoLock auto_lock(lock_); for (const auto& display : displays_) { - if (display->system_device_id() == system_device_id) { + if (display->system_device_id() == system_device_id && + display->display_key() == display_key) { return display.get(); } } std::unique_ptr<GLDisplayPlatform> display( - new GLDisplayPlatform(system_device_id)); + new GLDisplayPlatform(system_device_id, display_key)); displays_.push_back(std::move(display)); return displays_.back().get(); } - bool SupportsEGLDualGPURendering() { - return features::SupportsEGLDualGPURendering() || - override_egl_dual_gpu_rendering_support_for_tests_; - } - mutable base::Lock lock_; std::vector<std::unique_ptr<GLDisplayPlatform>> displays_ GUARDED_BY(lock_);
diff --git a/ui/gl/gl_implementation.cc b/ui/gl/gl_implementation.cc index c45ea6e..bc85515e 100644 --- a/ui/gl/gl_implementation.cc +++ b/ui/gl/gl_implementation.cc
@@ -64,69 +64,61 @@ std::string GLImplementationParts::ToString() const { std::stringstream s; s << "(gl="; - switch (gl) { - case GLImplementation::kGLImplementationNone: - s << "none"; - break; - case GLImplementation::kGLImplementationDesktopGL: - s << "desktop-gl"; - break; - case GLImplementation::kGLImplementationDesktopGLCoreProfile: - s << "desktop-gl-core-profile"; - break; - case GLImplementation::kGLImplementationEGLGLES2: - s << "egl-gles2"; - break; - case GLImplementation::kGLImplementationMockGL: - s << "mock-gl"; - break; - case GLImplementation::kGLImplementationStubGL: - s << "stub-gl"; - break; - case GLImplementation::kGLImplementationDisabled: - s << "disabled"; - break; - case GLImplementation::kGLImplementationEGLANGLE: - s << "egl-angle"; - break; - } + s << GLString(); s << ",angle="; - switch (angle) { - case ANGLEImplementation::kNone: - s << "none"; - break; - case ANGLEImplementation::kD3D9: - s << "d3d9"; - break; - case ANGLEImplementation::kD3D11: - s << "d3d11"; - break; - case ANGLEImplementation::kOpenGL: - s << "opengl"; - break; - case ANGLEImplementation::kOpenGLES: - s << "opengles"; - break; - case ANGLEImplementation::kNull: - s << "null"; - break; - case ANGLEImplementation::kVulkan: - s << "vulkan"; - break; - case ANGLEImplementation::kSwiftShader: - s << "swiftshader"; - break; - case ANGLEImplementation::kMetal: - s << "metal"; - break; - case ANGLEImplementation::kDefault: - s << "default"; - break; - } + s << ANGLEString(); s << ")"; return s.str(); } +std::string GLImplementationParts::GLString() const { + switch (gl) { + case GLImplementation::kGLImplementationNone: + return "none"; + case GLImplementation::kGLImplementationDesktopGL: + return "desktop-gl"; + case GLImplementation::kGLImplementationDesktopGLCoreProfile: + return "desktop-gl-core-profile"; + case GLImplementation::kGLImplementationEGLGLES2: + return "egl-gles2"; + case GLImplementation::kGLImplementationMockGL: + return "mock-gl"; + case GLImplementation::kGLImplementationStubGL: + return "stub-gl"; + case GLImplementation::kGLImplementationDisabled: + return "disabled"; + case GLImplementation::kGLImplementationEGLANGLE: + return "egl-angle"; + } + return ""; +} + +std::string GLImplementationParts::ANGLEString() const { + switch (angle) { + case ANGLEImplementation::kNone: + return "none"; + case ANGLEImplementation::kD3D9: + return "d3d9"; + case ANGLEImplementation::kD3D11: + return "d3d11"; + case ANGLEImplementation::kOpenGL: + return "opengl"; + case ANGLEImplementation::kOpenGLES: + return "opengles"; + case ANGLEImplementation::kNull: + return "null"; + case ANGLEImplementation::kVulkan: + return "vulkan"; + case ANGLEImplementation::kSwiftShader: + return "swiftshader"; + case ANGLEImplementation::kMetal: + return "metal"; + case ANGLEImplementation::kDefault: + return "default"; + } + return ""; +} + namespace { const struct {
diff --git a/ui/gl/gl_implementation.h b/ui/gl/gl_implementation.h index f0cf1ced..03c7218 100644 --- a/ui/gl/gl_implementation.h +++ b/ui/gl/gl_implementation.h
@@ -87,6 +87,8 @@ bool IsValid() const; bool IsAllowed(const std::vector<GLImplementationParts>& allowed_impls) const; std::string ToString() const; + std::string GLString() const; + std::string ANGLEString() const; private: static constexpr ANGLEImplementation MakeANGLEImplementation(
diff --git a/ui/gl/gl_utils.cc b/ui/gl/gl_utils.cc index e03cf24c..22a5f10 100644 --- a/ui/gl/gl_utils.cc +++ b/ui/gl/gl_utils.cc
@@ -176,13 +176,20 @@ #endif // BUILDFLAG(IS_WIN) GLDisplay* GetDisplay(GpuPreference gpu_preference) { + return GetDisplay(gpu_preference, gl::DisplayKey::kDefault); +} + +GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference, + gl::DisplayKey display_key) { #if defined(USE_GLX) if (!GLDisplayManagerX11::GetInstance()->IsEmpty()) { - return GLDisplayManagerX11::GetInstance()->GetDisplay(gpu_preference); + return GLDisplayManagerX11::GetInstance()->GetDisplay(gpu_preference, + display_key); } #endif #if defined(USE_EGL) - return GLDisplayManagerEGL::GetInstance()->GetDisplay(gpu_preference); + return GLDisplayManagerEGL::GetInstance()->GetDisplay(gpu_preference, + display_key); #endif NOTREACHED(); return nullptr;
diff --git a/ui/gl/gl_utils.h b/ui/gl/gl_utils.h index 6e656c6..c5aa7a3 100644 --- a/ui/gl/gl_utils.h +++ b/ui/gl/gl_utils.h
@@ -82,6 +82,11 @@ // GLDisplayX11. GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference); +// Query the GLDisplay by |gpu_preference| and |display_key|. May return either +// a GLDisplayEGL or GLDisplayX11. +GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference, + gl::DisplayKey display_key); + // Query the default GLDisplayEGL. GL_EXPORT GLDisplayEGL* GetDefaultDisplayEGL();
diff --git a/ui/gl/gpu_preference.h b/ui/gl/gpu_preference.h index e888e0c..bc78903 100644 --- a/ui/gl/gpu_preference.h +++ b/ui/gl/gpu_preference.h
@@ -22,6 +22,14 @@ kMaxValue = kHighPerformance }; +// Some clients may need to use the same GPU with a separate EGL display. +// This enum is used to key individual EGL displays per-GPU. +enum class DisplayKey { + kDefault, + kSeparateEGLDisplayForWebGLTesting, + kMaxValue = kSeparateEGLDisplayForWebGLTesting, +}; + } // namespace gl #endif // UI_GL_GPU_PREFERENCE_H_
diff --git a/ui/gl/native_pixmap_egl_binding_helper.cc b/ui/gl/native_pixmap_egl_binding_helper.cc deleted file mode 100644 index d3f9ed2d..0000000 --- a/ui/gl/native_pixmap_egl_binding_helper.cc +++ /dev/null
@@ -1,247 +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 "ui/gl/native_pixmap_egl_binding_helper.h" - -#include <vector> - -#include "ui/gfx/buffer_format_util.h" -#include "ui/gl/buffer_format_utils.h" -#include "ui/gl/gl_bindings.h" -#include "ui/gl/gl_surface_egl.h" -#include "ui/gl/scoped_binders.h" - -#define FOURCC(a, b, c, d) \ - ((static_cast<uint32_t>(a)) | (static_cast<uint32_t>(b) << 8) | \ - (static_cast<uint32_t>(c) << 16) | (static_cast<uint32_t>(d) << 24)) - -#define DRM_FORMAT_R8 FOURCC('R', '8', ' ', ' ') -#define DRM_FORMAT_R16 FOURCC('R', '1', '6', ' ') -#define DRM_FORMAT_GR88 FOURCC('G', 'R', '8', '8') -#define DRM_FORMAT_GR1616 FOURCC('G', 'R', '3', '2') -#define DRM_FORMAT_RGB565 FOURCC('R', 'G', '1', '6') -#define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4') -#define DRM_FORMAT_ABGR8888 FOURCC('A', 'B', '2', '4') -#define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4') -#define DRM_FORMAT_XBGR8888 FOURCC('X', 'B', '2', '4') -#define DRM_FORMAT_ABGR2101010 FOURCC('A', 'B', '3', '0') -#define DRM_FORMAT_ARGB2101010 FOURCC('A', 'R', '3', '0') -#define DRM_FORMAT_YVU420 FOURCC('Y', 'V', '1', '2') -#define DRM_FORMAT_NV12 FOURCC('N', 'V', '1', '2') -#define DRM_FORMAT_P010 FOURCC('P', '0', '1', '0') - -namespace gl { -namespace { - -// Returns corresponding internalformat if supported, and GL_NONE otherwise. -unsigned GLInternalFormat(gfx::BufferFormat format) { - switch (format) { - case gfx::BufferFormat::RGBA_4444: - case gfx::BufferFormat::RGBA_F16: - case gfx::BufferFormat::P010: - return GL_RGB_YCBCR_P010_CHROMIUM; - default: - break; - } - return gl::BufferFormatToGLInternalFormat(format); -} - -EGLint FourCC(gfx::BufferFormat format) { - switch (format) { - case gfx::BufferFormat::R_8: - return DRM_FORMAT_R8; - case gfx::BufferFormat::R_16: - return DRM_FORMAT_R16; - case gfx::BufferFormat::RG_88: - return DRM_FORMAT_GR88; - case gfx::BufferFormat::RG_1616: - return DRM_FORMAT_GR1616; - case gfx::BufferFormat::BGR_565: - return DRM_FORMAT_RGB565; - case gfx::BufferFormat::RGBA_8888: - return DRM_FORMAT_ABGR8888; - case gfx::BufferFormat::RGBX_8888: - return DRM_FORMAT_XBGR8888; - case gfx::BufferFormat::BGRA_8888: - return DRM_FORMAT_ARGB8888; - case gfx::BufferFormat::BGRX_8888: - return DRM_FORMAT_XRGB8888; - case gfx::BufferFormat::RGBA_1010102: - return DRM_FORMAT_ABGR2101010; - case gfx::BufferFormat::BGRA_1010102: - return DRM_FORMAT_ARGB2101010; - case gfx::BufferFormat::YVU_420: - return DRM_FORMAT_YVU420; - case gfx::BufferFormat::YUV_420_BIPLANAR: - return DRM_FORMAT_NV12; - case gfx::BufferFormat::P010: - return DRM_FORMAT_P010; - case gfx::BufferFormat::RGBA_4444: - case gfx::BufferFormat::RGBA_F16: - case gfx::BufferFormat::YUVA_420_TRIPLANAR: - return 0; - } - - NOTREACHED(); - return 0; -} - -} // namespace - -std::unique_ptr<NativePixmapEGLBindingHelper> -NativePixmapEGLBindingHelper::CreateForPlane( - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane, - scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id) { - DCHECK_GT(texture_id, 0u); - - auto binding = - std::make_unique<NativePixmapEGLBindingHelper>(size, format, plane); - - if (!binding->InitializeFromNativePixmap(std::move(pixmap), color_space, - target, texture_id)) { - return nullptr; - } - return binding; -} - -NativePixmapEGLBindingHelper::NativePixmapEGLBindingHelper( - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane) - : size_(size), format_(format), plane_(plane) {} - -NativePixmapEGLBindingHelper::~NativePixmapEGLBindingHelper() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); -} - -bool NativePixmapEGLBindingHelper::InitializeFromNativePixmap( - scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id) { - DCHECK(!pixmap_); - if (GLInternalFormat(format_) == GL_NONE) { - LOG(ERROR) << "Unsupported format: " << gfx::BufferFormatToString(format_); - return false; - } - - if (!pixmap->AreDmaBufFdsValid()) { - LOG(ERROR) << "Pixmap doesn't have valid dma bufs"; - return false; - } - - // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT - // target, the EGL will take a reference to the dma_buf. - std::vector<EGLint> attrs; - attrs.push_back(EGL_WIDTH); - attrs.push_back(size_.width()); - attrs.push_back(EGL_HEIGHT); - attrs.push_back(size_.height()); - attrs.push_back(EGL_LINUX_DRM_FOURCC_EXT); - attrs.push_back(FourCC(format_)); - - if (format_ == gfx::BufferFormat::YUV_420_BIPLANAR || - format_ == gfx::BufferFormat::YVU_420) { - // TODO(b/233667677): Since https://crrev.com/c/3855381, the only NV12 - // quads that we allow to be promoted to overlays are those that don't use - // the BT.2020 primaries and that don't use full range. Furthermore, since - // https://crrev.com/c/2336347, we force the DRM/KMS driver to use BT.601 - // with limited range. Therefore, for compositing purposes, we need to a) - // use EGL_ITU_REC601_EXT for any video frames that might be promoted to - // overlays - we shouldn't use EGL_ITU_REC709_EXT because we might then - // see a slight difference in compositing vs. overlays (note that the - // BT.601 and BT.709 primaries are close to each other, so this shouldn't - // be a huge correctness issue, though we'll need to address this at some - // point); b) use EGL_ITU_REC2020_EXT for BT.2020 frames in order to - // composite them correctly (and we won't need to worry about a difference - // in compositing vs. overlays in this case since those frames won't be - // promoted to overlays). We'll need to revisit this once we plumb the - // color space and range to DRM/KMS. - attrs.push_back(EGL_YUV_COLOR_SPACE_HINT_EXT); - switch (color_space.GetMatrixID()) { - case gfx::ColorSpace::MatrixID::BT2020_NCL: - attrs.push_back(EGL_ITU_REC2020_EXT); - break; - default: - attrs.push_back(EGL_ITU_REC601_EXT); - } - - attrs.push_back(EGL_SAMPLE_RANGE_HINT_EXT); - switch (color_space.GetRangeID()) { - case gfx::ColorSpace::RangeID::FULL: - attrs.push_back(EGL_YUV_FULL_RANGE_EXT); - break; - default: - attrs.push_back(EGL_YUV_NARROW_RANGE_EXT); - } - } - - if (plane_ == gfx::BufferPlane::DEFAULT) { - const EGLint kLinuxDrmModifiers[] = {EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, - EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, - EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT}; - bool has_dma_buf_import_modifier = - gl::GLSurfaceEGL::GetGLDisplayEGL() - ->ext->b_EGL_EXT_image_dma_buf_import_modifiers; - - for (size_t attrs_plane = 0; attrs_plane < pixmap->GetNumberOfPlanes(); - ++attrs_plane) { - attrs.push_back(EGL_DMA_BUF_PLANE0_FD_EXT + attrs_plane * 3); - - size_t pixmap_plane = attrs_plane; - - attrs.push_back(pixmap->GetDmaBufFd(pixmap_plane)); - attrs.push_back(EGL_DMA_BUF_PLANE0_OFFSET_EXT + attrs_plane * 3); - attrs.push_back(pixmap->GetDmaBufOffset(pixmap_plane)); - attrs.push_back(EGL_DMA_BUF_PLANE0_PITCH_EXT + attrs_plane * 3); - attrs.push_back(pixmap->GetDmaBufPitch(pixmap_plane)); - uint64_t modifier = pixmap->GetBufferFormatModifier(); - if (has_dma_buf_import_modifier && - modifier != gfx::NativePixmapHandle::kNoModifier) { - DCHECK(attrs_plane < std::size(kLinuxDrmModifiers)); - attrs.push_back(kLinuxDrmModifiers[attrs_plane]); - attrs.push_back(modifier & 0xffffffff); - attrs.push_back(kLinuxDrmModifiers[attrs_plane] + 1); - attrs.push_back(static_cast<uint32_t>(modifier >> 32)); - } - } - attrs.push_back(EGL_NONE); - } else { - DCHECK(plane_ == gfx::BufferPlane::Y || plane_ == gfx::BufferPlane::UV); - size_t pixmap_plane = plane_ == gfx::BufferPlane::Y ? 0 : 1; - - attrs.push_back(EGL_DMA_BUF_PLANE0_FD_EXT); - attrs.push_back(pixmap->GetDmaBufFd(pixmap_plane)); - attrs.push_back(EGL_DMA_BUF_PLANE0_OFFSET_EXT); - attrs.push_back(pixmap->GetDmaBufOffset(pixmap_plane)); - attrs.push_back(EGL_DMA_BUF_PLANE0_PITCH_EXT); - attrs.push_back(pixmap->GetDmaBufPitch(pixmap_plane)); - attrs.push_back(EGL_NONE); - } - - egl_image_ = - MakeScopedEGLImage(EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, - static_cast<EGLClientBuffer>(nullptr), &attrs[0]); - if (!egl_image_.get()) { - return false; - } - - pixmap_ = pixmap; - - gl::ScopedTextureBinder binder(target, texture_id); - glEGLImageTargetTexture2DOES(target, egl_image_.get()); - - return true; -} - -unsigned NativePixmapEGLBindingHelper::GetInternalFormat() { - return GLInternalFormat(format_); -} - -} // namespace gl
diff --git a/ui/gl/native_pixmap_egl_binding_helper.h b/ui/gl/native_pixmap_egl_binding_helper.h deleted file mode 100644 index c588f3a..0000000 --- a/ui/gl/native_pixmap_egl_binding_helper.h +++ /dev/null
@@ -1,65 +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 UI_GL_NATIVE_PIXMAP_EGL_BINDING_HELPER_H_ -#define UI_GL_NATIVE_PIXMAP_EGL_BINDING_HELPER_H_ - -#include <stdint.h> - -#include "base/threading/thread_checker.h" -#include "ui/gfx/color_space.h" -#include "ui/gfx/native_pixmap.h" -#include "ui/gl/gl_export.h" -#include "ui/gl/scoped_egl_image.h" - -typedef unsigned int GLuint; -typedef unsigned int GLenum; - -namespace gl { - -class GL_EXPORT NativePixmapEGLBindingHelper { - public: - // Create an EGLImage from a given NativePixmap and plane and bind - // |texture_id| to |target| followed by binding the image to |target|. The - // color space is for the external sampler: When we sample the YUV buffer as - // RGB, we need to tell it the encoding (BT.601, BT.709, or BT.2020) and range - // (limited or null), and |color_space| conveys this. - static std::unique_ptr<NativePixmapEGLBindingHelper> CreateForPlane( - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane, - scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id); - - NativePixmapEGLBindingHelper(const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferPlane plane); - ~NativePixmapEGLBindingHelper(); - - // Get the GL internal format of the image. - // It is aligned with glTexImage{2|3}D's parameter |internalformat|. - unsigned GetInternalFormat(); - - private: - // Create an EGLImage from a given NativePixmap and bind |texture_id| to - // |target| followed by binding the image to |target|. This EGLImage can be - // converted to a GL texture. - bool InitializeFromNativePixmap(scoped_refptr<gfx::NativePixmap> pixmap, - const gfx::ColorSpace& color_space, - GLenum target, - GLuint texture_id); - - ScopedEGLImage egl_image_; - const gfx::Size size_; - THREAD_CHECKER(thread_checker_); - gfx::BufferFormat format_; - scoped_refptr<gfx::NativePixmap> pixmap_; - gfx::BufferPlane plane_; -}; - -} // namespace gl - -#endif // UI_GL_NATIVE_PIXMAP_EGL_BINDING_HELPER_H_
diff --git a/ui/ozone/common/native_pixmap_egl_binding.cc b/ui/ozone/common/native_pixmap_egl_binding.cc index 2e18e73..946dbc2 100644 --- a/ui/ozone/common/native_pixmap_egl_binding.cc +++ b/ui/ozone/common/native_pixmap_egl_binding.cc
@@ -7,13 +7,88 @@ #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/notreached.h" +#include "ui/gfx/buffer_format_util.h" +#include "ui/gl/buffer_format_utils.h" #include "ui/gl/gl_bindings.h" -#include "ui/gl/native_pixmap_egl_binding_helper.h" +#include "ui/gl/gl_surface_egl.h" +#include "ui/gl/scoped_binders.h" namespace ui { namespace { +#define FOURCC(a, b, c, d) \ + ((static_cast<uint32_t>(a)) | (static_cast<uint32_t>(b) << 8) | \ + (static_cast<uint32_t>(c) << 16) | (static_cast<uint32_t>(d) << 24)) + +#define DRM_FORMAT_R8 FOURCC('R', '8', ' ', ' ') +#define DRM_FORMAT_R16 FOURCC('R', '1', '6', ' ') +#define DRM_FORMAT_GR88 FOURCC('G', 'R', '8', '8') +#define DRM_FORMAT_GR1616 FOURCC('G', 'R', '3', '2') +#define DRM_FORMAT_RGB565 FOURCC('R', 'G', '1', '6') +#define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4') +#define DRM_FORMAT_ABGR8888 FOURCC('A', 'B', '2', '4') +#define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4') +#define DRM_FORMAT_XBGR8888 FOURCC('X', 'B', '2', '4') +#define DRM_FORMAT_ABGR2101010 FOURCC('A', 'B', '3', '0') +#define DRM_FORMAT_ARGB2101010 FOURCC('A', 'R', '3', '0') +#define DRM_FORMAT_YVU420 FOURCC('Y', 'V', '1', '2') +#define DRM_FORMAT_NV12 FOURCC('N', 'V', '1', '2') +#define DRM_FORMAT_P010 FOURCC('P', '0', '1', '0') + +// Returns corresponding internalformat if supported, and GL_NONE otherwise. +unsigned GLInternalFormat(gfx::BufferFormat format) { + switch (format) { + case gfx::BufferFormat::RGBA_4444: + case gfx::BufferFormat::RGBA_F16: + case gfx::BufferFormat::P010: + return GL_RGB_YCBCR_P010_CHROMIUM; + default: + break; + } + return gl::BufferFormatToGLInternalFormat(format); +} + +EGLint FourCC(gfx::BufferFormat format) { + switch (format) { + case gfx::BufferFormat::R_8: + return DRM_FORMAT_R8; + case gfx::BufferFormat::R_16: + return DRM_FORMAT_R16; + case gfx::BufferFormat::RG_88: + return DRM_FORMAT_GR88; + case gfx::BufferFormat::RG_1616: + return DRM_FORMAT_GR1616; + case gfx::BufferFormat::BGR_565: + return DRM_FORMAT_RGB565; + case gfx::BufferFormat::RGBA_8888: + return DRM_FORMAT_ABGR8888; + case gfx::BufferFormat::RGBX_8888: + return DRM_FORMAT_XBGR8888; + case gfx::BufferFormat::BGRA_8888: + return DRM_FORMAT_ARGB8888; + case gfx::BufferFormat::BGRX_8888: + return DRM_FORMAT_XRGB8888; + case gfx::BufferFormat::RGBA_1010102: + return DRM_FORMAT_ABGR2101010; + case gfx::BufferFormat::BGRA_1010102: + return DRM_FORMAT_ARGB2101010; + case gfx::BufferFormat::YVU_420: + return DRM_FORMAT_YVU420; + case gfx::BufferFormat::YUV_420_BIPLANAR: + return DRM_FORMAT_NV12; + case gfx::BufferFormat::P010: + return DRM_FORMAT_P010; + case gfx::BufferFormat::RGBA_4444: + case gfx::BufferFormat::RGBA_F16: + case gfx::BufferFormat::YUVA_420_TRIPLANAR: + return 0; + } + + NOTREACHED(); + return 0; +} + // Map buffer format to GL type. Return GL_NONE if no sensible mapping. unsigned BufferFormatToGLDataType(gfx::BufferFormat format) { switch (format) { @@ -49,11 +124,14 @@ } // namespace -NativePixmapEGLBinding::NativePixmapEGLBinding( - std::unique_ptr<gl::NativePixmapEGLBindingHelper> binding_helper, - gfx::BufferFormat format) - : binding_helper_(std::move(binding_helper)), format_(format) {} -NativePixmapEGLBinding::~NativePixmapEGLBinding() = default; +NativePixmapEGLBinding::NativePixmapEGLBinding(const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferPlane plane) + : size_(size), format_(format), plane_(plane) {} + +NativePixmapEGLBinding::~NativePixmapEGLBinding() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); +} // static std::unique_ptr<NativePixmapGLBinding> NativePixmapEGLBinding::Create( @@ -64,22 +142,141 @@ const gfx::ColorSpace& color_space, GLenum target, GLuint texture_id) { - auto binding_helper = gl::NativePixmapEGLBindingHelper::CreateForPlane( - plane_size, plane_format, plane, std::move(pixmap), color_space, target, - texture_id); - if (!binding_helper) { + DCHECK_GT(texture_id, 0u); + + auto binding = + std::make_unique<NativePixmapEGLBinding>(plane_size, plane_format, plane); + + if (!binding->InitializeFromNativePixmap(std::move(pixmap), color_space, + target, texture_id)) { LOG(ERROR) << "Unable to initialize binding from pixmap"; return nullptr; } - - auto binding = std::make_unique<NativePixmapEGLBinding>( - std::move(binding_helper), plane_format); - return binding; } +bool NativePixmapEGLBinding::InitializeFromNativePixmap( + scoped_refptr<gfx::NativePixmap> pixmap, + const gfx::ColorSpace& color_space, + GLenum target, + GLuint texture_id) { + DCHECK(!pixmap_); + if (GLInternalFormat(format_) == GL_NONE) { + LOG(ERROR) << "Unsupported format: " << gfx::BufferFormatToString(format_); + return false; + } + + if (!pixmap->AreDmaBufFdsValid()) { + LOG(ERROR) << "Pixmap doesn't have valid dma bufs"; + return false; + } + + // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT + // target, the EGL will take a reference to the dma_buf. + std::vector<EGLint> attrs; + attrs.push_back(EGL_WIDTH); + attrs.push_back(size_.width()); + attrs.push_back(EGL_HEIGHT); + attrs.push_back(size_.height()); + attrs.push_back(EGL_LINUX_DRM_FOURCC_EXT); + attrs.push_back(FourCC(format_)); + + if (format_ == gfx::BufferFormat::YUV_420_BIPLANAR || + format_ == gfx::BufferFormat::YVU_420) { + // TODO(b/233667677): Since https://crrev.com/c/3855381, the only NV12 + // quads that we allow to be promoted to overlays are those that don't use + // the BT.2020 primaries and that don't use full range. Furthermore, since + // https://crrev.com/c/2336347, we force the DRM/KMS driver to use BT.601 + // with limited range. Therefore, for compositing purposes, we need to a) + // use EGL_ITU_REC601_EXT for any video frames that might be promoted to + // overlays - we shouldn't use EGL_ITU_REC709_EXT because we might then + // see a slight difference in compositing vs. overlays (note that the + // BT.601 and BT.709 primaries are close to each other, so this shouldn't + // be a huge correctness issue, though we'll need to address this at some + // point); b) use EGL_ITU_REC2020_EXT for BT.2020 frames in order to + // composite them correctly (and we won't need to worry about a difference + // in compositing vs. overlays in this case since those frames won't be + // promoted to overlays). We'll need to revisit this once we plumb the + // color space and range to DRM/KMS. + attrs.push_back(EGL_YUV_COLOR_SPACE_HINT_EXT); + switch (color_space.GetMatrixID()) { + case gfx::ColorSpace::MatrixID::BT2020_NCL: + attrs.push_back(EGL_ITU_REC2020_EXT); + break; + default: + attrs.push_back(EGL_ITU_REC601_EXT); + } + + attrs.push_back(EGL_SAMPLE_RANGE_HINT_EXT); + switch (color_space.GetRangeID()) { + case gfx::ColorSpace::RangeID::FULL: + attrs.push_back(EGL_YUV_FULL_RANGE_EXT); + break; + default: + attrs.push_back(EGL_YUV_NARROW_RANGE_EXT); + } + } + + if (plane_ == gfx::BufferPlane::DEFAULT) { + const EGLint kLinuxDrmModifiers[] = {EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, + EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, + EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT}; + bool has_dma_buf_import_modifier = + gl::GLSurfaceEGL::GetGLDisplayEGL() + ->ext->b_EGL_EXT_image_dma_buf_import_modifiers; + + for (size_t attrs_plane = 0; attrs_plane < pixmap->GetNumberOfPlanes(); + ++attrs_plane) { + attrs.push_back(EGL_DMA_BUF_PLANE0_FD_EXT + attrs_plane * 3); + + size_t pixmap_plane = attrs_plane; + + attrs.push_back(pixmap->GetDmaBufFd(pixmap_plane)); + attrs.push_back(EGL_DMA_BUF_PLANE0_OFFSET_EXT + attrs_plane * 3); + attrs.push_back(pixmap->GetDmaBufOffset(pixmap_plane)); + attrs.push_back(EGL_DMA_BUF_PLANE0_PITCH_EXT + attrs_plane * 3); + attrs.push_back(pixmap->GetDmaBufPitch(pixmap_plane)); + uint64_t modifier = pixmap->GetBufferFormatModifier(); + if (has_dma_buf_import_modifier && + modifier != gfx::NativePixmapHandle::kNoModifier) { + DCHECK(attrs_plane < std::size(kLinuxDrmModifiers)); + attrs.push_back(kLinuxDrmModifiers[attrs_plane]); + attrs.push_back(modifier & 0xffffffff); + attrs.push_back(kLinuxDrmModifiers[attrs_plane] + 1); + attrs.push_back(static_cast<uint32_t>(modifier >> 32)); + } + } + attrs.push_back(EGL_NONE); + } else { + DCHECK(plane_ == gfx::BufferPlane::Y || plane_ == gfx::BufferPlane::UV); + size_t pixmap_plane = plane_ == gfx::BufferPlane::Y ? 0 : 1; + + attrs.push_back(EGL_DMA_BUF_PLANE0_FD_EXT); + attrs.push_back(pixmap->GetDmaBufFd(pixmap_plane)); + attrs.push_back(EGL_DMA_BUF_PLANE0_OFFSET_EXT); + attrs.push_back(pixmap->GetDmaBufOffset(pixmap_plane)); + attrs.push_back(EGL_DMA_BUF_PLANE0_PITCH_EXT); + attrs.push_back(pixmap->GetDmaBufPitch(pixmap_plane)); + attrs.push_back(EGL_NONE); + } + + egl_image_ = + gl::MakeScopedEGLImage(EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, + static_cast<EGLClientBuffer>(nullptr), &attrs[0]); + if (!egl_image_.get()) { + return false; + } + + pixmap_ = pixmap; + + gl::ScopedTextureBinder binder(target, texture_id); + glEGLImageTargetTexture2DOES(target, egl_image_.get()); + + return true; +} + GLuint NativePixmapEGLBinding::GetInternalFormat() { - return binding_helper_->GetInternalFormat(); + return GLInternalFormat(format_); } GLenum NativePixmapEGLBinding::GetDataType() {
diff --git a/ui/ozone/common/native_pixmap_egl_binding.h b/ui/ozone/common/native_pixmap_egl_binding.h index c0382b1..792123c 100644 --- a/ui/ozone/common/native_pixmap_egl_binding.h +++ b/ui/ozone/common/native_pixmap_egl_binding.h
@@ -7,27 +7,27 @@ #include <memory> +#include "base/threading/thread_checker.h" +#include "ui/gfx/color_space.h" #include "ui/gfx/native_pixmap.h" +#include "ui/gl/scoped_egl_image.h" #include "ui/ozone/public/native_pixmap_gl_binding.h" -namespace gfx { -class ColorSpace; -} - -namespace gl { -class NativePixmapEGLBindingHelper; -} - namespace ui { // A binding maintained between NativePixmap and GL Textures in Ozone. class NativePixmapEGLBinding : public NativePixmapGLBinding { public: - NativePixmapEGLBinding( - std::unique_ptr<gl::NativePixmapEGLBindingHelper> binding_helper, - gfx::BufferFormat format); + NativePixmapEGLBinding(const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferPlane plane); ~NativePixmapEGLBinding() override; + // Create an EGLImage from a given NativePixmap and plane and bind + // |texture_id| to |target| followed by binding the image to |target|. The + // color space is for the external sampler: When we sample the YUV buffer as + // RGB, we need to tell it the encoding (BT.601, BT.709, or BT.2020) and range + // (limited or null), and |color_space| conveys this. static std::unique_ptr<NativePixmapGLBinding> Create( scoped_refptr<gfx::NativePixmap> pixmap, gfx::BufferFormat plane_format, @@ -42,9 +42,20 @@ GLenum GetDataType() override; private: - std::unique_ptr<gl::NativePixmapEGLBindingHelper> binding_helper_; + // Create an EGLImage from a given NativePixmap and bind |texture_id| to + // |target| followed by binding the image to |target|. This EGLImage can be + // converted to a GL texture. + bool InitializeFromNativePixmap(scoped_refptr<gfx::NativePixmap> pixmap, + const gfx::ColorSpace& color_space, + GLenum target, + GLuint texture_id); + gl::ScopedEGLImage egl_image_; + const gfx::Size size_; + THREAD_CHECKER(thread_checker_); gfx::BufferFormat format_; + scoped_refptr<gfx::NativePixmap> pixmap_; + gfx::BufferPlane plane_; }; } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc index 77a702f..afaae1c1 100644 --- a/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc
@@ -97,10 +97,22 @@ ZCR_COLOR_MANAGER_V1_MATRIX_NAMES_RGB, ZCR_COLOR_MANAGER_V1_RANGE_NAMES_FULL)); } + auto matrix = wayland::ToColorManagerMatrix(color_space.GetMatrixID()); + if (matrix == ZCR_COLOR_MANAGER_V1_MATRIX_NAMES_UNKNOWN) { + LOG(WARNING) << "Attempt to create color space from" + << " unsupported or invalid MatrixID: " + << color_space.ToString(); + matrix = ZCR_COLOR_MANAGER_V1_MATRIX_NAMES_RGB; + } + auto range = wayland::ToColorManagerRange(color_space.GetRangeID()); + if (range == ZCR_COLOR_MANAGER_V1_RANGE_NAMES_UNKNOWN) { + LOG(WARNING) << "Attempt to create color space from" + << " unsupported or invalid RangeID: " + << color_space.ToString(); + range = ZCR_COLOR_MANAGER_V1_RANGE_NAMES_FULL; + } auto chromaticity = wayland::ToColorManagerChromaticity(color_space.GetPrimaryID()); - auto matrix = wayland::ToColorManagerMatrix(color_space.GetMatrixID()); - auto range = wayland::ToColorManagerRange(color_space.GetRangeID()); if (chromaticity != ZCR_COLOR_MANAGER_V1_CHROMATICITY_NAMES_UNKNOWN) { if (zcr_color_manager_v1_get_version(zcr_color_manager_.get()) < ZCR_COLOR_SPACE_V1_COMPLETE_NAMES_SINCE_VERSION) {
diff --git a/ui/strings/ui_strings.grd b/ui/strings/ui_strings.grd index f4ef604d..4c5e9c2 100644 --- a/ui/strings/ui_strings.grd +++ b/ui/strings/ui_strings.grd
@@ -397,6 +397,9 @@ <message name="IDS_NEW_BADGE" desc="Appears as a badge on UI elements like menus, denoting new features"> New </message> + <message name="IDS_NEW_BADGE_UPPERCASE" desc="Appears as a badge on UI elements like menus, denoting new features, in uppercase"> + NEW + </message> <message name="IDS_NEW_BADGE_SCREEN_READER_MESSAGE" desc="Message appended to screen reader description of UI elements which have the 'New' badge"> This is a new feature
diff --git a/ui/strings/ui_strings_grd/IDS_NEW_BADGE_UPPERCASE.png.sha1 b/ui/strings/ui_strings_grd/IDS_NEW_BADGE_UPPERCASE.png.sha1 new file mode 100644 index 0000000..589857c --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_NEW_BADGE_UPPERCASE.png.sha1
@@ -0,0 +1 @@ +2244fc71fe84a8f368c23299dd8ee2b9591989d2 \ No newline at end of file
diff --git a/ui/views/badge_painter.cc b/ui/views/badge_painter.cc index 75f077f..d6e77ea 100644 --- a/ui/views/badge_painter.cc +++ b/ui/views/badge_painter.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include "base/i18n/rtl.h" +#include "ui/base/ui_base_features.h" #include "ui/color/color_id.h" #include "ui/color/color_provider.h" #include "ui/gfx/canvas.h" @@ -14,6 +15,7 @@ #include "ui/gfx/geometry/insets.h" #include "ui/gfx/text_constants.h" #include "ui/gfx/text_utils.h" +#include "ui/views/layout/layout_provider.h" #include "ui/views/view.h" namespace views { @@ -28,8 +30,11 @@ // add a small degree of bold to prevent color smearing/blurring due to font // smoothing. This ensures readability on all platforms and in both light and // dark modes. + const gfx::Font::Weight weight = features::IsChromeRefresh2023() + ? gfx::Font::Weight::SEMIBOLD + : gfx::Font::Weight::MEDIUM; return primary_font.Derive(BadgePainter::kBadgeFontSizeAdjustment, - gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM); + gfx::Font::NORMAL, weight); } // Returns the highlight rect for the badge given the font and text rect @@ -66,15 +71,17 @@ cc::PaintFlags flags; const ui::ColorProvider* color_provider = view->GetColorProvider(); const SkColor background_color = - color_provider->GetColor(ui::kColorButtonBackgroundProminent); + color_provider->GetColor(ui::kColorBadgeBackground); flags.setColor(background_color); canvas->DrawRoundRect( GetBadgeRectOutsetAroundText(badge_font, badge_text_bounds), - kBadgeCornerRadius, flags); + LayoutProvider::Get()->GetCornerRadiusMetric( + ShapeContextTokens::kBadgeRadius), + flags); // Render the badge text. const SkColor foreground_color = - color_provider->GetColor(ui::kColorButtonForegroundProminent); + color_provider->GetColor(ui::kColorBadgeForeground); canvas->DrawStringRect(text, badge_font, foreground_color, badge_text_bounds); }
diff --git a/ui/views/badge_painter.h b/ui/views/badge_painter.h index 800f3e9..6f8bff58 100644 --- a/ui/views/badge_painter.h +++ b/ui/views/badge_painter.h
@@ -66,11 +66,6 @@ // The baseline offset of the badge image to the menu text baseline. static constexpr int kBadgeBaselineOffsetMac = -4; - - // The corner radius of the rounded rect for the badge. - static constexpr int kBadgeCornerRadius = 3; - static_assert(kBadgeCornerRadius <= kBadgeInternalPadding, - "Badge corner radius should not exceed padding."); }; } // namespace views
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc index 16688b743..5dc929b6 100644 --- a/ui/views/controls/combobox/combobox.cc +++ b/ui/views/controls/combobox/combobox.cc
@@ -75,6 +75,10 @@ button_controller()->set_notify_action( ButtonController::NotifyAction::kOnPress); + if (features::IsChromeRefresh2023()) { + views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), + GetCornerRadius()); + } InkDrop::Get(this)->SetMode(views::InkDropHost::InkDropMode::ON); SetHasInkDropActionOnClick(true); InkDrop::UseInkDropForSquareRipple(InkDrop::Get(this), @@ -159,6 +163,14 @@ UpdateBorder(); + // The combobox uses the ink drop on the TransparentButton, but the focus ring + // needs to be set on the combobox itself. To ensure that the ink drop fills + // the entire bounds of the combobox including the portion of the combobox + // bounds that the focus ring paints over, we need to install the focus ring + // first so that the focus ring is added as a child before the + // TransparentButton and therefore painted before the ink drop. + FocusRing::Install(this); + arrow_button_ = AddChildView(std::make_unique<TransparentButton>(base::BindRepeating( &Combobox::ArrowButtonPressed, base::Unretained(this)))); @@ -188,7 +200,6 @@ views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), GetCornerRadius()); } - FocusRing::Install(this); } Combobox::~Combobox() {
diff --git a/ui/views/controls/editable_combobox/editable_password_combobox.cc b/ui/views/controls/editable_combobox/editable_password_combobox.cc index a1b5f48..e2ed366 100644 --- a/ui/views/controls/editable_combobox/editable_password_combobox.cc +++ b/ui/views/controls/editable_combobox/editable_password_combobox.cc
@@ -85,16 +85,15 @@ std::unique_ptr<ui::ComboboxModel> combobox_model, int text_context, int text_style, - bool display_arrow) + bool display_arrow, + Button::PressedCallback eye_callback) : EditableCombobox(std::move(combobox_model), /*filter_on_edit=*/false, /*show_on_empty=*/true, text_context, text_style, display_arrow) { - eye_ = AddControlElement(std::make_unique<Eye>(base::BindRepeating( - &EditablePasswordCombobox::RequestTogglePasswordVisibility, - base::Unretained(this)))); + eye_ = AddControlElement(std::make_unique<Eye>(std::move(eye_callback))); GetTextfield().SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); SetMenuDecorationStrategy( std::make_unique<PasswordMenuDecorationStrategy>(this)); @@ -124,19 +123,6 @@ return are_passwords_revealed_; } -void EditablePasswordCombobox::SetIsPasswordRevealPermittedCheck( - IsPasswordRevealPermittedCheck check) { - reveal_permitted_check_ = std::move(check); -} - -void EditablePasswordCombobox::RequestTogglePasswordVisibility() { - if (!are_passwords_revealed_ && reveal_permitted_check_ && - !reveal_permitted_check_.Run()) { - return; - } - RevealPasswords(!are_passwords_revealed_); -} - BEGIN_METADATA(EditablePasswordCombobox, View) END_METADATA
diff --git a/ui/views/controls/editable_combobox/editable_password_combobox.h b/ui/views/controls/editable_combobox/editable_password_combobox.h index ccfdf87..90b09b3 100644 --- a/ui/views/controls/editable_combobox/editable_password_combobox.h +++ b/ui/views/controls/editable_combobox/editable_password_combobox.h
@@ -8,9 +8,9 @@ #include <memory> #include <string> -#include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/controls/button/button.h" #include "ui/views/controls/editable_combobox/editable_combobox.h" namespace views { @@ -22,8 +22,6 @@ public: METADATA_HEADER(EditablePasswordCombobox); - using IsPasswordRevealPermittedCheck = base::RepeatingCallback<bool(void)>; - static constexpr int kDefaultTextContext = style::CONTEXT_BUTTON; static constexpr int kDefaultTextStyle = style::STYLE_PRIMARY; @@ -33,12 +31,14 @@ // menu. // `text_context` and `text_style`: Together these indicate the font to use. // `display_arrow`: Whether to display an arrow in the combobox to indicate - // that there is a drop-down list. + // that there is a drop-down list. `eye_callback` is called when the eye icon + // is clicked. explicit EditablePasswordCombobox( std::unique_ptr<ui::ComboboxModel> combobox_model, int text_context = kDefaultTextContext, int text_style = kDefaultTextStyle, - bool display_arrow = true); + bool display_arrow = true, + Button::PressedCallback eye_callback = Button::PressedCallback()); EditablePasswordCombobox(const EditablePasswordCombobox&) = delete; EditablePasswordCombobox& operator=(const EditablePasswordCombobox&) = delete; @@ -54,9 +54,6 @@ void RevealPasswords(bool revealed); bool ArePasswordsRevealed() const; - // Sets the callback to check whether revealing a password is permitted. - void SetIsPasswordRevealPermittedCheck(IsPasswordRevealPermittedCheck check); - private: friend class EditablePasswordComboboxTest; @@ -71,9 +68,6 @@ // Indicates whether the passwords are currently revealed. bool are_passwords_revealed_ = false; - - // A callback to check whether the password is allowed to be revealed. - IsPasswordRevealPermittedCheck reveal_permitted_check_; }; } // namespace views
diff --git a/ui/views/controls/editable_combobox/editable_password_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_password_combobox_unittest.cc index 8154b0bc..cc01b31 100644 --- a/ui/views/controls/editable_combobox/editable_password_combobox_unittest.cc +++ b/ui/views/controls/editable_combobox/editable_password_combobox_unittest.cc
@@ -14,6 +14,7 @@ #include "base/strings/string_piece.h" #include "base/test/mock_callback.h" #include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/models/combobox_model.h" #include "ui/base/models/menu_model.h" @@ -22,6 +23,7 @@ #include "ui/events/types/event_type.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/render_text.h" +#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/editable_combobox/editable_combobox.h" #include "ui/views/test/views_test_base.h" @@ -64,10 +66,14 @@ } EditablePasswordCombobox* combobox() { return combobox_.get(); } + base::MockCallback<Button::PressedCallback::Callback>* eye_mock_callback() { + return &eye_callback_; + } private: raw_ptr<Widget> widget_ = nullptr; raw_ptr<EditablePasswordCombobox> combobox_ = nullptr; + base::MockCallback<Button::PressedCallback::Callback> eye_callback_; // Used for simulating eye button clicks. std::unique_ptr<ui::test::EventGenerator> generator_; @@ -81,7 +87,9 @@ std::make_unique<ui::SimpleComboboxModel>( std::vector<ui::SimpleComboboxModel::Item>{ ui::SimpleComboboxModel::Item(u"item0"), - ui::SimpleComboboxModel::Item(u"item1")})); + ui::SimpleComboboxModel::Item(u"item1")}), + style::CONTEXT_BUTTON, style::STYLE_PRIMARY, /* display_arrow=*/true, + Button::PressedCallback(eye_callback_.Get())); // Set dummy tooltips and name to avoid running into a11y-related DCHECKs. combobox->SetPasswordIconTooltips(u"Show password", u"Hide password"); combobox->SetAccessibleName(u"Password field"); @@ -142,52 +150,9 @@ EXPECT_EQ(kObscuredPassword, GetItemAt(1)); } -TEST_F(EditablePasswordComboboxTest, EyeButtonClickRevealsAndHidesPassword) { - const std::u16string kObscuredPassword( - 5, gfx::RenderText::kPasswordReplacementChar); - - ASSERT_EQ(2u, GetItemCount()); - EXPECT_EQ(kObscuredPassword, GetItemAt(0)); - EXPECT_EQ(kObscuredPassword, GetItemAt(1)); - +TEST_F(EditablePasswordComboboxTest, EyeButtonClickInvokesCallback) { + EXPECT_CALL(*eye_mock_callback(), Run); ClickEye(); - EXPECT_EQ(u"item0", GetItemAt(0)); - EXPECT_EQ(u"item1", GetItemAt(1)); - - ClickEye(); - EXPECT_EQ(kObscuredPassword, GetItemAt(0)); - EXPECT_EQ(kObscuredPassword, GetItemAt(1)); -} - -TEST_F(EditablePasswordComboboxTest, EyeButtonClickRequestsPermission) { - const std::u16string kObscuredPassword( - 5, gfx::RenderText::kPasswordReplacementChar); - - StrictMock<base::MockCallback< - EditablePasswordCombobox::IsPasswordRevealPermittedCheck>> - reveal_check; - combobox()->SetIsPasswordRevealPermittedCheck(reveal_check.Get()); - - ASSERT_EQ(2u, GetItemCount()); - EXPECT_EQ(kObscuredPassword, GetItemAt(0)); - EXPECT_EQ(kObscuredPassword, GetItemAt(1)); - - // If the reveal check returns `false`, the passwords remain obscured. - EXPECT_CALL(reveal_check, Run).WillOnce(Return(false)); - ClickEye(); - EXPECT_EQ(kObscuredPassword, GetItemAt(0)); - EXPECT_EQ(kObscuredPassword, GetItemAt(1)); - - // If the reveal check returns `true`, the passwords are revealed. - EXPECT_CALL(reveal_check, Run).WillOnce(Return(true)); - ClickEye(); - EXPECT_EQ(u"item0", GetItemAt(0)); - EXPECT_EQ(u"item1", GetItemAt(1)); - - // Unrevealing the passwords does not trigger a check. - ClickEye(); - EXPECT_EQ(kObscuredPassword, GetItemAt(0)); - EXPECT_EQ(kObscuredPassword, GetItemAt(1)); } TEST_F(EditablePasswordComboboxTest, NoCrashWithoutWidget) {
diff --git a/ui/views/controls/focus_ring.cc b/ui/views/controls/focus_ring.cc index d3cfc17..6b72d07 100644 --- a/ui/views/controls/focus_ring.cc +++ b/ui/views/controls/focus_ring.cc
@@ -203,11 +203,14 @@ expansion_insets.set_right(min_x_inset); focus_bounds.Inset(expansion_insets); } - - focus_bounds.Inset(gfx::Insets(halo_inset_)); - - if (parent()->GetProperty(kDrawFocusRingBackgroundOutline)) - focus_bounds.Inset(gfx::Insets(-2 * kOutlineThickness)); + if (ShouldDrawInnerStroke()) { + focus_bounds.Outset(halo_thickness_); + } else { + focus_bounds.Inset(gfx::Insets(halo_inset_)); + if (parent()->GetProperty(kDrawFocusRingBackgroundOutline)) { + focus_bounds.Inset(gfx::Insets(-2 * kOutlineThickness)); + } + } SetBoundsRect(focus_bounds); @@ -237,20 +240,48 @@ if (!ShouldPaint()) { return; } - - const SkRRect ring_rect = GetRingRoundRect(); + SkRRect ring_rect = GetRingRoundRect(); cc::PaintFlags paint; paint.setAntiAlias(true); paint.setStyle(cc::PaintFlags::kStroke_Style); + if (ShouldDrawInnerStroke()) { + // Overlap between the outer stroke + // and inner stroke to avoid cracking between the two strokes. + const float kStrokeOverlap = halo_thickness_ / 2.0f; - if (parent()->GetProperty(kDrawFocusRingBackgroundOutline)) { - // Draw with full stroke width + 2x outline thickness to effectively paint - // the outline thickness on both sides of the FocusRing. - paint.setStrokeWidth(halo_thickness_ + 2 * kOutlineThickness); - paint.setColor(GetCascadingBackgroundColor(this)); - canvas->sk_canvas()->drawRRect(ring_rect, paint); + float inner_ring_bounds_adjustment = + halo_thickness_ / 2.0f - kStrokeOverlap / 2.0f; + SkRRect inner_ring_bounds = ring_rect; + inner_ring_bounds.inset(inner_ring_bounds_adjustment, + inner_ring_bounds_adjustment); + paint.setStrokeWidth(halo_thickness_ + kStrokeOverlap); + // The parent of the focus ring is the host view. Get the cascading + // background color starting at the parent of the host view if it exists. + // We assume focus ring colors will be + // set to correctly contrast against the host's parent's background. + View* host_parent = parent()->parent(); + // We don't expect to be placing focus when a host parent does not exist. If + // this check fails then we need to re-evaluate. + CHECK(host_parent) << "Parent of the host view is null"; + paint.setColor(GetCascadingBackgroundColor(host_parent)); + canvas->sk_canvas()->drawRRect(inner_ring_bounds, paint); + + SkRRect outer_ring_bounds = ring_rect; + float outer_ring_bounds_adjustment = halo_thickness_ / 2; + outer_ring_bounds.outset(outer_ring_bounds_adjustment, + outer_ring_bounds_adjustment); + ring_rect = outer_ring_bounds; + } else { + // TODO(crbug.com/1417057): kDrawFocusRingBackgroundOutline should be + // removed when ChromeRefresh is fully rolled out. + if (parent()->GetProperty(kDrawFocusRingBackgroundOutline)) { + // Draw with full stroke width + 2x outline thickness to effectively paint + // the outline thickness on both sides of the FocusRing. + paint.setStrokeWidth(halo_thickness_ + 2 * kOutlineThickness); + paint.setColor(GetCascadingBackgroundColor(this)); + canvas->sk_canvas()->drawRRect(ring_rect, paint); + } } - paint.setColor(GetPaintColor(this, !invalid_)); paint.setStrokeWidth(halo_thickness_); canvas->sk_canvas()->drawRRect(ring_rect, paint); @@ -341,6 +372,14 @@ } } +bool FocusRing::ShouldDrawInnerStroke() const { + // TODO(crbug.com/1417057): Some places set a custom `halo_inset_` value to + // move the focus ring away from the host. If those places want to instead + // draw an inner stroke, they need to be audited separately with UX. + return features::IsChromeRefresh2023() && inner_stroke_enabled_ && + halo_inset_ == FocusRing::kDefaultHaloInset; +} + bool FocusRing::ShouldPaint() { // TODO(pbos): Reevaluate if this can turn into a DCHECK, e.g. we should // never paint if there's no parent focus.
diff --git a/ui/views/controls/focus_ring.h b/ui/views/controls/focus_ring.h index 2dd7349..fd6ffdc8 100644 --- a/ui/views/controls/focus_ring.h +++ b/ui/views/controls/focus_ring.h
@@ -88,6 +88,11 @@ void SetHaloThickness(float halo_thickness); void SetHaloInset(float halo_inset); + // If set we do not draw an inner stroke using the color of the + // host's parent's background color. This may result in insufficient contrast + // between the focus ring and the host view. + void SetInnerStrokeDisabled() { inner_stroke_enabled_ = false; } + bool ShouldPaintForTesting(); // View: @@ -110,6 +115,11 @@ void RefreshLayer(); + // Returns whether we should draw the focus ring as two strokes. An outer + // stroke of the focus ring color and an inner stroke with the host's + // background color. + bool ShouldDrawInnerStroke() const; + bool ShouldPaint(); // Translates the provided SkRect or SkRRect, which is in the parent's @@ -123,6 +133,8 @@ // The path generator used to draw this focus ring. std::unique_ptr<HighlightPathGenerator> path_generator_; + bool inner_stroke_enabled_ = true; + // Whether the enclosed View is in an invalid state, which controls whether // the focus ring shows an invalid appearance (usually a different color). bool invalid_ = false;
diff --git a/ui/views/controls/menu/menu_controller_cocoa_delegate_impl.mm b/ui/views/controls/menu/menu_controller_cocoa_delegate_impl.mm index 55ce3c2..5e3480c 100644 --- a/ui/views/controls/menu/menu_controller_cocoa_delegate_impl.mm +++ b/ui/views/controls/menu/menu_controller_cocoa_delegate_impl.mm
@@ -12,11 +12,13 @@ #include "ui/base/interaction/element_tracker_mac.h" #include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/models/menu_model.h" +#include "ui/base/ui_base_features.h" #include "ui/color/color_provider.h" #include "ui/gfx/mac/coordinate_conversion.h" #include "ui/gfx/platform_font_mac.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/badge_painter.h" +#include "ui/views/layout/layout_provider.h" namespace { @@ -25,7 +27,9 @@ NSImage* NewTagImage(const ui::ColorProvider* color_provider) { // 1. Make the attributed string. - NSString* badge_text = l10n_util::GetNSString(IDS_NEW_BADGE); + NSString* badge_text = l10n_util::GetNSString(features::IsChromeRefresh2023() + ? IDS_NEW_BADGE_UPPERCASE + : IDS_NEW_BADGE); // The preferred font is slightly smaller and slightly more bold than the // menu font. The size change is required to make it look correct in the @@ -68,10 +72,13 @@ drawingHandler:^(NSRect dest_rect) { NSRect badge_frame = NSInsetRect( dest_rect, views::BadgePainter::kBadgeHorizontalMargin, 0); - NSBezierPath* rounded_badge_rect = [NSBezierPath - bezierPathWithRoundedRect:badge_frame - xRadius:views::BadgePainter::kBadgeCornerRadius - yRadius:views::BadgePainter::kBadgeCornerRadius]; + const int badge_radius = + views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::ShapeContextTokens::kBadgeRadius); + NSBezierPath* rounded_badge_rect = + [NSBezierPath bezierPathWithRoundedRect:badge_frame + xRadius:badge_radius + yRadius:badge_radius]; DCHECK(color_provider); NSColor* badge_color = skia::SkColorToSRGBNSColor( color_provider->GetColor(ui::kColorButtonBackgroundProminent));
diff --git a/ui/views/controls/menu/menu_item_view.h b/ui/views/controls/menu/menu_item_view.h index 46da203..4c50932 100644 --- a/ui/views/controls/menu/menu_item_view.h +++ b/ui/views/controls/menu/menu_item_view.h
@@ -18,6 +18,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/menu_separator_types.h" #include "ui/base/themed_vector_icon.h" +#include "ui/base/ui_base_features.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/image/image_skia.h" #include "ui/strings/grit/ui_strings.h" @@ -675,8 +676,9 @@ // and SetIconView() explicitly calls UpdateSelectionBasedStateIfChanged(). bool update_selection_based_state_in_view_herarchy_changed_ = true; - const std::u16string new_badge_text_ = - l10n_util::GetStringUTF16(IDS_NEW_BADGE); + const std::u16string new_badge_text_ = l10n_util::GetStringUTF16( + features::IsChromeRefresh2023() ? IDS_NEW_BADGE_UPPERCASE + : IDS_NEW_BADGE); }; } // namespace views
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc index e9102ac..147a5db 100644 --- a/ui/views/controls/menu/menu_scroll_view_container.cc +++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -85,6 +85,7 @@ void OnDragEntered(const ui::DropTargetEvent& event) override { DCHECK(host_->GetMenuItem()->GetMenuController()); + host_->GetMenuItem()->GetMenuController()->SetEnabledScrollButtons(true); host_->GetMenuItem()->GetMenuController()->OnDragEnteredScrollButton( host_, is_up_); }
diff --git a/ui/views/controls/scrollbar/scroll_bar_button_unittest.cc b/ui/views/controls/scrollbar/scroll_bar_button_unittest.cc index 715db41..32afc013 100644 --- a/ui/views/controls/scrollbar/scroll_bar_button_unittest.cc +++ b/ui/views/controls/scrollbar/scroll_bar_button_unittest.cc
@@ -9,7 +9,6 @@ #include "base/test/task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #include "ui/events/base_event_utils.h" #include "ui/events/event.h" @@ -41,11 +40,15 @@ base::BindRepeating(&MockButtonCallback::ButtonPressed, base::Unretained(&callback_)), ScrollBarButton::Type::kLeft, - task_environment_.GetMockTickClock())) {} + task_environment_.GetMockTickClock())) { + display::Screen::SetScreenInstance(&test_screen_); + } ScrollBarButtonTest(const ScrollBarButtonTest&) = delete; ScrollBarButtonTest& operator=(const ScrollBarButtonTest&) = delete; - ~ScrollBarButtonTest() override = default; + ~ScrollBarButtonTest() override { + display::Screen::SetScreenInstance(nullptr); + } protected: testing::StrictMock<MockButtonCallback>& callback() { return callback_; } @@ -59,7 +62,6 @@ base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; display::test::TestScreen test_screen_; - display::test::ScopedScreenOverride screen_override{&test_screen_}; testing::StrictMock<MockButtonCallback> callback_; const std::unique_ptr<Button> button_;
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc index 81f508e..33fd1dc 100644 --- a/ui/views/controls/textfield/textfield.cc +++ b/ui/views/controls/textfield/textfield.cc
@@ -804,9 +804,6 @@ break; case ui::ET_GESTURE_SCROLL_BEGIN: if (HasFocus()) { - touch_handles_hidden_due_to_scroll_ = - touch_selection_controller_ != nullptr; - DestroyTouchSelection(); #if BUILDFLAG(IS_CHROMEOS) if (::features::IsTouchTextEditingRedesignEnabled()) { MaybeStartSelectionDragging(event); @@ -816,12 +813,29 @@ drag_start_location_x_ = event->location().x(); drag_start_display_offset_ = GetRenderText()->GetUpdatedDisplayOffset().x(); + show_touch_handles_after_scroll_ = + touch_selection_controller_ != nullptr; + } else { + show_touch_handles_after_scroll_ = true; } + // Deactivate touch selection handles when scrolling or selection + // dragging. + DestroyTouchSelection(); event->SetHandled(); } break; case ui::ET_GESTURE_SCROLL_UPDATE: if (HasFocus()) { + // Switch from selection dragging to default scrolling behaviour if + // scroll update has multiple touch points. + if (selection_dragging_state_ != SelectionDraggingState::kNone && + event->details().touch_points() > 1) { + selection_dragging_state_ = SelectionDraggingState::kNone; + drag_start_location_x_ = event->location().x(); + drag_start_display_offset_ = + GetRenderText()->GetUpdatedDisplayOffset().x(); + show_touch_handles_after_scroll_ = true; + } switch (selection_dragging_state_) { case SelectionDraggingState::kDraggingSelectionExtent: MoveRangeSelectionExtent(event->location() + @@ -830,13 +844,14 @@ case SelectionDraggingState::kDraggingCursor: MoveCursorTo(event->location(), false); break; - case SelectionDraggingState::kNone: + case SelectionDraggingState::kNone: { int new_display_offset = drag_start_display_offset_ + event->location().x() - drag_start_location_x_; GetRenderText()->SetDisplayOffset(new_display_offset); SchedulePaint(); break; + } } event->SetHandled(); } @@ -844,12 +859,11 @@ case ui::ET_GESTURE_SCROLL_END: case ui::ET_SCROLL_FLING_START: if (HasFocus()) { - if (selection_dragging_state_ != SelectionDraggingState::kNone || - touch_handles_hidden_due_to_scroll_) { + if (show_touch_handles_after_scroll_) { CreateTouchSelectionControllerAndNotifyIt(); - selection_dragging_state_ = SelectionDraggingState::kNone; - touch_handles_hidden_due_to_scroll_ = false; + show_touch_handles_after_scroll_ = false; } + selection_dragging_state_ = SelectionDraggingState::kNone; event->SetHandled(); } break; @@ -2826,7 +2840,10 @@ #if BUILDFLAG(IS_CHROMEOS) void Textfield::MaybeStartSelectionDragging(ui::GestureEvent* event) { - if (event->type() != ui::ET_GESTURE_SCROLL_BEGIN) { + DCHECK_EQ(event->type(), ui::ET_GESTURE_SCROLL_BEGIN); + // Only start selection dragging if scrolling with one touch point. + if (event->details().touch_points() > 1) { + selection_dragging_state_ = SelectionDraggingState::kNone; return; }
diff --git a/ui/views/controls/textfield/textfield.h b/ui/views/controls/textfield/textfield.h index 1c28285..742525d3 100644 --- a/ui/views/controls/textfield/textfield.h +++ b/ui/views/controls/textfield/textfield.h
@@ -792,9 +792,11 @@ // shrinking. gfx::BreakType break_type_ = gfx::CHARACTER_BREAK; - // Tracks if touch editing handles are hidden because user has started - // scrolling. If |true|, handles are shown after scrolling ends. - bool touch_handles_hidden_due_to_scroll_ = false; + // Whether touch selection handles should be shown once the current scroll + // sequence ends. Handles should be shown if touch editing handles were hidden + // while scrolling or if part of the scroll sequence was used for cursor + // placement or adjusting the text selection. + bool show_touch_handles_after_scroll_ = false; // Whether the user should be notified if the clipboard is restricted. bool show_rejection_ui_if_any_ = false;
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc index 11a263ea..de199a55 100644 --- a/ui/views/controls/textfield/textfield_unittest.cc +++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -860,7 +860,7 @@ render_text_test_api.SetGlyphWidth(kGlyphWidth); constexpr int kCursorWidth = 1; test_api_->GetRenderText()->SetDisplayRect( - gfx::Rect(0, 0, kGlyphWidth * 10 + kCursorWidth, 20)); + gfx::Rect(kGlyphWidth * 10 + kCursorWidth, 20)); textfield_->SetTextWithoutCaretBoundsChangeNotification( u"0123456789_123456789_123456789", 0); test_api_->SetDisplayOffsetX(0); @@ -3646,10 +3646,11 @@ render_text_test_api.SetGlyphWidth(kGlyphWidth); constexpr int kCursorWidth = 1; test_api_->GetRenderText()->SetDisplayRect( - gfx::Rect(0, 0, kGlyphWidth * 10 + kCursorWidth, 20)); + gfx::Rect(kGlyphWidth * 10 + kCursorWidth, 20)); textfield_->SetTextWithoutCaretBoundsChangeNotification( u"0123456789_123456789_123456789", 0); test_api_->SetDisplayOffsetX(0); + EXPECT_FALSE(test_api_->touch_selection_controller()); // A scroll which begins in a vertical direction should adjust the display // offset. @@ -3657,12 +3658,61 @@ GetCursorPositionX(5), GetCursorYForTesting(), ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0, 1)); textfield_->OnGestureEvent(&scroll_begin); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); ui::GestureEvent scroll_update = CreateTestGestureEvent( GetCursorPositionX(5) - 30, GetCursorYForTesting(), ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE)); textfield_->OnGestureEvent(&scroll_update); EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + + ui::GestureEvent scroll_end = CreateTestGestureEvent( + GetCursorPositionX(5) - 30, GetCursorYForTesting(), + ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END)); + textfield_->OnGestureEvent(&scroll_end); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + // Touch handles shouldn't be shown since they weren't shown initially. + EXPECT_FALSE(test_api_->touch_selection_controller()); +} + +TEST_F(TextfieldTest, TwoFingerScroll) { + InitTextfield(); + + // Size the textfield wide enough to hold 10 characters. + gfx::test::RenderTextTestApi render_text_test_api(test_api_->GetRenderText()); + constexpr int kGlyphWidth = 10; + render_text_test_api.SetGlyphWidth(kGlyphWidth); + constexpr int kCursorWidth = 1; + test_api_->GetRenderText()->SetDisplayRect( + gfx::Rect(kGlyphWidth * 10 + kCursorWidth, 20)); + textfield_->SetTextWithoutCaretBoundsChangeNotification( + u"0123456789_123456789_123456789", 0); + test_api_->SetDisplayOffsetX(0); + EXPECT_FALSE(test_api_->touch_selection_controller()); + + // Two finger scroll should adjust the display offset. + ui::GestureEventDetails scroll_begin_details(ui::ET_GESTURE_SCROLL_BEGIN); + scroll_begin_details.set_touch_points(2); + ui::GestureEvent scroll_begin = CreateTestGestureEvent( + GetCursorPositionX(5), GetCursorYForTesting(), scroll_begin_details); + textfield_->OnGestureEvent(&scroll_begin); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); + + ui::GestureEventDetails scroll_update_details(ui::ET_GESTURE_SCROLL_UPDATE); + scroll_update_details.set_touch_points(2); + ui::GestureEvent scroll_update = + CreateTestGestureEvent(GetCursorPositionX(5) - 30, GetCursorYForTesting(), + scroll_update_details); + textfield_->OnGestureEvent(&scroll_update); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + + ui::GestureEvent scroll_end = CreateTestGestureEvent( + GetCursorPositionX(5) - 30, GetCursorYForTesting(), + ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END)); + textfield_->OnGestureEvent(&scroll_end); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + // Touch handles shouldn't be shown since they weren't shown initially. + EXPECT_FALSE(test_api_->touch_selection_controller()); } #if BUILDFLAG(IS_CHROMEOS) @@ -3741,7 +3791,7 @@ render_text_test_api.SetGlyphWidth(kGlyphWidth); constexpr int kCursorWidth = 1; test_api_->GetRenderText()->SetDisplayRect( - gfx::Rect(0, 0, kGlyphWidth * 10 + kCursorWidth, 20)); + gfx::Rect(kGlyphWidth * 10 + kCursorWidth, 20)); textfield_->SetTextWithoutCaretBoundsChangeNotification( u"0123456789_123456789_123456789", 0); test_api_->SetDisplayOffsetX(0); @@ -3752,6 +3802,7 @@ GetCursorPositionX(2), GetCursorYForTesting(), ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 1, 0)); textfield_->OnGestureEvent(&scroll_begin); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); ui::GestureEvent scroll_update = CreateTestGestureEvent( GetCursorPositionX(30), GetCursorYForTesting(), @@ -3763,6 +3814,72 @@ EXPECT_EQ(test_api_->GetDisplayOffsetX(), -200); } +TEST_F(TextfieldTest, TwoFingerScrollUpdate) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{::features::kTouchTextEditingRedesign}, + /*disabled_features=*/{}); + + InitTextfield(); + + // Size the textfield wide enough to hold 10 characters. + gfx::test::RenderTextTestApi render_text_test_api(test_api_->GetRenderText()); + constexpr int kGlyphWidth = 10; + render_text_test_api.SetGlyphWidth(kGlyphWidth); + constexpr int kCursorWidth = 1; + test_api_->GetRenderText()->SetDisplayRect( + gfx::Rect(kGlyphWidth * 10 + kCursorWidth, 20)); + textfield_->SetTextWithoutCaretBoundsChangeNotification( + u"0123456789_123456789_123456789", 0); + test_api_->SetDisplayOffsetX(0); + gfx::Range range; + + // Start scrolling with one touch point in a horizontal direction. + ui::GestureEventDetails scroll_begin_details(ui::ET_GESTURE_SCROLL_BEGIN, 1, + 0); + ui::GestureEvent scroll_begin = CreateTestGestureEvent( + GetCursorPositionX(5), GetCursorYForTesting(), scroll_begin_details); + textfield_->OnGestureEvent(&scroll_begin); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); + + // Scroll update should move the cursor. + ui::GestureEvent scroll_update_1 = CreateTestGestureEvent( + GetCursorPositionX(5), GetCursorYForTesting(), + ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE)); + textfield_->OnGestureEvent(&scroll_update_1); + textfield_->GetEditableSelectionRange(&range); + EXPECT_EQ(range, gfx::Range(5)); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); + + // Add second touch point to scroll sequence. + ui::GestureEventDetails scroll_update_details_2(ui::ET_GESTURE_SCROLL_UPDATE); + scroll_update_details_2.set_touch_points(2); + ui::GestureEvent scroll_update_2 = CreateTestGestureEvent( + GetCursorPositionX(5), GetCursorYForTesting(), scroll_update_details_2); + textfield_->OnGestureEvent(&scroll_update_2); + EXPECT_EQ(range, gfx::Range(5)); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), 0); + + // Scroll update should adjust display offset without moving cursor. + ui::GestureEventDetails scroll_update_details_3(ui::ET_GESTURE_SCROLL_UPDATE); + scroll_update_details_3.set_touch_points(2); + ui::GestureEvent scroll_update_3 = + CreateTestGestureEvent(GetCursorPositionX(5) - 30, GetCursorYForTesting(), + scroll_update_details_3); + textfield_->OnGestureEvent(&scroll_update_3); + EXPECT_EQ(range, gfx::Range(5)); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + + ui::GestureEvent scroll_end = CreateTestGestureEvent( + GetCursorPositionX(5) - 30, GetCursorYForTesting(), + ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END)); + textfield_->OnGestureEvent(&scroll_end); + EXPECT_EQ(test_api_->GetDisplayOffsetX(), -30); + // Touch handles should be shown when scroll ends since the scroll sequence + // was initially used for cursor placement. + EXPECT_TRUE(test_api_->touch_selection_controller()); +} + TEST_F(TextfieldTest, LongPressDragLTR_Forward) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( @@ -4370,7 +4487,7 @@ InitTextfield(); textfield_->SetBounds(0, 0, kDisplayRectWidth, 100); textfield_->SetBorder(views::CreateEmptyBorder(kBorderWidth)); - test_api_->GetRenderText()->SetDisplayRect(gfx::Rect(0, 0, 20, 20)); + test_api_->GetRenderText()->SetDisplayRect(gfx::Rect(20, 20)); ASSERT_EQ(20, test_api_->GetRenderText()->display_rect().width()); textfield_->FitToLocalBounds(); EXPECT_EQ(kDisplayRectWidth - 2 * kBorderWidth,
diff --git a/ui/views/layout/layout_provider.cc b/ui/views/layout/layout_provider.cc index 95fea75..d75e299 100644 --- a/ui/views/layout/layout_provider.cc +++ b/ui/views/layout/layout_provider.cc
@@ -179,6 +179,7 @@ ShapeSysTokens GetShapeSysToken(ShapeContextTokens id) { static constexpr auto shape_token_map = base::MakeFixedFlatMap<ShapeContextTokens, ShapeSysTokens>({ + {ShapeContextTokens::kBadgeRadius, ShapeSysTokens::kXSmall}, {ShapeContextTokens::kButtonRadius, ShapeSysTokens::kFull}, {ShapeContextTokens::kTextfieldRadius, ShapeSysTokens::kSmall}, {ShapeContextTokens::kComboboxRadius, ShapeSysTokens::kSmall}, @@ -191,6 +192,8 @@ const gfx::Size& size) const { if (!features::IsChromeRefresh2023()) { switch (id) { + case ShapeContextTokens::kBadgeRadius: + return 3; case ShapeContextTokens::kButtonRadius: return 4; case ShapeContextTokens::kComboboxRadius:
diff --git a/ui/views/layout/layout_provider.h b/ui/views/layout/layout_provider.h index 4ab66f2..2beabae 100644 --- a/ui/views/layout/layout_provider.h +++ b/ui/views/layout/layout_provider.h
@@ -136,6 +136,7 @@ // These context tokens are granular to the entire client and will map to // sys token values (see below). enum class ShapeContextTokens { + kBadgeRadius, kButtonRadius, kTextfieldRadius, kComboboxRadius,
diff --git a/ui/views/view.cc b/ui/views/view.cc index 30dbd9a..6598da41 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc
@@ -1877,6 +1877,11 @@ return base::NullCallback(); } +View::DropCallbackWithAnimation View::GetDropCallbackWithAnimation( + const ui::DropTargetEvent& event) { + return base::NullCallback(); +} + // static bool View::ExceededDragThreshold(const gfx::Vector2d& delta) { return (abs(delta.x()) > GetHorizontalDragThreshold() ||
diff --git a/ui/views/view.h b/ui/views/view.h index 93a815e..1229081 100644 --- a/ui/views/view.h +++ b/ui/views/view.h
@@ -70,6 +70,7 @@ class Compositor; class InputMethod; class Layer; +class LayerTreeOwner; class NativeTheme; class PaintContext; class ThemeProvider; @@ -295,6 +296,11 @@ base::OnceCallback<void(const ui::DropTargetEvent& event, ui::mojom::DragOperation& output_drag_op)>; + using DropCallbackWithAnimation = base::OnceCallback<void( + const ui::DropTargetEvent& event, + ui::mojom::DragOperation& output_drag_op, + std::unique_ptr<ui::LayerTreeOwner> old_layer_owner)>; + METADATA_HEADER_BASE(View); enum class FocusBehavior { @@ -1411,6 +1417,12 @@ // uses View local coordinates. virtual DropCallback GetDropCallback(const ui::DropTargetEvent& event); + // Invoked during a drag and drop session when the user release the mouse. + // Similar to GetDropCallback() but the returned callback has access to the + // drag image layer if any animation is needed. + virtual DropCallbackWithAnimation GetDropCallbackWithAnimation( + const ui::DropTargetEvent& event); + // Returns true if the mouse was dragged enough to start a drag operation. // delta_x and y are the distance the mouse was dragged. static bool ExceededDragThreshold(const gfx::Vector2d& delta);
diff --git a/ui/views/widget/drop_helper.cc b/ui/views/widget/drop_helper.cc index 70b46a69..17382dda 100644 --- a/ui/views/widget/drop_helper.cc +++ b/ui/views/widget/drop_helper.cc
@@ -15,6 +15,7 @@ #include "build/build_config.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h" +#include "ui/compositor/layer_tree_owner.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -143,6 +144,51 @@ drop_event, std::move(drop_view_cb)); } +DropHelper::DropCallbackWithAnimation DropHelper::GetDropCallbackWithAnimation( + const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation) { + View* drop_view = target_view_; + if (!drop_view) { + return base::NullCallback(); + } + + if (drag_operation == ui::DragDropTypes::DRAG_NONE) { + drop_view->OnDragExited(); + return base::NullCallback(); + } + + gfx::Point view_location(root_view_location); + View* root_view = drop_view->GetWidget()->GetRootView(); + View::ConvertPointToTarget(root_view, drop_view, &view_location); + ui::DropTargetEvent drop_event(data, gfx::PointF(view_location), + gfx::PointF(view_location), drag_operation); + + auto drop_view_cb = drop_view->GetDropCallbackWithAnimation(drop_event); + if (!drop_view_cb) { + return base::NullCallback(); + } + + // Only reset the target view when the helper successfully returns a callback. + // If no callback is returned here, GetDropCallback might still need the + // target view. + deepest_view_ = target_view_ = nullptr; + + return base::BindOnce( + [](const ui::DropTargetEvent& drop_event, + View::DropCallbackWithAnimation drop_cb, + std::unique_ptr<ui::OSExchangeData> data, + ui::mojom::DragOperation& output_drag_op, + std::unique_ptr<ui::LayerTreeOwner> old_layer_owner) { + // Bind the drop_event here instead of using the one that the callback + // is invoked with as that event is in window coordinates and callbacks + // expect View coordinates. + std::move(drop_cb).Run(drop_event, output_drag_op, + std::move(old_layer_owner)); + }, + drop_event, std::move(drop_view_cb)); +} + View* DropHelper::CalculateTargetView(const gfx::Point& root_view_location, const OSExchangeData& data, bool check_can_drop) {
diff --git a/ui/views/widget/drop_helper.h b/ui/views/widget/drop_helper.h index ceabf8a..6ba3786 100644 --- a/ui/views/widget/drop_helper.h +++ b/ui/views/widget/drop_helper.h
@@ -39,6 +39,13 @@ base::OnceCallback<void(std::unique_ptr<ui::OSExchangeData> data, ui::mojom::DragOperation& output_drag_op)>; + // This is expected to match the signature of + // aura::client::DragDropDelegate::DropCallbackWithAnimation. + using DropCallbackWithAnimation = base::OnceCallback<void( + std::unique_ptr<ui::OSExchangeData> data, + ui::mojom::DragOperation& output_drag_op, + std::unique_ptr<ui::LayerTreeOwner> old_layer_owner)>; + explicit DropHelper(View* root_view); DropHelper(const DropHelper&) = delete; @@ -85,9 +92,18 @@ // Invoked when the user drops data on the root view during a drag and drop // operation, but the drop is held because of DataTransferPolicController. + // To fetch the correct callback, callers should invoke + // GetDropCallbackWithAnimation before GetDropCallback to potentially avoid + // clearing the |target_view_| in case GetDropCallback should need it. DropCallback GetDropCallback(const OSExchangeData& data, const gfx::Point& root_view_location, int drag_operation); + DropCallbackWithAnimation GetDropCallbackWithAnimation( + const OSExchangeData& data, + const gfx::Point& root_view_location, + int drag_operation); + + bool WillAnimateDragImageForDrop(); // Calculates the target view for a drop given the specified location in // the coordinate system of the rootview. This tries to avoid continually
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index f1949d4..5703b0e 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc
@@ -1199,6 +1199,14 @@ last_drop_operation_); } +aura::client::DragDropDelegate::DropCallbackWithAnimation +NativeWidgetAura::GetDropCallbackWithAnimation( + const ui::DropTargetEvent& event) { + DCHECK(drop_helper_); + return drop_helper_->GetDropCallbackWithAnimation( + event.data(), event.location(), last_drop_operation_); +} + //////////////////////////////////////////////////////////////////////////////// // NativeWidgetAura, wm::TransientWindowObserver implementation:
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h index 5fcf32d..67f9055 100644 --- a/ui/views/widget/native_widget_aura.h +++ b/ui/views/widget/native_widget_aura.h
@@ -228,6 +228,8 @@ void OnDragExited() override; aura::client::DragDropDelegate::DropCallback GetDropCallback( const ui::DropTargetEvent& event) override; + aura::client::DragDropDelegate::DropCallbackWithAnimation + GetDropCallbackWithAnimation(const ui::DropTargetEvent& event) override; // aura::TransientWindowObserver: void OnTransientParentChanged(aura::Window* new_parent) override;
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index b9bac52..2519703 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn
@@ -91,18 +91,10 @@ if (is_chromeos_ash) { public_deps += [ ":build_cros_styles_grdp", - "//ash/webui/common/resources:build_grdp", - "//ash/webui/common/resources:build_html_css_wrapper_files_grdp", - "//ash/webui/common/resources/hotspot:build_grdp", - "//ash/webui/common/resources/typescript_utils:build_grdp", "//third_party/material_web_components:build_grdp", "//third_party/web-animations-js:build_grdp", ] grdp_files += [ - "$root_gen_dir/ash/webui/common/resources/ash_common_resources.grdp", - "$root_gen_dir/ash/webui/common/resources/hotspot/resources.grdp", - "$root_gen_dir/ash/webui/common/resources/typescript_utils/resources.grdp", - "$root_gen_dir/ash/webui/common/resources/html_css_wrapper_files_resources.grdp", "$root_gen_dir/third_party/material_web_components/material_web_components_resources.grdp", "$root_gen_dir/third_party/web-animations-js/web_animations_resources.grdp", "$target_gen_dir/cros_styles_resources.grdp",
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts index 5affd18..d263b66 100644 --- a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts +++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
@@ -31,6 +31,11 @@ export const HELP_BUBBLE_DISMISSED_EVENT = 'help-bubble-dismissed'; export const HELP_BUBBLE_TIMED_OUT_EVENT = 'help-bubble-timed-out'; +export const HELP_BUBBLE_SCROLL_ANCHOR_OPTIONS: ScrollIntoViewOptions = { + behavior: 'smooth', + block: 'center', +}; + export type HelpBubbleDismissedEvent = CustomEvent<{ nativeId: any, fromActionButton: boolean, @@ -121,6 +126,13 @@ private progressData_: void[] = []; /** + * Watches the offsetParent for resize events, allowing the bubble to be + * repositioned in response. Useful for when the content around a help bubble + * target can be filtered/expanded/repositioned. + */ + private resizeObserver_: ResizeObserver|null = null; + + /** * Shows the bubble. */ show(anchorElement: HTMLElement) { @@ -168,6 +180,14 @@ }; this.timeoutTimerId = setTimeout(timedOutCallback, this.timeoutMs); } + + if (this.offsetParent && !this.fixed) { + this.resizeObserver_ = new ResizeObserver(() => { + this.updatePosition_(); + this.anchorElement_?.scrollIntoView(HELP_BUBBLE_SCROLL_ANCHOR_OPTIONS); + }); + this.resizeObserver_.observe(this.offsetParent); + } } /** @@ -179,6 +199,10 @@ * bubble will go away on hide. */ hide() { + if (this.resizeObserver_) { + this.resizeObserver_.disconnect(); + this.resizeObserver_ = null; + } this.style.display = 'none'; this.setAttribute('aria-hidden', 'true'); this.anchorElement_ = null;
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts index fc78385..818ec70 100644 --- a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts +++ b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
@@ -5,7 +5,7 @@ import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {InsetsF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js'; -import {HelpBubbleElement} from './help_bubble.js'; +import {HELP_BUBBLE_SCROLL_ANCHOR_OPTIONS, HelpBubbleElement} from './help_bubble.js'; import {HelpBubbleParams} from './help_bubble.mojom-webui.js'; type Root = HTMLElement|ShadowRoot&{shadowRoot?: ShadowRoot}; @@ -176,7 +176,6 @@ return; } this.bubble_.show(this.anchor_); - this.anchor_.focus(); this.isBubbleShowing_ = true; this.setAnchorHighlight_(true); } @@ -255,6 +254,10 @@ assert( this.anchor_, 'Set anchor highlight: expected valid anchor element.'); this.anchor_.classList.toggle(ANCHOR_HIGHLIGHT_CLASS, highlight); + if (highlight) { + this.anchor_.focus(); + this.anchor_.scrollIntoView(HELP_BUBBLE_SCROLL_ANCHOR_OPTIONS); + } } /**
diff --git a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html index 41bfea0..c69794ef 100644 --- a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html +++ b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
@@ -118,29 +118,18 @@ } #checkmark { - border-color: var(--cr-checkbox-mark-color); - border-style: solid; - border-width: 0 2px 2px 0; - content: ''; display: block; - height: 73%; - transform: scale(0) rotate(45deg); - transform-origin: 100% 80%; - width: 36%; + transform: scale(0); } - :host-context([dir='rtl']) #checkmark { - transform-origin: 50% 14%; + #checkmark path { + fill: var(--cr-checkbox-mark-color); } - :host-context([chrome-refresh-2023]) #checkmark { - height: 7.19px; - transform-origin: 85% 92%; - width: 3.55px; - } - - :host-context([chrome-refresh-2023]):host-context([dir='rtl']) #checkmark { - transform-origin: 30% 14%; + :host([checked]) #checkmark { + transform: scale(1); + /* Only animate when showing checkmark. */ + transition: transform 140ms ease-out; } :host([checked]) #checkbox { @@ -149,12 +138,6 @@ border-color: var(--cr-checkbox-checked-box-color); } - :host([checked]) #checkmark { - transform: scale(1) rotate(45deg); - /* Only animate when showing checkmark. */ - transition: transform 140ms ease-out; - } - :host-context([chrome-refresh-2023]):host([checked]) #checkbox:focus-visible { background-clip: padding-box; border-color: transparent; @@ -206,7 +189,11 @@ on-keydown="onKeyDown_" on-keyup="onKeyUp_" aria-disabled="false" aria-checked="false" aria-labelledby="label-container" aria-describedby="ariaDescription"> - <span id="checkmark"></span> + <!-- Inline SVG paints faster than loading it from a separate file. --> + <svg id="checkmark" width="12" height="12" viewBox="0 0 12 12" + fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" d="m10.192 2.121-6.01 6.01-2.121-2.12L1 7.07l2.121 2.121.707.707.354.354 7.071-7.071-1.06-1.06Z"> + </svg> <div id="hover-layer"></div> </div> <div id="label-container" aria-hidden="true" part="label-container">
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html index c410a27..5413e78 100644 --- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html +++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -188,11 +188,19 @@ width: var(--cr-toggle-knob-diameter_); } + :host-context([chrome-refresh-2023]):host(:active) #knob { + --cr-toggle-knob-diameter_: 10px; + } + :host-context([chrome-refresh-2023]):host([checked]) #knob { --cr-toggle-knob-diameter_: 12px; left: calc(100% - var(--cr-toggle-knob-center-edge-distance_)); } + :host-context([chrome-refresh-2023]):host([checked]:active) #knob { + --cr-toggle-knob-diameter_: 14px; + } + :host-context([chrome-refresh-2023]):host(:hover) #knob::before { background-color: var(--cr-hover-background-color); border-radius: 50%;
diff --git a/ui/webui/resources/tools/generate_grd.py b/ui/webui/resources/tools/generate_grd.py index b143f71d..882f7ed 100644 --- a/ui/webui/resources/tools/generate_grd.py +++ b/ui/webui/resources/tools/generate_grd.py
@@ -66,10 +66,6 @@ GRD_INCLUDE_TEMPLATE = ' <include name="{name}" ' \ 'file="{file}" resource_path="{path}" ' \ 'use_base_dir="false" type="{type}" />\n' -GRD_INCLUDE_TEMPLATE_PP = ' <include name="{name}" ' \ - 'file="{file}" resource_path="{path}" ' \ - 'use_base_dir="false" preprocess="true" '\ - 'type="{type}" />\n' GRD_END_TEMPLATE = ' </includes>\n'\ ' </release>\n'\ @@ -98,16 +94,6 @@ resource_path = resource_path_prefix + '/' + resource_path assert '\\' not in resource_path - # This is a temporary workaround, since Polymer 2 shared resource files are - # not preprocessed. - # TODO(rbpotter): Remove this once OS Settings has been migrated to Polymer 3. - if ('vulcanized' in pathname or 'crisper' in pathname): - return GRD_INCLUDE_TEMPLATE_PP.format( - file=pathname, - path=resource_path, - name=name, - type=type) - return GRD_INCLUDE_TEMPLATE.format( file=pathname, path=resource_path,